API Reference
Generation result
GET /v1/requests/{request_id} — fetch the finished result with links to the image, video or audio; while the job is still running, the API returns 202.
Fetch the finished generation with links to its media. While the job is queued or running, the call returns 202 — try again later.
Playground
Use a test key here
Paste a clipia_test_… key into the form below: it charges no credits and calls no models, and the response has the same shape. The form keeps the key in this browser, so never enter a live clipia_live_… key here: it is a server-side secret. See Sandbox.
AuthorizationBearer <token>API key in the Authorization header with the Bearer scheme, the primary form. Generated clients add the Bearer prefix themselves, and in the playground the field already contains it: type the key after it. The playground keeps the key in this browser, so use a test key for trials:
Authorization: Bearer <CLIPIA_API_KEY>The same key is also accepted with the Key scheme (Authorization: Key <key>, the word Key in any case) and in the separate X-Api-Key header (the apiKeyHeader scheme); use whichever form suits you, the server tells them apart. The key is created in the developer console (clipia.ai/developer, "API keys" tab) and shown only once. Format: clipia_live_… (live), clipia_test_… (sandbox).
Sandbox / test mode. A key with the clipia_test_… prefix works in the sandbox: submit charges no credits and starts no real generation; it instantly returns status: COMPLETED with a deterministic mock result (a fixed sample asset on media.clipia.ai). The cost field shows the estimated cost, but it is not charged. Webhooks arrive through the same signed mechanism (HMAC-SHA256). This mode is meant for debugging an integration before you switch to a live key.
request_id*stringID of the generation request returned by submit.
uuidTerminal result. For COMPLETED it contains output; for FAILED, a sanitized error.
application/json- response
request_id*stringGeneration request ID.
uuidstatus*GenerationStatusGeneration status in the queue. CANCELED is terminal: a generation can be canceled outside the public API (for example, from the Clipia web interface); the public API has no cancel endpoint, but status can return CANCELED, so the client must treat it as final.
"IN_QUEUE""IN_PROGRESS""COMPLETED""FAILED""CANCELED"model*stringSlug of the model that ran the generation.
output*Generation result. For images: images: [{ url, original_url? }] (url is an optimized WebP for display; original_url is the full-size PNG/JPG original for download, when available); for video: video: { url, original_url?, thumbnail_url? } (thumbnail_url is a static cover frame, not available for every model); for audio (TTS, music): audio: { url, format? } and audios: [{ url, format? }]. Music models return several track variants per request: audios contains all of them, audio is the first one (the first item of audios matches audio). All media URLs point to the media.clipia.ai CDN.
The response has no width, height or duration fields: read the dimensions and duration from the file itself. original_url and thumbnail_url are not always filled in, so treat them as optional.
cost*numberGeneration cost in credits. While the request is in progress, this is the reserve; after completion, the amount actually charged. With FAILED and CANCELED, the reserve is refunded and the field equals 0.
created_at*stringRequest creation time (ISO 8601).
date-timecompleted_at?stringGeneration completion time (ISO 8601).
date-timeerror?Error details (only when status = FAILED). Sanitized.
warnings?array<>Warnings about request execution: the server deviated from the input parameters so that the request could complete. Currently there is one reason, audio_dropped (the video is created without sound). The field is present only when there is something to warn about, and it does not come with FAILED and CANCELED. These warnings are not yet known when the request is accepted, so the creation response does not contain them.
items <= 20curl -X GET "https://example.com/v1/requests/764cabcf-b745-4b3e-ae38-1200304cf45b"{ "request_id": "764cabcf-b745-4b3e-ae38-1200304cf45b", "status": "COMPLETED", "model": "nano-banana-2", "output": { "images": [ { "url": "https://media.clipia.ai/works/8f3a1c7e.webp", "original_url": "https://media.clipia.ai/works/8f3a1c7e.png" } ] }, "cost": 12, "created_at": "2026-06-01T12:00:00Z", "completed_at": "2026-06-01T12:00:18Z"}GET /v1/requests/:id returns the result with an output field and status 200 once the job reaches a terminal status (COMPLETED, FAILED or CANCELED). All links point to the media.clipia.ai CDN. No extra key permission is needed.
/v1/requests/:idRequest
Prop
Type
curl https://api.clipia.ai/v1/requests/764cabcf-b745-4b3e-ae38-1200304cf45b \
-H "Authorization: Bearer $CLIPIA_KEY"Image
{
"request_id": "764cabcf-b745-4b3e-ae38-1200304cf45b",
"status": "COMPLETED",
"model": "nano-banana-2",
"output": {
"images": [
{
"url": "https://media.clipia.ai/....webp",
"original_url": "https://media.clipia.ai/....png"
}
]
},
"cost": 12,
"created_at": "2026-10-09T12:00:00Z",
"completed_at": "2026-10-09T12:00:18Z"
}output.images is an array. url is an optimized WebP copy for display; original_url is the full-quality source file. Only the first image in the array has original_url.
Video
{
"request_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"status": "COMPLETED",
"model": "seedance-2-fast-i2v",
"output": {
"video": {
"url": "https://media.clipia.ai/....mp4",
"original_url": "https://media.clipia.ai/....mp4",
"thumbnail_url": "https://media.clipia.ai/....webp"
}
},
"cost": 40,
"created_at": "2026-10-09T12:00:00Z",
"completed_at": "2026-10-09T12:00:42Z"
}output.video is an object with url. The original_url and thumbnail_url (a preview frame) fields may be missing.
Audio
{
"output": {
"audio": { "url": "https://media.clipia.ai/....mp3", "format": "mp3" },
"audios": [
{ "url": "https://media.clipia.ai/....mp3", "format": "mp3" },
{ "url": "https://media.clipia.ai/...-2.mp3", "format": "mp3" }
]
}
}output.audio is the first track and output.audios lists every variant: music models return several tracks per run, text-to-speech returns one. The first element of audios equals audio. format is the file format taken from the URL extension (mp3, wav) and may be absent.
No dimensions or duration
The response has no width, height or duration fields — neither live nor in the sandbox. If you need them, read them from the file itself.
Response fields
Prop
Type
Warnings
If sound was requested but the audio track did not pass the model's safety check, the server retries the generation once without sound. The request finishes as COMPLETED, and the response additionally carries a warnings array:
{
"status": "COMPLETED",
"output": { "video": { "url": "https://media.clipia.ai/....mp4" } },
"warnings": [
{
"code": "audio_dropped",
"parameter": "generate_audio",
"message": "The audio track did not pass the model's safety check, so the video is generated without sound. The price of the request is unchanged."
}
]
}The cost of the request does not change. warnings is omitted when there is nothing to report, and for FAILED and CANCELED. The same array comes with the 202 response and with the request status while the silent video is still being generated. This is the only reason so far; treat an unfamiliar code as "the parameter was not applied".
Generation error codes
With status: "FAILED", the error object carries a code from a closed dictionary — it tells the client whether a retry makes sense. error.message is in English: a ready-made phrase about the reason when the server recognizes it, otherwise neutral text for the code, usually Generation failed. Please retry or contact support.; it has no names of internal systems. Credits for a FAILED job are always refunded.
error.code | Meaning | Retry |
|---|---|---|
generation_failed | generic generation failure, the default | yes |
content_moderated | the request was rejected by content moderation | pointless with the same input |
invalid_input | the model did not accept the input: size, format, parameters | fix the request |
model_unavailable | the model is temporarily unavailable | later |
timeout | the generation did not finish in time | yes |
rate_limited | the model is overloaded | after a pause |
insufficient_credits | not enough credits at charge time | after topping up |
result_unavailable | the result was produced but not stored or not reachable | yes |
empty_result | the model returned an empty result | yes, or change the request |
canceled | canceled by the user or the system | — |
The failure webhook uses the same dictionary. The list may grow: treat an unknown code as generation_failed.
Response codes
| HTTP | When | Body |
|---|---|---|
200 | COMPLETED | result with output |
200 | FAILED | error: { code, message }, code from the dictionary above, generation_failed by default; cost: 0 |
200 | CANCELED | terminal response, output is usually empty, cost: 0 |
202 | IN_QUEUE / IN_PROGRESS | { request_id, status } — try again later |
400 | malformed ID | message: invalid_request_id |
404 | no such request | code: not_found, message: request_not_found |
202 is expected
202 only appears while the job is unfinished. FAILED and CANCELED are final responses with status 200. On FAILED, the reserved credits are refunded in full. error.code is usually generation_failed (codes are lowercase snake_case), and error.message is in English: a ready-made phrase about the reason when the server recognizes it, otherwise neutral text for the code; it has no internal details. Branch on status and error.code, not on the message text.
Request status
GET /v1/requests/{request_id}/status — a lightweight check of a generation's status and progress by request_id. No extra key permission is needed.
Model catalog
GET /v1/models — Clipia image, video and audio models with exact slugs, input schema and pricing, including slugs that contain a slash.