{"openapi":"3.1.0","info":{"title":"Creator Harbor REST API","version":"1.0.0","description":"Make ads, Shorts and clips; manage Story steps, reference videos, schedules and connected-account posts. JSON bodies are limited to 1,000,000 bytes. Credit prices and available options come from GET /api/v1/catalog. API keys are limited to 120 requests/minute; browser sessions to 600/minute. Free drafting and editing have additional per-account limits. Unless explicitly documented, endpoints do not support idempotency keys. Response objects may gain fields; clients should allow additional properties. See /llms.txt for workflows, rendering constraints and webhook signature verification."},"servers":[{"url":"https://creatorharbor.app"}],"externalDocs":{"description":"Agent workflows and human-readable API reference","url":"https://creatorharbor.app/llms.txt"},"security":[{"ApiKey":[]},{"Session":[]},{"AppToken":[]}],"tags":[{"name":"catalog","description":"catalog endpoints"},{"name":"me","description":"me endpoints"},{"name":"scripts","description":"scripts endpoints"},{"name":"ads","description":"ads endpoints"},{"name":"shorts","description":"shorts endpoints"},{"name":"clips","description":"clips endpoints"},{"name":"statics","description":"statics endpoints"},{"name":"uploads","description":"uploads endpoints"},{"name":"actors","description":"actors endpoints"},{"name":"voices","description":"voices endpoints"},{"name":"brand","description":"brand endpoints"},{"name":"library","description":"library endpoints"},{"name":"trends","description":"trends endpoints"},{"name":"series","description":"series endpoints"},{"name":"autopilots","description":"autopilots endpoints"},{"name":"stories","description":"stories endpoints"},{"name":"social-accounts","description":"social-accounts endpoints"},{"name":"posts","description":"posts endpoints"},{"name":"webhooks","description":"webhooks endpoints"},{"name":"webhook-secret","description":"webhook-secret endpoints"}],"paths":{"/api/v1/catalog":{"get":{"operationId":"getCatalog","summary":"Current options, available background loops, and credit prices","tags":["catalog"],"parameters":[],"responses":{"200":{"description":"Current options, available background loops, and credit prices","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[]}},"/api/v1/me":{"get":{"operationId":"getAccount","summary":"Credit balance and account rendering access","tags":["me"],"parameters":[],"responses":{"200":{"description":"Credit balance and account rendering access","content":{"application/json":{"schema":{"type":"object","properties":{"credits":{"type":"integer"},"watermarked":{"type":"boolean"},"rendering_open":{"type":"boolean"}}}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/me/credits":{"get":{"operationId":"getCreditHistory","summary":"Balance and last 100 credit ledger entries","tags":["me"],"parameters":[],"responses":{"200":{"description":"Balance and last 100 credit ledger entries","content":{"application/json":{"schema":{"type":"object","properties":{"credits":{"type":"integer"},"history":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"amount":{"type":"integer"},"what":{"type":"string"}}}}}}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/scripts":{"post":{"operationId":"draftAdScript","summary":"Draft a script and optional alternative hooks, free and rate-limited","tags":["scripts"],"parameters":[],"responses":{"200":{"description":"Draft a script and optional alternative hooks, free and rate-limited","content":{"application/json":{"schema":{"type":"object","properties":{"hook":{"type":"string"},"script":{"type":"string"},"words":{"type":"integer"},"fits_words":{"type":"array","items":{"type":"integer"}},"duration_s":{"type":"number"},"from_page":{"type":"boolean"},"policy_warnings":{"type":"array","items":{"type":"object","properties":{}}},"alt_hooks":{"type":"array","items":{"type":"string"}},"scripts":{"type":"array","items":{"type":"string"}}}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptInput"}}}}}},"/api/v1/ads/batch":{"post":{"operationId":"createAdsBatch","summary":"Quote or start an actor × hook × format × engine matrix","tags":["ads"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."},{"name":"dry_run","in":"query","schema":{"type":"string","enum":["1"]},"required":false,"description":"Set to 1 to validate and price the whole matrix without starting or charging."}],"responses":{"200":{"description":"Dry-run quote or an idempotent replay.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BatchQuote"},{"$ref":"#/components/schemas/Batch"}]}}}},"201":{"description":"Quote or start an actor × hook × format × engine matrix","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"At most 20 takes. Singular actor, format and engine are fallbacks for the lists. Alternative hooks require a script and replace its first sentence. The entire matrix is checked and priced before starting. If a later take fails to start, earlier ads stay: the successful response includes ads and an error. Retries replay ad by ad.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchInput"}}}}}},"/api/v1/ads/export":{"get":{"operationId":"exportAds","summary":"Download finished ads and an Ads Manager CSV in one ZIP","tags":["ads"],"parameters":[{"name":"batch","in":"query","schema":{"type":"string"},"required":false,"description":"Batch ID to export, otherwise use ids or the latest finished ads."},{"name":"ids","in":"query","schema":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20},"required":false,"description":"Comma-separated owned ad IDs. Up to 20 ads; an explicit batch takes precedence.","style":"form","explode":false}],"responses":{"200":{"description":"File bytes.","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"MP4s and feed shapes plus ads-manager.csv. Returns 404 unless at least one finished ad exists. This downloads files; it does not push ads to an ad platform."}},"/api/v1/ads":{"post":{"operationId":"createAd","summary":"Start a paid ads render; failed renders refund","tags":["ads"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"200":{"description":"Idempotent replay of the original job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ad"}}}},"201":{"description":"Start a paid ads render; failed renders refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ad"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdInput"}}}}},"get":{"operationId":"listAds","summary":"List recent ads","tags":["ads"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20},"required":false,"description":"Newest first. The service caps the requested limit."}],"responses":{"200":{"description":"List recent ads","content":{"application/json":{"schema":{"type":"object","properties":{"ads":{"type":"array","items":{"$ref":"#/components/schemas/Ad"}}},"required":["ads"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/ads/{id}":{"get":{"operationId":"getAd","summary":"Get ads status and finished files","tags":["ads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"wait","in":"query","schema":{"type":"number","minimum":0,"maximum":25,"default":0},"required":false,"description":"Long-poll for up to 25 seconds; returns the current state if still running."}],"responses":{"200":{"description":"Get ads status and finished files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ad"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/shorts":{"post":{"operationId":"createShort","summary":"Start a paid shorts render; failed renders refund","tags":["shorts"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"200":{"description":"Idempotent replay of the original job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Short"}}}},"201":{"description":"Start a paid shorts render; failed renders refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Short"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortInput"}}}}},"get":{"operationId":"listShorts","summary":"List recent shorts","tags":["shorts"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20},"required":false,"description":"Newest first. The service caps the requested limit."}],"responses":{"200":{"description":"List recent shorts","content":{"application/json":{"schema":{"type":"object","properties":{"shorts":{"type":"array","items":{"$ref":"#/components/schemas/Short"}}},"required":["shorts"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/shorts/{id}":{"get":{"operationId":"getShort","summary":"Get shorts status and finished files","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"wait","in":"query","schema":{"type":"number","minimum":0,"maximum":25,"default":0},"required":false,"description":"Long-poll for up to 25 seconds; returns the current state if still running."}],"responses":{"200":{"description":"Get shorts status and finished files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Short"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips":{"post":{"operationId":"createClips","summary":"Start a paid clips render; failed renders refund","tags":["clips"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"200":{"description":"Idempotent replay of the original job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Clips"}}}},"201":{"description":"Start a paid clips render; failed renders refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Clips"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipInput"}}}}},"get":{"operationId":"listClips","summary":"List recent clips","tags":["clips"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20},"required":false,"description":"Newest first. The service caps the requested limit."}],"responses":{"200":{"description":"List recent clips","content":{"application/json":{"schema":{"type":"object","properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Clips"}}},"required":["jobs"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips/{id}":{"get":{"operationId":"getClips","summary":"Get clips status and finished files","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"wait","in":"query","schema":{"type":"number","minimum":0,"maximum":25,"default":0},"required":false,"description":"Long-poll for up to 25 seconds; returns the current state if still running."}],"responses":{"200":{"description":"Get clips status and finished files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Clips"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/ads/{id}/video":{"get":{"operationId":"downloadAd","summary":"Download the finished MP4","tags":["ads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."},{"name":"shape","in":"query","schema":{"type":"string"},"required":false,"description":"Shape key from shape_urls. Missing shapes return 404."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/ads/{id}/translate":{"post":{"operationId":"translateAd","summary":"Render the finished video in up to five languages","tags":["ads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"201":{"description":"Render the finished video in up to five languages","content":{"application/json":{"schema":{"type":"object","properties":{"ads":{"type":"array","items":{"$ref":"#/components/schemas/Ad"}}},"required":["ads"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateInput"}}}}}},"/api/v1/shorts/{id}/video":{"get":{"operationId":"downloadShort","summary":"Download the finished MP4","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."},{"name":"shape","in":"query","schema":{"type":"string"},"required":false,"description":"Shape key from shape_urls. Missing shapes return 404."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/shorts/{id}/translate":{"post":{"operationId":"translateShort","summary":"Render the finished video in up to five languages","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"201":{"description":"Render the finished video in up to five languages","content":{"application/json":{"schema":{"type":"object","properties":{"shorts":{"type":"array","items":{"$ref":"#/components/schemas/Short"}}},"required":["shorts"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateInput"}}}}}},"/api/v1/ads/{id}/captions":{"get":{"operationId":"downloadCaptions","summary":"Download stored SRT captions for an ad or Short","tags":["ads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."}],"responses":{"200":{"description":"File bytes.","content":{"application/x-subrip":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/ads/{id}/thumb":{"get":{"operationId":"getAdThumbnail","summary":"Download the finished ad's thumbnail","tags":["ads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/statics":{"post":{"operationId":"createStatics","summary":"Make static image ads at 1:1, 4:5 and 9:16; failures refund","tags":["statics"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"200":{"description":"Idempotent replay of the original job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Statics"}}}},"201":{"description":"Make static image ads at 1:1, 4:5 and 9:16; failures refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Statics"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticsInput"}}}}}},"/api/v1/statics/{id}":{"get":{"operationId":"getStatics","summary":"Get static image ads' status and image URLs","tags":["statics"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"wait","in":"query","schema":{"type":"number","minimum":0,"maximum":25,"default":0},"required":false,"description":"Long-poll for up to 25 seconds; returns the current state if still running."}],"responses":{"200":{"description":"Get static image ads' status and image URLs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Statics"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/statics/{id}/{name}":{"get":{"operationId":"downloadStatic","summary":"Download one static image ad by layout and shape, e.g. photo-4x5","tags":["statics"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"Layout and shape key from image_urls, e.g. photo-4x5."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/shorts/script":{"post":{"operationId":"draftShort","summary":"Draft a Short's editable plan, free and rate-limited","tags":["shorts"],"parameters":[],"responses":{"200":{"description":"Draft a Short's editable plan, free and rate-limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortPlan"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortDraftInput"}}}}}},"/api/v1/shorts/{id}/cancel":{"post":{"operationId":"discardShort","summary":"Discard a Short waiting for review; no refund","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Discard a Short waiting for review; no refund","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"discarded":{"const":true},"refunded":{"const":false}},"required":["id","discarded","refunded"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/shorts/{id}/render":{"post":{"operationId":"approveShort","summary":"Approve pictures and queue narration and rendering","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Approve pictures and queue narration and rendering","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Short"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"}}}}}}}}},"/api/v1/shorts/{id}/scenes/{n}":{"get":{"operationId":"getShortPicture","summary":"Get a review or finished scene picture","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"redoShortPicture","summary":"Redo a review picture, free within redo limits","tags":["shorts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."}],"responses":{"200":{"description":"Redo a review picture, free within redo limits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Short"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"visual":{"type":"string"}},"required":["visual"]}}}}}},"/api/v1/clips/{id}/source":{"get":{"operationId":"getClipSource","summary":"Preview the original uploaded source","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips/{id}/zip":{"get":{"operationId":"downloadClipsZip","summary":"Download all finished clips in a ZIP","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"File bytes.","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips/{id}/{n}/video":{"get":{"operationId":"downloadClip","summary":"Download one finished clip","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips/{id}/{n}/thumb":{"get":{"operationId":"getClipThumbnail","summary":"Download one clip's thumbnail","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/clips/{id}/{n}/edit":{"get":{"operationId":"getClipEdit","summary":"Get clip chat, current settings, and recut status","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."}],"responses":{"200":{"description":"Get clip chat, current settings, and recut status","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"editClip","summary":"Edit a finished clip by instruction, free and rate-limited","tags":["clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"n","in":"path","required":true,"schema":{"type":"integer","minimum":0},"description":"Zero-based scene or clip index."}],"responses":{"202":{"description":"Edit a finished clip by instruction, free and rate-limited","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"instruction":{"type":"string"}},"required":["instruction"]}}}}}},"/api/v1/uploads":{"post":{"operationId":"startUpload","summary":"Start a multipart MP4 or MOV upload, up to 2 GB","tags":["uploads"],"parameters":[],"responses":{"201":{"description":"Start a multipart MP4 or MOV upload, up to 2 GB","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStarted"}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInput"}}}}}},"/api/v1/uploads/part":{"put":{"operationId":"putUploadPart","summary":"Upload a raw part and keep its returned etag","tags":["uploads"],"parameters":[{"name":"key","in":"query","schema":{"type":"string"},"required":true,"description":"Key returned by startUpload."},{"name":"upload_id","in":"query","schema":{"type":"string"},"required":true,"description":"Multipart upload ID."},{"name":"n","in":"query","schema":{"type":"integer","minimum":1},"required":true,"description":"One-based part number. All but the final part are exactly part_bytes."},{"name":"Content-Length","in":"header","schema":{"type":"integer","minimum":1,"maximum":16777216},"required":true,"description":"Exact part size, at most part_bytes (16 MiB)."}],"responses":{"200":{"description":"Upload a raw part and keep its returned etag","content":{"application/json":{"schema":{"type":"object","properties":{"etag":{"type":"string"}},"required":["etag"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/api/v1/uploads/complete":{"post":{"operationId":"completeUpload","summary":"Join ordered parts and inspect duration and clipping price","tags":["uploads"],"parameters":[],"responses":{"200":{"description":"Join ordered parts and inspect duration and clipping price","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"duration_s":{"type":"number"},"clip_credits":{"type":"integer"}}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadComplete"}}}}}},"/api/v1/uploads/video":{"get":{"operationId":"previewUpload","summary":"Preview an owned uploaded or imported video","tags":["uploads"],"parameters":[{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"key","in":"query","schema":{"type":"string"},"required":true,"description":"Owned upload key."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/uploads/import":{"post":{"operationId":"importVideo","summary":"Import a Drive, Dropbox, or direct MP4/MOV/WebM link; YouTube unsupported","tags":["uploads"],"parameters":[],"responses":{"201":{"description":"Import a Drive, Dropbox, or direct MP4/MOV/WebM link; YouTube unsupported","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}}}}},"/api/v1/uploads/import/{id}":{"get":{"operationId":"getImport","summary":"Get import status, then upload key, duration and price","tags":["uploads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"wait","in":"query","schema":{"type":"number","minimum":0,"maximum":25,"default":0},"required":false,"description":"Long-poll for up to 25 seconds; returns the current state if still running."}],"responses":{"200":{"description":"Get import status, then upload key, duration and price","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/actors":{"get":{"operationId":"listActors","summary":"List stock and owned actors","tags":["actors"],"parameters":[],"responses":{"200":{"description":"List stock and owned actors","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/actors/{id}/image":{"get":{"operationId":"getActorImage","summary":"Download an owned actor portrait (ID without my- prefix)","tags":["actors"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/voices":{"get":{"operationId":"listVoices","summary":"List the account's cloned voices","tags":["voices"],"parameters":[],"responses":{"200":{"description":"List the account's cloned voices","content":{"application/json":{"schema":{"type":"object","properties":{"voices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created":{"type":"string","format":"date-time"}},"required":["id","name","created"]}}},"required":["voices"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"addVoice","summary":"Clone a voice from a recording","tags":["voices"],"parameters":[{"name":"name","in":"query","schema":{"type":"string","maxLength":30},"required":true,"description":"What to call the voice."},{"name":"consent","in":"query","schema":{"type":"string","enum":["true"]},"required":true,"description":"true: it's your voice, or you have the speaker's written permission to clone it."}],"responses":{"201":{"description":"Clone a voice from a recording","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created":{"type":"string","format":"date-time"}},"required":["id","name","created"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"The body is an MP3 or WAV recording of one person talking, up to 10 MB and at least 15 seconds. Use the id as voice on an ad (precise engine, lip-synced) or a Short.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}}}}}},"/api/v1/voices/{id}":{"delete":{"operationId":"deleteVoice","summary":"Delete a cloned voice","tags":["voices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"204":{"description":"Deleted; no response body."},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/brand/font":{"get":{"operationId":"getBrandFont","summary":"Download the account's caption font","tags":["brand"],"parameters":[{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"font/otf":{"schema":{"type":"string","format":"binary"}},"font/ttf":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"font/otf":{"schema":{"type":"string","format":"binary"}},"font/ttf":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/library":{"get":{"operationId":"listSavedVideos","summary":"List saved reference videos","tags":["library"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":60},"required":false,"description":"Newest first. The service caps the requested limit."}],"responses":{"200":{"description":"List saved reference videos","content":{"application/json":{"schema":{"type":"object","properties":{"videos":{"type":"array","items":{"type":"object","properties":{}}}},"required":["videos"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"saveVideo","summary":"Save a TikTok, YouTube Short or Instagram Reel","tags":["library"],"parameters":[],"responses":{"201":{"description":"Save a TikTok, YouTube Short or Instagram Reel","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"The extension's save-only API key can use this endpoint only. Reading and other writes require a full key or a browser session.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedVideoInput"}}}}}},"/api/v1/library/{id}":{"get":{"operationId":"getSavedVideo","summary":"Read a saved video and its processing status","tags":["library"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Read a saved video and its processing status","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"delete":{"operationId":"deleteSavedVideo","summary":"Remove a saved reference","tags":["library"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Remove a saved reference","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/library/{id}/cover":{"get":{"operationId":"getSavedCover","summary":"Download a saved reference's stored cover","tags":["library"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."}],"responses":{"200":{"description":"File bytes.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/library/{id}/explain":{"post":{"operationId":"explainSavedVideo","summary":"Explain a saved video and return a remix topic, free and rate-limited","tags":["library"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Explain a saved video and return a remix topic, free and rate-limited","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/trends":{"get":{"operationId":"findTrends","summary":"Find YouTube Shorts by topic and outlier performance","tags":["trends"],"parameters":[{"name":"q","in":"query","schema":{"type":"string"},"required":true,"description":"Search topic."},{"name":"window","in":"query","schema":{"type":"string","enum":["week","month","year"],"default":"month"},"required":false}],"responses":{"200":{"description":"Find YouTube Shorts by topic and outlier performance","content":{"application/json":{"schema":{"type":"object","properties":{"shorts":{"type":"array","items":{"type":"object","properties":{}}}},"required":["shorts"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/trends/explain":{"post":{"operationId":"explainTrend","summary":"Explain a YouTube Short and return a remix topic","tags":["trends"],"parameters":[],"responses":{"200":{"description":"Explain a YouTube Short and return a remix topic","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"video_id":{"type":"string"}},"required":["video_id"]}}}}}},"/api/v1/series":{"get":{"operationId":"listSeries","summary":"List account series","tags":["series"],"parameters":[],"responses":{"200":{"description":"List account series","content":{"application/json":{"schema":{"type":"object","properties":{"series":{"type":"array","items":{"type":"object","properties":{}}}},"required":["series"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"createSeries","summary":"Create a scheduled series","tags":["series"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"201":{"description":"Create a scheduled series","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeriesInput"}}}}}},"/api/v1/series/{id}":{"get":{"operationId":"getSeries","summary":"Get a scheduled series and recent renders","tags":["series"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Get a scheduled series and recent renders","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"delete":{"operationId":"deleteSeries","summary":"Stop future runs; previous videos remain","tags":["series"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Stop future runs; previous videos remain","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]},"patch":{"operationId":"updateSeries","summary":"Pause, resume, or add ideas to a series","tags":["series"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Pause, resume, or add ideas to a series","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"active":{"type":"boolean"},"ideas":{"type":"array","items":{"type":"string"}}}}}}}}},"/api/v1/autopilots":{"get":{"operationId":"listAutopilots","summary":"List account autopilots","tags":["autopilots"],"parameters":[],"responses":{"200":{"description":"List account autopilots","content":{"application/json":{"schema":{"type":"object","properties":{"autopilots":{"type":"array","items":{"type":"object","properties":{}}}},"required":["autopilots"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"createAutopilot","summary":"Create a scheduled autopilot","tags":["autopilots"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"201":{"description":"Create a scheduled autopilot","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopilotInput"}}}}}},"/api/v1/autopilots/{id}":{"get":{"operationId":"getAutopilot","summary":"Get a scheduled autopilot and recent renders","tags":["autopilots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Get a scheduled autopilot and recent renders","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"delete":{"operationId":"deleteAutopilot","summary":"Stop future runs; previous videos remain","tags":["autopilots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Stop future runs; previous videos remain","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]},"patch":{"operationId":"updateAutopilot","summary":"Pause, resume, or change settings from the next run","tags":["autopilots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Pause, resume, or change settings from the next run","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopilotUpdate"}}}}}},"/api/v1/series/{id}/run":{"post":{"operationId":"runSeriesNow","summary":"Make the next Short now, charged at the series settings","tags":["series"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Make the next Short now, charged at the series settings","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"Additional run besides the daily one. Refused while one is underway. This endpoint does not accept an Idempotency-Key.","security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/stories":{"post":{"operationId":"createStory","summary":"Create a Story brief, free; rendering needs explicit paid steps","tags":["stories"],"parameters":[],"responses":{"201":{"description":"Create a Story brief, free; rendering needs explicit paid steps","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryInput"}}}}},"get":{"operationId":"listStories","summary":"List Story briefs, newest first","tags":["stories"],"parameters":[],"responses":{"200":{"description":"List Story briefs, newest first","content":{"application/json":{"schema":{"type":"object","properties":{"stories":{"type":"array","items":{"type":"object","properties":{}}}},"required":["stories"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/stories/{id}":{"get":{"operationId":"getStory","summary":"Get brief, concepts, shots, jobs, next-step prices and rendered files","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Get brief, concepts, shots, jobs, next-step prices and rendered files","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"delete":{"operationId":"deleteStory","summary":"Delete the Story and its files; spent credits are not refunded","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"204":{"description":"Deleted; no response body."},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/stories/{id}/concepts":{"post":{"operationId":"draftStoryConcepts","summary":"Draft three checked Story concepts, free and rate-limited","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Draft three checked Story concepts, free and rate-limited","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"feedback":{"type":"string"}}}}}}}},"/api/v1/stories/{id}/pick":{"post":{"operationId":"pickStoryConcept","summary":"Pick a concept by index or submit an edited concept","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Pick a concept by index or submit an edited concept","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"index":{"type":"integer"},"concept":{"type":"object","properties":{}}},"anyOf":[{"required":["index"]},{"required":["concept"]}]}}}}}},"/api/v1/stories/{id}/steps":{"post":{"operationId":"runStoryStep","summary":"Run a Story step at the returned next-step price; failures refund","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"202":{"description":"Run a Story step at the returned next-step price; failures refund","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"compose is free. Still, render and reroll can name a shot; hook names one of concept.hooks and re-cuts the ad with it as the opener (only that shot is made); use the Story's next field for credits before starting.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"step":{"type":"string","enum":["cast","still","render","reroll","compose","hook"]},"shot":{"type":"string"},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."}},"required":["step"]}}}}}},"/api/v1/stories/{id}/file":{"get":{"operationId":"getStoryFile","summary":"Download a Story file or footage used in its brief","tags":["stories"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."},{"name":"Range","in":"header","schema":{"type":"string"},"required":false,"description":"A byte range, for example bytes=0-1023."},{"name":"k","in":"query","schema":{"type":"string"},"required":true,"description":"Owned file key from the Story."},{"name":"download","in":"query","schema":{"type":"string"},"required":false,"description":"Presence of this parameter requests an attachment; for example ?download=1."}],"responses":{"200":{"description":"File bytes.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/quicktime":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Range":{"schema":{"type":"string"}},"Accept-Ranges":{"schema":{"type":"string"}}}},"404":{"description":"File unavailable or not owned by this account.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Requested byte range is not satisfiable (local storage); remote storage may return 404.","headers":{"Content-Range":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/social-accounts":{"get":{"operationId":"listSocialAccounts","summary":"List connected accounts and browser connection links","tags":["social-accounts"],"parameters":[],"responses":{"200":{"description":"List connected accounts and browser connection links","content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"type":"array","items":{"type":"object","properties":{}}},"connect":{"type":"array","items":{"type":"object","properties":{}}}}}}}},"default":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/social-accounts/{id}":{"delete":{"operationId":"disconnectSocialAccount","summary":"Disconnect an account and cancel its scheduled posts","tags":["social-accounts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Disconnect an account and cancel its scheduled posts","content":{"application/json":{"schema":{"type":"object","properties":{"disconnected":{"type":"boolean"}}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/posts":{"get":{"operationId":"listPosts","summary":"List recent post status and published URLs","tags":["posts"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20},"required":false,"description":"Newest first. The service caps the requested limit."}],"responses":{"200":{"description":"List recent post status and published URLs","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"type":"object","properties":{}}}},"required":["posts"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"createPosts","summary":"Post or schedule a finished video to Instagram or YouTube","tags":["posts"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":200},"required":false,"description":"Same key and input replay the original result. Different input returns 409 idempotency_conflict."}],"responses":{"201":{"description":"Post or schedule a finished video to Instagram or YouTube","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"type":"object","properties":{}}}},"required":["posts"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"Paid accounts only. TikTok requires the person's confirmation in the browser; requests naming TikTok return 400 with a post-screen link. Schedule at most 30 days ahead.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostInput"}}}}}},"/api/v1/posts/{id}":{"delete":{"operationId":"cancelPost","summary":"Cancel a post that has not started","tags":["posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Resource ID owned by this account."}],"responses":{"200":{"description":"Cancel a post that has not started","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/webhooks":{"get":{"operationId":"getAccountWebhook","summary":"Get the account-wide webhook subscription, or null","tags":["webhooks"],"parameters":[],"responses":{"200":{"description":"Get the account-wide webhook subscription, or null","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"anyOf":[{"$ref":"#/components/schemas/WebhookSubscription"},{"type":"null"}]}},"required":["webhook"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}},"put":{"operationId":"setAccountWebhook","summary":"Replace the account-wide webhook URL and event subscriptions","tags":["webhooks"],"parameters":[],"responses":{"200":{"description":"Replace the account-wide webhook URL and event subscriptions","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/WebhookSubscription"}},"required":["webhook"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"description":"Full replacement. Replaying the same settings preserves pending events; changing settings cancels earlier pending account deliveries. Per-job callbacks remain independent. Events have stable IDs and snapshots and are delivered at least once, with six retries after failure. See /llms.txt for event payloads and signature verification.","security":[{"ApiKey":[]},{"Session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2000,"description":"HTTPS receiver URL without credentials or a fragment."},"events":{"type":"array","items":{"type":"string","enum":["ad.succeeded","ad.failed","short.succeeded","short.failed","clips.succeeded","clips.failed","short.review_ready","story.step_succeeded","story.step_failed","post.posted","post.failed"]},"minItems":1,"maxItems":11}},"required":["url","events"]}}}}},"delete":{"operationId":"deleteAccountWebhook","summary":"Unsubscribe the account; queued account deliveries are skipped","tags":["webhooks"],"parameters":[],"responses":{"200":{"description":"Unsubscribe the account; queued account deliveries are skipped","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"const":true}},"required":["deleted"]}}}},"default":{"$ref":"#/components/responses/ApiError"}},"security":[{"ApiKey":[]},{"Session":[]}]}},"/api/v1/webhook-secret":{"get":{"operationId":"getWebhookSecret","summary":"Get this account's webhook signing secret","tags":["webhook-secret"],"parameters":[],"responses":{"200":{"description":"Get this account's webhook signing secret","content":{"application/json":{"schema":{"type":"object","properties":{"secret":{"type":"string"}},"required":["secret"]}}}},"default":{"$ref":"#/components/responses/ApiError"}}}}},"webhooks":{"accountEvent":{"post":{"summary":"Signed account or per-job event delivered to the configured receiver","description":"Deduplicate by event id. Retries keep the same body and ID with a fresh signature timestamp; events may arrive out of order. Acknowledge quickly with 2xx. There are six retries after the first failed attempt. Verify the HMAC and timestamp before accepting; see /llms.txt.","parameters":[{"name":"CreatorHarbor-Signature","in":"header","schema":{"type":"string"},"required":true,"description":"t=<Unix seconds>,v1=<hex HMAC-SHA256(secret, t.rawBody)>"},{"name":"CreatorHarbor-Event-Id","in":"header","schema":{"type":"string","format":"uuid"},"required":true,"description":"Same stable UUID as body.id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Receiver durably accepted the event (any 2xx acknowledges)."}},"security":[]}}},"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ch_…","description":"Full API key from /app/keys. Save-only extension keys can only POST /api/v1/library."},"Session":{"type":"apiKey","in":"cookie","name":"__Secure-better-auth.session_token","description":"Signed-in browser session. Local development uses better-auth.session_token without the __Secure- prefix."},"AppToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"MCP OAuth access token. REST GET/HEAD only; use MCP tools with the appropriate scopes for writes, or a full API key."}},"schemas":{"StoryStepEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"story_id":{"type":"string","format":"uuid"},"step":{"type":"string","enum":["cast","still","render","reroll","compose","hook"]},"shot":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["succeeded","failed"]},"credits":{"type":"integer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"story_url":{"type":"string","format":"uri"}},"required":["id","story_id","step","shot","status","credits","error","story_url"]},"PostEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"platform":{"type":"string","enum":["youtube","instagram","tiktok"]},"account":{"type":"string"},"video_id":{"type":"string","format":"uuid"},"clip":{"anyOf":[{"type":"integer"},{"type":"null"}]},"caption":{"type":"string"},"scheduled_at":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["posted","failed"]},"url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"stats":{"anyOf":[{"type":"object","properties":{}},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"}},"required":["id","platform","account","video_id","clip","caption","scheduled_at","status","url","error","stats","created_at"]},"WebhookEvent":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"ad.succeeded"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Ad"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"ad.failed"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Ad"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"short.succeeded"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Short"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"short.failed"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Short"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"clips.succeeded"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Clips"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"clips.failed"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Clips"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"short.review_ready"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/Short"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"story.step_succeeded"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/StoryStepEvent"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"story.step_failed"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/StoryStepEvent"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"post.posted"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/PostEvent"}},"required":["id","type","created_at","data"]},{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"const":"post.failed"},"created_at":{"type":"string","format":"date-time"},"data":{"$ref":"#/components/schemas/PostEvent"}},"required":["id","type","created_at","data"]}]},"WebhookSubscription":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["ad.succeeded","ad.failed","short.succeeded","short.failed","clips.succeeded","clips.failed","short.review_ready","story.step_succeeded","story.step_failed","post.posted","post.failed"]}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","url","events","created_at","updated_at"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]},"AdInput":{"type":"object","properties":{"product_url":{"type":"string","format":"uri","maxLength":2000},"product_name":{"type":"string","maxLength":500},"product_image_url":{"type":"string","description":"HTTPS product image, or an owned image upload key."},"actor":{"type":"string","default":"maya","description":"Stock or owned my-… actor ID from GET /api/v1/actors."},"voice":{"type":"string","description":"Your own cloned voice (my-voice-… from GET /api/v1/actors), spoken on the precise engine and lip-synced. Omit for the actor's voice."},"format":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"],"default":"selfie"},"duration_s":{"type":"number","enum":[5,10,15,20,30],"default":10,"description":"20 and 30 are cut from several shots: natural engine and paid accounts only."},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"engine":{"type":"string","enum":["natural","precise","seedance"],"description":"Defaults to natural for English, precise otherwise. Other languages require precise. Seedance requires a stock actor and cannot use format app."},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"ai_label":{"type":"boolean","default":true},"script":{"type":"string","maxLength":1000},"say_as":{"type":"object","maxProperties":5,"additionalProperties":{"type":"string","minLength":1,"maxLength":60},"description":"Word to pronunciation, at most 5 entries. Each pronunciation is at most 3 words; captions keep the original spelling."},"template":{"type":"string","enum":["offer_demo","problem_demo","letter","asmr","unboxing","before_after","three_reasons","comparison","founder"],"description":"Proven script structure from catalog.templates."},"answers":{"type":"object","additionalProperties":{"type":"string","maxLength":200},"description":"Question ID to answer; use the selected template's question IDs from the catalog."},"music":{"type":"string","enum":["none","upbeat","chill","warm","tech","luxe"],"default":"none","description":"AI-made music bed under the speech, at catalog.ads.music_credits extra; refunded if it can't be made."},"lower_half_video":{"type":"string","description":"Owned uploaded or imported video key: fills the lower half under the actor. Free; needs lower_half_rights."},"lower_half_rights":{"type":"boolean","description":"Must be true with lower_half_video, confirming you own or have rights to the footage."},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."},"webhook_url":{"type":"string","format":"uri","description":"HTTPS callback for this job's success or failure. See /llms.txt for signature verification and retries."}},"required":["product_url"]},"BatchInput":{"type":"object","properties":{"product_url":{"type":"string","format":"uri","maxLength":2000},"product_name":{"type":"string","maxLength":500},"product_image_url":{"type":"string","description":"HTTPS product image, or an owned image upload key."},"actor":{"type":"string","default":"maya","description":"Stock or owned my-… actor ID from GET /api/v1/actors."},"voice":{"type":"string","description":"Your own cloned voice (my-voice-… from GET /api/v1/actors), spoken on the precise engine and lip-synced. Omit for the actor's voice."},"format":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"],"default":"selfie"},"duration_s":{"type":"number","enum":[5,10,15,20,30],"default":10,"description":"20 and 30 are cut from several shots: natural engine and paid accounts only."},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"engine":{"type":"string","enum":["natural","precise","seedance"],"description":"Defaults to natural for English, precise otherwise. Other languages require precise. Seedance requires a stock actor and cannot use format app."},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"ai_label":{"type":"boolean","default":true},"script":{"type":"string","maxLength":1000},"say_as":{"type":"object","maxProperties":5,"additionalProperties":{"type":"string","minLength":1,"maxLength":60},"description":"Word to pronunciation, at most 5 entries. Each pronunciation is at most 3 words; captions keep the original spelling."},"template":{"type":"string","enum":["offer_demo","problem_demo","letter","asmr","unboxing","before_after","three_reasons","comparison","founder"],"description":"Proven script structure from catalog.templates."},"answers":{"type":"object","additionalProperties":{"type":"string","maxLength":200},"description":"Question ID to answer; use the selected template's question IDs from the catalog."},"music":{"type":"string","enum":["none","upbeat","chill","warm","tech","luxe"],"default":"none","description":"AI-made music bed under the speech, at catalog.ads.music_credits extra; refunded if it can't be made."},"lower_half_video":{"type":"string","description":"Owned uploaded or imported video key: fills the lower half under the actor. Free; needs lower_half_rights."},"lower_half_rights":{"type":"boolean","description":"Must be true with lower_half_video, confirming you own or have rights to the footage."},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."},"webhook_url":{"type":"string","format":"uri","description":"HTTPS callback for this job's success or failure. See /llms.txt for signature verification and retries."},"actors":{"type":"array","items":{"type":"string"},"maxItems":4},"formats":{"type":"array","items":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"]}},"engines":{"type":"array","items":{"type":"string","enum":["natural","precise","seedance"]}},"hooks":{"type":"array","items":{"type":"string","maxLength":300}}},"required":["product_url"]},"BatchQuote":{"type":"object","properties":{"takes":{"type":"integer"},"credits":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["takes","credits","warnings"]},"Batch":{"type":"object","properties":{"batch":{"type":"string"},"ads":{"type":"array","items":{"$ref":"#/components/schemas/Ad"}},"takes":{"type":"integer"},"credits":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}},"required":["batch","ads","takes","credits","warnings"]},"ScriptInput":{"type":"object","properties":{"product_url":{"type":"string","format":"uri","maxLength":2000},"product_name":{"type":"string","maxLength":500},"product_image_url":{"type":"string","description":"HTTPS product image, or an owned image upload key."},"actor":{"type":"string","default":"maya","description":"Stock or owned my-… actor ID from GET /api/v1/actors."},"voice":{"type":"string","description":"Your own cloned voice (my-voice-… from GET /api/v1/actors), spoken on the precise engine and lip-synced. Omit for the actor's voice."},"format":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"],"default":"selfie"},"duration_s":{"type":"number","enum":[5,10,15,20,30],"default":10,"description":"20 and 30 are cut from several shots: natural engine and paid accounts only."},"engine":{"type":"string","enum":["natural","precise","seedance"],"description":"Defaults to natural for English, precise otherwise. Other languages require precise. Seedance requires a stock actor and cannot use format app."},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"script":{"type":"string","maxLength":1000},"template":{"type":"string","enum":["offer_demo","problem_demo","letter","asmr","unboxing","before_after","three_reasons","comparison","founder"],"description":"Proven script structure from catalog.templates."},"answers":{"type":"object","additionalProperties":{"type":"string","maxLength":200},"description":"Question ID to answer; use the selected template's question IDs from the catalog."},"hooks":{"type":"integer","minimum":1,"maximum":5}},"required":["product_url"]},"ShortPlan":{"type":"object","properties":{"title":{"type":"string","maxLength":100},"art_direction":{"type":"string","maxLength":600},"music":{"type":"string","maxLength":300},"keywords":{"type":"array","items":{"type":"string"}},"scenes":{"type":"array","items":{"type":"object","properties":{"line":{"type":"string","maxLength":600},"visual":{"type":"string","maxLength":600}},"required":["line"]},"minItems":2,"maxItems":24,"description":"Each scene needs words and a visual description; visual may be empty or omitted with background footage. The scene limit also depends on duration_s."}},"required":["scenes"]},"ShortInput":{"type":"object","properties":{"format":{"type":"string","enum":["free","story","list","facts","explainer","motivation","myth","reddit","quiz","pov","news","scary"],"default":"free"},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"duration_s":{"type":"number","enum":[15,30,60],"default":30},"voice":{"type":"string","default":"marin","description":"A narrator: marin, cedar, coral, ash, sage, verse, george, brian, daniel, bill, adam, callum, charlie, chris, eric, harry, liam, roger, will, sarah, alice, bella, jessica, laura, lily, matilda, river, or your own cloned voice (my-voice-…)."},"speed":{"type":"number","enum":[0.9,1,1.15,1.3],"default":1},"visual_style":{"type":"string","enum":["photo","cinematic","illustration","anime","3d"],"default":"cinematic"},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"music":{"type":"boolean","default":true},"headline":{"type":"boolean","default":true},"aspect":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"},"motion":{"type":"string","enum":["still","moving"],"default":"still"},"transition":{"type":"string","enum":["cut","fade","slide","zoom"],"default":"cut"},"whoosh":{"type":"boolean","default":false},"topic":{"type":"string","maxLength":2000},"source_url":{"type":"string","format":"uri","maxLength":2000},"script":{"type":"string","maxLength":2500,"description":"Exact narration. Blank lines separate scenes; at most ten [pause] markers."},"plan":{"$ref":"#/components/schemas/ShortPlan"},"pictures":{"type":"array","items":{"anyOf":[{"type":"string","description":"HTTPS image, owned upload key, or a previous Short's picture_key. Null generates a picture."},{"type":"null"}]}},"background":{"type":"string","default":"pictures","description":"pictures, a currently available catalog.shorts.backgrounds ID, or an owned uploaded video key. Footage cannot be combined with pictures, presenter, moving motion or review."},"footage_rights":{"type":"boolean","description":"Must be true when background is your uploaded video, confirming you own or have rights to the footage."},"review":{"type":"boolean"},"presenter":{"type":"string"},"presenter_mode":{"type":"string","enum":["open_close","whole"],"default":"open_close"},"broll":{"type":"boolean"},"say_as":{"type":"object","maxProperties":5,"additionalProperties":{"type":"string","minLength":1,"maxLength":60},"description":"Word to pronunciation, at most 5 entries. Each pronunciation is at most 3 words; captions keep the original spelling."},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."},"webhook_url":{"type":"string","format":"uri","description":"HTTPS callback for this job's success or failure. See /llms.txt for signature verification and retries."}},"anyOf":[{"required":["topic"]},{"required":["source_url"]},{"required":["script"]},{"required":["plan"]},{"required":["pictures"]}],"description":"Provide a topic, source_url, script, edited plan, or owned pictures. Scene counts and spoken length must fit duration_s. A presenter uses its own voice and speed; broll applies to presenter_mode whole."},"ShortDraftInput":{"type":"object","properties":{"format":{"type":"string","enum":["free","story","list","facts","explainer","motivation","myth","reddit","quiz","pov","news","scary"],"default":"free"},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"duration_s":{"type":"number","enum":[15,30,60],"default":30},"speed":{"type":"number","enum":[0.9,1,1.15,1.3],"default":1},"topic":{"type":"string","maxLength":2000},"source_url":{"type":"string","format":"uri","maxLength":2000},"pictures":{"type":"array","items":{"anyOf":[{"type":"string","description":"HTTPS image, owned upload key, or a previous Short's picture_key. Null generates a picture."},{"type":"null"}]}},"background":{"type":"string","default":"pictures","description":"pictures, a currently available catalog.shorts.backgrounds ID, or an owned uploaded video key. Footage cannot be combined with pictures, presenter, moving motion or review."},"footage_rights":{"type":"boolean","description":"Must be true when background is your uploaded video, confirming you own or have rights to the footage."}}},"ClipInput":{"type":"object","properties":{"upload":{"type":"string","description":"Owned video key from a completed upload or import; 1–120 minutes."},"name":{"type":"string","maxLength":200},"count":{"type":"number","enum":[3,5,10,20],"default":5},"length":{"type":"string","enum":["short","medium","long","xl"],"default":"medium"},"layout":{"type":"string","enum":["speaker","split","fit"],"default":"speaker"},"aspect":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"},"cut_pauses":{"type":"boolean","default":true},"zooms":{"type":"boolean","default":true},"headline":{"type":"boolean","default":true},"captions_language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th","cs","da","nb","fi","el","hu","he","bg","hr","sr","bs","mk","sk","sl","lt","lv","et","sq","ca","is","cy","af","ms","fil","sw","az","kk","uz","fa","ur","mr","ne"]},"from_s":{"type":"number","minimum":0},"to_s":{"type":"number"},"focus":{"type":"string","maxLength":300},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."},"webhook_url":{"type":"string","format":"uri","description":"HTTPS callback for this job's success or failure. See /llms.txt for signature verification and retries."}},"required":["upload"]},"TranslateInput":{"type":"object","properties":{"languages":{"type":"array","items":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"]},"minItems":1,"maxItems":5},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."}},"required":["languages"]},"SeriesInput":{"type":"object","properties":{"name":{"type":"string"},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["theme"]},"theme":{"type":"string","maxLength":500}},"required":["kind","theme"]},{"type":"object","properties":{"kind":{"type":"string","enum":["ideas"]},"ideas":{"type":"array","items":{"type":"string","maxLength":300}}},"required":["kind","ideas"]},{"type":"object","properties":{"kind":{"type":"string","enum":["feed"]},"url":{"type":"string","format":"uri"}},"required":["kind","url"]}]},"settings":{"type":"object","properties":{"format":{"type":"string","enum":["free","story","list","facts","explainer","motivation","myth","reddit","quiz","pov","news","scary"],"default":"free"},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"duration_s":{"type":"number","enum":[15,30,60],"default":30},"voice":{"type":"string","default":"marin","description":"A narrator: marin, cedar, coral, ash, sage, verse, george, brian, daniel, bill, adam, callum, charlie, chris, eric, harry, liam, roger, will, sarah, alice, bella, jessica, laura, lily, matilda, river, or your own cloned voice (my-voice-…)."},"speed":{"type":"number","enum":[0.9,1,1.15,1.3],"default":1},"visual_style":{"type":"string","enum":["photo","cinematic","illustration","anime","3d"],"default":"cinematic"},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"music":{"type":"boolean","default":true},"headline":{"type":"boolean","default":true},"aspect":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"},"motion":{"type":"string","enum":["still","moving"],"default":"still"},"transition":{"type":"string","enum":["cut","fade","slide","zoom"],"default":"cut"},"whoosh":{"type":"boolean","default":false}}},"hour_utc":{"type":"integer","minimum":0,"maximum":23},"post":{"anyOf":[{"type":"object","properties":{"account_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"caption":{"type":"string","maxLength":500},"youtube_privacy":{"type":"string","enum":["public","unlisted","private"],"default":"public"}}},{"type":"null"}]}},"required":["name","source"]},"AutopilotInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"from_ad_id":{"type":"string","format":"uuid"},"ad":{"type":"object","properties":{"product_url":{"type":"string","format":"uri","maxLength":2000},"product_name":{"type":"string","maxLength":500},"product_image_url":{"type":"string","description":"HTTPS product image, or an owned image upload key."},"voice":{"type":"string","description":"Your own cloned voice (my-voice-… from GET /api/v1/actors), spoken on the precise engine and lip-synced. Omit for the actor's voice."},"format":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"],"default":"selfie"},"duration_s":{"type":"number","enum":[5,10,15,20,30],"default":10,"description":"20 and 30 are cut from several shots: natural engine and paid accounts only."},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"engine":{"type":"string","enum":["natural","precise","seedance"],"description":"Defaults to natural for English, precise otherwise. Other languages require precise. Seedance requires a stock actor and cannot use format app."},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"ai_label":{"type":"boolean","default":true},"script":{"type":"string","maxLength":1000},"say_as":{"type":"object","maxProperties":5,"additionalProperties":{"type":"string","minLength":1,"maxLength":60},"description":"Word to pronunciation, at most 5 entries. Each pronunciation is at most 3 words; captions keep the original spelling."}}},"actors":{"type":"array","items":{"type":"string"}},"hooks":{"type":"array","items":{"type":"string"}},"ads_per_run":{"type":"integer","minimum":1,"maximum":10},"every_hours":{"type":"integer","minimum":1,"maximum":24},"budget":{"type":"object","properties":{"credits":{"type":"integer","minimum":1,"maximum":1000000},"per":{"type":"string","enum":["day","week"],"default":"day"}},"required":["credits"]},"post":{"anyOf":[{"type":"object","properties":{"account_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"caption":{"type":"string","maxLength":500},"youtube_privacy":{"type":"string","enum":["public","unlisted","private"],"default":"public"}}},{"type":"null"}]}},"required":["name","budget"],"anyOf":[{"required":["from_ad_id"]},{"required":["ad","actors"]}],"description":"Seed from an owned ad or supply ad settings and actors. Credits are charged per rendered ad within the budget."},"AutopilotUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"from_ad_id":{"type":"string","format":"uuid"},"ad":{"type":"object","properties":{"product_url":{"type":"string","format":"uri","maxLength":2000},"product_name":{"type":"string","maxLength":500},"product_image_url":{"type":"string","description":"HTTPS product image, or an owned image upload key."},"voice":{"type":"string","description":"Your own cloned voice (my-voice-… from GET /api/v1/actors), spoken on the precise engine and lip-synced. Omit for the actor's voice."},"format":{"type":"string","enum":["selfie","product","unboxing","review","problem","app"],"default":"selfie"},"duration_s":{"type":"number","enum":[5,10,15,20,30],"default":10,"description":"20 and 30 are cut from several shots: natural engine and paid accounts only."},"captions":{"type":"string","enum":["hormozi","minimal","box","yellow","karaoke","marker","pop","neon","subtle","fire"],"default":"hormozi"},"engine":{"type":"string","enum":["natural","precise","seedance"],"description":"Defaults to natural for English, precise otherwise. Other languages require precise. Seedance requires a stock actor and cannot use format app."},"language":{"type":"string","enum":["en","es","pt","fr","de","it","nl","pl","tr","sv","id","ro","ru","uk","vi","ja","ko","zh","hi","ar","th"],"default":"en"},"ai_label":{"type":"boolean","default":true},"script":{"type":"string","maxLength":1000},"say_as":{"type":"object","maxProperties":5,"additionalProperties":{"type":"string","minLength":1,"maxLength":60},"description":"Word to pronunciation, at most 5 entries. Each pronunciation is at most 3 words; captions keep the original spelling."}}},"actors":{"type":"array","items":{"type":"string"}},"hooks":{"type":"array","items":{"type":"string"}},"ads_per_run":{"type":"integer","minimum":1,"maximum":10},"every_hours":{"type":"integer","minimum":1,"maximum":24},"budget":{"type":"object","properties":{"credits":{"type":"integer","minimum":1,"maximum":1000000},"per":{"type":"string","enum":["day","week"],"default":"day"}},"required":["credits"]},"post":{"anyOf":[{"type":"object","properties":{"account_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"caption":{"type":"string","maxLength":500},"youtube_privacy":{"type":"string","enum":["public","unlisted","private"],"default":"public"}}},{"type":"null"}]},"active":{"type":"boolean"}}},"StoryInput":{"type":"object","properties":{"product":{"type":"string","maxLength":60},"main_feature":{"type":"string","maxLength":200},"audience":{"type":"string","maxLength":200},"price":{"type":"string","maxLength":60},"offer":{"type":"string","maxLength":200},"url":{"type":"string","format":"uri"},"facts":{"type":"string","maxLength":600},"platforms":{"type":"array","items":{"type":"string","enum":["tiktok","reels","shorts","meta","x"]}},"length_s":{"type":"number","enum":[15,30,45],"default":30},"style":{"type":"string","enum":["loud","calm"],"default":"loud"},"budget":{"type":"integer"},"reference_notes":{"type":"string","maxLength":1000},"reference_video":{"type":"string"},"assets":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key"]}},"screenshot_urls":{"type":"array","items":{"type":"string","format":"uri"}}},"required":["product","main_feature","audience"]},"PostInput":{"type":"object","properties":{"video_id":{"type":"string","format":"uuid"},"clip":{"type":"integer","minimum":0,"description":"Zero-based index, required for a clips job."},"account_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"caption":{"type":"string","maxLength":2200},"scheduled_at":{"type":"string","format":"date-time"},"instagram":{"type":"object","properties":{"share_to_feed":{"type":"boolean","default":true}}},"youtube":{"type":"object","properties":{"title":{"type":"string","maxLength":100},"privacy":{"type":"string","enum":["public","unlisted","private"],"default":"public"},"made_for_kids":{"type":"boolean","default":false}}}},"required":["video_id","account_ids"]},"UploadInput":{"type":"object","properties":{"name":{"type":"string"},"size":{"type":"integer","minimum":1,"maximum":2147483648}},"required":["size"]},"UploadStarted":{"type":"object","properties":{"key":{"type":"string"},"upload_id":{"type":"string"},"part_bytes":{"type":"integer"},"parts":{"type":"integer"}},"required":["key","upload_id","part_bytes","parts"]},"UploadComplete":{"type":"object","properties":{"key":{"type":"string"},"upload_id":{"type":"string"},"etags":{"type":"array","items":{"type":"string"}}},"required":["key","upload_id","etags"]},"SavedVideoInput":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string"},"author":{"type":"string"},"views":{"type":"number"},"likes":{"type":"number"},"comments":{"type":"number"},"shares":{"type":"number"}},"required":["url"]},"Job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","succeeded","failed"]},"step":{"anyOf":[{"type":"string"},{"type":"null"}]},"credits":{"type":"integer"},"video_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"thumbnail_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"}},"required":["id","status"]},"Ad":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","properties":{"product":{"type":"string"},"product_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"actor":{"type":"string"},"format":{"type":"string"},"duration_s":{"type":"number"},"language":{"type":"string"},"ai_label":{"type":"boolean"},"captions":{"type":"string"},"watermarked":{"type":"boolean"},"hook":{"anyOf":[{"type":"string"},{"type":"null"}]},"hook_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"script":{"anyOf":[{"type":"string"},{"type":"null"}]},"captions_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"shape_urls":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"refunded":{"type":"boolean"}}}]},"StaticsInput":{"type":"object","properties":{"ad_id":{"type":"string","format":"uuid"},"product_name":{"type":"string","maxLength":100},"headline":{"type":"string","maxLength":150},"cta":{"type":"string","maxLength":40},"product_image_url":{"type":"string","format":"uri","maxLength":2000},"expected_credits":{"type":"integer","minimum":0,"description":"The price shown to the user. A mismatch returns 409 price_changed without charging."}},"anyOf":[{"required":["ad_id"]},{"required":["product_name","headline"]}],"description":"From a finished ad (its hook, call to action and first frame), or on their own from a product name and headline."},"Statics":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"const":"statics"},"status":{"type":"string","enum":["queued","running","succeeded","failed"]},"ad_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"product":{"type":"string"},"headline":{"type":"string"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}]},"watermarked":{"type":"boolean"},"credits":{"type":"integer"},"image_urls":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"refunded":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}},"required":["id","status"]},"Short":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"script":{"anyOf":[{"type":"string"},{"type":"null"}]},"scenes":{"anyOf":[{"type":"array","items":{"type":"object","properties":{}}},{"type":"null"}]},"captions_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"review":{"anyOf":[{"type":"object","properties":{}},{"type":"null"}]}}}]},"Clips":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","properties":{"clips":{"type":"array","items":{"type":"object","properties":{"n":{"type":"integer"},"title":{"type":"string"},"video_url":{"type":"string","format":"uri"},"thumbnail_url":{"type":"string","format":"uri"}}}}}}]}},"responses":{"ApiError":{"description":"JSON error with stable code and actionable message. Common statuses: 400 bad_input/bad_json, 401 unauthorized, 403 forbidden, 402 insufficient_credits, 404 not_found, 409 idempotency_conflict/price_changed/conflict, 411 length_required, 413 too_large, 422 unprocessable, 429 rate_limited, 500 internal, 503 rendering_closed. Files may return a plain-text 404 instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}