{"openapi":"3.1.0","info":{"title":"MoviePro API","version":"1.0.0","description":"Make a film end to end: plan it (scripts, breakdowns, shot plans), keep characters and places consistent (elements), generate shots, stills, music, voice and sound effects, cut them together on a project's timeline with atomic edits, and render it to MP4. Every endpoint is also an MCP tool at /api/mcp-server. Authenticate with an API key from Settings → API keys, sent as `Authorization: Bearer mpk_…`."},"servers":[{"url":"https://moviepro.ai/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Projects","description":"Editor projects: create, read, update, delete."},{"name":"Timeline","description":"A project's tracks and clips, edited one atomic step at a time (live in an open editor)."},{"name":"Planning","description":"Scripts, script breakdowns and AI-directed shot plans. 1 credit each."},{"name":"Media","description":"The media library: list, inspect, delete, and import files by URL."},{"name":"Generations","description":"AI video, image, music, speech and sound effects. Asynchronous; charged in credits."},{"name":"Elements","description":"Reusable characters, locations, props and styles with reference images."},{"name":"Renders","description":"Cloud renders of a project to MP4."},{"name":"Account","description":"Credit balance and the models you can use."}],"paths":{"/projects":{"get":{"operationId":"listProjects","tags":["Projects"],"summary":"List projects","x-moviepro-scope":"projects:read","x-moviepro-mcp-tool":"list_projects","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","in-progress","review","completed","archived"]}}],"responses":{"200":{"description":"Projects, most recently updated first","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"operationId":"createProject","tags":["Projects"],"summary":"Create a project","description":"A new editor project with the default tracks (V1, V2, Text, A1, A2) at the chosen aspect ratio. Build its timeline with the Timeline endpoints.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"create_project","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"},"example":{"name":"Launch teaser","description":"30s product teaser","aspect_ratio":"16:9"}}}},"responses":{"201":{"description":"The new project","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}":{"get":{"operationId":"getProject","tags":["Projects"],"summary":"Get a project","description":"Includes the raw editor `tracks` and `settings`. GET /projects/{id}/timeline is the readable timeline (ms, clip kinds, the seq to edit against).","x-moviepro-scope":"projects:read","x-moviepro-mcp-tool":"get_project","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The project","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"operationId":"updateProject","tags":["Projects"],"summary":"Update a project","description":"Name, status and other fields. Sending `tracks` replaces the whole timeline outside the collaboration log (an open editor is asked before keeping it); use the Timeline endpoints to edit it.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"update_project","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"},"example":{"status":"in-progress"}}}},"responses":{"200":{"description":"The updated project","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"operationId":"deleteProject","tags":["Projects"],"summary":"Delete a project","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"delete_project","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deleted":{"const":true}},"required":["id","deleted"]}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/media":{"get":{"operationId":"listMedia","tags":["Media"],"summary":"List media files","x-moviepro-scope":"media:read","x-moviepro-mcp-tool":"list_media","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["video","audio","image"]},"description":"Filter by top-level MIME type"}],"responses":{"200":{"description":"Media library, newest first","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Media"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/media/import":{"post":{"operationId":"importMedia","tags":["Media"],"summary":"Import a file from a URL","description":"MoviePro downloads the file (video, audio or image, up to 500 MB), stores it and adds it to the media library. The URL must be publicly reachable.","x-moviepro-scope":"media:write","x-moviepro-mcp-tool":"import_media","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMedia"},"example":{"url":"https://example.com/clips/intro.mp4","file_name":"intro.mp4"}}}},"responses":{"201":{"description":"The imported file","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Media"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"413":{"$ref":"#/components/responses/E413"},"415":{"$ref":"#/components/responses/E415"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/media/{id}":{"get":{"operationId":"getMedia","tags":["Media"],"summary":"Get a media file","x-moviepro-scope":"media:read","x-moviepro-mcp-tool":"get_media_file","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The media file","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Media"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"operationId":"deleteMedia","tags":["Media"],"summary":"Delete a media file","description":"Removes the library entry and the stored file.","x-moviepro-scope":"media:write","x-moviepro-mcp-tool":"delete_media_file","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deleted":{"const":true}},"required":["id","deleted"]}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/timeline":{"get":{"operationId":"getTimeline","tags":["Timeline"],"summary":"Get a project's timeline","description":"Tracks bottom → top, each clip with start/duration/trims in ms, its kind and source. Includes edits a live editor hasn't saved yet. `seq` is the version to pass as expected_seq.","x-moviepro-scope":"projects:read","x-moviepro-mcp-tool":"get_timeline","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The timeline","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Timeline"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/timeline/edits":{"post":{"operationId":"editTimeline","tags":["Timeline"],"summary":"Apply timeline edits","description":"Applies up to 200 atomic edits in order, all or none: add_track, update_track, delete_track, reorder_tracks, add_clip, add_text, update_clip (move, trim, speed, transform, audio, transition), split_clip, delete_clip. Clips on one track never overlap (409 CLIP_OVERLAP; use placement nearest/append). A `ref` on an edit names what it creates so later edits can use \"$ref\" as its id. Edits reach an open editor live.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"edit_timeline","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineEditsRequest"},"example":{"edits":[{"op":"add_clip","ref":"opening","generation_id":"6f1c2a7e-3b0d-4f5e-9a51-2a7c1d9e8b10"},{"op":"add_clip","media_id":"0b8e2f4c-7d1a-4c3e-8f6b-5a9d2c1e7f30","transition":{"type":"dissolve","duration_ms":500}},{"op":"add_text","text":"THE LAST SLICE","start_ms":500,"duration_ms":2500,"style":{"font_size":96}},{"op":"add_clip","url":"https://example.com/score.mp3","track_id":"a1","start_ms":0,"duration_ms":30000,"audio":{"volume":70,"fade_out_ms":2000}}]}}}},"responses":{"200":{"description":"The timeline after the edits, and what each created","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"413":{"$ref":"#/components/responses/E413"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/tracks":{"post":{"operationId":"addTrack","tags":["Timeline"],"summary":"Add a track","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"add_track","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTrackBody"},"example":{"type":"audio","label":"Music","role":"music"}}}},"responses":{"200":{"description":"results[0].track_id is the new track","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/tracks/{trackId}":{"patch":{"operationId":"updateTrack","tags":["Timeline"],"summary":"Update a track","description":"Label, mute, hide, lock, volume, pan, role.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"update_track","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"trackId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTrackBody"},"example":{"muted":true}}}},"responses":{"200":{"description":"The timeline","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"operationId":"deleteTrack","tags":["Timeline"],"summary":"Delete a track","description":"Removes the track and its clips.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"delete_track","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"trackId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The timeline","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/clips":{"post":{"operationId":"addClip","tags":["Timeline"],"summary":"Add a clip","description":"Puts a media file (media_id), a finished generation (generation_id) or an https URL on a track. Default: after the last clip of the lowest video track (video/image) or audio track (audio), for the source's full length (images 5 s).","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"add_clip","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddClipBody"},"example":{"generation_id":"6f1c2a7e-3b0d-4f5e-9a51-2a7c1d9e8b10","trim_start_ms":500,"duration_ms":4000,"transition":{"type":"dissolve","duration_ms":400}}}}},"responses":{"200":{"description":"results[0].clip_id is the new clip","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/texts":{"post":{"operationId":"addText","tags":["Timeline"],"summary":"Add a title / text","description":"A text clip over the picture (titles, lower thirds, captions). Text clips may overlap media and each other.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"add_text","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTextBody"},"example":{"text":"Chapter One","start_ms":0,"duration_ms":3000,"style":{"font_size":80,"animation":"fade-in","animation_out":"fade-out"},"position":{"x":0,"y":380}}}}},"responses":{"200":{"description":"results[0].clip_id is the new text clip","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/clips/{clipId}":{"patch":{"operationId":"updateClip","tags":["Timeline"],"summary":"Update a clip","description":"Move (start_ms, track_id), trim (trim_start_ms, trim_end_ms, duration_ms), retime (speed, reversed), transform, audio, transition, text and style, disable or lock.","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"update_clip","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"clipId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClipBody"},"example":{"start_ms":12000,"audio":{"volume":40}}}}},"responses":{"200":{"description":"The timeline","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"operationId":"deleteClip","tags":["Timeline"],"summary":"Delete a clip","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"delete_clip","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"clipId","in":"path","required":true,"schema":{"type":"string"}},{"name":"ripple","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]},"description":"true closes the gap"}],"responses":{"200":{"description":"The timeline","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/projects/{id}/clips/{clipId}/split":{"post":{"operationId":"splitClip","tags":["Timeline"],"summary":"Split a clip","x-moviepro-scope":"projects:write","x-moviepro-mcp-tool":"split_clip","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"clipId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitClipBody"},"example":{"at_ms":4200}}}},"responses":{"200":{"description":"results[0].new_clip_id is the right-hand part","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TimelineEditResult"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/scripts":{"post":{"operationId":"createScript","tags":["Planning"],"summary":"Write a script","description":"A production-ready script from a brief. 1 credit.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"write_script","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptRequest"},"example":{"prompt":"A pizza courier's last delivery before the shop closes forever","type":"narrative","duration":"2min","tone":"dramatic"}}}},"responses":{"200":{"description":"`script` holds the text","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/scripts/breakdown":{"post":{"operationId":"breakdownScript","tags":["Planning"],"summary":"Break a script down","description":"Scenes, a shot list with camera settings, and the characters and locations a screenplay mentions. 1 credit.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"break_down_script","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BreakdownRequest"}}}},"responses":{"200":{"description":"The breakdown","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"scenes":{"type":"array"},"shots":{"type":"array"},"characters":{"type":"array"},"locations":{"type":"array"}}}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"413":{"$ref":"#/components/responses/E413"},"429":{"$ref":"#/components/responses/E429"}}}},"/shot-plans":{"post":{"operationId":"createShotPlan","tags":["Planning"],"summary":"Plan the shots","description":"The AI director turns a concept, a screenplay or a shot list into generatable shots: each has a self-contained video `prompt`, `duration_seconds` fitted to the video model, `camera` (pass it to POST /generations/video) and the `element_ids` that appear in it (pass their reference images as reference_image_urls). With project_id it uses the elements linked to that project. 1 credit.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"plan_shots","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotPlanRequest"},"example":{"concept":"Rain-soaked noir: a courier delivers a pizza to a detective who knows too much","target_seconds":45,"style":"Cinematic noir, 35mm film grain","model_id":"seedance-2.5","aspect_ratio":"16:9"}}}},"responses":{"200":{"description":"The shot plan","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"title":{"type":"string"},"logline":{"type":"string"},"style":{"type":"string"},"pacing":{"type":"string"},"shots":{"type":"array"}}}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"413":{"$ref":"#/components/responses/E413"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/video":{"post":{"operationId":"createVideoGeneration","tags":["Generations"],"summary":"Generate a video","description":"Starts the generation and returns at once with status `processing` and the credits charged. Poll `GET /generations/{id}` or pass `webhook_url`; once `succeeded`, put it on a timeline with add_clip { generation_id }. Validation, low-balance (402) and plan (403) errors are returned synchronously and charge nothing; if the provider fails later the credits are refunded.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"generate_video","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationRequest"},"example":{"prompt":"A slow dolly shot through a neon-lit alley in the rain","model":"seedance-2.5","duration":5,"aspect_ratio":"16:9","webhook_url":"https://example.com/hooks/moviepro"}}}},"responses":{"202":{"description":"Accepted; the generation is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/image":{"post":{"operationId":"createImageGeneration","tags":["Generations"],"summary":"Generate an image","description":"Starts the generation and returns at once with status `processing` and the credits charged. Poll `GET /generations/{id}` or pass `webhook_url`; once `succeeded`, put it on a timeline with add_clip { generation_id }. Validation, low-balance (402) and plan (403) errors are returned synchronously and charge nothing; if the provider fails later the credits are refunded.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"generate_image","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationRequest"},"example":{"prompt":"Storyboard frame: a lighthouse at dawn, wide shot","aspect_ratio":"16:9"}}}},"responses":{"202":{"description":"Accepted; the generation is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/music":{"post":{"operationId":"createMusicGeneration","tags":["Generations"],"summary":"Generate music","description":"Starts the generation and returns at once with status `processing` and the credits charged. Poll `GET /generations/{id}` or pass `webhook_url`; once `succeeded`, put it on a timeline with add_clip { generation_id }. Validation, low-balance (402) and plan (403) errors are returned synchronously and charge nothing; if the provider fails later the credits are refunded.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"generate_music","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationRequest"},"example":{"prompt":"Warm lo-fi beat for a travel vlog","duration":30,"instrumental":true}}}},"responses":{"202":{"description":"Accepted; the generation is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/speech":{"post":{"operationId":"createSpeechGeneration","tags":["Generations"],"summary":"Generate speech","description":"Starts the generation and returns at once with status `processing` and the credits charged. Poll `GET /generations/{id}` or pass `webhook_url`; once `succeeded`, put it on a timeline with add_clip { generation_id }. Validation, low-balance (402) and plan (403) errors are returned synchronously and charge nothing; if the provider fails later the credits are refunded.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"generate_speech","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechGenerationRequest"},"example":{"text":"Welcome back to the channel.","voice_id":"minimax:English_Wiselady"}}}},"responses":{"202":{"description":"Accepted; the generation is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/sound-effect":{"post":{"operationId":"createSoundEffectGeneration","tags":["Generations"],"summary":"Generate a sound effect","description":"Starts the generation and returns at once with status `processing` and the credits charged. Poll `GET /generations/{id}` or pass `webhook_url`; once `succeeded`, put it on a timeline with add_clip { generation_id }. Validation, low-balance (402) and plan (403) errors are returned synchronously and charge nothing; if the provider fails later the credits are refunded.","x-moviepro-scope":"generations:write","x-moviepro-mcp-tool":"generate_sound_effect","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoundEffectGenerationRequest"},"example":{"prompt":"Rain on a tin roof, distant thunder","duration":8}}}},"responses":{"202":{"description":"Accepted; the generation is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"402":{"$ref":"#/components/responses/E402"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations":{"get":{"operationId":"listGenerations","tags":["Generations"],"summary":"List generations","description":"Generations started through the API.","x-moviepro-scope":"generations:read","x-moviepro-mcp-tool":"list_generations","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["video","image","music","speech","sound_effect"]}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["queued","processing","succeeded","failed"]}}],"responses":{"200":{"description":"Newest first","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Generation"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/generations/{id}":{"get":{"operationId":"getGeneration","tags":["Generations"],"summary":"Get a generation","description":"Status and, once `succeeded`, the result (`result.url`).","x-moviepro-scope":"generations:read","x-moviepro-mcp-tool":"get_generation","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The generation","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Generation"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/elements":{"get":{"operationId":"listElements","tags":["Elements"],"summary":"List elements","description":"Reusable characters, locations, props and styles. Pass an element's reference image URLs to `reference_image_urls` to keep it consistent across shots.","x-moviepro-scope":"elements:read","x-moviepro-mcp-tool":"list_elements","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["character","location","prop","style"]}},{"name":"project_id","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Only elements linked to this project (what its Cast page and the shot planner use)"},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Elements, most recently updated first","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Element"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"operationId":"createElement","tags":["Elements"],"summary":"Create an element","x-moviepro-scope":"elements:write","x-moviepro-mcp-tool":"create_element","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateElement"},"example":{"kind":"character","name":"Mara","description":"Late-20s courier, red rain jacket","reference_images":[{"url":"https://example.com/mara-front.png","view":"front"}]}}}},"responses":{"201":{"description":"The new element","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Element"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/elements/{id}":{"get":{"operationId":"getElement","tags":["Elements"],"summary":"Get an element","description":"Includes `project_ids`, the projects it is linked to.","x-moviepro-scope":"elements:read","x-moviepro-mcp-tool":"get_element","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The element","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Element"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"operationId":"updateElement","tags":["Elements"],"summary":"Update an element","x-moviepro-scope":"elements:write","x-moviepro-mcp-tool":"update_element","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateElement"},"example":{"description":"Late-20s courier, red rain jacket, scar over the left eyebrow"}}}},"responses":{"200":{"description":"The updated element","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Element"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"operationId":"deleteElement","tags":["Elements"],"summary":"Delete an element","x-moviepro-scope":"elements:write","x-moviepro-mcp-tool":"delete_element","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deleted":{"const":true}},"required":["id","deleted"]}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/elements/{id}/projects":{"post":{"operationId":"linkElement","tags":["Elements"],"summary":"Link an element to a project","description":"A project's shot plans and Cast page use only its linked elements.","x-moviepro-scope":"elements:write","x-moviepro-mcp-tool":"link_element","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElementProjectLink"}}}},"responses":{"200":{"description":"Linked","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"element_id":{"type":"string"},"project_id":{"type":"string"},"linked":{"type":"boolean"}}}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/elements/{id}/projects/{projectId}":{"delete":{"operationId":"unlinkElement","tags":["Elements"],"summary":"Unlink an element from a project","x-moviepro-scope":"elements:write","x-moviepro-mcp-tool":"unlink_element","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Unlinked","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"element_id":{"type":"string"},"project_id":{"type":"string"},"linked":{"type":"boolean"}}}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/renders":{"post":{"operationId":"createRender","tags":["Renders"],"summary":"Render a project","description":"Renders a saved project (just `project_id`) or a raw editor `timeline` to MP4 on the configured cloud renderer (Shotstack or Creatomate); 503 when none is configured. Features the cloud can't draw are refused with 409 DROPPED_FEATURES unless `accept_dropped` (check first with POST /renders/plan). Poll `GET /renders/{id}` or pass `webhook_url`.","x-moviepro-scope":"renders:write","x-moviepro-mcp-tool":"create_render","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRenderRequest"},"example":{"project_id":"3c2b9f1e-8a4d-4e7b-b6c5-1d0e2f3a4b5c","settings":{"format":"mp4","resolution":"1080p"},"accept_dropped":true}}}},"responses":{"202":{"description":"Accepted; the render is processing","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Render"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}},"get":{"operationId":"listRenders","tags":["Renders"],"summary":"List renders","x-moviepro-scope":"renders:read","x-moviepro-mcp-tool":"list_renders","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0}}],"responses":{"200":{"description":"Newest first","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Render"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/renders/plan":{"post":{"operationId":"planRender","tags":["Renders"],"summary":"Check a render","description":"Dry run for a project: errors that block a cloud render, editor features it would drop, warnings and the length. Nothing is submitted.","x-moviepro-scope":"renders:read","x-moviepro-mcp-tool":"check_render","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderPlanRequest"},"example":{"project_id":"3c2b9f1e-8a4d-4e7b-b6c5-1d0e2f3a4b5c"}}}},"responses":{"200":{"description":"The plan","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RenderPlan"}},"required":["data"]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/renders/{id}":{"get":{"operationId":"getRender","tags":["Renders"],"summary":"Get a render","description":"Polls the renderer; when finished, `result_url` is the stored MP4.","x-moviepro-scope":"renders:read","x-moviepro-mcp-tool":"get_render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The render","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Render"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/renders/capabilities":{"get":{"operationId":"getRenderCapabilities","tags":["Renders"],"summary":"Renderer availability","x-moviepro-scope":"renders:read","x-moviepro-mcp-tool":"get_render_capabilities","responses":{"200":{"description":"Whether cloud rendering is configured, and which formats it encodes","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"available":{"type":"boolean"},"provider":{"type":["string","null"]},"formats":{"type":"array","items":{"type":"string"}}}}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/credits":{"get":{"operationId":"getCredits","tags":["Account"],"summary":"Credit balance","x-moviepro-scope":"credits:read","x-moviepro-mcp-tool":"get_credits","responses":{"200":{"description":"Current balance","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Credits"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/models":{"get":{"operationId":"listModels","tags":["Account"],"summary":"Available models","description":"Model ids accepted by the generation endpoints.","x-moviepro-mcp-tool":"list_models","responses":{"200":{"description":"Models by type","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ModelList"}},"required":["data"]}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"mpk_…","description":"MoviePro API key (Settings → API keys)"}},"headers":{"RateLimitLimit":{"description":"Requests allowed per minute for this key","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window","schema":{"type":"integer"}},"RateLimitReset":{"description":"Unix time (seconds) when the window resets","schema":{"type":"integer"}}},"responses":{"E400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E402":{"description":"Not enough credits (INSUFFICIENT_CREDITS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E403":{"description":"Key lacks the scope (INSUFFICIENT_SCOPE), plan required (PRO_REQUIRED) or account suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E409":{"description":"Conflict: overlapping clips, a locked clip or track, a changed timeline, or features a render would drop","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E413":{"description":"File too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E422":{"description":"The input could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E429":{"description":"Rate limit exceeded; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E503":{"description":"A required service is not configured or reachable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"ClipTransform":{"type":"object","properties":{"x":{"description":"Horizontal offset of the clip's centre from the frame centre, project px","type":"number","minimum":-20000,"maximum":20000},"y":{"description":"Vertical offset from the frame centre, project px, down is positive","type":"number","minimum":-20000,"maximum":20000},"scale":{"description":"1 = fit the frame","type":"number","minimum":0.01,"maximum":20},"rotation":{"description":"Degrees","type":"number","minimum":-3600,"maximum":3600},"opacity":{"type":"number","minimum":0,"maximum":1},"blend_mode":{"type":"string","enum":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion"]}}},"ClipAudio":{"type":"object","properties":{"volume":{"description":"Percent (100 = unchanged)","type":"number","minimum":0,"maximum":150},"pan":{"type":"number","minimum":-100,"maximum":100},"muted":{"type":"boolean"},"fade_in_ms":{"type":"integer","minimum":0,"maximum":60000},"fade_out_ms":{"type":"integer","minimum":0,"maximum":60000}}},"ClipTransition":{"description":"Transition in, from the previous clip on the same track","type":"object","properties":{"type":{"type":"string","enum":["dissolve","fade","blur-dissolve","dip-black","dip-white","wipe-left","wipe-right","wipe-up","wipe-down","slide-left","slide-right","slide-up","slide-down","zoom-in","zoom-out","iris-open","iris-close"]},"duration_ms":{"type":"integer","minimum":1,"maximum":10000}},"required":["type","duration_ms"]},"TextStyle":{"type":"object","properties":{"font_family":{"type":"string","maxLength":100},"font_size":{"description":"Project px","type":"number","minimum":4,"maximum":600},"font_weight":{"description":"e.g. 400, 700, bold","type":"string","maxLength":20},"font_style":{"type":"string","enum":["normal","italic"]},"color":{"description":"CSS colour, e.g. #ffffff","type":"string","maxLength":40},"background_color":{"description":"CSS colour, or transparent","type":"string","maxLength":40},"text_align":{"type":"string","enum":["left","center","right"]},"animation":{"description":"Entrance","type":"string","enum":["none","fade-in","slide-up","slide-down","slide-left","slide-right","zoom-in","pop","typewriter"]},"animation_out":{"description":"Exit","type":"string","enum":["none","fade-out","slide-up","slide-down","slide-left","slide-right","zoom-out"]}}},"AddTrackEdit":{"type":"object","properties":{"op":{"type":"string","const":"add_track"},"ref":{"description":"Name for what this edit creates; later edits in the same request can use \"$<ref>\" as its id","type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},"type":{"type":"string","enum":["video","audio"]},"label":{"description":"Default V<n> / A<n>","type":"string","minLength":1,"maxLength":40},"index":{"description":"Position in the bottom → top list. Default: above the other tracks of its type","type":"integer","minimum":0,"maximum":200},"role":{"description":"Audio routing; voice is the dialogue stem","type":"string","enum":["voice","music","sfx","general"]}},"required":["op","type"]},"UpdateTrackEdit":{"type":"object","properties":{"op":{"type":"string","const":"update_track"},"track_id":{"type":"string","minLength":1,"maxLength":200},"label":{"type":"string","minLength":1,"maxLength":40},"muted":{"type":"boolean"},"hidden":{"description":"Video tracks: leave the picture out of preview and renders","type":"boolean"},"locked":{"type":"boolean"},"volume":{"type":"number","minimum":0,"maximum":150},"pan":{"type":"number","minimum":-100,"maximum":100},"role":{"type":"string","enum":["voice","music","sfx","general"]}},"required":["op","track_id"]},"DeleteTrackEdit":{"description":"Removes the track and every clip on it","type":"object","properties":{"op":{"type":"string","const":"delete_track"},"track_id":{"type":"string","minLength":1,"maxLength":200}},"required":["op","track_id"]},"ReorderTracksEdit":{"type":"object","properties":{"op":{"type":"string","const":"reorder_tracks"},"track_ids":{"description":"Bottom → top; unlisted tracks keep their place after these","minItems":1,"maxItems":200,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}}},"required":["op","track_ids"]},"AddClipEdit":{"type":"object","properties":{"op":{"type":"string","const":"add_clip"},"ref":{"description":"Name for what this edit creates; later edits in the same request can use \"$<ref>\" as its id","type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},"media_id":{"description":"A media library file (GET /media)","type":"string","format":"uuid"},"generation_id":{"description":"A succeeded generation (GET /generations/{id})","type":"string","format":"uuid"},"url":{"description":"Any public https file. duration_ms is required for video/audio not stored on MoviePro","type":"string","maxLength":2048,"format":"uri"},"media_type":{"description":"Needed only for a url whose type the extension doesn't show","type":"string","enum":["video","image","audio"]},"track_id":{"description":"Default: the lowest video track (video/image) or audio track (audio); created if the project has none","type":"string","minLength":1,"maxLength":200},"start_ms":{"type":"integer","minimum":0,"maximum":86400000},"placement":{"description":"exact: at start_ms, or fail with CLIP_OVERLAP if another clip is there; nearest: the free spot closest to start_ms; append: after the track's last clip. Default exact when start_ms is given, else append. Text clips sit over media and are always placed exactly.","type":"string","enum":["exact","nearest","append"]},"duration_ms":{"description":"Screen time. Default: the rest of the source after trim_start_ms (images 5000)","type":"integer","minimum":1,"maximum":86400000},"trim_start_ms":{"description":"Source time to skip at the start","type":"integer","minimum":0,"maximum":86400000},"speed":{"description":"Constant playback rate (default 1)","type":"number","minimum":0.1,"maximum":16},"name":{"type":"string","maxLength":200},"transform":{"$ref":"#/components/schemas/ClipTransform"},"audio":{"$ref":"#/components/schemas/ClipAudio"},"transition":{"$ref":"#/components/schemas/ClipTransition"}},"required":["op"]},"AddTextEdit":{"type":"object","properties":{"op":{"type":"string","const":"add_text"},"ref":{"description":"Name for what this edit creates; later edits in the same request can use \"$<ref>\" as its id","type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},"text":{"type":"string","minLength":1,"maxLength":2000},"track_id":{"description":"Default: a video track labelled \"Text\", else the top video track","type":"string","minLength":1,"maxLength":200},"start_ms":{"default":0,"type":"integer","minimum":0,"maximum":86400000},"duration_ms":{"default":3000,"type":"integer","minimum":100,"maximum":86400000},"style":{"$ref":"#/components/schemas/TextStyle"},"position":{"description":"Offset of the text's centre from the frame centre, project px (default 0,0 = centred)","type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]},"transition":{"$ref":"#/components/schemas/ClipTransition"}},"required":["op","text"]},"UpdateClipEdit":{"type":"object","properties":{"op":{"type":"string","const":"update_clip"},"clip_id":{"type":"string","minLength":1,"maxLength":200},"track_id":{"description":"Move to another track of the same type","type":"string","minLength":1,"maxLength":200},"start_ms":{"type":"integer","minimum":0,"maximum":86400000},"placement":{"description":"When moving: exact (default) fails on overlap, nearest finds room","type":"string","enum":["exact","nearest"]},"duration_ms":{"type":"integer","minimum":1,"maximum":86400000},"trim_start_ms":{"type":"integer","minimum":0,"maximum":86400000},"trim_end_ms":{"type":"integer","minimum":0,"maximum":86400000},"speed":{"type":"number","minimum":0.1,"maximum":16},"reversed":{"type":"boolean"},"disabled":{"description":"Hide the clip from preview and renders without removing it","type":"boolean"},"locked":{"type":"boolean"},"name":{"type":"string","maxLength":200},"transform":{"description":"Merged into the clip's transform","$ref":"#/components/schemas/ClipTransform"},"audio":{"description":"Merged into the clip's audio settings","$ref":"#/components/schemas/ClipAudio"},"transition":{"description":"null removes the transition","anyOf":[{"$ref":"#/components/schemas/ClipTransition"},{"type":"null"}]},"text":{"description":"Text clips only","type":"string","minLength":1,"maxLength":2000},"style":{"description":"Text clips only; merged","$ref":"#/components/schemas/TextStyle"}},"required":["op","clip_id"]},"SplitClipEdit":{"type":"object","properties":{"op":{"type":"string","const":"split_clip"},"ref":{"description":"Name for the right-hand part (the left part keeps the clip id)","type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},"clip_id":{"type":"string","minLength":1,"maxLength":200},"at_ms":{"description":"Timeline time inside the clip","type":"integer","minimum":0,"maximum":86400000}},"required":["op","clip_id","at_ms"]},"DeleteClipEdit":{"type":"object","properties":{"op":{"type":"string","const":"delete_clip"},"clip_id":{"type":"string","minLength":1,"maxLength":200},"ripple":{"description":"Close the gap: move the later clips on the track left","type":"boolean"}},"required":["op","clip_id"]},"TimelineEdit":{"anyOf":[{"$ref":"#/components/schemas/AddTrackEdit"},{"$ref":"#/components/schemas/UpdateTrackEdit"},{"$ref":"#/components/schemas/DeleteTrackEdit"},{"$ref":"#/components/schemas/ReorderTracksEdit"},{"$ref":"#/components/schemas/AddClipEdit"},{"$ref":"#/components/schemas/AddTextEdit"},{"$ref":"#/components/schemas/UpdateClipEdit"},{"$ref":"#/components/schemas/SplitClipEdit"},{"$ref":"#/components/schemas/DeleteClipEdit"}]},"TimelineEditsRequest":{"type":"object","properties":{"edits":{"description":"Applied in order, all or none","minItems":1,"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/TimelineEdit"}},"expected_seq":{"description":"Fail with 409 TIMELINE_CHANGED unless the timeline is still at this seq (from GET …/timeline)","type":"integer","minimum":0}},"required":["edits"]},"AddTrackBody":{"type":"object","properties":{"type":{"type":"string","enum":["video","audio"]},"label":{"description":"Default V<n> / A<n>","type":"string","minLength":1,"maxLength":40},"index":{"description":"Position in the bottom → top list. Default: above the other tracks of its type","type":"integer","minimum":0,"maximum":200},"role":{"description":"Audio routing; voice is the dialogue stem","type":"string","enum":["voice","music","sfx","general"]}},"required":["type"]},"UpdateTrackBody":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":40},"muted":{"type":"boolean"},"hidden":{"description":"Video tracks: leave the picture out of preview and renders","type":"boolean"},"locked":{"type":"boolean"},"volume":{"type":"number","minimum":0,"maximum":150},"pan":{"type":"number","minimum":-100,"maximum":100},"role":{"type":"string","enum":["voice","music","sfx","general"]}}},"AddClipBody":{"type":"object","properties":{"media_id":{"description":"A media library file (GET /media)","type":"string","format":"uuid"},"generation_id":{"description":"A succeeded generation (GET /generations/{id})","type":"string","format":"uuid"},"url":{"description":"Any public https file. duration_ms is required for video/audio not stored on MoviePro","type":"string","maxLength":2048,"format":"uri"},"media_type":{"description":"Needed only for a url whose type the extension doesn't show","type":"string","enum":["video","image","audio"]},"track_id":{"description":"Default: the lowest video track (video/image) or audio track (audio); created if the project has none","type":"string","minLength":1,"maxLength":200},"start_ms":{"type":"integer","minimum":0,"maximum":86400000},"placement":{"description":"exact: at start_ms, or fail with CLIP_OVERLAP if another clip is there; nearest: the free spot closest to start_ms; append: after the track's last clip. Default exact when start_ms is given, else append. Text clips sit over media and are always placed exactly.","type":"string","enum":["exact","nearest","append"]},"duration_ms":{"description":"Screen time. Default: the rest of the source after trim_start_ms (images 5000)","type":"integer","minimum":1,"maximum":86400000},"trim_start_ms":{"description":"Source time to skip at the start","type":"integer","minimum":0,"maximum":86400000},"speed":{"description":"Constant playback rate (default 1)","type":"number","minimum":0.1,"maximum":16},"name":{"type":"string","maxLength":200},"transform":{"$ref":"#/components/schemas/ClipTransform"},"audio":{"$ref":"#/components/schemas/ClipAudio"},"transition":{"$ref":"#/components/schemas/ClipTransition"}}},"AddTextBody":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":2000},"track_id":{"description":"Default: a video track labelled \"Text\", else the top video track","type":"string","minLength":1,"maxLength":200},"start_ms":{"default":0,"type":"integer","minimum":0,"maximum":86400000},"duration_ms":{"default":3000,"type":"integer","minimum":100,"maximum":86400000},"style":{"$ref":"#/components/schemas/TextStyle"},"position":{"description":"Offset of the text's centre from the frame centre, project px (default 0,0 = centred)","type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]},"transition":{"$ref":"#/components/schemas/ClipTransition"}},"required":["text"]},"UpdateClipBody":{"type":"object","properties":{"track_id":{"description":"Move to another track of the same type","type":"string","minLength":1,"maxLength":200},"start_ms":{"type":"integer","minimum":0,"maximum":86400000},"placement":{"description":"When moving: exact (default) fails on overlap, nearest finds room","type":"string","enum":["exact","nearest"]},"duration_ms":{"type":"integer","minimum":1,"maximum":86400000},"trim_start_ms":{"type":"integer","minimum":0,"maximum":86400000},"trim_end_ms":{"type":"integer","minimum":0,"maximum":86400000},"speed":{"type":"number","minimum":0.1,"maximum":16},"reversed":{"type":"boolean"},"disabled":{"description":"Hide the clip from preview and renders without removing it","type":"boolean"},"locked":{"type":"boolean"},"name":{"type":"string","maxLength":200},"transform":{"description":"Merged into the clip's transform","$ref":"#/components/schemas/ClipTransform"},"audio":{"description":"Merged into the clip's audio settings","$ref":"#/components/schemas/ClipAudio"},"transition":{"description":"null removes the transition","anyOf":[{"$ref":"#/components/schemas/ClipTransition"},{"type":"null"}]},"text":{"description":"Text clips only","type":"string","minLength":1,"maxLength":2000},"style":{"description":"Text clips only; merged","$ref":"#/components/schemas/TextStyle"}}},"SplitClipBody":{"type":"object","properties":{"at_ms":{"description":"Timeline time inside the clip","type":"integer","minimum":0,"maximum":86400000}},"required":["at_ms"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"description":"Stable machine-readable code, e.g. INSUFFICIENT_CREDITS","type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]},"credits_required":{"description":"Present on 402 INSUFFICIENT_CREDITS","type":"integer"}},"required":["error"]},"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["limit","offset","has_more"]},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["draft","in-progress","review","completed","archived"]},{"type":"null"}]},"duration":{"anyOf":[{"type":"number"},{"type":"null"}]},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"is_favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"settings":{"description":"Full project only","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"tracks":{"description":"Full project only: the editor timeline tracks","type":"array","items":{}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","description","status","duration","is_favorite","created_at","updated_at"]},"CreateProject":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":500},"duration":{"description":"Seconds","type":"integer","minimum":0,"maximum":86400},"bpm":{"type":"integer","minimum":1,"maximum":400},"aspect_ratio":{"description":"Sets the resolution (16:9 → 1920×1080, 9:16 → 1080×1920, …). Default 16:9","type":"string","enum":["16:9","9:16","1:1","4:5","4:3","21:9"]},"frame_rate":{"description":"Default 30","type":"integer","minimum":12,"maximum":120},"settings":{"description":"Raw editor settings, merged over the defaults","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"tracks":{"description":"Raw editor tracks. Default: V1, V2, Text, A1, A2. Prefer the timeline edit endpoints","type":"array","items":{}}},"required":["name"]},"UpdateProject":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"status":{"type":"string","enum":["draft","in-progress","review","completed","archived"]},"duration":{"type":"integer","minimum":0,"maximum":86400},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"tracks":{"type":"array","items":{}},"is_favorite":{"type":"boolean"}}},"Media":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"file_name":{"type":"string"},"url":{"description":"Public URL of the file","anyOf":[{"type":"string"},{"type":"null"}]},"mime_type":{"type":"string"},"file_size":{"type":"number"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}]},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"is_folder":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"created_at":{"type":"string"}},"required":["id","file_name","url","mime_type","file_size","duration","width","height","is_folder","created_at"]},"ImportMedia":{"type":"object","properties":{"url":{"description":"Public http(s) URL of a video, audio or image file (max 500 MB)","type":"string","format":"uri"},"file_name":{"description":"Defaults to the URL's last path segment","type":"string","minLength":1,"maxLength":200}},"required":["url"]},"ReferenceImage":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"label":{"type":"string","maxLength":120},"view":{"description":"e.g. front, side, back","type":"string","maxLength":60}},"required":["url"]},"Element":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["character","location","prop","style"]},"name":{"type":"string"},"description":{"type":"string"},"reference_images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"source":{"type":"string"},"label":{"type":"string"},"view":{"type":"string"}},"required":["url","source"]}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","kind","name","description","reference_images","created_at","updated_at"]},"CreateElement":{"type":"object","properties":{"kind":{"type":"string","enum":["character","location","prop","style"]},"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":4000},"reference_images":{"maxItems":12,"type":"array","items":{"$ref":"#/components/schemas/ReferenceImage"}},"project_ids":{"description":"Link the element to these projects (the shot planner only uses a project's linked elements)","maxItems":20,"type":"array","items":{"type":"string","format":"uuid"}}},"required":["kind","name"]},"UpdateElement":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":4000},"reference_images":{"description":"Replaces the list","maxItems":12,"type":"array","items":{"$ref":"#/components/schemas/ReferenceImage"}}}},"ElementProjectLink":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid"}},"required":["project_id"]},"VideoGenerationRequest":{"type":"object","properties":{"prompt":{"description":"Required for text-to-video","type":"string","maxLength":4000},"model":{"description":"Video model id from GET /v1/models (e.g. seedance-2.5). Omit for the default cascade.","type":"string"},"mode":{"type":"string","enum":["text-to-video","image-to-video","first-last-frame","reference-to-video"]},"duration":{"description":"Seconds (default 5). -1 lets Seedance 2.5 choose.","type":"integer","minimum":-1,"maximum":60},"aspect_ratio":{"description":"e.g. 16:9, 9:16, 1:1","type":"string","maxLength":10},"resolution":{"description":"e.g. 720p, 1080p","type":"string","maxLength":10},"image_url":{"description":"Start frame (image-to-video, first-last-frame)","type":"string","format":"uri"},"last_frame_image_url":{"type":"string","format":"uri"},"reference_image_urls":{"maxItems":9,"type":"array","items":{"type":"string","format":"uri"}},"reference_video_urls":{"maxItems":3,"type":"array","items":{"type":"string","format":"uri"}},"reference_audio_urls":{"maxItems":3,"type":"array","items":{"type":"string","format":"uri"}},"generate_audio":{"type":"boolean"},"camera_fixed":{"type":"boolean"},"camera":{"description":"Camera direction; a shot plan's shot.camera can be passed as is","type":"object","properties":{"shotSize":{"type":"string","enum":["extreme-wide","wide","full","medium-wide","medium","medium-close","close-up","extreme-close-up","over-the-shoulder","two-shot","pov","insert"]},"angle":{"type":"string","enum":["eye-level","high","low","overhead","birds-eye","worms-eye","dutch","shoulder-level"]},"movement":{"type":"string","enum":["static","dolly-in","dolly-out","pan-left","pan-right","tilt-up","tilt-down","truck-left","truck-right","orbit-left","orbit-right","crane-up","crane-down","tracking","handheld","zoom-in","zoom-out"]},"lens":{"type":"string","enum":["14mm","24mm","35mm","50mm","85mm","135mm","200mm"]},"anamorphic":{"type":"boolean"},"speed":{"type":"string","enum":["slow","medium","fast"]}}},"seed":{"type":"integer"},"save_to_library":{"description":"Add the result to the media library (default true)","type":"boolean"},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}}},"ImageGenerationRequest":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":4000},"model":{"description":"Image model id from GET /v1/models (default gemini-2.5-flash-image)","type":"string"},"aspect_ratio":{"type":"string","enum":["1:1","16:9","9:16","4:3","3:4","3:2","2:3"]},"hd":{"description":"HD output, +1 credit","type":"boolean"},"reference_image_urls":{"description":"Gemini only","maxItems":4,"type":"array","items":{"type":"string","format":"uri"}},"save_to_library":{"type":"boolean"},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}},"required":["prompt"]},"MusicGenerationRequest":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":2000},"model":{"description":"Default stable-audio-2.5. minimax-music-1.5 sings (with lyrics).","type":"string","enum":["stable-audio-2.5","musicgen","minimax-music-1.5"]},"duration":{"description":"Seconds (default 30)","anyOf":[{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":120}]},"genre":{"type":"string","maxLength":60},"mood":{"type":"string","maxLength":60},"instrumental":{"type":"boolean"},"lyrics":{"description":"minimax-music-1.5 only; written for you when omitted","type":"string","maxLength":600},"save_to_library":{"type":"boolean"},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}},"required":["prompt"]},"SpeechGenerationRequest":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000},"voice_id":{"description":"Prefixed voice id, e.g. \"minimax:English_Wiselady\" or \"elevenlabs:<id>\"","type":"string","maxLength":200},"speed":{"type":"number","minimum":0.5,"maximum":2},"emotion":{"type":"string","maxLength":30},"language":{"description":"ISO 639-1","type":"string","pattern":"^[a-z]{2}$"},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}},"required":["text"]},"SoundEffectGenerationRequest":{"type":"object","properties":{"prompt":{"description":"The sound, e.g. \"rain on a tin roof, distant thunder\"","type":"string","minLength":1,"maxLength":500},"duration":{"description":"Seconds (default 5)","type":"number","minimum":1,"maximum":30},"provider":{"description":"Default stable-audio","type":"string","enum":["stable-audio","elevenlabs"]},"loop":{"description":"Seamless loop (elevenlabs)","type":"boolean"},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}},"required":["prompt"]},"Generation":{"type":"object","properties":{"id":{"description":"Generation id; poll GET /v1/generations/{id}","type":"string","format":"uuid"},"object":{"type":"string","const":"generation"},"type":{"type":"string","enum":["video","image","music","speech","sound_effect"]},"status":{"type":"string","enum":["queued","processing","succeeded","failed"]},"result":{"description":"On success: url plus type-specific fields (media_file_id, duration, provider, …)","anyOf":[{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":{}},{"type":"null"}]},"error":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]},{"type":"null"}]},"generation_id":{"description":"The AI history record (video, image, music)","anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"credits_charged":{"type":"integer"},"credits_refunded":{"type":"boolean"},"webhook":{"anyOf":[{"type":"object","properties":{"url":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["pending","delivered","failed"]},{"type":"null"}]},"attempts":{"type":"integer"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["url","status","attempts","last_error"]},{"type":"null"}]},"created_at":{"type":"string"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","object","type","status","result","error","generation_id","credits_charged","credits_refunded","webhook","created_at","completed_at"]},"CreateRenderRequest":{"type":"object","properties":{"project_id":{"description":"Render this saved project's timeline (when `timeline` is omitted), and file the render under it","type":"string","format":"uuid"},"range":{"description":"Render only this part of the timeline","type":"object","properties":{"start_ms":{"type":"integer","minimum":0},"end_ms":{"type":"integer","exclusiveMinimum":0}},"required":["start_ms","end_ms"]},"accept_dropped":{"description":"Editor features the cloud renderer can't draw are refused (409 DROPPED_FEATURES) unless accepted: true, or the feature ids from POST /renders/plan","anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"timeline":{"description":"A raw editor timeline. Omit it and pass project_id to render a saved project","type":"object","properties":{"tracks":{"description":"Editor tracks: [{ id, type: video|audio, clips: [{ mediaId, startTime, duration, … }] }]","type":"array","items":{}},"mediaItems":{"description":"[{ id, url, type, duration }] referenced by clips","type":"array","items":{}},"width":{"type":"integer","exclusiveMinimum":0},"height":{"type":"integer","exclusiveMinimum":0},"duration":{"type":"number","exclusiveMinimum":0}},"required":["tracks"]},"settings":{"default":{"format":"mp4","resolution":"1080p"},"type":"object","properties":{"format":{"description":"mp4 (or what GET /v1/renders/capabilities lists)","default":"mp4","type":"string"},"resolution":{"default":"1080p","type":"string","enum":["720p","1080p","4k"]},"quality":{"type":"number","minimum":1,"maximum":100},"frame_rate":{"type":"number","exclusiveMinimum":0,"maximum":120}}},"webhook_url":{"description":"Public https URL. MoviePro POSTs a signed event here when the job finishes.","type":"string","maxLength":2048,"format":"uri"}}},"RenderPlanRequest":{"type":"object","properties":{"project_id":{"description":"The saved project to check","type":"string","format":"uuid"},"range":{"description":"Render only this part of the timeline","type":"object","properties":{"start_ms":{"type":"integer","minimum":0},"end_ms":{"type":"integer","exclusiveMinimum":0}},"required":["start_ms","end_ms"]},"accept_dropped":{"description":"Editor features the cloud renderer can't draw are refused (409 DROPPED_FEATURES) unless accepted: true, or the feature ids from POST /renders/plan","anyOf":[{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"settings":{"default":{"format":"mp4","resolution":"1080p"},"type":"object","properties":{"format":{"description":"mp4 (or what GET /v1/renders/capabilities lists)","default":"mp4","type":"string"},"resolution":{"default":"1080p","type":"string","enum":["720p","1080p","4k"]},"quality":{"type":"number","minimum":1,"maximum":100},"frame_rate":{"type":"number","exclusiveMinimum":0,"maximum":120}}}},"required":["project_id"]},"RenderPlan":{"type":"object","properties":{"ok":{"description":"False when errors block a cloud render","type":"boolean"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}]},"errors":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"dropped":{"description":"Features the render will leave out; pass their `feature` ids as accept_dropped","type":"array","items":{"type":"object","properties":{"feature":{"type":"string"},"label":{"type":"string"},"clips":{"type":"array","items":{"type":"string"}}},"required":["feature","label","clips"]}},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["ok","provider","errors","warnings","dropped","duration_seconds"]},"Render":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"render"},"status":{"type":"string","enum":["pending","processing","completed","failed","cancelled"]},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}]},"provider":{"type":"string"},"result_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"error":{"anyOf":[{"type":"object","properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["code","message"]},{"type":"null"}]},"warnings":{"type":"array","items":{"type":"string"}},"project_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"created_at":{"type":"string"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","object","status","progress","provider","result_url","error","created_at","completed_at"]},"Timeline":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid"},"seq":{"description":"Version of the timeline; pass as expected_seq to edit only if nobody changed it","type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"frame_rate":{"type":"number"},"duration_ms":{"type":"integer"},"tracks":{"description":"Bottom → top: later tracks draw over earlier ones","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["video","audio"]},"label":{"type":"string"},"muted":{"type":"boolean"},"hidden":{"type":"boolean"},"locked":{"type":"boolean"},"clips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["media","audio","text","adjustment"]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"start_ms":{"type":"number"},"duration_ms":{"type":"number"},"end_ms":{"type":"number"},"trim_start_ms":{"type":"number"},"trim_end_ms":{"type":"number"},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"editor":{"description":"The clip exactly as the editor stores it","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","kind","name","start_ms","duration_ms","end_ms","trim_start_ms","trim_end_ms","media_id","url","editor"],"additionalProperties":{}}}},"required":["id","type","label","muted","hidden","locked","clips"],"additionalProperties":{}}}},"required":["project_id","seq","width","height","frame_rate","duration_ms","tracks"]},"TimelineEditResult":{"type":"object","properties":{"timeline":{"$ref":"#/components/schemas/Timeline"},"results":{"description":"One per edit: the ids it created or changed","type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"op":{"type":"string"},"track_id":{"type":"string"},"clip_id":{"type":"string"},"new_clip_id":{"type":"string"},"start_ms":{"type":"number"},"duration_ms":{"type":"number"}},"required":["index","op"]}}},"required":["timeline","results"]},"ScriptRequest":{"type":"object","properties":{"prompt":{"description":"What the film is about","type":"string","minLength":1,"maxLength":4000},"type":{"type":"string","enum":["short","commercial","documentary","narrative"]},"duration":{"type":"string","enum":["30sec","1min","2min","5min"]},"tone":{"type":"string","enum":["dramatic","comedic","inspirational","informative"]}},"required":["prompt"]},"BreakdownRequest":{"type":"object","properties":{"script":{"description":"A screenplay, or one scene's description with mode scene","type":"string","minLength":1,"maxLength":120000},"mode":{"description":"script (default): the whole screenplay; scene: coverage for one scene","type":"string","enum":["script","scene"]},"pacing":{"description":"Editing pace; sizes the coverage (default standard)","type":"string","enum":["slow","measured","standard","fast","rapid"]},"scene_number":{"description":"scene mode","type":"integer","minimum":1},"scene_heading":{"description":"scene mode","type":"string","maxLength":200},"scene_seconds":{"description":"scene mode: the scene's screen time","type":"number","minimum":1,"maximum":1800}},"required":["script"]},"ShotPlanRequest":{"type":"object","properties":{"concept":{"description":"A brief: what happens, for whom, the feel","type":"string","maxLength":4000},"script":{"description":"A screenplay to shoot","type":"string","maxLength":60000},"shots":{"description":"An existing shot list (e.g. from POST /scripts/breakdown) to direct","maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"scene":{"type":"integer","minimum":1},"shot":{"type":"string","maxLength":20},"description":{"type":"string","maxLength":600},"cast":{"type":"string","maxLength":200},"notes":{"type":"string","maxLength":300},"type":{"type":"string","maxLength":20},"move":{"type":"string","maxLength":20},"lens":{"type":"string","maxLength":20},"duration_seconds":{"type":"number","minimum":1,"maximum":60}},"required":["id","scene","shot","description"]}},"target_seconds":{"description":"Film length (default 60)","type":"number","minimum":5,"maximum":900},"style":{"description":"e.g. \"Cinematic noir, 35mm film grain\"","type":"string","maxLength":200},"pacing":{"type":"string","enum":["slow","measured","standard","fast","rapid"]},"aspect_ratio":{"type":"string","maxLength":10},"model_id":{"description":"Video model the shots are for; durations are fitted to it","type":"string","maxLength":80},"element_ids":{"description":"Limit to these elements","maxItems":60,"type":"array","items":{"type":"string","format":"uuid"}},"project_id":{"description":"Use the elements linked to this project","type":"string","format":"uuid"}}},"Credits":{"type":"object","properties":{"balance":{"description":"Total credits available","type":"number"},"balances":{"description":"Per credit type, as reported by the billing service","type":"array","items":{}}},"required":["balance","balances"]},"ModelList":{"type":"object","properties":{"video":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"modes":{"type":"array","items":{"type":"string"}},"durations":{"type":"string"},"resolutions":{"type":"array","items":{"type":"string"}},"aspect_ratios":{"type":"array","items":{"type":"string"}}},"required":["id","label","modes","durations","resolutions","aspect_ratios"]}},"image":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"credits":{"type":"number"},"aspect_ratios":{"type":"array","items":{"type":"string"}},"reference_images":{"type":"boolean"}},"required":["id","label","credits","aspect_ratios","reference_images"]}},"music":{"type":"array","items":{"type":"string"}}},"required":["video","image","music"]}}},"x-moviepro":{"rateLimit":{"requestsPerMinute":120,"window":"fixed, 60 s, per API key"},"scopes":["all","projects:read","projects:write","media:read","media:write","elements:read","elements:write","generations:read","generations:write","renders:read","renders:write","credits:read"],"webhooks":{"events":["generation.succeeded","generation.failed","render.succeeded","render.failed"],"signatureHeader":"MoviePro-Signature","signatureFormat":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `${t}.${raw body}` keyed with the API key's webhook secret>","retries":"Up to 6 attempts: immediately, then after 1 m, 5 m, 30 m, 2 h and 6 h. A 2xx within 10 s counts as delivered."}}}