API reference
MakeAIVideo Videos API
Create, inspect, edit, regenerate, export and download videos.
22 operations · https://app.makeaivideo.ai/api/v1
When to use the Videos API
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. |
| video_model | string | Optional. Leave it unset and MakeAIVideo picks the best video model for each scene. |
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
/videos/image-to-videoaiAnimate one image into a 5 or 10 s clip; optional narration makes the subject speak it (voice + lip-sync)
POST https://app.makeaivideo.ai/api/v1/videos/image-to-video
Responses
202AcceptedVideoCreated402Not enough creditsErrorEnvelope
/videos/talking-avataraiYour own filmed video speaks a new script (voice + lip-sync onto your clip). For an AI presenter use POST /videos with mode talking-head
POST https://app.makeaivideo.ai/api/v1/videos/talking-avatar
Responses
202AcceptedVideoCreated402Not enough creditsErrorEnvelope
/videos/character-swapaiCharacter Swap: the person in your video becomes a character or the person in your photos. Motion, camera, room and the original audio are kept; lips stay in sync. 3-60 s
POST https://app.makeaivideo.ai/api/v1/videos/character-swap
Responses
202AcceptedVideoCreated402Not enough creditsErrorEnvelope
/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.
MakeAIVideo API guides
- Quickstart — the create, poll and download loop end to end.
- Authentication — what the read, write, ai scope on this page mean.
- Agents — calling these endpoints from an autonomous agent.
Get an API key
The API and MCP server use the same credits and the same balance as the app, with no separate API plan. Create a key under Settings, Advanced, API keys.
7-day free trial with 350 credits, then plans from $9/mo. Cancel anytime before the trial ends.