AI generation
Generate content using the active account voice
Use this endpoint from your own integration, with the same account permissions and safeguards as the app.
Request
POST
/api/v1/voice/{accountId}/generateExample requestcURL
curl -X POST 'https://postlift.io/api/v1/voice/{accountId}/generate' \
-H "Authorization: Bearer $POSTLIFT_API_KEY" \
-H 'Idempotency-Key: integration-operation-0001' \
-H 'Content-Type: application/json' \
--data '{
"kind": "draft",
"brief": "Explain one lesson from a small product release.",
"model": "openai/gpt-6-luna",
"maxOutputTokens": 1024,
"stream": false
}'Replace path placeholders with your Postlift resource IDs. Example timestamps must be replaced with a future time; preserve the same timestamp when retrying the same operation.
Parameters
| Name | Location | Description |
|---|---|---|
accountIdrequired | path | Postlift resource ID belonging to the API key owner. |
Idempotency-Keyrequired | header | Unique operation key. Reuse only for the same payload/account. See retry semantics in the guide.Pattern: ^[A-Za-z0-9_-]{8,128}$. |
Request body
Send JSON with Content-Type: application/json.
| Field | Type & constraints |
|---|---|
kindrequired | stringValues: draft, rewrite, thread, hook, reply, ideas. |
briefrequired | stringMin. characters: 1. Max. characters: 8000. |
modeloptional | stringDefault: "openai/gpt-6-luna". |
maxOutputTokensoptional | integerDefault: 1024. Minimum: 32. Maximum: 2048. |
streamoptional | booleanDefault: false. |
View JSON schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"draft",
"rewrite",
"thread",
"hook",
"reply",
"ideas"
]
},
"brief": {
"type": "string",
"minLength": 1,
"maxLength": 8000
},
"model": {
"default": "openai/gpt-6-luna",
"type": "string"
},
"maxOutputTokens": {
"default": 1024,
"type": "integer",
"minimum": 32,
"maximum": 2048
},
"stream": {
"default": false,
"type": "boolean"
}
},
"required": [
"kind",
"brief"
],
"additionalProperties": false
}Response
200 Successful operation.
Streaming supported. Set stream:false for JSON. Stream errors can occur after HTTP 200; retain X-AI-Request-ID and inspect request status.
| Field | Type & constraints |
|---|---|
requestIdrequired | string |
modelrequired | string |
textrequired | string |
finishReasonrequired | string |
usagerequired | object |
View JSON schema
{
"type": "object",
"properties": {
"requestId": {
"type": "string"
},
"model": {
"type": "string"
},
"text": {
"type": "string"
},
"finishReason": {
"type": "string"
},
"usage": {
"type": "object",
"additionalProperties": true
}
},
"required": [
"requestId",
"model",
"text",
"finishReason",
"usage"
],
"additionalProperties": true
}Errors & retries
Failures use a stable error code and request ID. Check the current resource version or request status before retrying a write.
| Status | Meaning |
|---|---|
400 | Invalid input or Jev rejection |
401 | Invalid, expired or revoked API key |
402 | Plan, publishing quota or AI credit requirement |
403 | Missing scope |
404 | Resource not found or not owned |
409 | Version conflict, missing voice or duplicate AI operation |
413 | Payload too large |
429 | Rate or concurrency limit |
500 | Internal error |
502 | Upstream failure; inspect operation status |
503 | Service or review unavailable |