Create a video
A camera move or fly-through from a single still, priced by model and length.
POST/v2/videosReturns 202 straight away with the job and what it charged. Poll GET /v2/jobs/{id} for the result; a job that fails is refunded. A clip takes a few minutes.
Video needs an account that has topped up its API wallet. On an account that never has, it returns
403 PLAN_REQUIRED and nothing is charged.| Model | Per clip |
|---|---|
v2.0 · Flash (v2.0-flash) | $0.99 per 10s clip |
v2.0 · Cinematic (v2.0) | $1.98 per 10s clip |
Headers
AuthorizationstringRequiredBearer mk_live_…: your API key. See Authentication.Content-TypestringRequiredapplication/json, ormultipart/form-datato send a file.Idempotency-Keystring- Your own key, 1 to 255 visible ASCII characters. A retry with the same key and request within 24 hours returns the first answer instead of running again.
Body
imagestring- The JPEG, PNG or WebP to work on, up to 15 MB: a public
https://link we fetch, adata:image/…;base64,URI, or bare base64. With multipart form data, attach the file itself (-F [email protected]). Send one ofimageorjob_id. job_idstring- A finished job of yours: work on its output without downloading it first.
modelstringDefaultv2.0 · Flash- A video model’s id or name from
video_modelsin GET /v2/engines. duration_secondsintegerDefault10- The clip’s length. The lengths each model offers, and their prices, are in
video_models. camera_movementstringDefaultstaticstatic,auto, a preset such asorbit-right, or up to two moves:"dolly-in,tilt-up".motionstringDefaultsubtle- How much moves in the scene:
subtle,balancedordynamic. promptstring- What should happen in the clip.
end_framestring | object- A last frame to move towards: the image itself, as
imageis sent, or an object naming it.Fields (2)
imagestring- The frame: a public
https://link we fetch, adata:image/…;base64,URI, or bare base64. With multipart form data, attach the file itself. Send one ofimageorjob_id. job_idstring- The frame, as a finished job of yours.
cinematicboolean- v1.1 only: the Cinematic variant, which needs
end_frame. webhook_urlstring- A public
https://URL to send this job’s settle event to, signed like every webhook, on top of your account’s endpoints.
Response
On success (202): Started. A clip takes minutes; poll GET /v2/jobs/{id} for it. The JSON is { "success": true, "data": … }, and inside data:
idstringRequired- The job. Read it at GET /v2/jobs/{id}.
statusstringRequired- The job’s status when it was accepted, usually
queued.queuedprocessingsucceededfailedcanceled charged_usdnumberRequired- What this call charged, in US dollars. A job that fails is refunded.
replayedbooleanRequired- True when this is the stored answer to an earlier identical request with the same
Idempotency-Key: nothing ran or was charged again. See Idempotency. notesstring[]Required- What was accepted but not applied, in plain words: a setting that does not fit the engine, a seed it does not take. Empty when everything applied.
Response headers (5)
X-Request-Idstring- This request, for support and the console log.
RateLimit-Limitinteger- Requests this key may make per minute.
RateLimit-Remaininginteger- Requests left in the current minute.
RateLimit-Resetinteger- Seconds until the current minute resets.
Idempotent-Replayedstring- Present, as
true, when this is the stored answer to an earlier request.
Status codes
- 202
- Started. A clip takes minutes; poll GET /v2/jobs/{id} for it.
- 401
- The API key is missing, malformed, unknown or revoked.
- 402
- The balance does not cover this call.
- 409
- The Idempotency-Key was reused for a different request, or is still in progress.
- 429
- A limit was reached: requests per minute, or a daily or concurrency limit.
- Other
- Any other error, in the same envelope.
Every error answers { "success": false, "error": { "code", "message" } }. What each code means, and what to do, is on Errors.