{"openapi":"3.1.0","info":{"title":"Simpled.ai Video Generation API","description":"Generate multi-scene whiteboard animation videos from a topic, a script, or an\nuploaded document. This is the Simpled.ai video **generation** API.\n\nProduct facts — capabilities, pricing, solutions, guides — live on a separate,\nunauthenticated API at <https://simpled.ai/api/v1>, described by\n<https://simpled.ai/api/v1/openapi.json>. Read that one first if you only need\nto know what the product can do; it costs nothing and needs no key.\n\n## Authentication\n\nSend an API key in the `X-API-Key` header. Keys are stored only as a SHA-256\nhash and are shown once, at creation. Request one at manav@simpled.ai.\n\n## How generation works\n\nRendering is asynchronous, because a single video runs several models and a\nvideo render:\n\n1. `POST /v1.7/projects` — returns a `project_id` immediately with 202.\n2. `GET /projects/{project_id}` — poll until `status` is `completed` or `failed`.\n3. `GET /projects/{project_id}/video` — fetch the finished MP4.\n\nEach minute of finished video costs one credit.\n\n## Video length\n\n`duration_seconds` sets the target length. Leave `duration_mode` at its default\n(`manual`) and that number is the target. Send `\"duration_mode\": \"auto\"` and the\nlength is chosen for you: the pipeline reads the topic — and the source document,\nif you sent one — and picks the shortest length that covers the material, from\n30/60/120/180/300/600 seconds. Send `duration_seconds` alongside `auto` only if\nyou want a ceiling on what it may choose.\n\n`POST /v1.7/suggest-duration` returns that same judgement on its own, so you can\nresolve the number before creating the project — useful when you need to price or\nconfirm the render up front.\n\n## Building a video from a document\n\nPut the document's text in `source_document` (and its file name in\n`source_document_name`) rather than in `topic`. That switches the planner into\nstrict transformation mode: every point in the document reaches the narration, in\nthe document's own order, with nothing added, dropped, merged, or reworded in a way\nthat changes meaning — modal verbs, numbers, thresholds, names, and exceptions are\ncarried through as written. `topic` is then read as framing instruction only.\nPair it with `\"duration_mode\": \"auto\"` so the video is long enough to say all of it.\n\n## Rate limits\n\nLimits on this API are per-key and agreed when a key is issued; there is no\npublished anonymous quota, and no rate-limit headers are emitted here.\n\nIf you want machine-readable rate-limit signalling, the public product API at\n<https://simpled.ai/api/v1> publishes it: `RateLimit` and `RateLimit-Policy`\n(draft-ietf-httpapi-ratelimit-headers-11 — an Internet-Draft, not an RFC)\nalongside the de-facto `X-RateLimit-*` trio, with 429 responses carrying\n`Retry-After` and an RFC 9457 problem document.\n\nPlease do not run automated scans against this host. Every generation request\nspends real compute and real third-party API budget, and creates a job a human\nis billed for.\n\n## Versioning and deprecation\n\nVersions are path segments; `/v1.7` is current and `/motion/v0` is a separate\nbeta pipeline. A breaking change ships under a new segment rather than altering\nan existing one in place. Additive changes are not breaking and ship without a\nversion bump.\n\nA version is announced deprecated at least 12 months\nbefore it stops responding. The announcement is carried by:\n\n- `Deprecation` (RFC 9745) — a Structured Fields Date, e.g. `@1788220799`.\n- `Sunset` (RFC 8594) — an HTTP-date, e.g. `Wed, 30 Dec 2026 23:59:59 GMT`.\n  Never earlier than the `Deprecation` value.\n- `Link` with `rel=\"deprecation\"`, which is sent on **every** response —\n  including undeprecated ones — so the policy is discoverable before anything\n  is retired. `rel=\"sunset\"` is added once a retirement date is fixed.\n- `deprecated: true` on the affected operations in this description.\n\nWritten policy: <https://simpled.ai/docs#versioning-and-deprecation>\n","termsOfService":"https://simpled.ai/privacy","contact":{"name":"Simpled.ai support","url":"https://simpled.ai/contact","email":"manav@simpled.ai"},"license":{"name":"Proprietary","url":"https://simpled.ai/privacy"},"version":"1.7.0"},"servers":[{"url":"https://api.simpled.ai","description":"Production"}],"paths":{"/":{"get":{"summary":"API Documentation Landing Page","description":"Serves the main API documentation interface.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/projects":{"post":{"summary":"Create Project","description":"Create a new video project. Returns immediately; poll for status.","operationId":"create_project_projects_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Projects","description":"List projects with their current status, filtered by user_email.","operationId":"list_projects_projects_get","parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectStatusResponse"},"title":"Response List Projects Projects Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}":{"get":{"summary":"Get Project Status","description":"Poll project status + progress percentage.","operationId":"get_project_status_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Project","description":"Delete a project and its generated files (S3 + local + DB).","operationId":"delete_project_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/video/presigned":{"get":{"summary":"Get Presigned Video Urls","description":"Return presigned S3 URLs for all videos of a project (admin use).","operationId":"get_presigned_video_urls_projects__project_id__video_presigned_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/video/{model_name}":{"get":{"summary":"Download Video For Model","description":"Redirect to presigned S3 URL for a specific model's video.","operationId":"download_video_for_model_projects__project_id__video__model_name__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"model_name","in":"path","required":true,"schema":{"type":"string","title":"Model Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/video":{"get":{"summary":"Download Video","description":"Redirect to S3 video URL (available once status = completed).","operationId":"download_video_projects__project_id__video_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.1/projects":{"post":{"summary":"Create Project V11","description":"Create a video using v1.1 pipeline (SAM 3, no magenta borders, multiple animations).","operationId":"create_project_v11_v1_1_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.1/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace","description":"Get the pipeline trace for a v1.1 project.\nReturns the trace summary and links to all intermediate artifacts.","operationId":"get_project_trace_v1_1_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.1/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact","description":"Serve a specific trace artifact (image, JSON, audio).","operationId":"serve_trace_artifact_v1_1_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.2/projects":{"post":{"summary":"Create Project V12","description":"Create a video using v1.2 pipeline.\n\nv1.2 features:\n- User provides topic + duration_seconds (instead of num_scenes/components_per_scene)\n- LLM plans frames with explicitly typed components: text (with optional underline) or illustration\n- Image prompts are auto-constructed from structured component data\n- Illustration animation: 3-phase contour reveal (outlines → details → fills)\n- Text animation: left-to-right sketch reveal","operationId":"create_project_v12_v1_2_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV12"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.2/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V12","description":"Get the full pipeline trace for a v1.2 project.\nReturns summary (timing, step log) + artifact tree with URLs.","operationId":"get_project_trace_v12_v1_2_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.2/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V12","description":"Serve a specific v1.2 trace artifact (image, JSON, audio).","operationId":"serve_trace_artifact_v12_v1_2_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.3/projects":{"post":{"summary":"Create Project V13","description":"Create a video using v1.3 pipeline.\n\nv1.3 features (same as v1.2 except text animation):\n- Text animation: per-letter potrace SVG reveal (outline draws in, fill fades in)\n- Illustration animation: 3-phase contour reveal (unchanged from v1.2)","operationId":"create_project_v13_v1_3_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV13"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.3/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V13","description":"Get the full pipeline trace for a v1.3 project.","operationId":"get_project_trace_v13_v1_3_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.3/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V13","description":"Serve a specific v1.3 trace artifact.","operationId":"serve_trace_artifact_v13_v1_3_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.4/projects":{"post":{"summary":"Create Project V14","description":"Create a video using v1.4 pipeline.\n\nv1.4 features (same as v1.3 + visual styles):\n- style: 'whiteboard_black_n_white' (classic) or 'whiteboard_colored' (color marker)\n- Text animation: per-letter skeleton reveal\n- Illustration animation: 3-phase contour reveal","operationId":"create_project_v14_v1_4_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV14"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.4/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V14","description":"Get the full pipeline trace for a v1.4 project.\nFalls back to S3 if local trace directory doesn't exist (e.g. generated on a different instance).","operationId":"get_project_trace_v14_v1_4_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.4/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V14","description":"Serve a specific v1.4 trace artifact.","operationId":"serve_trace_artifact_v14_v1_4_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys":{"post":{"summary":"Admin Create Api Key","description":"Create a new API key. Returns the plaintext key — store it, it won't be shown again.","operationId":"admin_create_api_key_admin_api_keys_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"x-admin-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Secret"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Admin List Api Keys","description":"List all API keys (hashes are never returned).","operationId":"admin_list_api_keys_admin_api_keys_get","parameters":[{"name":"x-admin-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys/{key_id}":{"delete":{"summary":"Admin Revoke Api Key","description":"Revoke an API key by ID.","operationId":"admin_revoke_api_key_admin_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.5/projects":{"post":{"summary":"Create Project V15","description":"Create a video using v1.5 pipeline.\n\nv1.5 features (v1.4 + multi-language):\n- language_code: generate narration in 29 languages (Indian + international)\n  Indian: hi, mr, te, ta, kn, bn, gu, pa, ml, or, ur\n  International: en, es, fr, de, pt, ar, ja, ko, zh, it, nl, ru, tr, pl, vi, id, th, uk\n- Text animation: per-letter skeleton reveal (same as v1.4)\n- Illustration animation: 3-phase contour reveal (same as v1.4)\n- All helpers self-contained inside pipeline_v15/ — no shared pipeline dependencies","operationId":"create_project_v15_v1_5_projects_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV15"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.5/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V15","description":"Get the full pipeline trace for a v1.5 project.","operationId":"get_project_trace_v15_v1_5_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.5/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V15","description":"Serve a specific v1.5 trace artifact.","operationId":"serve_trace_artifact_v15_v1_5_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.6/projects":{"post":{"summary":"Create Project V16","description":"Create a video using v1.6 pipeline.\n\nv1.6 features (v1.5 + embedded-text reveal fix):\n- language_code: generate narration in 29 languages (Indian + international)\n- Text animation: per-letter skeleton reveal\n- Illustration animation: 3-phase contour reveal + embedded-text column wipe\n  (text labels / annotations inside illustrations animate naturally)\n- All helpers self-contained inside pipeline_v16/","operationId":"create_project_v16_v1_6_projects_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV15"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.6/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V16","description":"Get the full pipeline trace for a v1.6 project.","operationId":"get_project_trace_v16_v1_6_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.6/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V16","description":"Serve a specific v1.6 trace artifact.","operationId":"serve_trace_artifact_v16_v1_6_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/projects":{"post":{"summary":"Create Project V17","description":"Create a video using v1.7 pipeline.\n\nv1.7 is a standalone copy of v1.6 with zero shared pipeline code:\n- All helpers self-contained inside pipeline_v17/\n- No imports from pipeline/, pipeline_v11/.../pipeline_v16/","operationId":"create_project_v17_v1_7_projects_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequestV15"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/suggest-duration":{"post":{"summary":"Suggest Duration V17","description":"Ask the pipeline how long this video should be.\n\nThe same judgement `duration_mode=\"auto\"` makes internally, exposed on its own\nso a caller that needs the number up front — to price the render, or to show\nthe user what they are about to get — can resolve it before creating the\nproject, then pass it back as a plain `duration_seconds`.","operationId":"suggest_duration_v17_v1_7_suggest_duration_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestDurationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestDurationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/prompts":{"get":{"summary":"List Prompts V17","description":"Every editable v1.7 prompt, with its default and this owner's override.","operationId":"list_prompts_v17_v1_7_prompts_get","parameters":[{"name":"owner_email","in":"query","required":true,"schema":{"type":"string","title":"Owner Email"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/prompts/{template_id}":{"put":{"summary":"Save Prompt V17","description":"Save an override for one prompt, for one owner. Rejected unless it renders.","operationId":"save_prompt_v17_v1_7_prompts__template_id__put","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptSaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Reset Prompt V17","description":"Drop this owner's override so the prompt goes back to the shipped default.","operationId":"reset_prompt_v17_v1_7_prompts__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}},{"name":"owner_email","in":"query","required":true,"schema":{"type":"string","title":"Owner Email"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/prompts/{template_id}/preview":{"post":{"summary":"Preview Prompt V17","description":"Render a draft against sample values — the exact text the model would receive.","operationId":"preview_prompt_v17_v1_7_prompts__template_id__preview_post","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace V17","description":"Get the full pipeline trace for a v1.7 project.","operationId":"get_project_trace_v17_v1_7_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1.7/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact V17","description":"Serve a specific v1.7 trace artifact.","operationId":"serve_trace_artifact_v17_v1_7_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/projects":{"post":{"summary":"Create Project Wb Beta","description":"Create a narrated whiteboard explainer with the beta vector pipeline (pipeline_wb).\n\nSame request surface as motion v0. Poll GET /projects/{id}; artifacts, cost and timings at\nGET /beta/wb/projects/{id}/report and /trace.","operationId":"create_project_wb_beta_beta_wb_projects_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMotionProjectRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/projects/{project_id}/report":{"get":{"summary":"Get Wb Beta Report","description":"Cost, usage and stage timings for a beta run (written by pipeline_wb at the end).","operationId":"get_wb_beta_report_beta_wb_projects__project_id__report_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/projects/{project_id}/video":{"get":{"summary":"Get Wb Beta Video","description":"Local fallback when S3 is not configured.","operationId":"get_wb_beta_video_beta_wb_projects__project_id__video_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/projects/{project_id}/trace":{"get":{"summary":"Get Wb Beta Trace","description":"Trace listing for a whiteboard-beta run. Falls back to S3 the way motion v0 does, so a\nrun archived on another host (or after this container's disk was replaced) is still\ninspectable.","operationId":"get_wb_beta_trace_beta_wb_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Wb Beta Artifact","operationId":"serve_wb_beta_artifact_beta_wb_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/beta/wb/icons":{"get":{"summary":"Get Wb Beta Icons","description":"Icon artwork (viewBox, outline, full) for the browser-side whiteboard player.","operationId":"get_wb_beta_icons_beta_wb_icons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/motion/v0/projects":{"post":{"summary":"Create Project Motion V0","description":"Create a motion graphics video using the v0 vector pipeline.\n\nProduces a video composed of animated text and shape primitives on flat\ncolor backgrounds — no image generation, no CV extraction.","operationId":"create_project_motion_v0_motion_v0_projects_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMotionProjectRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/motion/v0/projects/{project_id}/trace":{"get":{"summary":"Get Project Trace Motion V0","description":"Get the motion v0 pipeline trace for a project (mirrors v1.7 trace shape).\n\nReturns artifacts grouped by top-level subdirectory under `trace/`:\n  - plan.json, timeline.json, scenes.json, visual_review.json\n  - narration.mp3, word_timestamps.json\n  - review/scene_N_iter_M.png (per-iteration stills from the visual review)","operationId":"get_project_trace_motion_v0_motion_v0_projects__project_id__trace_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/motion/v0/projects/{project_id}/trace/{path}":{"get":{"summary":"Serve Trace Artifact Motion V0","description":"Serve a single motion v0 trace artifact (local-only).","operationId":"serve_trace_artifact_motion_v0_motion_v0_projects__project_id__trace__path__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/upload-pdf":{"post":{"summary":"Upload Pdf","description":"Extract text from an uploaded document — PDF, Word (.doc/.docx), or\nPowerPoint (.ppt/.pptx). Route name retained for backward compatibility.","operationId":"upload_pdf_upload_pdf_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_pdf_upload_pdf_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/upload-watermark":{"post":{"summary":"Upload Watermark Logo","description":"Upload a watermark logo image to S3 and return the public URL.\n\nAccepted formats: PNG, JPEG, WEBP, SVG.\nMax size: 2 MB.","operationId":"upload_watermark_logo_upload_watermark_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_watermark_logo_upload_watermark_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watermark/presigned":{"get":{"summary":"Watermark Presigned Url","description":"Return a short-lived presigned URL for a watermark stored in S3.\n\nThe browser cannot access private S3 objects directly; this endpoint\ngenerates a pre-signed URL that the browser can load without credentials.","operationId":"watermark_presigned_url_watermark_presigned_get","parameters":[{"name":"s3_url","in":"query","required":true,"schema":{"type":"string","title":"S3 Url"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/{session_id}/assets/{path}":{"get":{"summary":"Serve Live Asset","description":"Serve generated assets (images, geodesic maps, masks) for live sessions.","operationId":"serve_live_asset_live__session_id__assets__path__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/{session_id}/media/{path}":{"get":{"summary":"Serve Live Media","description":"Serve audio/video media files for live sessions (audio.mp3, scene videos, follow-up audio).","operationId":"serve_live_media_live__session_id__media__path__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/{session_id}/hls/{path}":{"get":{"summary":"Serve Live Hls","description":"Serve HLS playlist and MPEG-TS segments for live streaming sessions.","operationId":"serve_live_hls_live__session_id__hls__path__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/recent":{"get":{"summary":"List Recent Sessions","description":"Return the most recently created live sessions — useful for debugging stream URLs.","operationId":"list_recent_sessions_live_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/{session_id}/log":{"get":{"summary":"Serve Live Log","description":"Return the last `tail` lines of a session log. Useful for remote debugging.","operationId":"serve_live_log_live__session_id__log_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"tail","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Tail"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annotate/projects":{"post":{"summary":"Create Annotate Project","description":"Queue an image annotation job.\nUploads an image + instruction; Gemini draws scribbles in a sentinel color;\nscribbles are extracted and animated on top of the original image.","operationId":"create_annotate_project_annotate_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnnotateRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annotate/projects/{project_id}/steps":{"get":{"summary":"Get Annotate Steps","description":"Return the step-by-step pipeline log for an annotate job.","operationId":"get_annotate_steps_annotate_projects__project_id__steps_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annotate/projects/{project_id}/artifacts/{filename}":{"get":{"summary":"Serve Annotate Artifact","description":"Serve an intermediate artifact image (original, annotated, mask, etc.).","operationId":"serve_annotate_artifact_annotate_projects__project_id__artifacts__filename__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annotate/projects/{project_id}/video":{"get":{"summary":"Serve Annotate Video","description":"Stream the final annotated video.","operationId":"serve_annotate_video_annotate_projects__project_id__video_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_upload_pdf_upload_pdf_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_pdf_upload_pdf_post"},"Body_upload_watermark_logo_upload_watermark_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_watermark_logo_upload_watermark_post"},"CreateAnnotateRequest":{"properties":{"image_base64":{"type":"string","title":"Image Base64","description":"Base64-encoded image (JPEG or PNG)"},"image_mime_type":{"type":"string","title":"Image Mime Type","description":"MIME type of the image","default":"image/jpeg"},"instruction":{"type":"string","minLength":5,"title":"Instruction","description":"What to annotate, e.g. 'circle the mitochondria'"}},"type":"object","required":["image_base64","instruction"],"title":"CreateAnnotateRequest","description":"Body for POST /annotate/projects"},"CreateMotionProjectRequest":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / prompt for the video"},"duration_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Duration Seconds","description":"Target video duration in seconds","default":60},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation","default":"horizontal"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"pacing":{"$ref":"#/components/schemas/Pacing","default":"normal"},"audio_language_code":{"type":"string","title":"Audio Language Code","description":"ISO 639-1 code for narration language (same set as v1.7).","default":"en"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email for completion notification"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name","description":"User name for email greeting"}},"type":"object","required":["topic"],"title":"CreateMotionProjectRequest","description":"Body for POST /motion/v0/projects — minimal v0 surface."},"CreateProjectRequest":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / script for the video"},"num_scenes":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Num Scenes","description":"Number of scenes (auto if null)"},"components_per_scene":{"type":"integer","maximum":8.0,"minimum":2.0,"title":"Components Per Scene","default":2},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation: horizontal (16:9) or vertical (9:16)","default":"horizontal"},"video_type":{"$ref":"#/components/schemas/VideoType","description":"Content type: 'usmle' for USMLE question walkthroughs, 'generic' for general explainers, 'auto' to detect automatically","default":"auto"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"transition_style":{"$ref":"#/components/schemas/TransitionStyle","default":"erase"},"transition_duration":{"type":"number","maximum":5.0,"minimum":0.2,"title":"Transition Duration","default":1.0},"show_cursor":{"type":"boolean","title":"Show Cursor","default":false},"caption_enabled":{"type":"boolean","title":"Caption Enabled","default":true}},"type":"object","required":["topic"],"title":"CreateProjectRequest","description":"Body for POST /projects"},"CreateProjectRequestV12":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / prompt for the video"},"duration_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Duration Seconds","description":"Target video duration in seconds","default":60},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation","default":"horizontal"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"transition_style":{"$ref":"#/components/schemas/TransitionStyle","default":"erase"},"transition_duration":{"type":"number","maximum":5.0,"minimum":0.2,"title":"Transition Duration","default":1.0},"show_cursor":{"type":"boolean","title":"Show Cursor","default":false},"caption_enabled":{"type":"boolean","title":"Caption Enabled","default":true}},"type":"object","required":["topic"],"title":"CreateProjectRequestV12","description":"Body for POST /v1.2/projects"},"CreateProjectRequestV13":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / prompt for the video"},"duration_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Duration Seconds","description":"Target video duration in seconds","default":60},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation","default":"horizontal"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"transition_style":{"$ref":"#/components/schemas/TransitionStyle","default":"erase"},"transition_duration":{"type":"number","maximum":5.0,"minimum":0.2,"title":"Transition Duration","default":1.0},"show_cursor":{"type":"boolean","title":"Show Cursor","default":false},"caption_enabled":{"type":"boolean","title":"Caption Enabled","default":true},"image_models":{"items":{"$ref":"#/components/schemas/ImageModel"},"type":"array","title":"Image Models","description":"Image model(s) for frame generation. Select multiple to produce one video per model."}},"type":"object","required":["topic"],"title":"CreateProjectRequestV13","description":"Body for POST /v1.3/projects"},"CreateProjectRequestV14":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / prompt for the video"},"duration_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Duration Seconds","description":"Target video duration in seconds","default":60},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation","default":"horizontal"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"transition_style":{"$ref":"#/components/schemas/TransitionStyle","default":"erase"},"transition_duration":{"type":"number","maximum":5.0,"minimum":0.2,"title":"Transition Duration","default":1.0},"show_cursor":{"type":"boolean","title":"Show Cursor","default":false},"caption_enabled":{"type":"boolean","title":"Caption Enabled","default":true},"image_models":{"items":{"$ref":"#/components/schemas/ImageModel"},"type":"array","title":"Image Models","description":"Image model(s) for frame generation. Select multiple to produce one video per model."},"style":{"$ref":"#/components/schemas/WhiteboardStyle","description":"Visual style: 'whiteboard_black_n_white' (classic) or 'whiteboard_colored' (color marker style).","default":"whiteboard_black_n_white"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email for completion notification"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name","description":"User name for email greeting"}},"type":"object","required":["topic"],"title":"CreateProjectRequestV14","description":"Body for POST /v1.4/projects"},"CreateProjectRequestV15":{"properties":{"topic":{"type":"string","minLength":10,"title":"Topic","description":"Topic / prompt for the video"},"duration_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Duration Seconds","description":"Target video duration in seconds","default":60},"video_format":{"$ref":"#/components/schemas/VideoFormat","description":"Video orientation","default":"horizontal"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"ElevenLabs voice ID override"},"fps":{"type":"integer","maximum":60.0,"minimum":24.0,"title":"Fps","default":30},"transition_style":{"$ref":"#/components/schemas/TransitionStyle","default":"erase"},"transition_duration":{"type":"number","maximum":5.0,"minimum":0.2,"title":"Transition Duration","default":1.0},"show_cursor":{"type":"boolean","title":"Show Cursor","default":false},"caption_enabled":{"type":"boolean","title":"Caption Enabled","default":true},"image_models":{"items":{"$ref":"#/components/schemas/ImageModel"},"type":"array","title":"Image Models","description":"Image model(s) for frame generation. Select multiple to produce one video per model."},"style":{"$ref":"#/components/schemas/WhiteboardStyle","description":"Visual style: 'whiteboard_black_n_white' (classic) or 'whiteboard_colored' (color marker style).","default":"whiteboard_black_n_white"},"pacing":{"$ref":"#/components/schemas/Pacing","description":"Narration pacing: 'slow' (fewer words, slower TTS), 'normal', or 'fast' (denser narration, quicker TTS). Total video duration stays the same — only the feel/density changes.","default":"normal"},"audio_language_code":{"type":"string","title":"Audio Language Code","description":"ISO 639-1 code for the narration/audio language (spoken voice). Indian: hi, mr, te, ta, kn, bn, gu, pa, ml, or, ur. International: en, es, fr, de, pt, ar, ja, ko, zh, it, nl, ru, tr, pl, vi, id, th, uk.","default":"en"},"display_language_code":{"type":"string","title":"Display Language Code","description":"ISO 639-1 code for the language of text shown on the whiteboard. Same language options as audio_language_code. Can differ from audio_language_code (e.g. audio=hi, display=en for bilingual).","default":"en"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email for completion notification"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name","description":"User name for email greeting"},"reference_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Image Base64","description":"Base64-encoded reference image for GPT vision (single-image legacy field)"},"reference_image_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Image Mime Type","description":"MIME type of reference image (e.g. image/jpeg)"},"reference_images":{"items":{"$ref":"#/components/schemas/ReferenceImage"},"type":"array","title":"Reference Images","description":"User-supplied reference images to be embedded directly in video frames."},"document_images":{"items":{"$ref":"#/components/schemas/ReferenceImage"},"type":"array","title":"Document Images","description":"Images extracted from an uploaded document (figures/diagrams/charts). Same shape as reference_images, but placed by the planner only where they fit the narration — unlike reference_images, not all are required. Composited into frames as-is via the user_image rail."},"watermark_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Watermark Url","description":"URL of the watermark image to overlay on the final video. Free users get the brand watermark injected server-side. Paid users may supply their own logo URL; omit for no watermark."},"watermark_position":{"$ref":"#/components/schemas/WatermarkPosition","description":"Corner of the video where the watermark is overlaid: 'top_left' (default), 'top_right', 'bottom_left', or 'bottom_right'.","default":"top_left"},"allow_real_images":{"type":"boolean","title":"Allow Real Images","description":"When True, the planner may emit photorealistic 'photo' components (real AI-generated images) in place of hand-drawn illustrations (v1.7 only). Beta-gated: defaults to False so non-beta users never get real-image components.","default":false},"duration_mode":{"$ref":"#/components/schemas/DurationMode","description":"How the video length is decided (v1.7 only). 'manual' (default) uses duration_seconds as the target. 'auto' lets the pipeline choose the length itself from the topic and the source document; send duration_seconds alongside it only if you want an upper bound. The chosen length is one of 30/60/120/180/300/600 seconds and is reported in the project trace.","default":"manual"},"source_document":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Document","description":"Verbatim text of a document the video must be built from — an SOP, policy, manual, or any source whose content must survive intact (v1.7 only). When set, the planner switches to strict transformation mode: every point in this text is carried into the narration, in the source's own order, with nothing added, dropped, merged, reordered, or reworded in a way that changes meaning. `topic` is then read as framing instruction only. Pair with duration_mode='auto' so the video is long enough to cover the whole document."},"source_document_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Document Name","description":"File name of source_document, used to label it in the plan (v1.7 only)."}},"type":"object","required":["topic"],"title":"CreateProjectRequestV15","description":"Body for POST /v1.5/projects\n\nNew in v1.5:\n  - language_code: ISO 639-1 code for narration language.\n    Supported Indian: hi, mr, te, ta, kn, bn, gu, pa, ml, or, ur\n    Supported International: en, es, fr, de, pt, ar, ja, ko, zh, it, nl, ru, tr, pl, vi, id, th, uk"},"CreateProjectResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"status":{"$ref":"#/components/schemas/ProjectStatus"},"message":{"type":"string","title":"Message"}},"type":"object","required":["project_id","status","message"],"title":"CreateProjectResponse"},"DurationMode":{"type":"string","enum":["manual","auto"],"title":"DurationMode","description":"How the video's length is decided.\n\nMANUAL — the caller's `duration_seconds` is the target (existing behaviour).\nAUTO   — the pipeline picks the length itself from the topic (and the\n         source document, when one was uploaded); `duration_seconds` is\n         then only an upper bound."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageModel":{"type":"string","enum":["gpt_image_2","gemini","flux_pro"],"title":"ImageModel"},"Pacing":{"type":"string","enum":["slow","normal","fast"],"title":"Pacing"},"ProjectStatus":{"type":"string","enum":["queued","planning","generating_audio","building_timeline","generating_frames","extracting_components","building_strokes","rendering","merging","completed","failed"],"title":"ProjectStatus"},"ProjectStatusResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"status":{"$ref":"#/components/schemas/ProjectStatus"},"progress_pct":{"type":"number","title":"Progress Pct","default":0.0},"current_step":{"type":"string","title":"Current Step","default":""},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"video_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Video Urls"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"num_scenes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Scenes"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"video_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Format"},"video_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Type"},"fps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fps"},"transition_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transition Style"},"transition_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Transition Duration"},"show_cursor":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Cursor"},"caption_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Caption Enabled"},"components_per_scene":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Components Per Scene"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id"}},"type":"object","required":["project_id","status","created_at","updated_at"],"title":"ProjectStatusResponse","description":"Response for GET /projects/{id}/status"},"PromptPreviewRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Prompt text to render. Defaults to the shipped default when omitted."}},"type":"object","title":"PromptPreviewRequest","description":"Body for POST /v1.7/prompts/{template_id}/preview."},"PromptSaveRequest":{"properties":{"owner_email":{"type":"string","minLength":3,"title":"Owner Email","description":"Who this override belongs to. It is stored against this email and only ever applied to runs owned by it — there is no way to write a global override. The email must be listed in the backend's PROMPT_EDITOR_EMAILS."},"content":{"type":"string","minLength":1,"title":"Content","description":"The full prompt text, with $placeholders."}},"type":"object","required":["owner_email","content"],"title":"PromptSaveRequest","description":"Body for PUT /v1.7/prompts/{template_id}."},"ReferenceImage":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label","default":""},"base64":{"type":"string","title":"Base64"},"mime_type":{"type":"string","title":"Mime Type"}},"type":"object","required":["id","base64","mime_type"],"title":"ReferenceImage","description":"A user-supplied image to be embedded in video frames."},"SuggestDurationRequest":{"properties":{"topic":{"type":"string","minLength":1,"title":"Topic","description":"Topic / prompt for the video"},"source_document":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Document","description":"Verbatim text of the source document, when the video is built from one. The suggestion is then floored by how long that text takes to narrate, since strict mode may not drop content to fit."},"pacing":{"$ref":"#/components/schemas/Pacing","description":"Narration pacing — affects the words that fit in a second.","default":"normal"},"max_seconds":{"type":"integer","maximum":600.0,"minimum":10.0,"title":"Max Seconds","description":"Upper bound on the suggested duration.","default":600}},"type":"object","required":["topic"],"title":"SuggestDurationRequest","description":"Body for POST /v1.7/suggest-duration."},"SuggestDurationResponse":{"properties":{"duration_seconds":{"type":"integer","title":"Duration Seconds","description":"Suggested length, one of 30/60/120/180/300/600."},"reason":{"type":"string","title":"Reason","description":"One-sentence explanation of the choice.","default":""},"source":{"type":"string","title":"Source","description":"'llm' when the model chose it, 'heuristic' on fallback.","default":"llm"},"floor_seconds":{"type":"integer","title":"Floor Seconds","description":"Seconds needed to narrate the source document in full (0 when none).","default":0},"capped":{"type":"boolean","title":"Capped","description":"True when the content wanted more than max_seconds.","default":false}},"type":"object","required":["duration_seconds"],"title":"SuggestDurationResponse","description":"Result of POST /v1.7/suggest-duration."},"TransitionStyle":{"type":"string","enum":["erase","fade","instant"],"title":"TransitionStyle"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VideoFormat":{"type":"string","enum":["horizontal","vertical"],"title":"VideoFormat"},"VideoType":{"type":"string","enum":["auto","usmle","generic"],"title":"VideoType"},"WatermarkPosition":{"type":"string","enum":["top_left","top_right","bottom_left","bottom_right"],"title":"WatermarkPosition"},"WhiteboardStyle":{"type":"string","enum":["whiteboard_black_n_white","whiteboard_colored","sketch","illustrated","editorial","minimal_mono"],"title":"WhiteboardStyle"}}},"tags":[{"name":"projects","description":"Create, poll and fetch video generation jobs."},{"name":"uploads","description":"Source documents and watermark images."},{"name":"live","description":"Live pipeline sessions and their media."},{"name":"annotate","description":"Document annotation pipeline."},{"name":"admin","description":"API key management. Requires the admin secret."}]}