API reference
Videos API
Create, inspect, edit, regenerate, export and download videos.
19 operations · https://app.makeaivideo.ai/api/v1
What the videos endpoints are for
The core of the API. Create a video from a brief we script for you or from a script you supply, watch the render, change parts of it, and export the result.
Creation is asynchronous. POST /videos returns 202 with a video id while the render continues in the background, so a client either polls GET /videos/{id} at the interval the response asks for, or subscribes to a webhook and stops polling entirely.
The editing endpoints are the reason to use the API over a one-shot generator. A finished video is not final: you can regenerate a single scene without re-rendering the rest, swap the voiceover for a different voice, edit the script or caption settings, and export again. Re-running one scene costs a fraction of what re-running the whole video does.
/videosreadList videos
GET https://app.makeaivideo.ai/api/v1/videos
Responses
200VideosVideoList
/videoswriteCreate a video from a brief or your own script
POST https://app.makeaivideo.ai/api/v1/videos
Request body CreateVideorequired
| Field | Type | Description |
|---|---|---|
| tool | string | Path A: a tool id from GET /tools; we write the script |
| fields | object | — |
| duration_seconds | integer | — |
| script | object | Path B: your own script (from /videos/script, /videos/scriptify, or hand-written) |
| title | string | — |
| topic | string | — |
| mode | "talking-head" | "cinematic" | "hybrid" | "stock-narrated" | "smart-mix" | — |
| style | "talking-head" | "cinematic" | — |
| character_id | integer | null | — |
| voice_id | string | — |
| music_id | string | — |
| caption_style | string | — |
| aspect_ratio | "9:16" | "1:1" | "16:9" | — |
| language | string | — |
| start_generation | boolean | — |
| idempotency_key | string | Same key = same video. Set it when retrying. |
Responses
202Accepted. status is `generating`, or `draft` when start_generation is falseVideoCreated400Invalid brief or scriptErrorEnvelope402Not enough credits or no active subscriptionErrorEnvelope403Key lacks the write scopeErrorEnvelope429Rate or spend limit reached; see Retry-AfterErrorEnvelope
/videos/estimatereadFree credit quote
POST https://app.makeaivideo.ai/api/v1/videos/estimate
Responses
200Quote
/videos/{id}readVideo status and progress
GET https://app.makeaivideo.ai/api/v1/videos/{id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200StatusVideo404Unknown videoErrorEnvelope
/videos/{id}writeEdit title, topic, script or caption settings
PATCH https://app.makeaivideo.ai/api/v1/videos/{id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Saved. Script changes apply on the next generate404Unknown videoErrorEnvelope
/videos/{id}writeDelete a video and its files
DELETE https://app.makeaivideo.ai/api/v1/videos/{id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Deleted404Unknown videoErrorEnvelope
/videos/{id}/generatewriteStart or re-run generation (drafts, or after edits)
POST https://app.makeaivideo.ai/api/v1/videos/{id}/generate
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
202Accepted409Already generatingErrorEnvelope
/videos/{id}/cancelwriteCancel a running render and release its credits
POST https://app.makeaivideo.ai/api/v1/videos/{id}/cancel
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Cancelled409Not runningErrorEnvelope
/videos/{id}/downloadreadSigned download URL for the finished MP4
GET https://app.makeaivideo.ai/api/v1/videos/{id}/download
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200URL valid 15 minutes404Unknown videoErrorEnvelope409Not ready yet (retryable)ErrorEnvelope
/videos/{id}/rendersreadPast exports
GET https://app.makeaivideo.ai/api/v1/videos/{id}/renders
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Renders
/videos/{id}/renderswriteExport again (after edits)
POST https://app.makeaivideo.ai/api/v1/videos/{id}/renders
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
202Accepted
/videos/{id}/renders/progressreadCurrent export progress
GET https://app.makeaivideo.ai/api/v1/videos/{id}/renders/progress
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Progress
/videos/{id}/scenes/{n}/regeneratewriteRegenerate one scene (optionally with new narration)
POST https://app.makeaivideo.ai/api/v1/videos/{id}/scenes/{n}/regenerate
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
| nrequired | path | integer | Scene number, 1-based |
Responses
202Accepted
/videos/{id}/voicereadVoice regeneration progress
GET https://app.makeaivideo.ai/api/v1/videos/{id}/voice
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Progress
/videos/{id}/voicewriteRegenerate the voiceover with another voice
POST https://app.makeaivideo.ai/api/v1/videos/{id}/voice
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
202Accepted
/videos/{id}/captionsreadCaption file (SRT or VTT), returned as text
GET https://app.makeaivideo.ai/api/v1/videos/{id}/captions
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
| format | query | "srt" | "vtt" | — |
Responses
200Caption file400No caption data yetErrorEnvelope
/videos/{id}/reportwriteFlag a generated video for review
POST https://app.makeaivideo.ai/api/v1/videos/{id}/report
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | Public video id, e.g. vid_abc123 |
Responses
200Reported
/templatesreadTemplate library
GET https://app.makeaivideo.ai/api/v1/templates
Responses
200Templates
Videos API questions
- How long does an API video render take?
- Minutes, not seconds. POST /videos returns immediately with a video id and a poll_after_seconds hint; treat the render as a background job rather than something to block a request on.
- Can I regenerate one scene instead of the whole video?
- Yes. POST /videos/{id}/scenes/{n}/regenerate re-renders a single scene, optionally with new narration, leaving every other scene untouched. It is the cheapest way to fix one bad shot.
- How do I avoid being charged twice for a retried request?
- Send an idempotency_key on POST /videos. Without one, a retry after a dropped connection creates and charges for a second video, because the server cannot tell a retry from a new request.
- How do I download the finished MP4?
- GET /videos/{id}/download returns a signed download URL. Captions come separately from GET /videos/{id}/captions as an SRT or VTT file rather than JSON.
- Can I cancel a render that is already running?
- Yes. POST /videos/{id}/cancel stops a running render and releases the credits it had reserved.
Related
- Quickstart — the create, poll and download loop end to end.
- Authentication — what the read, write scope on this page mean.
- Agents — calling these endpoints from an autonomous agent.