Explainer video
A narrated explainer video planned from your topic, script or material, rendered to MP4 with captions.
- Price5 credits (50p) per storyboard
- Typical time2 min to 15 min
- Scope
media:write - Runs asA background job
Run explainer video in the sandbox
No key and nothing to pay. The sandbox returns a realistic example in a couple of seconds; no AI runs and no data is kept.
- Queued202 and a job id, straight away
- ProcessingPoll, stream or wait for a webhook
- SucceededResult and files on the job
Plans a storyboard from EduMark's reviewed animation library, records an AI voice-over and, with auto_render (the default), renders video.mp4 and captions.vtt on EduMark's render workers. storyboard.json is always saved. Facts come only from the material you send; without material the planner sticks to well-established facts and lists anything it could not support in notes. Scenes that cannot be drawn are left out. Rendering takes roughly as long as the video plays, after planning.
Requires media:write. Costs 5 credits per storyboard. Send a unique Idempotency-Key; reuse it with the identical body when retrying. Returns 202 with a job: poll GET /jobs/{job_id}, stream GET /jobs/{job_id}/events, or use a signed webhook.
Explainer video
POST/v1/videos
Scope media:write
Headers
| Field | Details |
|---|---|
Idempotency-Key | stringRequiredA unique key per new operation; reuse it with the identical body when retrying. |
EduMark-Version | enumAPI version. Defaults to the latest.One of 2026-10-21 |
Request body
| Field | Details |
|---|---|
topic | string, optionalWhat the video explains.Up to 300 characters |
audience | string, optionalWho it is for, for example 'Year 10 science'.Up to 300 characters |
objective | string, optionalWhat a viewer should understand afterwards.Up to 600 characters |
notes | string, optionalAnything else the planner should know.Up to 2,000 characters |
script | string, optionalYour own narration script. When given, the video is built around these words.Up to 12,000 characters |
source_text | string, optionalMaterial the facts must come from (up to 10,000 words).Up to 60,000 characters |
document | FileReference or DocumentInput, optionalA PDF, DOCX or TXT the facts must come from. |
file_iddocument.file_id | stringRequiredThe id returned by POST /v1/files, after POST /v1/files/{id}/complete reported ready.When sending FileReferencePattern ^file_[a-f0-9]{32}$ |
filenamedocument.filename | stringRequiredWhen sending DocumentInputUp to 200 characters |
base64document.base64 | stringRequiredWhen sending DocumentInputUp to 27,962,028 characters |
mime_typedocument.mime_type | string, optionalWhen sending DocumentInputUp to 150 characters |
length | enumAbout 45, 75 or 120 seconds.One of short, standard, longDefault "standard" |
aspect | enumOne of 16:9, 1:1, 9:16Default "16:9" |
voice | enumOne of alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse, marin, cedarDefault "cedar" |
auto_render | booleanRender video.mp4 and captions.vtt. False returns the storyboard only.Default true |
Responses
| Status | Meaning |
|---|---|
| 202 | Successful Response |
| 400 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 401 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 402 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 403 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 404 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 409 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 410 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 413 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 415 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 422 | Validation Error |
| 429 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 503 | Request rejected. Inspect error.code and request_id; failed work is not billed. |