{"openapi":"3.1.0","info":{"title":"Mango9 Create API","version":"1.2.0","description":"Account-scoped Create and native editor API. Central sessions keep browser CSRF protection; external integrations use Authorization: Bearer <API key>. Every API key has full access to the Create operations available to its account and projects, with expiry, immediate local revocation, 120 requests/minute/key and live Central authority checks. No provider/broker credentials are exposed. All JSON envelopes include a request ID; errors have stable codes. 429/503 include Retry-After. No automatic client retries for new paid work: retry the same idempotency key. There is no browser cross-origin cookie access; use a server integration or Central-authenticated Create app."},"servers":[{"url":"/api/v1"}],"paths":{"/":{"get":{"operationId":"get_","summary":"API discovery","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"get__openapi_json","summary":"OpenAPI document","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/compatibility":{"get":{"operationId":"get__compatibility","summary":"Inspect release contracts and observed component compatibility","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Authenticated read-only manifest: API/MCP schema fingerprint, worker contract observations, renderer and caption/font catalog fingerprints, analyzer source fingerprints and versions, recipe versions and shared media limits. Analyzer evidenceVersion is the candidate source version; observedEvidenceVersion is inferred only from a fresh matching entrypoint fingerprint, otherwise null. Analyzer comparison is informational and does not attest imported worker components or media quality. Workers report every 30 seconds; observations older than 90 seconds are unknown. Compatible means contract fingerprints and native caption fields agree, not that all visual/audio quality checks pass. Different commit IDs alone are never incompatibility. Missing or unavailable components remain unknown; this endpoint creates no jobs or edits."}},"/me":{"get":{"operationId":"get__me","summary":"Current API identity and permissions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/identities":{"get":{"operationId":"get__identities","summary":"List versioned subject and product identities","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":160},"description":"Literal case-insensitive search of the latest version name and description."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"brandId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Character discovery with bounded cursor pages. Pass projectId to return only that project’s characters. Returns latest approved reference versions and content checksums; no source files are modified and no generation starts."},"post":{"operationId":"post__identities","summary":"Publish an immutable subject or product identity","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Own JPEG/PNG references up to10MiB each; validates actual image bytes and records SHA256. This creates a reference record, not new media. Source retention follows each referenced asset; expired or changed references are rejected before submission. Requires account library write access.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["subject","product","brand"]},"description":{"type":"string","minLength":1,"maxLength":1200},"projectId":{"description":"Project that owns this character. Required unless every reference originates in the same project.","type":"integer","exclusiveMinimum":0,"maximum":2147483647},"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"referenceAssetIds":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}}},"required":["name","kind","description","referenceAssetIds"],"additionalProperties":false}}}}}},"/identities/{identity}":{"get":{"operationId":"get__identities_identity","summary":"Read the latest identity version","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"identity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/identities/{identity}/versions":{"post":{"operationId":"post__identities_identity_versions","summary":"Publish a new reference version without changing history","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"identity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Supply expectedVersion and the full new definition. Concurrent revision changes return409. Previous versions and generation snapshots remain unchanged. Retry identical input with the same idempotency key. A validation failure checked after the receipt lookup may include error.publicationState=not_created; only that marker confirms no publication for this key. Authentication failures or uncertain server responses do not disprove an earlier successful publication.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["subject","product","brand"]},"description":{"type":"string","minLength":1,"maxLength":1200},"projectId":{"description":"Project that owns this character. Required unless every reference originates in the same project.","type":"integer","exclusiveMinimum":0,"maximum":2147483647},"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"referenceAssetIds":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["name","kind","description","referenceAssetIds","expectedVersion"],"additionalProperties":false}}}}}},"/identities/{identity}/versions/{version}":{"get":{"operationId":"get__identities_identity_versions_version","summary":"Read an exact immutable identity version","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"identity","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Generation input identityBindings pins identityId,version and a unique prompt alias. Kling3 requires settings.inputMode=frames and a starting image in references when using identityBindings. It accepts up to3 named elements, each with2–4 approved images. Refer to @alias in the relevant prompt or storyboard shot. The public quote and generation receipt expose the exact version/digest/reference checksums. Model support is validated without silently dropping references; image likeness still requires rendered review."}},"/keys":{"get":{"operationId":"get__keys","summary":"List your API keys","security":[{"centralSession":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Central session required. Lists only the current actor and workspace; tokens are never returned."},"post":{"operationId":"post__keys","summary":"Issue an API key","security":[{"centralSession":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ApiKey"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Central session and same-origin request required. Every key has full account access; no permission selection is needed. Copy data.token now: only its hash is retained. Maximum 20 active keys per actor/workspace; expiry 1–90 days. Keys issued through Login as are capped to that support session and stop working when it ends.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyInput"}}}}}},"/keys/{keyId}":{"delete":{"operationId":"delete__keys_keyId","summary":"Revoke an API key","security":[{"centralSession":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{id}/storyboard-sources":{"get":{"operationId":"get__projects_id_storyboard_sources","summary":"Inspect exact current or latest storyboard image sources","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"threadId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"source","in":"query","schema":{"type":"string","enum":["current","latest"],"default":"current"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read-only owned project/conversation snapshot in stable scene order. Current uses explicit project scene image selections, falling back to latest generated still only when unselected. Latest ignores selections. Includes both IDs, actual chosen asset, availability, plan version/revision, project revision and fingerprint. Missing/expired sources are explicit, never silently replaced with older media. contentUrl requests a source-bound full-frame preview; inspect these pixels before judging wardrobe/props/identity. Availability and metadata do not certify quality. No media/model/billing operation occurs."}},"/projects/{id}/character-references":{"get":{"operationId":"get__projects_id_character_references","summary":"Read storyboard character identity reference selections","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"threadId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Owned project conversation only. Returns current plan version/revision, stable characterId, name, description, selected image referenceAssetIds and assigned sceneIds. Use before selecting recurring cast anchors. These are selected inputs, not proof of visual identity."},"patch":{"operationId":"patch__projects_id_character_references","summary":"Select inspected identity images for a recurring storyboard character","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Set character referenceAssetIds using exact threadId, plan version/revision, stable characterId and idempotent clientId. Uses the same owned available JPEG/PNG/WebP, project/library/brand checks and revisioned plan edit as the UI. A group reference may be selected for each depicted person. Empty clears this character selection without deleting images. Updates future image requests only; submitted media and receipts are immutable. Supervisor image generation includes every selected reference for the scene cast and rejects capacity overflow instead of dropping identities. Creates no media and does not grant initial build approval. Completed plans are read-only. Public edits steer active work; an authenticated supervisor-origin edit is recorded without self-steering. Stable character IDs avoid assigning a reference to a different person after reordering. No external URLs or cross-account references.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"threadId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"referenceAssetIds":{"maxItems":10,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"characterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["threadId","version","revision","clientId","referenceAssetIds","characterId"],"additionalProperties":false}}}}}},"/projects/{id}/scene-references":{"get":{"operationId":"get__projects_id_scene_references","summary":"Read the current storyboard scene reference selections","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"threadId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Owned project conversation only. Returns exact version/revision and per-scene canonical image IDs. Null means a legacy scene without automatic reference binding. imageReferenceAssetIds combines selected scene and assigned character images; it is input provenance, not generated likeness evidence."},"patch":{"operationId":"patch__projects_id_scene_references","summary":"Select canonical reference images for a storyboard scene","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Select owned available JPEG, PNG or WebP images from this project, its linked library or selected brand. Exact thread/version/revision and stable sceneId are required. clientId retries are idempotent. Updates remaining work and steers a running chat; completed plans are read-only. Empty clears scene-specific references. Supervisor image quotes and generations automatically include selected scene and cast references without dropping extras beyond model capacity. External image-generation callers pass the returned imageReferenceAssetIds explicitly as generation references. Video start/end frames remain explicit. Creates no media, never repeats submitted work or proves visual identity.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"threadId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"referenceAssetIds":{"maxItems":10,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["threadId","version","revision","clientId","sceneId","referenceAssetIds"],"additionalProperties":false}}}}}},"/projects/{id}/scene-reference-batches":{"post":{"operationId":"post__projects_id_scene_reference_batches","summary":"Select canonical reference images across storyboard scenes atomically","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Prefer this operation when assigning references to multiple scenes. Submit stable scene IDs and owned available JPEG, PNG or WebP asset IDs in selections with one exact thread/version/revision and clientId. Every selection is validated before one plan revision is committed; any invalid scene, unavailable/foreign image or stale revision rejects the entire batch. Empty referenceAssetIds clears one scene. Duplicate scene IDs are rejected. Identical clientId retries are idempotent; changed content conflicts. Completed plans are read-only. External edits steer remaining work once; supervisor edits do not self-steer. Returns the updated plan. Creates no media and never repeats submitted work. Existing single-scene GET/PATCH remains supported.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"threadId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"selections":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"referenceAssetIds":{"maxItems":10,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["sceneId","referenceAssetIds"],"additionalProperties":false}}},"required":["threadId","version","revision","clientId","selections"],"additionalProperties":false}}}}}},"/projects/{id}/production-reviews":{"get":{"operationId":"get__projects_id_production_reviews","summary":"List stage reviews for an owned project conversation","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"threadId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns the latest twelve image and preview stage decisions, exact media and plan revisions. Read-only; never authorizes production."},"post":{"operationId":"post__projects_id_production_reviews","summary":"Request review of keyframes or an exact rendered preview","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Explicit stage reviews work in automatic and guided plans without changing the standing review preference. A pending review pauses new production until its bound customer decision. Requires a running guided production in this owned project and exact confirmed storyboard version/revision. clientId is an idempotent request UUID. Keyframes include one image for every scene. Preview requires one completed render asset matching timelineRevision. Pauses the same chat workflow at its next committed step, creates no paid media and never substitutes for initial brief confirmation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"threadId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"runId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"review":{"type":"object","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"kind":{"type":"string","enum":["keyframes","preview"]},"assets":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["assetId"],"additionalProperties":false}},"timelineRevision":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["clientId","version","revision","kind","assets"],"additionalProperties":false}},"required":["threadId","runId","review"],"additionalProperties":false}}}}}},"/projects/{id}/production-reviews/{review}":{"get":{"operationId":"get__projects_id_production_reviews_review","summary":"Read a production-stage review","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"review","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__projects_id_production_reviews_review","summary":"Approve or request changes to a production stage","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"review","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires project edit access, exact displayed evidenceDigest and current storyboard version/revision. clientId makes identical answers idempotent. revise requires a note; it does not approve animation. Stale, replaced, expired or foreign media is rejected. Resumes the same workflow with the recorded human answer; no new build or provider job is created by this request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"evidenceDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"decision":{"type":"string","enum":["approved","revise"]},"note":{"default":"","type":"string","maxLength":2000}},"required":["clientId","version","revision","evidenceDigest","decision"],"additionalProperties":false}}}}}},"/projects/{id}/narration-fit-plan":{"post":{"operationId":"post__projects_id_narration_fit_plan","summary":"Fit all recorded narration takes to one runtime without trial derivatives","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only calculation from owned audio-only asset durations, with no model, media job, reservation or editor call. Supply original narration assetIds in playback order, target duration, padding/gaps, frame rate and maximum acceptable tempo. Returns one uniform pitch-preserving pace, frame-allocated nominal positions and existing finishes API request bodies. Already-fitting takes return no finish requests. A pace conflict returns needs_revision and no requests; it never removes words, silently raises the pace limit, stretches short speech or changes source files. Durations and positions are nominal full-source calculations, not word timing, actual encoded length or verified intelligibility. Submit each required finish once with its own stable idempotency key, wait for completion, then measure/listen to resulting audio and use narration-plan for timed captions. Requests are suggestions only and are not executed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetIds":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":1800},"leadingSeconds":{"default":0.2,"type":"number","minimum":0,"maximum":1800},"trailingSeconds":{"default":0.3,"type":"number","minimum":0,"maximum":1800},"gapSeconds":{"default":0.15,"type":"number","minimum":0,"maximum":1800},"maximumTempo":{"default":1.25,"description":"Maximum acceptable speed-up for this performance. Default 1.25 is a planning preference, not a guarantee of natural or intelligible speech. A conflict never silently increases this value.","type":"number","minimum":1,"maximum":4},"fps":{"default":{"num":30,"den":1},"type":"object","properties":{"num":{"type":"integer","exclusiveMinimum":0,"maximum":60000},"den":{"type":"integer","exclusiveMinimum":0,"maximum":1001}},"required":["num","den"],"additionalProperties":false}},"required":["assetIds","durationSeconds"],"additionalProperties":false}}}}}},"/projects/{id}/narration-plan":{"post":{"operationId":"post__projects_id_narration_plan","summary":"Validate narration timing and caption settings before editing","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Requires a completed owned reviewId for the selected narration. When addAudio=true and trackId is supplied, it must be an exact current timeline track ID; names are not IDs. An absent track returns 409 without work. Omit trackId to create a separate narration track when applying. Reuses recognized word timings, preserves source offsets and speech handles, validates segment overlap and timeline end, and checks the current timeline revision. Returns cues, SRT and the exact apply body. plan.speechCuts reports each compiled leading/trailing cut, nearest recognized word, signed margin and a source-relative inspection range. A cut within0.25seconds of a recognized word is marked inspect, not diagnosed as defective. No acoustic boundary detection is performed; buffered and source_boundary states do not certify complete speech. Inspect original audio before trimming more or adding silence. Existing source cuts are unchanged. Caption readability uses bounded display-only holds by default and returns original speech endpoints separately; readability.mode=speech_timed preserves measured cue endpoints exactly. Optional readability controls maximum characters per second, minimum display duration and trailing hold; the plan reports adjusted and limited cues without changing audio or word evidence. Optional protectedPhrases keeps matching approved phone numbers or names in one measured cue, preserves uncertainty, and rejects cuts through the phrase. Missing recognition is a warning, never fabricated speech. A zero-duration recognition candidate with known confidence below0.2 is excluded from timed cues and reported in plan.timingExclusions with its original word, time, probability, index and reason; plan.uncertain remains true and raw review evidence is unchanged. Other invalid timing still fails. This does not establish that excluded words were absent: inspect the audio. No transcription, reservations, generation or timeline changes. Correct unsupported caption appearance keys before submitting the resulting narration-captions request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"reviewId":{"description":"Completed source word-timing review. Its analyzed range must cover the entire planned audio segment, including added speech handles. New requests with invalid saved timing fail before a job is queued; original receipts remain recoverable.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"addAudio":{"default":true,"type":"boolean"},"trackId":{"type":"string","minLength":1,"maxLength":80,"description":"Exact existing track ID from the current owned editor timeline, not its name. Checked before new audio jobs are queued and before analysis/apply. Omit to create a separate narration track. Ignored when addAudio=false. Replaying an existing idempotency key recovers its original receipt even if the track later changes."},"segments":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"sourceStart":{"type":"number","minimum":0,"maximum":1800},"sourceEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"position":{"type":"number","minimum":0,"maximum":1800}},"required":["sourceStart","sourceEnd","position"],"additionalProperties":false}},"leadingHandle":{"default":0.08,"type":"number","minimum":0,"maximum":0.5},"trailingHandle":{"default":0.12,"type":"number","minimum":0,"maximum":0.5},"timelineEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"language":{"type":"string","pattern":"^[a-z]{2,3}$"},"transcriptionQuality":{"default":"high","type":"string","enum":["standard","high"]},"readability":{"description":"Caption display timing. Omitted uses balanced defaults: 22 characters/second, minimum 0.8 seconds and at most 0.5 seconds trailing hold. Holds cannot cross the next caption, narration segment end or timelineEnd. Source word/audio timing stays unchanged. speech_timed keeps original measured endpoints. Inspect limited reading-time warnings before final delivery.","type":"object","properties":{"mode":{"default":"balanced","type":"string","enum":["balanced","speech_timed"]},"maximumCharactersPerSecond":{"default":22,"type":"number","minimum":10,"maximum":40},"minimumDuration":{"default":0.8,"type":"number","minimum":0,"maximum":2},"maximumTrailingHold":{"default":0.5,"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"protectedPhrases":{"description":"Approved phone numbers, names or short phrases to keep in one timed cue. Uses only matching recognized words and their real timestamps; matching phrases use the supplied spelling, case and punctuation. Missing matches remain warnings and are never inserted. Does not translate, invent speech or verify the wording.","maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":160}},"format":{"default":{"style":"dark-pill","placement":"bottom","animation":"fade"},"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["revision","assetId"],"additionalProperties":false}}}}}},"/projects/{id}/narration-captions":{"post":{"operationId":"post__projects_id_narration_captions","summary":"Transcribe narration and import editable timed captions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Queued asynchronously; poll the Location endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Creates a durable production job. New requests with addAudio=true and trackId validate the exact owned track and revision before enqueue. Invalid targets return 409 without creating work. Already-admitted idempotency keys retain the original receipt; queued workers recheck targets before analysis and native apply. Reuses the supplied completed review or transcribes the source, maps words through explicit source cuts and timeline offsets, and applies one atomic editor transaction against the supplied revision. addAudio=true also adds a separate audio track with video disabled and preserves leading/trailing speech handles; overlapping segments or an exceeded timelineEnd fail before editing. addAudio=false changes captions only and reports any truncated word. The source is immutable. For voice-first supervisor animation, a later completed narration edit can explicitly select a previously generated source even while a replacement request is unresolved, when the exact owned measured source, approved scene/script, selected speech range and unchanged committed timeline clips are verified. This never retries or changes the unresolved provider request and does not certify audible quality. Retries reuse the review and editor receipt; stale revisions retain analysis for a new revision request. Inspect uncertainty and speech timing; this is recognition alignment, not invented translated-word timing. Optional readability controls maximum characters per second, minimum display duration and trailing hold; the plan reports adjusted and limited cues without changing audio or word evidence. Optional protectedPhrases keeps matching approved phone numbers or names in one measured cue, preserves uncertainty, and rejects cuts through the phrase. Missing recognition is a warning, never fabricated speech.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"reviewId":{"description":"Completed source word-timing review. Its analyzed range must cover the entire planned audio segment, including added speech handles. New requests with invalid saved timing fail before a job is queued; original receipts remain recoverable.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"addAudio":{"default":true,"type":"boolean"},"trackId":{"type":"string","minLength":1,"maxLength":80,"description":"Exact existing track ID from the current owned editor timeline, not its name. Checked before new audio jobs are queued and before analysis/apply. Omit to create a separate narration track. Ignored when addAudio=false. Replaying an existing idempotency key recovers its original receipt even if the track later changes."},"segments":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"sourceStart":{"type":"number","minimum":0,"maximum":1800},"sourceEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"position":{"type":"number","minimum":0,"maximum":1800}},"required":["sourceStart","sourceEnd","position"],"additionalProperties":false}},"leadingHandle":{"default":0.08,"type":"number","minimum":0,"maximum":0.5},"trailingHandle":{"default":0.12,"type":"number","minimum":0,"maximum":0.5},"timelineEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"language":{"type":"string","pattern":"^[a-z]{2,3}$"},"transcriptionQuality":{"default":"high","type":"string","enum":["standard","high"]},"readability":{"description":"Caption display timing. Omitted uses balanced defaults: 22 characters/second, minimum 0.8 seconds and at most 0.5 seconds trailing hold. Holds cannot cross the next caption, narration segment end or timelineEnd. Source word/audio timing stays unchanged. speech_timed keeps original measured endpoints. Inspect limited reading-time warnings before final delivery.","type":"object","properties":{"mode":{"default":"balanced","type":"string","enum":["balanced","speech_timed"]},"maximumCharactersPerSecond":{"default":22,"type":"number","minimum":10,"maximum":40},"minimumDuration":{"default":0.8,"type":"number","minimum":0,"maximum":2},"maximumTrailingHold":{"default":0.5,"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"protectedPhrases":{"description":"Approved phone numbers, names or short phrases to keep in one timed cue. Uses only matching recognized words and their real timestamps; matching phrases use the supplied spelling, case and punctuation. Missing matches remain warnings and are never inserted. Does not translate, invent speech or verify the wording.","maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":160}},"format":{"default":{"style":"dark-pill","placement":"bottom","animation":"fade"},"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["revision","assetId"],"additionalProperties":false}}}}}},"/projects/{id}/deliveries":{"post":{"operationId":"post__projects_id_deliveries","summary":"Render and finish a revision-bound delivery bundle","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Queued asynchronously; poll the Location endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Optional sourceRenderId reuses an explicitly selected completed full native render, after checking its owned project, exact revision, native receipt, complete interval, dimensions, frame rate, retained caption roles and available media. It pins the historical picture even if the live timeline later changes; finishing, clean-caption omission and final reviews still run as requested. Invalid, expired or mismatched references fail without silently re-rendering. Omission preserves fresh rendering. Optional expectedDurationSeconds checks every clip endpoint before queueing/rendering and verifies encoded master durations. end is a source trim, so timeline endpoint = position + end - start. A mismatch returns409 with offending clips and does not silently trim them. Supervisor deliveries automatically use the approved brief duration. Freezes the timeline, produces requested clean/captioned normalized masters and SRT/VTT from the same revision. Optional sidecarCaptions preserves separately approved SRT/VTT speech cues without burning duplicate text into picture. Times are relative to the final file and bounded by its frozen duration; omission preserves timeline-derived sidecars. Clean removes subtitle-role captions by default while retaining titles, brand, contact and disclosures. Completed child outputs are reused after interruption. Final readiness requires every requested master and its durable media review. Supervisor requests obey the storyboard quality-check selection: local by default; assisted explicitly enables model-based review. External API callers retain explicit review.perceptual access. Optional review.perceptual opts into paid listening/watching of each exact finished master, requires expectedDurationSeconds up to 600, checks the local wallet and creates durable per-segment reservations after mastering. Resume reuses completed or uncertain receipts without another paid submission. Parent cancellation releases only unsubmitted attempts; completed downloads remain available. Omission preserves technical-only review. The result links review evidence and reports quality as passed or needs_review; unmeasured checks are never certified. A single final export notice is emitted; internal renders are silent. Audio-only finishing preserves compatible picture streams unless an output profile is explicitly changed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"speechReview":{"type":"object","properties":{"sceneIds":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["sceneIds"],"additionalProperties":false,"description":"Automatically select local mouth/speech diagnostic intervals for these dialogue scenes from the frozen final timeline. Scene identity comes from owned video generation provenance, never clip titles or planned durations. Includes half a second around each placed clip; crossing scene boundaries uses unknown intent. Missing provenance rejects before rendering. Diagnostic findings require playback inspection; no quality pass or automatic edit is granted. No paid provider request."},"sourceRenderId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Optional exact completed full native render to reuse for this revision. Must belong to this account/project, preserve all caption roles and cover the full timeline at its original dimensions and frame rate. An invalid reference fails instead of silently rendering again. Omit for a fresh freeze/render."},"expectedDurationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":1800},"policyRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"policyOverrides":{"type":"object","properties":{"version":{"type":"number","const":1},"preserveOriginals":{"type":"boolean","const":true},"captions":{"type":"string","enum":["editable","none"]},"narration":{"type":"string","enum":["separate","source","none"]},"sourceAudio":{"type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false},"name":{"default":"Campaign delivery","type":"string","minLength":1,"maxLength":100},"sidecarCaptions":{"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80},"text":{"type":"string","minLength":1,"maxLength":2000},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800}},"required":["id","text","start","end"],"additionalProperties":false},"description":"Optional separately approved SRT/VTT cues in final-file seconds. These do not burn text into picture; use to retain speech captions when an existing contact/title already displays the words. Omit to derive sidecars from the frozen timeline."},"masters":{"default":["captioned","clean"],"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["captioned","clean"]}},"cleanOmitRoles":{"default":["subtitle"],"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}},"audio":{"default":{"name":"Finished media","sourceAudio":"keep","sourceAudioRole":"mix","stems":[],"targetLufs":-16,"maxTruePeakDbtp":-1,"retention":"30_days"},"type":"object","properties":{"name":{"default":"Finished media","type":"string","minLength":1,"maxLength":120},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"voice":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":1800},"gainDb":{"default":0,"type":"number","minimum":-40,"maximum":12}},"required":["assetId"],"additionalProperties":false},"music":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":1800},"gainDb":{"default":-14,"type":"number","minimum":-40,"maximum":0},"duck":{"default":true,"type":"boolean"}},"required":["assetId"],"additionalProperties":false},"sourceTempo":{"type":"number","minimum":0.25,"maximum":4},"sourceAudio":{"default":"keep","description":"Source audio is the entire rendered timeline mix, including narration, music and sound effects. Keep it when those are already assembled. Replace removes it all; without replacement voice/music/stems the result is silent. Mute unwanted generated-clip audio on individual timeline clips before delivery.","type":"string","enum":["keep","replace"]},"sourceAudioRole":{"default":"mix","type":"string","enum":["mix","voice","music","ambience","sound"]},"stems":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"role":{"type":"string","enum":["voice","music","ambience","sound"]},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"sourceStart":{"default":0,"type":"number","minimum":0,"maximum":1800},"sourceEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"gainDb":{"default":0,"type":"number","minimum":-60,"maximum":12},"fadeIn":{"default":0,"type":"number","minimum":0,"maximum":1800},"fadeOut":{"default":0,"type":"number","minimum":0,"maximum":1800},"duck":{"default":true,"type":"boolean"}},"required":["assetId","role"],"additionalProperties":false}},"targetLufs":{"default":-16,"type":"number","minimum":-30,"maximum":-8},"maxTruePeakDbtp":{"default":-1,"type":"number","minimum":-6,"maximum":-0.5},"output":{"type":"object","properties":{"width":{"type":"integer","minimum":160,"maximum":3840},"height":{"type":"integer","minimum":160,"maximum":3840},"fit":{"default":"contain","type":"string","enum":["contain","cover"]},"fps":{"default":"30","type":"string","enum":["24","25","30","60"]},"quality":{"default":"high","type":"string","enum":["standard","high"]},"audioBitrateKbps":{"default":"192","type":"string","enum":["128","192","256"]}},"required":["width","height"],"additionalProperties":false},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]}},"additionalProperties":false},"review":{"type":"object","properties":{"textRecognition":{"type":"string","const":"local","description":"Optional pinned offline OCR on sampled frames and requested detail crops. Automatically adds frame extraction. Returns line polygons and confidence in checks.textRecognition with a private full artifact. Uses actual decoded frame timestamps; never invents word boxes or certifies unsampled frames, readability or timing. No paid provider calls. Check capabilities.textRecognition.configured."},"wordAlignment":{"type":"string","const":"local","description":"Optional local English word-alignment diagnostic using independently recognized speech plus speech likelihood. Automatically enables transcript analysis. Returns unverified candidate times in a private artifact; does not replace captions, retime media or certify words/lip sync. Check capabilities.wordAlignment.configured. No paid review request."},"localSpeechMotion":{"type":"object","properties":{"windows":{"minItems":1,"maxItems":60,"type":"array","items":{"type":"object","properties":{"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"sceneIntent":{"default":"unknown","type":"string","enum":["on_camera_dialogue","voiceover","unknown"]}},"required":["start","end"],"additionalProperties":false}}},"required":["windows"],"additionalProperties":false,"description":"Optional local diagnostic on selected source-relative video intervals. Measures silent mouth-motion candidates and audio/face timing, without a quality pass, active-speaker proof or automatic edits. Declare approved scene intent. No provider generation/review request is made. Unsupported or missing evidence stays unassessed; times are original source seconds. Each interval is 2.5–60 seconds. Windows must fit the asset and the enclosing review range."},"perceptual":{"type":"object","properties":{"modelKey":{"default":"gemini-3-8-flash","type":"string","const":"gemini-3-8-flash"},"modes":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["listen","watch"]},"description":"New video watch reviews require explicit speech-motion assessments around frozen media boundaries and recognized phrase endings. Returned perceptual stages include speechMotionInspection and report.speechMotionChecks. Music is not speech; uncertain or omitted inspections cannot be clear. This does not certify every frame or add another paid review stage. Listening-only and image reviews are unchanged."},"brief":{"default":"","type":"string","maxLength":6000},"creativeContext":{"type":"object","properties":{"version":{"type":"number","const":1},"timing":{"type":"string","const":"planned_story_order_not_verified_timeline"},"style":{"type":"string","maxLength":1000},"notes":{"type":"string","maxLength":4000},"scenes":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"title":{"type":"string","maxLength":140},"seconds":{"type":"number","minimum":0},"visual":{"type":"string","maxLength":2000},"camera":{"type":"string","maxLength":700},"motion":{"type":"string","maxLength":700},"continuity":{"type":"string","maxLength":1500},"sound":{"type":"string","maxLength":1000}},"required":["title"],"additionalProperties":false}},"decisions":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"question":{"type":"string","maxLength":600},"answer":{"type":"string","minLength":1,"maxLength":1200},"selectedDescription":{"type":"string","maxLength":400},"resolvedValue":{"type":"string","maxLength":2000}},"required":["question","answer"],"additionalProperties":false}}},"required":["version","timing","scenes","decisions"],"additionalProperties":false,"description":"Optional scene directions and answered creative choices. Expectations only, not observed evidence or permission. Planned scene seconds are not measured output timestamps. Supplied to visual reviews only; no media, additional review modes or production authorization is added."},"brandFacts":{"default":{},"type":"object","properties":{"name":{"type":"string","maxLength":180},"offer":{"type":"string","maxLength":1000},"phone":{"type":"string","maxLength":100},"website":{"type":"string","maxLength":500}},"additionalProperties":false},"frameEvidence":{"type":"boolean","description":"Opt in to timestamped source frames alongside the video for a short action review. The chronological contact sheet retains every requested sample. New reviews may add up to four complete frame images and individual frameChecks assessments, sharing media capacity with references. Requires watch, video, a review interval at most 600 seconds, frames checks, and 2–24 distinct explicit timestamps within the interval. Each video window receives only its selected samples; windows without samples keep ordinary video review. Uses actual decoded JPEG artifacts, not generated images. Adds image input cost; does not certify continuous motion or change the source."},"frameEvidenceRegion":{"type":"integer","minimum":0,"maximum":3,"description":"Optional zero-based index of an existing detailRegions entry. Requires frameEvidence=true. Places that exact native source crop beside the matching full frame at each timestamp. A crop is the same moment, not a reference or another scene; no enhancement or generation."},"referenceAssetIds":{"default":[],"maxItems":4,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["modes"],"additionalProperties":false},"motionMode":{"type":"string","enum":["sampled","all_frames"],"description":"Omit for existing 10 FPS checks. all_frames measures every decoded frame at its actual presentation timestamp using a bounded RGB raster and derived luma, with downloadable frame evidence. Detects brightness flashes and spatial/color excursions returning within 0.2 seconds. Approved measured black holds also explain their contained freeze signals; freezes outside the approved interval remain warnings. Includes flat edge-band positions/thickness; intended borders require plan context. No automatic crop or face recognition. This is signal coverage, not semantic recognition."},"visualMode":{"default":"sampled","type":"string","enum":["sampled","all_frames"],"description":"all_frames records independent whole-frame OCR for every decoded frame. With captions, checks.visual.captionVisibility tracks matching wording across the complete reviewed range, including outside planned intervals. Expected times are never observations. Repeated wording or a phrase contained within another caption cannot identify one overlay. possibleSourceCueIndices lists direct candidate cues, while sharedCueIndices groups exact wording. An ambiguous_shared_phrase status stays uncertain; matches outside every candidate interval retain warnings. Unrecognized text remains uncertain. Times are review-relative. Inspect pixels before retiming; this is not speech synchronization or a visibility certificate."},"retention":{"default":"7_days","type":"string","enum":["7_days","30_days","campaign"]},"transcriptionQuality":{"type":"string","enum":["standard","high"]},"captionLanguage":{"type":"string","pattern":"^[a-z]{2,3}$"},"checks":{"default":["metadata","frames","audio","motion"],"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","enum":["metadata","frames","audio","motion","transcript","captions","visual","rhythm"]}},"safeArea":{"default":{"left":0.05,"right":0.05,"top":0.1,"bottom":0.15},"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"required":["left","right","top","bottom"],"additionalProperties":false},"protectedRegions":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}},"timestamps":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"number","minimum":0,"maximum":600},"description":"When omitted, frame sampling prioritizes caption midpoints across the entire reviewed interval, then overview frames, capped at 24. checks.frames.captionSampling reports actual decoded-frame inclusion for each cue; unsampled and edge-only cues remain explicit. This is temporal evidence, not verified readability or opacity. Explicit timestamps are preserved. With motionMode all_frames and omitted timestamps, unused frame slots add decoded before/at pairs around PySceneDetect candidates; checks.frames.boundaryContext reports source indices, PTS and omitted pairs. These are inspection targets, not confirmed cuts or automatic quality approval. For still-frame inspection of an existing export, request checks:[metadata,frames] and batch timestamps instead of rendering tiny videos for their posters. Read the returned JPEG artifacts through HTTP/MCP. Seconds relative to the reviewed file, or relative to range.start when a range is supplied. A short preview starts at zero here, not at its full-project position. Values must be within its duration. Use renderId to associate native captions and original timeline times."},"detailRegions":{"minItems":1,"maxItems":4,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["x","y","width","height"],"additionalProperties":false},"description":"Optional normalized rectangles in the decoded, display-oriented frame. With checks frames or visual, produce native-resolution JPEG crops for each sampled frame, capped by frameMaxDimension without upscaling. Use for small logos, lettering or exact correction areas. Region artifacts include source pixel bounds, dimensions, timestamps and hashes. They supplement the full frame; crops cannot establish whole-scene correctness or motion. No source edit, generation or automatic approval."},"frameMaxDimension":{"default":640,"type":"integer","minimum":320,"maximum":1920},"minWordProbability":{"default":0.2,"type":"number","minimum":0,"maximum":1},"expectSpeech":{"default":true,"type":"boolean"},"ocrMinConfidence":{"default":60,"type":"number","minimum":0,"maximum":100},"audioRole":{"default":"mix","type":"string","enum":["mix","voice","music","sound"]},"expectedScript":{"type":"string","maxLength":10000},"language":{"type":"string","pattern":"^[a-z]{2,3}$"},"expectAudio":{"default":true,"type":"boolean"},"targetLufs":{"default":-16,"type":"number","minimum":-30,"maximum":-8},"maxTruePeakDbtp":{"default":-1,"type":"number","minimum":-6,"maximum":0},"silenceThresholdDb":{"default":-50,"type":"number","minimum":-80,"maximum":-20},"intentionalIntervals":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["black","freeze","silence","flicker","border_band"]},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600},"reason":{"type":"string","minLength":1,"maxLength":300}},"required":["type","start","end","reason"],"additionalProperties":false}}},"additionalProperties":false},"style":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id","version"],"additionalProperties":false}},"required":["revision"],"additionalProperties":false}}}}}},"/production-jobs/{jobId}/subtitles.srt":{"get":{"operationId":"get__production_jobs_jobId_subtitles_srt","summary":"Download the frozen delivery subtitles","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private subtitle attachment"},"409":{"description":"Delivery incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/production-jobs/{jobId}/subtitles.vtt":{"get":{"operationId":"get__production_jobs_jobId_subtitles_vtt","summary":"Download the frozen delivery subtitles","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private subtitle attachment"},"409":{"description":"Delivery incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/audio/separation":{"get":{"operationId":"get__audio_separation","summary":"Discover vocal and music separation capabilities","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns availability, two-stem and four-stem modes, supported interval and source size, output format and quality limitations. Local processing; no paid media generation. Each result requires listening review."}},"/assets/{id}/stem-separations":{"post":{"operationId":"post__assets_id_stem_separations","summary":"Separate vocals or musical parts into aligned audio assets","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Owned audio or MP4/MOV with an audio stream, maximum5GiB and selected interval up to600seconds. modes: vocals_accompaniment (vocals plus original-minus-vocals residual) or four_stems (drums,bass,other,vocals). Produces separate24bit44100Hz stereo WAV assets linked to projectId; the original remains untouched. First output sample corresponds to source start; all stems share duration and commonGainDb. Poll or cancel the production job; completed result.stems lists private content URLs and asset IDs for editor/finishing. Output retention30days, permanent archive available separately. Unknown asset-insert acknowledgements recover by durable receipts; originals are never overwritten. A source without audio fails with source_has_no_audio. No automatic timeline replacement. Successful processing does not certify isolation or intelligibility; quality remains needs_review. Vocal leakage, background voices, music bleed and artifacts may remain.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mode":{"default":"vocals_accompaniment","type":"string","enum":["vocals_accompaniment","four_stems"]},"start":{"default":0,"type":"number","minimum":0},"end":{"type":"number","exclusiveMinimum":0},"name":{"type":"string","minLength":1,"maxLength":100}},"required":["projectId"],"additionalProperties":false}}}}}},"/assets/{id}/motion-analysis":{"post":{"operationId":"post__assets_id_motion_analysis","summary":"Track a selected visual patch or stabilize an owned video","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Asynchronous source-range analysis up to 5 GiB. track uses a normalized source-frame rectangle and reports feature loss without inventing coordinates; uniform resampled timestamps are approximate source-frame selections. This is feature tracking, not semantic object detection. stabilize creates a separate SDR H264/AAC derivative using two-pass camera motion analysis and automatic border zoom. Rotation metadata and HDR stabilization are rejected explicitly. The original is untouched. Poll the production job; cancellation uses the existing job cancel operation. Outputs retain30days; always preview before delivery.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"operation":{"type":"string","const":"track"},"region":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["x","y","width","height"],"additionalProperties":false},"sampleFps":{"default":15,"anyOf":[{"type":"number","const":10},{"type":"number","const":15},{"type":"number","const":30}]}},"required":["projectId","operation","region"],"additionalProperties":false},{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"operation":{"type":"string","const":"stabilize"},"smoothingFrames":{"default":15,"type":"integer","minimum":1,"maximum":120},"shakiness":{"default":5,"type":"integer","minimum":1,"maximum":10}},"required":["projectId","operation"],"additionalProperties":false}]}}}}}},"/production-jobs/{jobId}/tracking.json":{"get":{"operationId":"get__production_jobs_jobId_tracking_json","summary":"Download private tracking coordinates and loss evidence","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private JSON artifact with source-relative resampled timestamps and normalized translation; no object-store URLs."},"409":{"description":"Tracking incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{id}/editor/analysis-plan":{"post":{"operationId":"post__projects_id_editor_analysis_plan","summary":"Plan insertion of stabilized media or apply measured translation to an overlay","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Returns revision-bound batch commands without applying edits. insert-stabilized adds the derivative on an existing track with source audio muted by default. follow-track adds measured relative translation to a separately positioned static overlay over the exact analyzed time interval. Requires a complete track, an untransformed source with matching canvas aspect, no existing source effects or speed mapping, and no pre-existing animated overlay position. Reframe/render transformed sources before analysis. Inspect the evidence and actual preview; apply using editor/batches with the supplied revision and idempotency key. Originals and historical facts stay unchanged.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","const":"insert-stabilized"},"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":3600},"sourceAudio":{"default":"mute","type":"string","enum":["mute","preserve"]}},"required":["action","jobId","revision","trackId","position"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"follow-track"},"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"sourceClipId":{"type":"string","minLength":1,"maxLength":80},"overlayClipId":{"type":"string","minLength":1,"maxLength":80}},"required":["action","jobId","revision","sourceClipId","overlayClipId"],"additionalProperties":false}]}}}}}},"/assets/{id}/provenance":{"get":{"operationId":"get__assets_id_provenance","summary":"Read preserved original metadata and editing proxy","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Source checksum, codec, frame rate, time base and color metadata. Original content is retained; proxy parameters are explicit. Newly ingested generation outputs preserve provider bytes and their checksum without a second lossy encode. They stream to storage up to 5 GiB. For original-only assets, proxy and proxyUrl are null and the proxy endpoint returns 404. No object-store paths or provider URLs are exposed."}},"/assets/{id}/proxy":{"get":{"operationId":"get__assets_id_proxy","summary":"Read the editing proxy","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Private binary proxy"},"404":{"description":"No proxy exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/styles":{"get":{"operationId":"get__styles","summary":"Search versioned reel styles","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":200}},{"name":"after","in":"query","schema":{"type":"integer","minimum":0}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Published visual samples are available in preview when state is rendered_sample: version-bound public videoUrl/posterUrl, durationSeconds, dimensions and SHA256. Samples are silent native treatment demonstrations, not completed commercial-film validation. A changed recipe invalidates its old sample; pending_validation has no playable URL. Native recipe directions with captions, transitions, motion, music and source attribution. Optional starter contains an original editable example: title, category, summary, prompt and storyBeats. Search includes those fields. A starter is suggestion text, never authorization or a queued job; clients must retain brief confirmation. preview.state reports actual validation; an unavailable preview is not a rendered quality claim."}},"/styles/{style}/skill":{"get":{"operationId":"get__styles_style_skill","summary":"Read reviewed reel direction and native tool bindings","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"style","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"query","schema":{"type":"integer","enum":[1,2],"default":2}},{"name":"styleVersion","in":"query","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"styleVersion pins the recipe independently of the direction version; missing historical versions return 404 without substitution. Returns one original authored Markdown direction, immutable version/hash, native caption/motion/transition bindings and planning steps. Version 2 is current; version=1 reads the preserved definition for previously approved plans. Only allowlisted server content enters supervisor instructions. Guidance is policy-reviewed; renderValidation independently records whether actual output has been validated. No remote code, shell commands, installation or user-supplied skill import is supported."}},"/styles/{style}":{"get":{"operationId":"get__styles_style","summary":"Read one versioned reel style","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"style","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Omit version for the latest published recipe. Supply version to resolve an exact historical recipe; unknown versions return 404 and never fall back. Plans must preserve the returned version. Reel-plan validates styleVersion before compilation; unsupported versions start no work."}},"/projects/{id}/reel-plan":{"post":{"operationId":"post__projects_id_reel_plan","summary":"Compile a style and brief into timed scenes and dependencies","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only planning operation. Resolves owned brand facts/assets; returns a deterministic digest, style version, timed scenes and dependency graph. Optional policyRevision pins an owned project policy (0 selects immutable defaults); policyOverrides applies film-specific voice/caption/source-audio choices without changing project defaults. The response includes the effective policy snapshot and digest. Omitted fields preserve existing behavior. Creates no media, charges nothing and requires the normal brief confirmation before execution.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policyRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"policyOverrides":{"type":"object","properties":{"version":{"type":"number","const":1},"preserveOriginals":{"type":"boolean","const":true},"captions":{"type":"string","enum":["editable","none"]},"narration":{"type":"string","enum":["separate","source","none"]},"sourceAudio":{"type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false},"styleId":{"type":"string","enum":["clean-editorial","calm-luxury","bold-offer","creator-story","cinematic-product","kinetic-typography","product-benefits","client-story","comparison","quick-tips","property-tour","food-showcase","documentary-interview","brand-launch","narrative-film","cinematic-trailer","visual-explainer","music-video"]},"styleVersion":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"durationSeconds":{"default":35,"type":"number","minimum":5,"maximum":1800},"aspectRatio":{"default":"9:16","type":"string","enum":["9:16","1:1","16:9"]},"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"brief":{"type":"string","minLength":1,"maxLength":20000},"assetIds":{"default":[],"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["styleId","brief"],"additionalProperties":false}}}}}},"/brands/{id}/fonts":{"get":{"operationId":"get__brands_id_fonts","summary":"List private, pinned brand fonts","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns display family, exact render family, checksum, weight, style, license metadata and immutable asset IDs. New version-2 uploads normalize deterministically and use a distinct private alias; existing version-1 assets and frozen renders remain unchanged. Attach a font asset to an owned project before using its renderFamily in caption appearance.font. Missing glyphs or conflicting pinned font bytes fail explicitly instead of substituting another family."},"post":{"operationId":"post__brands_id_fonts","summary":"Validate and upload a private brand font","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","name","license"],"properties":{"file":{"type":"string","format":"binary"},"name":{"type":"string","minLength":1,"maxLength":120},"license":{"type":"string","minLength":1,"maxLength":2000}}}}}},"description":"TTF, OTF, WOFF or WOFF2 up to 5 MiB. Provide your font license metadata. Validates outlines and checksums in a bounded process, pins an isolated family alias, and stores the normalized font privately. New files create new immutable font assets; no global font installation. Requires account library write authority."}},"/brands/{id}/profile":{"get":{"operationId":"get__brands_id_profile","summary":"Read versioned brand facts and role-tagged assets","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"put__brands_id_profile","summary":"Publish a brand profile revision","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Supply the current revision; concurrent updates return 409. Retains historical revisions. All referenced assets must be owned. Contact/offer facts are supplied by the customer, never invented.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"displayName":{"type":"string","minLength":1,"maxLength":120},"description":{"default":"","type":"string","maxLength":5000},"colors":{"default":[],"maxItems":12,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"fontAssetIds":{"default":[],"maxItems":12,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"assets":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"role":{"type":"string","enum":["logo","hero","product","person","reference","music","voice","sound","mask"]}},"required":["assetId","role"],"additionalProperties":false}},"contact":{"default":{},"type":"object","properties":{"phone":{"type":"string","maxLength":80},"website":{"type":"string","maxLength":500,"format":"uri"},"address":{"type":"string","maxLength":500}},"additionalProperties":false},"offers":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":1000},"conditions":{"default":"","type":"string","maxLength":1000},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["text"],"additionalProperties":false}}},"required":["revision","displayName"],"additionalProperties":false}}}}}},"/generation-series":{"get":{"operationId":"get__generation_series","summary":"List grouped scene generations","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"after","in":"query","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Bounded cursor pages of owned series. Project-scoped team grants apply. Each summary distinguishes running, completed, needs_review, needs_attention and cancelled."},"post":{"operationId":"post__generation_series","summary":"Submit a scene series or selective revision","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Existing or fully reused series; inspect state and individual node outcomes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"202":{"description":"Queued asynchronously; poll the Location endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Atomically records an immutable series and its new jobs. Nodes either generate with complete GenerationInput except projectId/policyRevision, or reuse an owned existing generation receipt. New video nodes can depend on earlier new images in the same scene. Audio nodes may use a stable client-generated grouping UUID in sceneId without adding a visual scene to the project, just like POST /generations. Reuse that UUID for revisions of the same audio track; visual nodes still require an existing project scene. Reused image dependencies must already be completed. parentSeriesId creates a new revision, never edits history; matching generated node IDs inherit parentGenerationId. Completed reused outputs are attached to this project without copying; pending reused jobs are tracked without resubmission and can be attached after completion by replaying this same request. Partial failures remain visible; no automatic paid retry. Retry identical inputs with the same key; changed inputs require a new key. Poll statusUrl; a fully reused terminal series returns 200.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"name":{"type":"string","minLength":1,"maxLength":120},"parentSeriesId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policyRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"policyOverrides":{"type":"object","properties":{"version":{"type":"number","const":1},"preserveOriginals":{"type":"boolean","const":true},"captions":{"type":"string","enum":["editable","none"]},"narration":{"type":"string","enum":["separate","source","none"]},"sourceAudio":{"type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false},"nodes":{"minItems":1,"maxItems":160,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"action":{"type":"string","const":"generate"},"request":{"type":"object","properties":{"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"modelKey":{"type":"string","minLength":1,"maxLength":120},"prompt":{"type":"string","minLength":1,"maxLength":30000},"references":{"default":[],"description":"Owned image asset IDs, not generation job IDs. For a generated image, wait for its generation to complete and read outputs (the array of asset IDs); use that exact asset ID. Never infer asset IDs from a generation ID or sequence. Null is only an empty optional reference slot.","maxItems":30,"type":"array","items":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]}},"mediaReferences":{"type":"object","properties":{"videos":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"audio":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"additionalProperties":false,"description":"Owned media asset IDs. Kling Motion requires one video; Wan reference mode accepts up to five videos and five audio files. Duration and billing are measured by the server. Use references for image asset IDs."},"speakerId":{"anyOf":[{"type":"string","const":"narrator"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}],"description":"Separate voice generation only: narrator or the stable character UUID from the approved plan. Omit for native-video dialogue, images, music and sound effects; native video speech is directed in prompt using the catalog audio setting."},"dialogueLineIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Separate character voice generation only. Ordered approved dialogue line UUIDs from this scene, all from the same character speakerId. Omit for native-video dialogue, images, music and sound effects. For native video, put the exact approved speech and character direction in prompt and use the model catalog audio setting."},"settings":{"default":{},"type":"object","propertyNames":{"type":"string","maxLength":40},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}},"identityBindings":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"identityId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"alias":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,39}$"}},"required":["identityId","version","alias"],"additionalProperties":false}},"storyboard":{"type":"object","properties":{"version":{"type":"number","const":1},"shots":{"minItems":2,"maxItems":15,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"prompt":{"type":"string","minLength":1,"maxLength":500,"description":"Complete instructions for this shot. The overview prompt is not appended or silently truncated."},"durationSeconds":{"type":"integer","minimum":1,"maximum":12}},"required":["id","prompt","durationSeconds"],"additionalProperties":false}}},"required":["version","shots"],"additionalProperties":false},"parentGenerationId":{"description":"Previous generation job ID of the SAME media kind, project and scene. For image-to-video, put the completed image asset ID in references and omit this field; an image job is not a parent video generation.","type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["sceneId","modelKey","prompt"],"additionalProperties":false},"dependsOn":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"}},"required":["id","action","request"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"action":{"type":"string","const":"reuse"},"generationId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["id","action","generationId"],"additionalProperties":false}]}}},"required":["projectId","name","nodes"],"additionalProperties":false}}}}}},"/generation-series/quote":{"post":{"operationId":"post__generation_series_quote","summary":"Quote only the new work in a scene series","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Validates every new generation, owned reuse receipt and earlier image dependency. Quotes only new nodes against the local wallet and catalog; creates no series, reservations or provider requests. Reused work costs zero. Admission revalidates current rates.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"name":{"type":"string","minLength":1,"maxLength":120},"parentSeriesId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policyRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"policyOverrides":{"type":"object","properties":{"version":{"type":"number","const":1},"preserveOriginals":{"type":"boolean","const":true},"captions":{"type":"string","enum":["editable","none"]},"narration":{"type":"string","enum":["separate","source","none"]},"sourceAudio":{"type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false},"nodes":{"minItems":1,"maxItems":160,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"action":{"type":"string","const":"generate"},"request":{"type":"object","properties":{"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"modelKey":{"type":"string","minLength":1,"maxLength":120},"prompt":{"type":"string","minLength":1,"maxLength":30000},"references":{"default":[],"description":"Owned image asset IDs, not generation job IDs. For a generated image, wait for its generation to complete and read outputs (the array of asset IDs); use that exact asset ID. Never infer asset IDs from a generation ID or sequence. Null is only an empty optional reference slot.","maxItems":30,"type":"array","items":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]}},"mediaReferences":{"type":"object","properties":{"videos":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"audio":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"additionalProperties":false,"description":"Owned media asset IDs. Kling Motion requires one video; Wan reference mode accepts up to five videos and five audio files. Duration and billing are measured by the server. Use references for image asset IDs."},"speakerId":{"anyOf":[{"type":"string","const":"narrator"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}],"description":"Separate voice generation only: narrator or the stable character UUID from the approved plan. Omit for native-video dialogue, images, music and sound effects; native video speech is directed in prompt using the catalog audio setting."},"dialogueLineIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Separate character voice generation only. Ordered approved dialogue line UUIDs from this scene, all from the same character speakerId. Omit for native-video dialogue, images, music and sound effects. For native video, put the exact approved speech and character direction in prompt and use the model catalog audio setting."},"settings":{"default":{},"type":"object","propertyNames":{"type":"string","maxLength":40},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}},"identityBindings":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"identityId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"alias":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,39}$"}},"required":["identityId","version","alias"],"additionalProperties":false}},"storyboard":{"type":"object","properties":{"version":{"type":"number","const":1},"shots":{"minItems":2,"maxItems":15,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"prompt":{"type":"string","minLength":1,"maxLength":500,"description":"Complete instructions for this shot. The overview prompt is not appended or silently truncated."},"durationSeconds":{"type":"integer","minimum":1,"maximum":12}},"required":["id","prompt","durationSeconds"],"additionalProperties":false}}},"required":["version","shots"],"additionalProperties":false},"parentGenerationId":{"description":"Previous generation job ID of the SAME media kind, project and scene. For image-to-video, put the completed image asset ID in references and omit this field; an image job is not a parent video generation.","type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["sceneId","modelKey","prompt"],"additionalProperties":false},"dependsOn":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"}},"required":["id","action","request"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"action":{"type":"string","const":"reuse"},"generationId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["id","action","generationId"],"additionalProperties":false}]}}},"required":["projectId","name","nodes"],"additionalProperties":false}}}}}},"/generation-series/{series}":{"get":{"operationId":"get__generation_series_series","summary":"Read scene states, outputs and revision lineage","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"series","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns immutable definition, owned generation receipts, aggregate progress and attention flags. Does not submit work or change a timeline. Inspect completed rendered media before treating a storyboard as visually successful."}},"/quotes":{"post":{"operationId":"post__quotes","summary":"Validate and quote a generation from the local catalog","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Uses the generation model/settings/reference rules and current local prices. Returns estimate, reservation ceiling, local available balance and quote expiry. Does not reserve funds, generate media or mutate balance. Admission rechecks the current catalog when submitted. audioPlan reports the actual generation switch, requested audio, preserved source and non-destructive editor mute. Audio-on rates must be configured in the local published catalog; provider usage determines final settlement.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationInput"}}}}}},"/models/match":{"post":{"operationId":"post__models_match","summary":"Match creative requirements to enabled model capabilities","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only matching. Optional resolution uses the exact advertised resolution or quality-mode token (for example 4K or pro). Checks aspect ratio against the selected resolution and returns compatible alternatives, explicit rejection reasons and a series/trim plan. Image-guided proportions may require source validation; matching is not a promise of final delivery framing. Does not reserve funds or submit work.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","audio"]},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":1800},"aspectRatio":{"type":"string","maxLength":20},"resolution":{"type":"string","minLength":1,"maxLength":30},"references":{"default":0,"type":"integer","minimum":0,"maximum":30},"videoReferences":{"default":0,"type":"integer","minimum":0,"maximum":5},"audioReferences":{"default":0,"type":"integer","minimum":0,"maximum":5},"providerAudio":{"default":false,"type":"boolean"},"promptCharacters":{"default":0,"type":"integer","minimum":0,"maximum":30000}},"required":["kind"],"additionalProperties":false}}}}}},"/models/{model}/adapt":{"post":{"operationId":"post__models_model_adapt","summary":"Validate an explicit prompt adaptation without changing history","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"model","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Checks the proposed prompt length and every supplied critical fact; keeps the original prompt. Does not truncate text, silently change duration, submit work or claim semantic equivalence. Review the adaptation in the plan before generation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"originalPrompt":{"type":"string","minLength":1,"maxLength":30000},"adaptedPrompt":{"type":"string","minLength":1,"maxLength":30000},"requiredFacts":{"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":1000}},"settings":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}}},"required":["originalPrompt","adaptedPrompt","requiredFacts"],"additionalProperties":false}}}}}},"/models":{"get":{"operationId":"get__models","summary":"Available models, input definitions and current prices","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["media","image","video","audio","text"],"default":"media"}},{"name":"key","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":120},"description":"Exact Create model key. Returns at most that model, with complete options and conditional constraints. Unknown keys return an empty data array."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Use kind to narrow discovery, then key to retrieve one exact model before generation. Display names and upstream provider IDs are not valid model keys. Kling, Seedance and Wan expose generateAudio (default false). Motion Control and Wan advertise video/audio reference constraints in mediaReferences. Pass owned media asset IDs through generation.mediaReferences; quotes measure duration and include input-video or extra-image charges. Veo and unverified custom video adapters report provider-managed audio; never infer silent output from a missing switch. Returned streams are preserved and can be muted on the timeline. kind=text discovers models accepted by speech-edits, with availability, supported speech tasks and input/output credits per million tokens. usdPerCredit includes this account pricing multiplier. Actual job usage appears in its receipt."}},"/projects":{"get":{"operationId":"get__projects","summary":"List projects","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__projects","summary":"Create a project","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Project"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Creates a project with one empty scene by default. Returned scenes contain IDs for generation. Does not modify an existing project.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectInput"}}}}}},"/projects/{id}":{"get":{"operationId":"get__projects_id","summary":"Get one project","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Project"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patch__projects_id","summary":"Rename a project","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Name only. Supply revision equal to the project updatedAt returned by GET. Concurrent changes return 409. Generation prompts, settings and history remain immutable.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"revision":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["name","revision"],"additionalProperties":false}}}}}},"/assets":{"get":{"operationId":"get__assets","summary":"List assets","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"brandId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"excludeProjectId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"q","in":"query","schema":{"type":"string","maxLength":160},"description":"Literal, case-insensitive name search."},{"name":"kind","in":"query","schema":{"type":"string","enum":["image","video","audio"]}},{"name":"source","in":"query","schema":{"type":"string","enum":["generation","upload","export"]}},{"name":"brandOnly","in":"query","schema":{"type":"string","enum":["true","false"]}},{"name":"availableOnly","in":"query","schema":{"type":"string","enum":["true","false"]}},{"name":"mediaOnly","in":"query","schema":{"type":"string","enum":["true","false"]},"description":"Restrict results to image, video and audio media; omit private fonts and other asset types."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__assets","summary":"Upload project media","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Asset"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"},"projectId":{"type":"integer","minimum":1},"brandId":{"type":"integer","minimum":1}}}}}},"description":"Images up to 10 MiB; video/audio up to 100 MiB. Multipart form with file and projectId or brandId. Brand uploads remain available for reuse; attach them to a project to edit with them. Original upload bytes are preserved. A private normalized proxy is available through GET /assets/{id}/proxy and source checksum through GET /assets/{id}/provenance, consistently with resumable uploads. No arbitrary remote URL imports."}},"/assets/{id}":{"get":{"operationId":"get__assets_id","summary":"Get one asset","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Asset"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/generations":{"get":{"operationId":"get__generations","summary":"List generations","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Generation"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__generations","summary":"Generate a new image, video or audio result","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Generation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Generation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read GET /models first: use an exact enabled model key, option values and conditional constraints. Do not pass inactive fields (for example Kling aspectRatio in frames mode or instrumental music style; put instrumental musical direction in prompt). Invalid settings return 400 with the offending catalog field and permitted values or condition before generation admission. Correct only that field; do not guess another model key or change approved content. An unresolved identical generation cannot be resubmitted with a new Idempotency-Key. Reuse the original request key or inspect/reconcile its existing status; original reservations and historical outputs remain unchanged. Optional speakerId is narrator or a stable character UUID, for separate voice models only. Optional dialogueLineIds identifies ordered character speech lines, requires a character speakerId and is returned unchanged with the receipt. In supervised production, selected IDs must be contiguous lines in the current scene, all from that speaker, and prompt must exactly equal their text joined by a newline; acting notes and speaker names are not spoken copy. Narrator speech remains separate. In supervised voice-first narration, new separate narrator requests must match consecutive words of the current approved scene narration; punctuation and exact digit-spelled phone numbers are accepted. Stale script wording is rejected before admission; existing recordings are never rewritten. It is caller-supplied grouping metadata returned with the generation receipt, not proof of human approval or native-video voice support. Supervised production validates selected voices against the locked current plan before admitting new jobs; other API callers supply their exact modelKey and settings.voice from the catalog. Model determines media kind. Image/video require a scene ID from the project; audio also accepts a new client-generated scene UUID. Prompts/settings belong to this new job. Kling 3.0 accepts storyboard version 1 with unique shot IDs, complete prompts and integer durationSeconds per shot. The shot durations must sum exactly to settings.duration (3–15 seconds). At most one starting image is supported. Shot timing is a provider request, not frame-exact; inspect the rendered result. The overview prompt remains in history and is not appended to shot prompts. parentGenerationId links a new version to a previous generation of the SAME media kind, project and scene without modifying it. Animating an image is a new video: pass the image asset ID in references, not its image generation ID as parentGenerationId. Requires current model availability, project edit access and sufficient customer wallet balance. POST replies 202 for accepted asynchronous work; replay may return 200 or 202 with the same job ID; poll GET /generations/{id}. outputs contains asset IDs. No PUT, PATCH or save operation exists for generation history.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationInput"}}}}}},"/generations/{id}":{"get":{"operationId":"get__generations_id","summary":"Get one generation","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Generation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read owned generation status and exact output asset IDs. ingestion reports the current generated-file retrieval/check/storage phase and transfer-only byte counts; stale observations are historical, and null means unknown or terminal. It never authorizes a new generation. Failed work exposes error.recovery: correct_request means revise confirmed inputs, fix_connection needs connection administration, retry_later is a definitive busy rejection, reconcile prohibits replacement until the original outcome is known, and inspect_result needs a review of a failed terminal result. error.retryable is true only for retry_later, never an instruction to automatically spend. Diagnostic fields are allowlisted upstream parameter names; empty means no field-specific evidence. Never guess an unrecorded cause or rewrite original history. Historical submissionDiagnostic can remain after successful callback recovery; current state and error take precedence."}},"/exports":{"get":{"operationId":"get__exports","summary":"List exports","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."},{"name":"projectId","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Export"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__exports","summary":"Render a new edited video from a clip timeline","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Export"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Export"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Clip order, trim points, transitions, motion, fit, look, volume and titles describe a new export. Existing media remains unchanged. Media must belong to and be attached to the project. Up to 80 clips / 30 minutes. Poll GET /exports/{id}; assetId identifies the completed video. Identical retries reuse the job.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportInput"}}}}}},"/exports/{id}":{"get":{"operationId":"get__exports_id","summary":"Get one export","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Export"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assets/{id}/image-info":{"get":{"operationId":"get__assets_id_image_info","summary":"Inspect image dimensions, transparency and visible artwork bounds","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read-only inspection of an owned, available still PNG, JPEG or WebP from private storage. Returns display-oriented width/height, aspect ratio, hasAlpha, fullyTransparent, sourceSha256, visibleBounds in pixels and normalizedVisibleBounds in fractions. Bounds include every pixel with alpha greater than zero; fully transparent artwork returns null bounds. This describes geometry, not logo recognition or semantic safety. No source, timeline or billing changes. Supports existing assets with no provenance record; accepts no URL, script or caller file path. Streams up to 5 GiB into a private temporary file, decodes at most 40 megapixels and caches by current owned asset version. Busy inspection returns 429; retry later."}},"/generations/{id}/reconcile":{"post":{"operationId":"post__generations_id_reconcile","summary":"Resume tracking an interrupted generation","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Uses only a trusted provider task ID already stored by Create. Never submits a paid generation. recovery is tracking_resumed, not_needed, or provider_confirmation_required. The last state requires administrator/provider confirmation; no charge is silently cleared and no automatic paid retry occurs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/projects/{id}/scenes":{"post":{"operationId":"post__projects_id_scenes","summary":"Add an empty scene","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Client-generated scene UUID makes identical retries safe. Existing historical scene prompts are not editable through this API.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneInput"}}}}}},"/projects/{id}/scenes/{scene}/media":{"get":{"operationId":"get__projects_id_scenes_scene_media","summary":"Read the selected media for a scene","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"scene","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns project revision and selected image, video and audio asset IDs. An asset can be reused in multiple scenes. Selection is project state, separate from the immutable generation scene ID."},"patch":{"operationId":"patch__projects_id_scenes_scene_media","summary":"Select existing media for a storyboard scene","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"scene","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Select image, video or audio by owned asset ID already attached to this project; null clears that selection. Read this endpoint first and supply its revision. Changed selections with a stale revision return409; identical retries are read-only. Validates account, project, availability and media kind. Does not change generation history, source bytes or the native timeline, and creates no paid job. Chat storyboard previews honor explicit selections ahead of automatic latest-generation choices. Use the exact approved scene ID; add that scene first if needed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"image":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]},"video":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]},"audio":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]}},"required":["revision"],"additionalProperties":false}}}}}},"/projects/{id}/assets":{"post":{"operationId":"post__projects_id_assets","summary":"Attach owned media to a project","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkInput"}}}}}},"/speech-edits":{"post":{"operationId":"post__speech_edits","summary":"Translate speech captions or propose an interview edit","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Queued asynchronously; poll the Location endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Uses completed transcription reviews from one owned source asset in this project. References are snapshotted into an immutable, billed text job using the configured text provider and existing customer wallet. translate returns English cues with original ASR segment timings and uncertainty flags; offset/limit page up to 80 cues. verifyAudio=true verifies English translation against the owned speech-audio evidence from one completed review, up to 300 seconds and 10 MiB; no arbitrary audio URLs are accepted. Campaign evidence has no automatic expiry; 7_days and 30_days use the recorded deadline. The worker rechecks source/project ownership and availability, exact size and SHA256 before any provider call. This speech proxy does not certify stereo final-mix quality. edit-plan proposes conservative cuts, chapters and a grounded opening for review; it never changes the timeline. Retry the identical request with its original key. An uncertain provider outcome requires inspection, never an automatic paid retry.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"reviewIds":{"minItems":1,"maxItems":6,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"task":{"type":"string","enum":["translate","edit-plan"]},"modelKey":{"type":"string","minLength":1,"maxLength":80},"targetLanguage":{"default":"en","type":"string","const":"en"},"offset":{"default":0,"type":"integer","minimum":0,"maximum":4000},"limit":{"default":60,"type":"integer","minimum":1,"maximum":80},"verifyAudio":{"type":"boolean"},"instruction":{"default":"","type":"string","maxLength":2000}},"required":["projectId","reviewIds","task","modelKey"],"additionalProperties":false}}}}}},"/speech-edits/{jobId}":{"get":{"operationId":"get__speech_edits_jobId","summary":"Read a speech translation or interview edit plan","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"States follow text jobs: queued, processing, completed, failed, review. A completed result includes validated translation or edit-plan JSON. A failed validation returns result=null and a bounded private diagnostic containing the rejected output; it must never be applied as an edit. Usage and estimated/actual credits stay in the normal account history. Source ASR times are preserved, not forced-aligned English word timings."}},"/uploads":{"post":{"operationId":"post__uploads","summary":"Begin a resumable media upload","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"PNG/JPEG/WebP images, MP4/MOV video and MP3/WAV/OGG/FLAC/M4A/AAC audio. Optional mime identifies the media type; omitted mime preserves video compatibility. Reserves disk capacity and expires in 24 hours. Finished assets are private in Wasabi. Original bytes are preserved as the resulting asset. A separate private proxy normalizes images to PNG, audio to MP3, and video to H.264/AAC at 30 fps with maximum dimension 1920, without upscaling smaller sources. Read /assets/{id}/provenance and /assets/{id}/proxy for metadata and proxy bytes. Native final rendering uses the original asset. All resumable API/chat uploads, production workers and native imports accept at most 5 GiB (5,368,709,120 bytes). Existing image pixel, audio duration and video duration validation applies. Poll status for the resulting assetId. The transient staging file is removed only after the original and proxy are stored in Wasabi.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"name":{"type":"string","minLength":1,"maxLength":120},"size":{"type":"integer","minimum":1,"maximum":5368709120},"mime":{"type":"string","enum":["image/png","image/jpeg","image/webp","video/mp4","video/quicktime","audio/mpeg","audio/mp3","audio/wav","audio/x-wav","audio/ogg","audio/flac","audio/x-flac","audio/mp4","audio/x-m4a","audio/aac"]}},"required":["projectId","name","size"],"additionalProperties":false}}}}}},"/uploads/{uploadId}":{"get":{"operationId":"get__uploads_uploadId","summary":"Read resumable upload status","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete__uploads_uploadId","summary":"Cancel an unfinished upload","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Does not delete an already completed asset."}},"/uploads/{uploadId}/chunks":{"put":{"operationId":"put__uploads_uploadId_chunks","summary":"Stream the next media chunk","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Upload-Offset","in":"header","required":true,"schema":{"type":"integer","minimum":0}},{"name":"Content-Length","in":"header","required":true,"schema":{"type":"integer","minimum":1,"maximum":33554432}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"description":"Up to 32 MiB. Send the exact receivedBytes offset from GET. An interrupted chunk is rolled back. After a lost response, read status before retrying; a stale offset returns 409."}},"/uploads/{uploadId}/complete":{"post":{"operationId":"post__uploads_uploadId_complete","summary":"Queue completed bytes for media processing","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Queued asynchronously; poll the Location endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires receivedBytes=size. Repeating completion is safe. Read state and error; only completed has assetId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/assets/{id}/content":{"get":{"operationId":"get__assets_id_content","summary":"Stream media or a thumbnail","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Range","in":"header","schema":{"type":"string"},"example":"bytes=0-1023"},{"name":"download","in":"query","schema":{"type":"string"}},{"name":"thumbnail","in":"query","schema":{"type":"string"}},{"name":"preview","in":"query","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Binary media"},"206":{"description":"Partial binary media"},"401":{"description":"Unauthenticated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unavailable media","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Expired media","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"416":{"description":"Invalid byte range"}},"description":"thumbnail=1 returns a bounded JPEG preview for still images, or the stored poster for a video. Omit thumbnail for original bytes. For complete original JPEG/PNG/WebP responses up to the inline limit, MCP includes the actual image and a SHA-256 evidence marker that the creative supervisor can reuse for keyframe inspection without a separate review job. preview=1 returns a source-bound full-frame JPEG up to1920px without cropping or upscaling, with EXIF orientation and white alpha flattening. X-Create-Image-Preview records original/preview SHA-256, dimensions and transform; MCP includes these as imagePreview with actual JPEG bytes. This is lossy picture evidence, not original-pixel, identity, lettering or quality certification. Synchronous previews accept single-page JPEG/PNG/WebP sources up to64MiB and40million pixels; larger originals keep existing downloads/uploads and can use asynchronous metadata/frames reviews. Do not combine preview with thumbnail, download or Range. The supervisor automatically requests this preview when an owned original is too large to inline; fallback failure retains the original link. Thumbnails, partial ranges and download links alone do not establish original-image inspection. Originals remain unchanged."}},"/projects/{id}/editor/session":{"get":{"operationId":"get__projects_id_editor_session","summary":"Read native editor session status","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"statusUrl is this owned status endpoint. Wait for state=ready and app.ready=true before timeline commands. mediaSync can continue in the background; check per-asset imported readiness before adding clips."},"post":{"operationId":"post__projects_id_editor_session","summary":"Start or reconnect to the native editor","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Maps to the existing editor broker. The project ID makes reconnects safe. 202 means starting; poll the returned statusUrl until state=ready and app.ready=true. Background mediaSync does not prevent opening the editor; individual assets must be imported before timeline use. editorUrl opens the interactive editor and requires a Central browser session with project edit access. API keys are never placed in editor URLs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/projects/{id}/editor/sync":{"post":{"operationId":"post__projects_id_editor_sync","summary":"Sync owned project media into the native editor","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorSession"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/projects/{id}/editor/exports":{"get":{"operationId":"get__projects_id_editor_exports","summary":"List native exports pending delivery to Create","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Maps to the editor export API. Pending files are transient: the existing worker imports them into Create assets. For durable retrieval use GET /assets?projectId=... and GET /assets/{id}/content. No public acknowledgement or purge operation is exposed."}},"/projects/{id}/editor/exports/{token}/content":{"get":{"operationId":"get__projects_id_editor_exports_token_content","summary":"Download a pending native export","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"token","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"video/mp4 stream"},"401":{"description":"Unauthenticated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Already imported or not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/balance":{"get":{"operationId":"get__balance","summary":"Read the current Mango9 wallet balance","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Balance"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns the owning account’s current shared wallet balance in integer USD cents. Also returns reservedCents and availableCents (balance minus known reservations, floored at zero), reservationScope=this_create_server, and asOf. Reservations only cover this Create server, not other apps sharing the wallet. Values are a point-in-time estimate; generation admission rechecks affordability. Read-only: no balance mutation endpoint is provided."}},"/brands":{"get":{"operationId":"get__brands","summary":"List account brands","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Brand"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post__brands","summary":"Create a brand library","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Brand"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Creates a named library for the account owner. Upload permanent brand media with POST /assets using brandId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandInput"}}}}}},"/brands/{id}":{"get":{"operationId":"get__brands_id","summary":"Read a brand","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Brand"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/brands/{id}/assets":{"get":{"operationId":"get__brands_id_assets","summary":"List a brand’s assets","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"integer","minimum":1},"description":"Use pagination.nextCursor to fetch the next page in descending ID order."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Attach selected asset IDs to a project with POST /projects/{id}/assets, then sync its editor. The original brand asset remains unchanged."}},"/editor/catalog":{"get":{"operationId":"get__editor_catalog","summary":"Full editor capabilities and settings","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Discovery from the installed native editor. Properties include supported types, defaults, writable status, numeric bounds and choices. The catalog marks analysis tools that still require the interactive editor."}},"/editor/effects":{"get":{"operationId":"get__editor_effects","summary":"All installed effects and their properties","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Discovery from the installed native editor. Properties include supported types, defaults, writable status, numeric bounds and choices. The catalog marks analysis tools that still require the interactive editor."}},"/editor/transitions":{"get":{"operationId":"get__editor_transitions","summary":"All installed transition designs","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Discovery from the installed native editor. Properties include supported types, defaults, writable status, numeric bounds and choices. The catalog marks analysis tools that still require the interactive editor."}},"/editor/captions":{"get":{"operationId":"get__editor_captions","summary":"Caption styles, appearance settings and animations","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Discovery from the installed native editor. Properties include supported types, defaults, writable status, numeric bounds and choices. The catalog marks analysis tools that still require the interactive editor."}},"/editor/fonts":{"get":{"operationId":"get__editor_fonts","summary":"Installed caption font families","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Discovery from the installed native editor. Properties include supported types, defaults, writable status, numeric bounds and choices. The catalog marks analysis tools that still require the interactive editor."}},"/projects/{id}/editor/changes":{"get":{"operationId":"get__projects_id_editor_changes","summary":"Compare targeted edits with a prior rendered timeline","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"baselineRenderId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"targetRenderId","in":"query","schema":{"type":"string","format":"uuid"},"description":"Choose this completed render or revision for the current timeline; exactly one target is required."},{"name":"revision","in":"query","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"},"description":"Compare the current full timeline only if this revision still matches."},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read-only structural comparison of two retained completed render snapshots, or a baseline render and current revision-bound full timeline. Reports exact changed paths for clip sources, timing, caption roles/appearance, transforms, keyframes, effects, tracks, transitions, profile and collection order. Missing snapshot sections remain incomplete. Read all pages; large values use fingerprints and require full source records for exact curves. Does not assess requested intent or certify picture/audio quality; preservationVerified and qualityCertificate are false. Original output settings are included because rendered resolution/range may differ from timeline profile. Both renders must belong to this account and project. Does not open stopped editor sessions, edit, render, generate, charge or contact Central beyond existing request authentication. Use it before final delivery after a selective edit; fix unintended changes without regenerating unchanged footage."}},"/projects/{id}/editor/timeline":{"get":{"operationId":"get__projects_id_editor_timeline","summary":"Read the native editor’s current timeline and settings","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"view","in":"query","schema":{"type":"string","enum":["full","summary"],"default":"full"}},{"name":"clipIds","in":"query","schema":{"type":"string","minLength":1,"maxLength":6500,"pattern":"^[A-Za-z0-9_-]{1,80}(,[A-Za-z0-9_-]{1,80}){0,79}$"},"description":"Up to 80 literal comma-separated clip IDs. Unknown IDs fail; no expressions or paths."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"anyOf":[{"$ref":"#/components/schemas/EditorTimeline"},{"$ref":"#/components/schemas/EditorTimelineSummary"}]},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Summary caption.lines preserves authored newline breaks; linesScope distinguishes these from actual rendered line count. The renderer can wrap a long entry again. Caption edits that clip their source artwork fail before committing with guidance to shorten, split or adjust the caption. Existing artwork is immutable. Start the editor session first. Default full preserves the complete existing response. Use view=summary to discover clip IDs, timing, caption copy and roles, effect IDs, property names and counts without large property curves or asset catalogs. Summary now includes per-clip opacity (constant, animated or unavailable) and transitionSummary with source-trim-aware opening opacity fades. transitionCount counts native transition objects only: zero does not mean no dissolve. openingOpacityFades report stored curve endpoints and lower-track overlap candidates, not rendered quality. Complex or retimed curves stay animated without invented fade timing. Do not reapply fades solely because the native count is zero. Summary is not an editable replacement snapshot. Read view=full&clipIds=ID for exact current properties before editing; selected responses include partial metadata and the current whole-timeline revision. Use full without selectors for assets[].imported and complete transitions. capabilities.clipSourceReplacementVersion=1 enables clip.replace to swap a source while preserving the existing edit and clip ID; it does not delete/recreate the clip. capabilities.semanticLayoutVersion=1 enables layout.reflow with semantic roles for portrait, square and landscape; read its command schema and review each new render. capabilities.semanticAdPanelVersion=1 additionally enables preset=ad-panel for square and landscape, with adjacent footage and copy areas and optional product sequenceId groups through dissolves. Omitting preset preserves the classic layout; still render and review composition, transitions and audio. capabilities.captionRendererVersion>=3 also enables format.appearance.background_mode=block for one panel behind the complete caption; lines remains the default. Version 2 separates multiline backings. Old caption.rendererVersion values (absent means 1) can be refreshed by caption.update with only the existing id; audit and preview the new revision before export. Private fonts expose assets[].font.renderFamily and font.registered; wait for that project registration before styling captions. The global installed-font catalog is not a per-project readiness check. revision changes whenever the timeline changes. Server file paths are not exposed. export.contentUrl identifies a completed video after import into Create."}},"/editor/motion-presets":{"get":{"operationId":"get__editor_motion_presets","summary":"Discover tested visual motion recipe definitions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Versioned hold, push/pull, directional pan and gentle rotation recipes. Each lists the transform curves it replaces. Rendered framing still requires inspection."}},"/projects/{id}/editor/sequence-plan":{"post":{"operationId":"post__projects_id_editor_sequence_plan","summary":"Compile storyboard scenes, sound and captions into one timeline assembly","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only, revision-bound scene assembly using existing owned project media. Computes cumulative frame-aligned scene positions and real source trims, retains spare outgoing source handles for incoming dissolves or native transitions without changing total story duration, orders visual tracks below captions, optionally adds motion, separately named audio tracks with gain/fades, and editable caption cues. Source sound is muted unless sourceAudio=keep is explicit. For transitionIn.kind=native, choose transitionId from GET /editor/transitions or an owned attached PNG/JPEG maskAssetId when the editor supports owned masks. The compiler validates the source and emits a reveal on the incoming visual track; choose an opposite installed mask for direction, because low-level reverse conceals rather than spatially mirroring. Returns commands, scene-to-command and native-transition mappings, source frame ranges and a dry-run editor/batches body. Apply the same commands with dryRun=false and a new Idempotency-Key after inspecting the dry run. Only explicit replaceClipIds are deleted; other clips, original media, billing and completed exports are untouched. Existing overlaps are reported; the existing 100-command atomic batch capacity still applies. Dialogue, framing, continuity, readability and sound balance require rendered review. It does not generate media, fabricate word timings, retime sources or silently crop/shorten source audio.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"replaceClipIds":{"default":[],"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}},"scenes":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"sceneId":{"type":"string","minLength":1,"maxLength":80},"title":{"type":"string","minLength":1,"maxLength":120},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"sourceStart":{"default":0,"type":"number","minimum":0,"maximum":1800},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":1800},"sourceAudio":{"default":"mute","type":"string","enum":["mute","keep"]},"transitionIn":{"default":{"kind":"cut","seconds":0.4},"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["cut","dissolve"]},"seconds":{"default":0.4,"type":"number","minimum":0.05,"maximum":3}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"native"},"transitionId":{"type":"string","minLength":1,"maxLength":250},"seconds":{"default":0.4,"type":"number","minimum":0.05,"maximum":3}},"required":["kind","transitionId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"native"},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"seconds":{"default":0.4,"type":"number","minimum":0.05,"maximum":3}},"required":["kind","maskAssetId"],"additionalProperties":false}]},"motion":{"type":"object","properties":{"preset":{"type":"string","enum":["hold","push-in","pull-out","pan-left","pan-right","pan-up","pan-down","gentle-rotate"]},"strength":{"default":0.08,"type":"number","minimum":0,"maximum":0.4}},"required":["preset"],"additionalProperties":false}},"required":["sceneId","title","assetId","durationSeconds"],"additionalProperties":false}},"audio":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"role":{"type":"string","enum":["narration","dialogue","music","ambience","sound"]},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"sourceStart":{"default":0,"type":"number","minimum":0,"maximum":1800},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":1800},"gainDb":{"default":0,"type":"number","minimum":-60,"maximum":12},"fadeIn":{"default":0,"type":"number","minimum":0,"maximum":1800},"fadeOut":{"default":0,"type":"number","minimum":0,"maximum":1800}},"required":["assetId","role","durationSeconds"],"additionalProperties":false}},"captions":{"type":"object","properties":{"cues":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":2000},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800}},"required":["text","start","end"],"additionalProperties":false}},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["cues"],"additionalProperties":false}},"required":["revision","scenes"],"additionalProperties":false}}}}}},"/projects/{id}/editor/dissolve-plan":{"post":{"operationId":"post__projects_id_editor_dissolve_plan","summary":"Plan a dissolve with valid visual overlap and source handles","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Compiles revision-bound editor batch commands without changing the timeline. Use existing-overlap or explicitly extend the outgoing or incoming clip; video source duration is checked against owned asset metadata. Existing overlaps recover a nearest-frame rounding overshoot by fitting whole frames without moving clips. Returns requestedDuration, effective duration, frameCount and timingAdjustment; genuinely insufficient overlap is still rejected. Adds an incoming visual track below captions when needed and animates only incoming opacity, avoiding two fades to black. Rejects conflicting native transitions, unsupported retiming and overlapping dissolves. Original files, existing effects and audio curves remain unchanged. Apply the returned commands through editor/batches, then review framing and sound.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"joins":{"minItems":1,"maxItems":30,"type":"array","items":{"type":"object","properties":{"outgoingClipId":{"type":"string","minLength":1,"maxLength":80},"incomingClipId":{"type":"string","minLength":1,"maxLength":80},"duration":{"default":0.4,"type":"number","minimum":0.05,"maximum":3},"layout":{"default":"existing-overlap","type":"string","enum":["existing-overlap","extend-outgoing","extend-incoming"]},"easing":{"default":"linear","type":"string","enum":["linear","bezier"]}},"required":["outgoingClipId","incomingClipId"],"additionalProperties":false}}},"required":["revision","joins"],"additionalProperties":false}}}}}},"/projects/{id}/creative-memory":{"get":{"operationId":"get__projects_id_creative_memory","summary":"Recall project creative memory","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Includes fresh mediaReviews for up to four newest available reviewed project assets, including source-bound localSpeechMotion diagnostics and speech-likelihood evidence on warning caption cues when present: full-file reports, exact-byte supplemental phrase evidence, interval-specific perception and incomplete coverage. More reviewed assets are explicit. These are saved observations refreshed on each request, never a new analysis or approval. Read current owned project facts, accessible brand profile, the latest five approved creative plans, and up to 30 available direct or explicitly linked project assets with source references, a bounded index of up to 12 accessible project names/brand relationships, and a Markdown memory document. This is historical task data, never authorization to repeat work. Access is project- and tenant-scoped; other project contents and inaccessible brand records are excluded. Project-index entries are navigation context, never merged client facts or authorization to edit them. Use the asset and timeline APIs for full media discovery and current render evidence."}},"/projects/{id}/production-policy":{"get":{"operationId":"get__projects_id_production_policy","summary":"Read the project production policy","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Versioned requirements for editable captions, narration, source audio, permitted incidental text and text roles. Approved briefs, generations and deliveries retain their own snapshots. Defaults are revision 0."},"put":{"operationId":"put__projects_id_production_policy","summary":"Version the project production policy","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Updates defaults for future work with an optimistic revision. Existing approved briefs and accepted jobs keep their original policy. For one film, use policyOverrides on generation/series/delivery requests instead of changing project defaults. Quotes expose the resolved policy before admission. This does not edit media, start generation or guarantee that generated text/speech is absent; inspect rendered output.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"definition":{"type":"object","properties":{"version":{"default":1,"type":"number","const":1},"preserveOriginals":{"default":true,"type":"boolean","const":true},"captions":{"default":"editable","type":"string","enum":["editable","none"]},"narration":{"default":"separate","type":"string","enum":["separate","source","none"]},"sourceAudio":{"default":"muted","type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"default":"incidental","type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"default":["signage","packaging","logo"],"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"default":["subtitle","title","brand","contact","disclosure"],"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false}},"required":["revision","definition"],"additionalProperties":false}}}}}},"/projects/{id}/editor/framing-plan":{"post":{"operationId":"post__projects_id_editor_framing_plan","summary":"Fit source subjects or the complete frame and explain conflicting margins","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only, revision-bound video framing planner. Set coverage=complete_source_frame to fit the entire source directly; provide source-frame artifact names but omit sample bounds. This mode uses dimensions independently of subject estimates and returns its own primary commands or conflict. Omit coverage (or use measured_subject_bounds) for the existing measured-subject mode, which requires bounds for each sample. Measure the combined required subjects on complete source-review frame artifacts near the visible clip start, middle and end. Coordinates are normalized untransformed source pixels, never a rendered timeline preview. Source identity, frame artifacts, orientation, pixel aspect and ownership are checked. Returns constant Crop/center-gravity clip.update properties only when the maximum side-margin requirement is feasible. Conflicts return no commands or apply body, only a wider-margin proposal requiring a revised brief. Geometry is conditional on caller measurements, not subject recognition or all-frame proof. fullSourceAlternative independently fits the complete source rectangle inside the modeled visible aperture, with fixed Bars preserved. It reports its own feasibility, margins and unapplied commands; use it as a conservative option when subject measurements are uncertain, not as the minimum necessary border. A narrower caller-measured proposal is not verified subject recognition. Fixed post-transform Bars are preserved and reserved as occluded space. Other effects, animated Bars, nonstandard origin, rotation, shear, margin and time remapping require separate handling. Apply using existing revision-checked editor/batches; inspect actual preview afterward. No media generation, rendering or mutation occurs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"clipId":{"type":"string","minLength":1,"maxLength":80},"sourceReviewId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"sourceSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"coordinateSpace":{"type":"string","const":"untransformed_source_frame"},"coverage":{"description":"Omit for existing measured-subject behavior. complete_source_frame fits the whole source dimensions without estimated subject bounds; omit bounds on every sample in this mode.","type":"string","enum":["measured_subject_bounds","complete_source_frame"]},"samples":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"object","properties":{"artifact":{"type":"string","pattern":"^frame-\\d+\\.jpg$"},"bounds":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["artifact"],"additionalProperties":false}},"maximumSideMargin":{"type":"number","minimum":0,"maximum":0.49,"description":"Maximum uncovered canvas fraction at each side. 0 means no side border; .03 permits up to 3% per side."},"subjectPadding":{"default":0.01,"type":"number","minimum":0,"maximum":0.2}},"required":["revision","clipId","sourceReviewId","sourceSha256","coordinateSpace","samples","maximumSideMargin"],"additionalProperties":false}}}}}},"/projects/{id}/editor/motion-plan":{"post":{"operationId":"post__projects_id_editor_motion_plan","summary":"Compile motion presets into exact native keyframes","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Read-only planning against a current owned timeline revision. Returns native clip.update commands with source-frame offsets, preserving source media, clip timing, audio and effects. Apply the returned commands using editor/batches with that revision and an Idempotency-Key. This endpoint never applies an edit or generates media. Inspect an actual preview afterward.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"clips":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"clipId":{"type":"string","minLength":1,"maxLength":80},"preset":{"type":"string","enum":["hold","push-in","pull-out","pan-left","pan-right","pan-up","pan-down","gentle-rotate"]},"strength":{"default":0.08,"type":"number","minimum":0,"maximum":0.4},"anchor":{"default":{"x":0,"y":0},"type":"object","properties":{"x":{"type":"number","minimum":-1,"maximum":1},"y":{"type":"number","minimum":-1,"maximum":1}},"required":["x","y"],"additionalProperties":false},"easing":{"default":"bezier","type":"string","enum":["linear","bezier"]}},"required":["clipId","preset"],"additionalProperties":false}}},"required":["revision","clips"],"additionalProperties":false}}}}}},"/projects/{id}/editor/speed-ramp-plan":{"post":{"operationId":"post__projects_id_editor_speed_ramp_plan","summary":"Plan a forward speed ramp with explicit source and output timing","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Integrates positive speed segments into a native time curve at the timeline fps, including trim offsets and quantized segment boundaries. Linear or smoothstep speed changes, 0.125x–8x; no reverse or optical-flow invention. Returns consumed source duration, exact output frames, neighboring overlaps and revision-bound batch commands without editing or billing. Default audio=mute affects only this source clip; audio=retime preserves existing audio controls and may change pitch. Separate voice/music and captions are never shifted. Read source bounds and preview before delivery. Extended slow motion requires capabilities.extendedLinearTimeMapping in the current session timeline. Older sessions must reopen after adapter rollout; unsupported extensions and oversized curves fail before any edit. Existing source media and generation facts remain unchanged.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"clipId":{"type":"string","minLength":1,"maxLength":80},"sourceStart":{"type":"number","minimum":0,"maximum":3600},"sourceEnd":{"type":"number","exclusiveMinimum":0,"maximum":3600},"audio":{"default":"mute","type":"string","enum":["mute","retime"]},"segments":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"seconds":{"type":"number","minimum":0.016666666666666666,"maximum":1800},"fromSpeed":{"type":"number","minimum":0.125,"maximum":8},"toSpeed":{"type":"number","minimum":0.125,"maximum":8},"easing":{"default":"linear","type":"string","enum":["linear","smoothstep"]}},"required":["seconds","fromSpeed","toSpeed"],"additionalProperties":false}}},"required":["revision","clipId","segments"],"additionalProperties":false}}}}}},"/projects/{id}/editor/commands":{"post":{"operationId":"post__projects_id_editor_commands","summary":"Edit the native timeline, captions, effects and audio","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Runs one command in the native editor and persists it automatically. Use the revision from GET /projects/{id}/editor/timeline and a new Idempotency-Key. The full request schema lists every command. Supports tracks; image, video and audio clips; trim, split, duplicate, placement and properties; property keyframes; effect settings and masks; installed transitions and owned PNG/JPEG transition masks (capabilities.ownedTransitionMasksVersion >= 1); caption text, all appearance controls, SRT/VTT, project presets; profile; semantic layout.reflow for 9:16, 1:1 and 16:9 without manual coordinates; layout.suggest for a read-only caption placement proposal (captionPlacementPlanVersion >= 1), followed by a separate revision-checked application; undo/redo; and render. Audio-only clip.add commands default to has_video:0 so they cannot obscure lower video tracks. Explicit has_video or waveform settings are preserved. Asset IDs must be attached and synced; wait for assets[].imported in the timeline response. Poll statusUrl when state is queued or running; a completed operation returns the new revision. failed, expired and unknown states require inspection before a new request. Historical generation records and source media never change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditorCommandInput"}}}}}},"/projects/{id}/editor/render":{"post":{"operationId":"post__projects_id_editor_render","summary":"Render the current complete native timeline","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Exports the actual native timeline, including audio, overlays, captions and effects, through the existing editor renderer. Uses revision and Idempotency-Key. Poll the command’s statusUrl for acceptance, then GET /projects/{id}/editor/timeline for export.state/progress. When imported, export.assetId and export.contentUrl identify the durable completed video. Pending native files are also available under the editor exports endpoints. Maximum finished duration is 30 minutes and exported file size is 5 GiB. Completed renders stream into private storage without another video encode.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditorRenderInput"}}}}}},"/projects/{id}/editor/operations/{operationId}":{"get":{"operationId":"get__projects_id_editor_operations_operationId","summary":"Read an editor command result","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"operationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Use the statusUrl returned by a command. States: queued, running, completed, failed, expired, unknown. Retrying the identical request with its original idempotency key retrieves its receipt and never applies it twice."}},"/exports/{id}/content":{"get":{"operationId":"get__exports_id_content","summary":"Download a completed export video","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Range","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"video/mp4 attachment"},"206":{"description":"Partial video bytes"},"409":{"description":"Export is not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Authenticated attachment download for a completed Create or native-editor export. Supports byte ranges. Returns 409 while the export is not ready. The asset’s normal availability period applies."}},"/assets/{id}/reviews":{"post":{"operationId":"post__assets_id_reviews","summary":"Review rendered frames, sound, motion and captions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Queues private asynchronous analysis of an owned asset. The supervisor uses local checks unless its storyboard explicitly selects assisted verification; direct API callers retain the documented perceptual option. Optional textRecognition:local adds pinned offline line OCR on decoded sampled frames and detail crops; inspect capabilities.textRecognition.configured. Returns checks.textRecognition and private text-recognition-local.json with source/frame/model hashes, actual frame timestamps and line polygons. No word boxes, automatic edits or full-video quality certificate. Available in delivery.review too. Optional wordAlignment:local runs pinned offline English phonetic alignment of independently recognized speech and measures speech likelihood from the same decoded audio. Check capabilities.wordAlignment.configured first. Automatically adds transcript analysis. Available on audio/video reviews and delivery.review; not still images. Returns checks.wordAlignment with up to128 candidate words and a private word-alignment-local.json containing all words and speech measurements. When capabilities.wordAlignment.captionTimingComparisonVersion is 1, checks.wordAlignment.captionTimingComparison compares uniquely matched complete subtitle phrases against both recognition and local alignment. Its source-bound counts/items preserve both estimates and report disagreement or unassessed wording; similar estimates are not a timing pass. Repeated phrases, unaligned words and missing speech evidence remain unassessed. This derived comparison is in the review JSON; word-alignment-local.json retains the original full alignment measurements. Original transcript, SRT/VTT and timeline stay unchanged. Low speech likelihood, missing evidence, numbers and unsupported languages remain uncertain. Wrong words over speech can still receive timings; no word, lip-sync or delivery certification and no automatic retiming. Unavailable recognition returns not_assessed. No additional paid review call. Normal requests omit this option. Optional localSpeechMotion.windows runs local experimental face/speech diagnostics without paid provider requests. Check GET /media-reviews/capabilities localSpeechMotion.configured first. Each window declares source-relative start/end and sceneIntent (on_camera_dialogue, voiceover or unknown), lasts 2.5–60 seconds and must fit the asset and enclosing review range. Results include checks.localSpeechMotion, speech-motion-local.json, per-window local-mouth JSON and available local-sync JSON with exact source hashes/times. When capabilities.localSpeechMotion.observedFaceRegionsVersion is 1, each window also exposes faceRegions: conservative per-time-bin unions of actually observed face landmark bounds, source hash, original source times, detection counts and unassessed frames. Its protectedRegions can guide layout.audit/layout.suggest only for the same rendered picture and correctly mapped time origin. Raw source-clip coordinates require the actual timeline transform. Read full evidence when compact tool output is truncated; recheck after reframing. No detection is not proof of no face, and these hints never certify safe placement or identity. No extra inference or paid request is added. Missing, discontinuous or multiple-face evidence remains unassessed. A best timing offset is not speaker attribution, phonetic matching or a quality certificate. No automatic trim/retime. Normal reviews without this option retain existing behavior. Opt-in perceptual.frameEvidence=true sends a chronological contact sheet of the exact decoded JPEG artifacts alongside the original video to inspect brief actions. Requires watch, frames checks, a video interval at most600 seconds and2–24 distinct explicit timestamps inside that interval. Each watch stage returns frameEvidence with source hashes, requested segment times and actual decoded source presentation timestamps. This adds image input cost, leaves footage unchanged and does not certify continuous motion or every frame. Approved reference images remain separately labeled. Optional perceptual.frameEvidenceRegion selects the zero-based index of a supplied detailRegions entry; its exact native crop appears beside the matching full frame. Hashes, geometry and source timestamps remain explicit. Review windows receive only their selected samples; a window without samples keeps ordinary video review. Optional detailRegions returns native-resolution JPEG crops of up to four normalized rectangles for each sampled frame, with pixel bounds, source dimensions, timestamps and hashes. Requires frames or visual checks. Useful for verifying small lettering and precise corrections; no upscaling, enhancement, source edits or automatic quality approval. Keep the full-frame context. Read the returned detail artifact contentUrl through HTTP or MCP. To inspect an existing export without rendering again, use checks:[metadata,frames] with up to24 timestamps and read the returned JPEG/contact-sheet artifacts. Perceptual modes are not needed for frame extraction. motionMode=all_frames also measures flat edge bands and returns side/thickness/time evidence; intentional letterboxing can be marked with intentionalIntervals type border_band. These heuristic signals never authorize automatic cropping or certify composition. Optional perceptual.modes:[listen,watch] submits actual owned audio, image or video bytes for paid structured review. Use GET /media-reviews/capabilities first. Requires a project and local wallet admission; each segment has a durable billing receipt, findings, timestamps and explicit sampling uncertainty. Brand facts and owned reference images are optional. No arbitrary media URLs. No automatic paid retry. Each perceptual stage includes evidenceScope. A listen stage receives only audio and cannot establish picture, caption, continuity or sync quality; visual reference images and storyboard expectations are sent only to watch stages. Listening with expectSpeech=true also runs independent speech recognition. The worker compares recognized lexical words with the model-reported speech; missing evidence or disagreement keeps the perceptual result incomplete. Numeric agreement, pronunciation and mix quality are not certified by this comparison. expectSpeech=false is appropriate for instrumental-only material. Model findings do not certify every native frame or replace technical checks. Checks: metadata, frames, audio, motion, transcript, captions, visual, rhythm. Opt-in rhythm performs local acoustic onset analysis using librosa (engine version and parameters are recorded in checks.rhythm.engine) and returns checks.rhythm plus a hashed audio-rhythm.json artifact with every candidate. Times are relative to the review range; sourceTime and timelineTime are explicit. Relative strength is not probability. These are heuristic acoustic changes, not certified beats, bars, phrases or BPM. No candidates means not_checked, never an invented beat grid. Prefer isolated music and audition chosen anchors; no timeline edit or paid request is made by rhythm. Optional motionMode=all_frames measures every decoded frame using its actual presentation timestamp and a bounded RGB raster and derived luma; catches single-frame black spans, brightness flashes and spatial/color excursions returning to the preceding picture within 0.2 seconds. Exposes colorPulseTimes and exact event metrics. For all_frames, sceneBoundaryDetection identifies local PySceneDetect ContentDetector and its settings. Decoded frame indices map to actual presentation timestamps, including variable-rate video. Flashes can produce candidates; fades may be missed. No paid call or automatic edit. Existing checks.motion.sceneChangeTimes and checks.temporalSignals.sceneChangeTimes report picture-change candidates in review-relative seconds, including when status is pass. Inspect adjacent source frames against intended shot boundaries. The first 200 candidates are retained inline; temporal-coverage.json preserves the complete measured list. Candidates are not confirmed cuts and an empty list does not certify continuous motion. Approved measured black holds explain their contained freeze signals; freezes outside that interval still warn. Records temporal-frame-coverage.jsonl plus temporal-coverage.json. Omitted motionMode preserves existing 10 FPS analysis. Pixel signals are not semantic correctness; compare intentionalIntervals before applying a correction. Optional renderId binds evidence to a completed render, its caption timings and revision. For an audio-finished delivery master, use deliveryId instead: the API verifies the exact owned output, completed finish receipt and frozen picture render, then binds the matching clean or captioned timeline. Supplying both identifiers is rejected. Automatic caption timings are relative to the requested review range. Returns authenticated JPEGs, a contact sheet, waveform JSON, WAV and SRT/VTT as requested. Transcript reviews also return checks.speechActivity and a private speech-activity.json artifact with 32 ms speech-likelihood windows, model provenance, source hash and explicit source/review/timeline coordinates when available. Caption alignment cues may include speechActivity at recognized start/end boundaries. These are likelihoods, not exact word onsets, silence proof or permission to retime. Caption timing findings remain warnings and are presented as uncertain estimates. Unavailable measurements stay not_assessed without discarding transcription. expectedScript compares actual recognized speech, never fabricates timings. Raw word probabilities remain available; minWordProbability filters comparison and suggested subtitles. English numeric discounts (50% / fifty percent) normalize equivalently. Set caption role to title, brand, contact or disclosure for nonspoken overlays. expectSpeech=false checks instrumental tracks for unexpected speech. audioRole=voice treats short narration pauses as informational. frameMaxDimension up to 1920 returns sharper frames; OCR confidence is configurable. Include visual in checks and use visualMode=all_frames to inspect every decoded frame; the default is sampled OCR. Frame coverage and text recognition certainty are reported separately and never certify unrecognized text. With supplied or inferred captions, all_frames also returns checks.visual.captionVisibility: independent OCR matches across the full review, recognized spans and observations outside expected intervals. Expected timing never becomes measured visibility; repeated wording shares ambiguous evidence, and non-recognition does not prove absence. Caption visibility matchingVersion=3 preserves currency and discount symbols, decimals, URL and phone punctuation. Missing or changed critical copy remains unrecognized/uncertain rather than being counted as a matching caption. OCR still does not certify readability or the offer. caption_visibility findings preserve contradictory positive observations even when a perceptual report is clear. Full frame-coverage.jsonl and text-coverage.json artifacts retain the evidence. No automatic retiming. Maximum 600 seconds per review range on sources up to 30 minutes and 5 GiB, 24 sampled frames and 10 queued/running reviews per account. Range timestamps are relative to the selected interval; timeOrigin records its source offset. captionLanguage skips cross-language word matching without claiming semantic verification. Artifact retention is 7_days by default; 30_days and campaign are also supported. Expiry removes artifact bytes while retaining the manifest, hashes, findings and source/revision evidence. Review artifactRetention reports retention eligibility, confirmed deletion time and cleanup state; it does not certify object availability or quality. Retry identical inputs with the same key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"textRecognition":{"type":"string","const":"local","description":"Optional pinned offline OCR on sampled frames and requested detail crops. Automatically adds frame extraction. Returns line polygons and confidence in checks.textRecognition with a private full artifact. Uses actual decoded frame timestamps; never invents word boxes or certifies unsampled frames, readability or timing. No paid provider calls. Check capabilities.textRecognition.configured."},"wordAlignment":{"type":"string","const":"local","description":"Optional local English word-alignment diagnostic using independently recognized speech plus speech likelihood. Automatically enables transcript analysis. Returns unverified candidate times in a private artifact; does not replace captions, retime media or certify words/lip sync. Check capabilities.wordAlignment.configured. No paid review request."},"localSpeechMotion":{"type":"object","properties":{"windows":{"minItems":1,"maxItems":60,"type":"array","items":{"type":"object","properties":{"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"sceneIntent":{"default":"unknown","type":"string","enum":["on_camera_dialogue","voiceover","unknown"]}},"required":["start","end"],"additionalProperties":false}}},"required":["windows"],"additionalProperties":false,"description":"Optional local diagnostic on selected source-relative video intervals. Measures silent mouth-motion candidates and audio/face timing, without a quality pass, active-speaker proof or automatic edits. Declare approved scene intent. No provider generation/review request is made. Unsupported or missing evidence stays unassessed; times are original source seconds. Each interval is 2.5–60 seconds. Windows must fit the asset and the enclosing review range."},"perceptual":{"type":"object","properties":{"modelKey":{"default":"gemini-3-8-flash","type":"string","const":"gemini-3-8-flash"},"modes":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["listen","watch"]},"description":"New video watch reviews require explicit speech-motion assessments around frozen media boundaries and recognized phrase endings. Returned perceptual stages include speechMotionInspection and report.speechMotionChecks. Music is not speech; uncertain or omitted inspections cannot be clear. This does not certify every frame or add another paid review stage. Listening-only and image reviews are unchanged."},"brief":{"default":"","type":"string","maxLength":6000},"creativeContext":{"type":"object","properties":{"version":{"type":"number","const":1},"timing":{"type":"string","const":"planned_story_order_not_verified_timeline"},"style":{"type":"string","maxLength":1000},"notes":{"type":"string","maxLength":4000},"scenes":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"title":{"type":"string","maxLength":140},"seconds":{"type":"number","minimum":0},"visual":{"type":"string","maxLength":2000},"camera":{"type":"string","maxLength":700},"motion":{"type":"string","maxLength":700},"continuity":{"type":"string","maxLength":1500},"sound":{"type":"string","maxLength":1000}},"required":["title"],"additionalProperties":false}},"decisions":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"question":{"type":"string","maxLength":600},"answer":{"type":"string","minLength":1,"maxLength":1200},"selectedDescription":{"type":"string","maxLength":400},"resolvedValue":{"type":"string","maxLength":2000}},"required":["question","answer"],"additionalProperties":false}}},"required":["version","timing","scenes","decisions"],"additionalProperties":false,"description":"Optional scene directions and answered creative choices. Expectations only, not observed evidence or permission. Planned scene seconds are not measured output timestamps. Supplied to visual reviews only; no media, additional review modes or production authorization is added."},"brandFacts":{"default":{},"type":"object","properties":{"name":{"type":"string","maxLength":180},"offer":{"type":"string","maxLength":1000},"phone":{"type":"string","maxLength":100},"website":{"type":"string","maxLength":500}},"additionalProperties":false},"frameEvidence":{"type":"boolean","description":"Opt in to timestamped source frames alongside the video for a short action review. The chronological contact sheet retains every requested sample. New reviews may add up to four complete frame images and individual frameChecks assessments, sharing media capacity with references. Requires watch, video, a review interval at most 600 seconds, frames checks, and 2–24 distinct explicit timestamps within the interval. Each video window receives only its selected samples; windows without samples keep ordinary video review. Uses actual decoded JPEG artifacts, not generated images. Adds image input cost; does not certify continuous motion or change the source."},"frameEvidenceRegion":{"type":"integer","minimum":0,"maximum":3,"description":"Optional zero-based index of an existing detailRegions entry. Requires frameEvidence=true. Places that exact native source crop beside the matching full frame at each timestamp. A crop is the same moment, not a reference or another scene; no enhancement or generation."},"referenceAssetIds":{"default":[],"maxItems":4,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["modes"],"additionalProperties":false},"motionMode":{"type":"string","enum":["sampled","all_frames"],"description":"Omit for existing 10 FPS checks. all_frames measures every decoded frame at its actual presentation timestamp using a bounded RGB raster and derived luma, with downloadable frame evidence. Detects brightness flashes and spatial/color excursions returning within 0.2 seconds. Approved measured black holds also explain their contained freeze signals; freezes outside the approved interval remain warnings. Includes flat edge-band positions/thickness; intended borders require plan context. No automatic crop or face recognition. This is signal coverage, not semantic recognition."},"visualMode":{"default":"sampled","type":"string","enum":["sampled","all_frames"],"description":"all_frames records independent whole-frame OCR for every decoded frame. With captions, checks.visual.captionVisibility tracks matching wording across the complete reviewed range, including outside planned intervals. Expected times are never observations. Repeated wording or a phrase contained within another caption cannot identify one overlay. possibleSourceCueIndices lists direct candidate cues, while sharedCueIndices groups exact wording. An ambiguous_shared_phrase status stays uncertain; matches outside every candidate interval retain warnings. Unrecognized text remains uncertain. Times are review-relative. Inspect pixels before retiming; this is not speech synchronization or a visibility certificate."},"retention":{"default":"7_days","type":"string","enum":["7_days","30_days","campaign"]},"range":{"type":"object","properties":{"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800}},"required":["start","end"],"additionalProperties":false,"description":"Optional audio/video interval in seconds within the source asset duration, at most 600 seconds. Omit range for still images: review the image directly with checks:[metadata,frames] or visual and optional perceptual watch. Omit range when source duration is unknown. Frame timestamps within a range are relative to range.start."},"transcriptionQuality":{"type":"string","enum":["standard","high"]},"captionLanguage":{"type":"string","pattern":"^[a-z]{2,3}$"},"checks":{"default":["metadata","frames","audio","motion"],"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","enum":["metadata","frames","audio","motion","transcript","captions","visual","rhythm"]}},"safeArea":{"default":{"left":0.05,"right":0.05,"top":0.1,"bottom":0.15},"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"required":["left","right","top","bottom"],"additionalProperties":false},"protectedRegions":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}},"timestamps":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"number","minimum":0,"maximum":600},"description":"When omitted, frame sampling prioritizes caption midpoints across the entire reviewed interval, then overview frames, capped at 24. checks.frames.captionSampling reports actual decoded-frame inclusion for each cue; unsampled and edge-only cues remain explicit. This is temporal evidence, not verified readability or opacity. Explicit timestamps are preserved. With motionMode all_frames and omitted timestamps, unused frame slots add decoded before/at pairs around PySceneDetect candidates; checks.frames.boundaryContext reports source indices, PTS and omitted pairs. These are inspection targets, not confirmed cuts or automatic quality approval. For still-frame inspection of an existing export, request checks:[metadata,frames] and batch timestamps instead of rendering tiny videos for their posters. Read the returned JPEG artifacts through HTTP/MCP. Seconds relative to the reviewed file, or relative to range.start when a range is supplied. A short preview starts at zero here, not at its full-project position. Values must be within its duration. Use renderId to associate native captions and original timeline times."},"renderId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Frozen native render for this exact asset or a completed same-project audio finish whose picture stream and duration are unchanged. When omitted with no deliveryId, one unique completed render in the same account and project is associated automatically, including its caption timing and original timeline revision. Ambiguous or unrelated assets are not inferred. A unique copied-picture finish inherits its original frozen captions and revision; resized, trimmed or retimed copies do not. For an audio-finished delivery master use deliveryId."},"deliveryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Bind an exact finished delivery master to its frozen picture render and timeline revision. Use instead of renderId for an audio-finished master."},"detailRegions":{"minItems":1,"maxItems":4,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["x","y","width","height"],"additionalProperties":false},"description":"Optional normalized rectangles in the decoded, display-oriented frame. With checks frames or visual, produce native-resolution JPEG crops for each sampled frame, capped by frameMaxDimension without upscaling. Use for small logos, lettering or exact correction areas. Region artifacts include source pixel bounds, dimensions, timestamps and hashes. They supplement the full frame; crops cannot establish whole-scene correctness or motion. No source edit, generation or automatic approval."},"frameMaxDimension":{"default":640,"type":"integer","minimum":320,"maximum":1920},"minWordProbability":{"default":0.2,"type":"number","minimum":0,"maximum":1},"expectSpeech":{"default":true,"type":"boolean"},"ocrMinConfidence":{"default":60,"type":"number","minimum":0,"maximum":100},"audioRole":{"default":"mix","type":"string","enum":["mix","voice","music","sound"]},"expectedScript":{"type":"string","maxLength":10000},"language":{"type":"string","pattern":"^[a-z]{2,3}$"},"expectAudio":{"default":true,"type":"boolean"},"targetLufs":{"default":-16,"type":"number","minimum":-30,"maximum":-8},"maxTruePeakDbtp":{"default":-1,"type":"number","minimum":-6,"maximum":0},"silenceThresholdDb":{"default":-50,"type":"number","minimum":-80,"maximum":-20},"captions":{"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","minLength":1,"maxLength":2000},"role":{"default":"subtitle","type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600}},"required":["text","start","end"],"additionalProperties":false}},"intentionalIntervals":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["black","freeze","silence","flicker","border_band"]},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600},"reason":{"type":"string","minLength":1,"maxLength":300}},"required":["type","start","end","reason"],"additionalProperties":false}}},"additionalProperties":false}}}}},"get":{"operationId":"get__assets_id_reviews","summary":"List this asset’s review jobs","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"string","format":"uuid"},"description":"Use pagination.nextCursor."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MediaReview"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assets/{id}/transcriptions":{"post":{"operationId":"post__assets_id_transcriptions","summary":"Transcribe speech and return word-timed captions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Queues a review with transcript and captions enabled. Use checks:[\"transcript\",\"captions\"] for transcription only. Returns recognized words, timestamps, probability, SRT/VTT and optional expected-script/caption comparison. Import the SRT/VTT with the existing caption.import command.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"textRecognition":{"type":"string","const":"local","description":"Optional pinned offline OCR on sampled frames and requested detail crops. Automatically adds frame extraction. Returns line polygons and confidence in checks.textRecognition with a private full artifact. Uses actual decoded frame timestamps; never invents word boxes or certifies unsampled frames, readability or timing. No paid provider calls. Check capabilities.textRecognition.configured."},"wordAlignment":{"type":"string","const":"local","description":"Optional local English word-alignment diagnostic using independently recognized speech plus speech likelihood. Automatically enables transcript analysis. Returns unverified candidate times in a private artifact; does not replace captions, retime media or certify words/lip sync. Check capabilities.wordAlignment.configured. No paid review request."},"localSpeechMotion":{"type":"object","properties":{"windows":{"minItems":1,"maxItems":60,"type":"array","items":{"type":"object","properties":{"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"sceneIntent":{"default":"unknown","type":"string","enum":["on_camera_dialogue","voiceover","unknown"]}},"required":["start","end"],"additionalProperties":false}}},"required":["windows"],"additionalProperties":false,"description":"Optional local diagnostic on selected source-relative video intervals. Measures silent mouth-motion candidates and audio/face timing, without a quality pass, active-speaker proof or automatic edits. Declare approved scene intent. No provider generation/review request is made. Unsupported or missing evidence stays unassessed; times are original source seconds. Each interval is 2.5–60 seconds. Windows must fit the asset and the enclosing review range."},"perceptual":{"type":"object","properties":{"modelKey":{"default":"gemini-3-8-flash","type":"string","const":"gemini-3-8-flash"},"modes":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["listen","watch"]},"description":"New video watch reviews require explicit speech-motion assessments around frozen media boundaries and recognized phrase endings. Returned perceptual stages include speechMotionInspection and report.speechMotionChecks. Music is not speech; uncertain or omitted inspections cannot be clear. This does not certify every frame or add another paid review stage. Listening-only and image reviews are unchanged."},"brief":{"default":"","type":"string","maxLength":6000},"creativeContext":{"type":"object","properties":{"version":{"type":"number","const":1},"timing":{"type":"string","const":"planned_story_order_not_verified_timeline"},"style":{"type":"string","maxLength":1000},"notes":{"type":"string","maxLength":4000},"scenes":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"title":{"type":"string","maxLength":140},"seconds":{"type":"number","minimum":0},"visual":{"type":"string","maxLength":2000},"camera":{"type":"string","maxLength":700},"motion":{"type":"string","maxLength":700},"continuity":{"type":"string","maxLength":1500},"sound":{"type":"string","maxLength":1000}},"required":["title"],"additionalProperties":false}},"decisions":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"question":{"type":"string","maxLength":600},"answer":{"type":"string","minLength":1,"maxLength":1200},"selectedDescription":{"type":"string","maxLength":400},"resolvedValue":{"type":"string","maxLength":2000}},"required":["question","answer"],"additionalProperties":false}}},"required":["version","timing","scenes","decisions"],"additionalProperties":false,"description":"Optional scene directions and answered creative choices. Expectations only, not observed evidence or permission. Planned scene seconds are not measured output timestamps. Supplied to visual reviews only; no media, additional review modes or production authorization is added."},"brandFacts":{"default":{},"type":"object","properties":{"name":{"type":"string","maxLength":180},"offer":{"type":"string","maxLength":1000},"phone":{"type":"string","maxLength":100},"website":{"type":"string","maxLength":500}},"additionalProperties":false},"frameEvidence":{"type":"boolean","description":"Opt in to timestamped source frames alongside the video for a short action review. The chronological contact sheet retains every requested sample. New reviews may add up to four complete frame images and individual frameChecks assessments, sharing media capacity with references. Requires watch, video, a review interval at most 600 seconds, frames checks, and 2–24 distinct explicit timestamps within the interval. Each video window receives only its selected samples; windows without samples keep ordinary video review. Uses actual decoded JPEG artifacts, not generated images. Adds image input cost; does not certify continuous motion or change the source."},"frameEvidenceRegion":{"type":"integer","minimum":0,"maximum":3,"description":"Optional zero-based index of an existing detailRegions entry. Requires frameEvidence=true. Places that exact native source crop beside the matching full frame at each timestamp. A crop is the same moment, not a reference or another scene; no enhancement or generation."},"referenceAssetIds":{"default":[],"maxItems":4,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["modes"],"additionalProperties":false},"motionMode":{"type":"string","enum":["sampled","all_frames"],"description":"Omit for existing 10 FPS checks. all_frames measures every decoded frame at its actual presentation timestamp using a bounded RGB raster and derived luma, with downloadable frame evidence. Detects brightness flashes and spatial/color excursions returning within 0.2 seconds. Approved measured black holds also explain their contained freeze signals; freezes outside the approved interval remain warnings. Includes flat edge-band positions/thickness; intended borders require plan context. No automatic crop or face recognition. This is signal coverage, not semantic recognition."},"visualMode":{"default":"sampled","type":"string","enum":["sampled","all_frames"],"description":"all_frames records independent whole-frame OCR for every decoded frame. With captions, checks.visual.captionVisibility tracks matching wording across the complete reviewed range, including outside planned intervals. Expected times are never observations. Repeated wording or a phrase contained within another caption cannot identify one overlay. possibleSourceCueIndices lists direct candidate cues, while sharedCueIndices groups exact wording. An ambiguous_shared_phrase status stays uncertain; matches outside every candidate interval retain warnings. Unrecognized text remains uncertain. Times are review-relative. Inspect pixels before retiming; this is not speech synchronization or a visibility certificate."},"retention":{"default":"7_days","type":"string","enum":["7_days","30_days","campaign"]},"range":{"type":"object","properties":{"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800}},"required":["start","end"],"additionalProperties":false,"description":"Optional audio/video interval in seconds within the source asset duration, at most 600 seconds. Omit range for still images: review the image directly with checks:[metadata,frames] or visual and optional perceptual watch. Omit range when source duration is unknown. Frame timestamps within a range are relative to range.start."},"transcriptionQuality":{"type":"string","enum":["standard","high"]},"captionLanguage":{"type":"string","pattern":"^[a-z]{2,3}$"},"checks":{"default":["metadata","frames","audio","motion"],"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","enum":["metadata","frames","audio","motion","transcript","captions","visual","rhythm"]}},"safeArea":{"default":{"left":0.05,"right":0.05,"top":0.1,"bottom":0.15},"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"required":["left","right","top","bottom"],"additionalProperties":false},"protectedRegions":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}},"timestamps":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"number","minimum":0,"maximum":600},"description":"When omitted, frame sampling prioritizes caption midpoints across the entire reviewed interval, then overview frames, capped at 24. checks.frames.captionSampling reports actual decoded-frame inclusion for each cue; unsampled and edge-only cues remain explicit. This is temporal evidence, not verified readability or opacity. Explicit timestamps are preserved. With motionMode all_frames and omitted timestamps, unused frame slots add decoded before/at pairs around PySceneDetect candidates; checks.frames.boundaryContext reports source indices, PTS and omitted pairs. These are inspection targets, not confirmed cuts or automatic quality approval. For still-frame inspection of an existing export, request checks:[metadata,frames] and batch timestamps instead of rendering tiny videos for their posters. Read the returned JPEG artifacts through HTTP/MCP. Seconds relative to the reviewed file, or relative to range.start when a range is supplied. A short preview starts at zero here, not at its full-project position. Values must be within its duration. Use renderId to associate native captions and original timeline times."},"renderId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Frozen native render for this exact asset or a completed same-project audio finish whose picture stream and duration are unchanged. When omitted with no deliveryId, one unique completed render in the same account and project is associated automatically, including its caption timing and original timeline revision. Ambiguous or unrelated assets are not inferred. A unique copied-picture finish inherits its original frozen captions and revision; resized, trimmed or retimed copies do not. For an audio-finished delivery master use deliveryId."},"deliveryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Bind an exact finished delivery master to its frozen picture render and timeline revision. Use instead of renderId for an audio-finished master."},"detailRegions":{"minItems":1,"maxItems":4,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["x","y","width","height"],"additionalProperties":false},"description":"Optional normalized rectangles in the decoded, display-oriented frame. With checks frames or visual, produce native-resolution JPEG crops for each sampled frame, capped by frameMaxDimension without upscaling. Use for small logos, lettering or exact correction areas. Region artifacts include source pixel bounds, dimensions, timestamps and hashes. They supplement the full frame; crops cannot establish whole-scene correctness or motion. No source edit, generation or automatic approval."},"frameMaxDimension":{"default":640,"type":"integer","minimum":320,"maximum":1920},"minWordProbability":{"default":0.2,"type":"number","minimum":0,"maximum":1},"expectSpeech":{"default":true,"type":"boolean"},"ocrMinConfidence":{"default":60,"type":"number","minimum":0,"maximum":100},"audioRole":{"default":"mix","type":"string","enum":["mix","voice","music","sound"]},"expectedScript":{"type":"string","maxLength":10000},"language":{"type":"string","pattern":"^[a-z]{2,3}$"},"expectAudio":{"default":true,"type":"boolean"},"targetLufs":{"default":-16,"type":"number","minimum":-30,"maximum":-8},"maxTruePeakDbtp":{"default":-1,"type":"number","minimum":-6,"maximum":0},"silenceThresholdDb":{"default":-50,"type":"number","minimum":-80,"maximum":-20},"captions":{"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","minLength":1,"maxLength":2000},"role":{"default":"subtitle","type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600}},"required":["text","start","end"],"additionalProperties":false}},"intentionalIntervals":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["black","freeze","silence","flicker","border_band"]},"start":{"type":"number","minimum":0,"maximum":600},"end":{"type":"number","minimum":0,"maximum":600},"reason":{"type":"string","minLength":1,"maxLength":300}},"required":["type","start","end","reason"],"additionalProperties":false}}},"additionalProperties":false}}}}}},"/media-reviews/capabilities":{"get":{"operationId":"get__media_reviews_capabilities","summary":"Inspect perceptual media review capabilities","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Reports configured model, actual media input bounds, local billing and recovery contract, and unknown provider sampling. Each admitted interval runs independently: a failed or uncertain audio/visual stage does not cancel later planned checks. Every new submission still requires current authority, local wallet and cancellation checks. No automatic paid retry; historical cancelled stages remain cancelled. Incomplete intervals stay explicit in coverage. Experimental findings are not an exhaustive quality certificate. Perceptual review is opt-in on an owned asset or delivery.review.perceptual. Delivery review requires expectedDurationSeconds up to 600, checks the exact finished clean/captioned masters, reserves locally per master, reuses durable receipts on resume, and preserves downloads when quality remains incomplete. It never enables paid review by default."}},"/media-reviews/{reviewId}/resume":{"post":{"operationId":"post__media_reviews_reviewId_resume","summary":"Resume a failed review without repeating paid requests","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Reuses saved technical evidence and provider responses. Interrupted submissions become unknown and are never automatically resubmitted. Cancelled or expired reviews cannot resume. Repeating this request does not create another review.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/media-reviews/{reviewId}":{"get":{"operationId":"get__media_reviews_reviewId","summary":"Read review progress and audiovisual evidence","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"artifactRetention reports policy, expiresAt, retained/expired/not_ready status, deletedAt, cleanupState and manifestCount. Expired evidence keeps its historical manifest and findings; artifact download still returns410. Older already-cleared manifests remain missing and are never reconstructed as observed evidence. Includes supplementalEvidence.savedResponseInterpretations for retained invalid saved responses from this review and eligible exact-byte supplemental reviews whose only structural issue is wholly outside-window coverage notes. The versioned derived report is scoped to the supplied segment and preserves outsideWindowNotes, source/receipt hashes and original invalid state; it never replays a provider request or upgrades original aggregate coverage. Includes supplementalEvidence from retained, completed reviews of the same owner, project, asset and exact source hash. Each transcript or perception result has its own source-relative interval and modality. supplementalEvidence.reviews[].localTextRecognition locates retained independent sampled OCR. supplementalEvidence.reviews[].localWordAlignment locates retained local candidate word timings and optional captionTimingComparison counts. Follow its child statusUrl and child-relative fullEvidencePath before requesting another analysis; returnedSpeechCounts describe only returned words unless countsComplete is true. Source hash, interval, time origin and duration must agree. Timings remain candidates and neither agreement nor disagreement grants quality approval or automatic retiming. Follow its child statusUrl; fullEvidencePath and fullFramePath address the child response. At most six decoded-frame locators are returned, with explicit truncation and a private artifact link. Availability requires matching source bytes, interval and time origin. Sampled readings never certify unsampled frames or overwrite original findings. Original warnings and coverage are not overwritten; hasMore and listUrl expose bounded discovery. Recognition does not certify audible mix, caption timing or other intervals. Job states: queued, running, completed, failed, cancelled. Completion means analysis finished. The additive summary is a bounded customer-facing projection of current findings and coverage; it is never a quality certificate. Its timestamps seek within the complete source file, including a selected range offset. Raw result evidence remains available. Cut-word/music-cut findings touching an artificial analysis-window edge are marked uncertain with boundaryEvidence and a suggested surrounding source range. The raw provider report is retained; an excerpt ending cannot establish that the original file is cut off. visualMode=all_frames scans every decoded video frame using presentation timestamps, including variable frame rates, with bounded OCR workers. frame-coverage.jsonl records each frame and expected cue; text-coverage.json summarizes uncertainty. Frame coverage is distinct from recognition accuracy; missing/animated text remains uncertain. Optional transcriptionQuality=high uses the installed multilingual large-v3-turbo recognizer; omitted quality preserves the standard model. Transcript evidence identifies its engine/model and includes recognition confidence signals. recognitionWindowSeconds is the decoder chunk length, not the total analyzed range or a guarantee that later speech was recognized. Scope is the requested file/range; use a targeted review on the same exact asset for missing or uncertain words. Do not reuse an earlier export's speech or loudness evidence as verification of a changed final mix. Recognition still needs editorial review. Inspect result.status and each check: pass, warning, fail, not_checked or unavailable. Perceptual coverage distinguishes plannedIntervals, submittedIntervals backed by durable provider responses, uncertainSubmissionIntervals, and notSubmittedIntervals. Each stage includes submissionState. A submitted interval is not necessarily a successful review. coverageComplete is false if any check was not performed. Findings include output/timeline timestamps, clip IDs and intentional-interval markers. Computed summary.captions includes complete aligned/warning counts and explicit before/after recognition timing; summary.reviewCoverage separates completed listening and viewing intervals. These are measured evidence, not quality approval. Flagged technical text issues include bounded ocrEvidence with recognized tokens, OCR confidence scores, normalized boxes and full-source timestamps; raw findings remain immutable and warnings are not suppressed. OCR alone cannot prove that artwork is lettering or that a caption needs editing. New word evidence includes captionAssociation with version, status, relatedCaptionIds, geometryComplete and captionIdentityVerified:false. Status is overlaps_expected_caption_region, outside_expected_caption_regions or unassessed. Association is geometric only; outside requires complete valid active frozen caption bounds. Missing or legacy evidence stays unassessed. Sampled text_placement findings link to the exact word via evidencePath; exhaustive intervals link frameEvidence artifact and firstFrame/lastFrame. Raw flags and quality status are unchanged. Read these fields through the same review HTTP/MCP routes before changing captions."}},"/media-reviews/{reviewId}/cancel":{"post":{"operationId":"post__media_reviews_reviewId_cancel","summary":"Cancel a queued or running review","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/MediaReview"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Idempotent cancellation. Completed jobs stay completed; running work observes cancellation within its heartbeat interval.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/media-reviews/{reviewId}/artifacts/{name}":{"get":{"operationId":"get__media_reviews_reviewId_artifacts_name","summary":"Read a private review artifact","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Private artifact bytes"},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Review incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Artifact expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Use the returned artifact contentUrl. Requires access to the source asset/project. Artifacts follow the requested 7-day, 30-day or campaign retention. Campaign expiresAt=null means no automatic expiry; deleted or inaccessible objects still fail. Downloads and speech verification resolve the same owned review artifact. A tool adapter forwards JPEG bytes as image content for model inspection."}},"/projects/{id}/editor/previews":{"post":{"operationId":"post__projects_id_editor_previews","summary":"Render a time range at preview resolution","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["id","state","statusUrl"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"enum":["queued","running","completed","failed","expired","unknown"]},"statusUrl":{"type":"string"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"data":{"type":["object","null"],"additionalProperties":true},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"renderUrl":{"type":"string"},"cacheHit":{"type":"boolean","description":"True only when an available completed preview is returned without a native render request."},"retentionDays":{"type":"integer","const":1,"description":"Preview media expires one day after import, independently of final output retention."}}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["id","state","statusUrl"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"enum":["queued","running","completed","failed","expired","unknown"]},"statusUrl":{"type":"string"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"data":{"type":["object","null"],"additionalProperties":true},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"renderUrl":{"type":"string"},"cacheHit":{"type":"boolean","description":"True only when an available completed preview is returned without a native render request."},"retentionDays":{"type":"integer","const":1,"description":"Preview media expires one day after import, independently of final output retention."}}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Uses the native renderer and exact revision with a selected range and bounded dimensions, preserving aspect ratio and the production profile. Identical completed, available previews in the same account and project are reused across new request keys with cacheHit:true and the same asset; no new render is submitted on a hit. Unfinished, failed, mismatched, deleted or expired outputs are never reported as ready cached previews. Poll statusUrl for command acceptance, then renderUrl for rendering/uploading/completed/failed: command completion alone does not mean media is ready. Preview assets expire one day after import; final outputs keep their separate retention policy. An expired original key returns 410; request a replacement with a fresh key. Changing revision, range or bounds requires a new key. Preview generation creates a separate asset and never changes source media or project resolution. No claim of lower cost is implied without measuring the actual render.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"start":{"default":0,"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"maxWidth":{"default":640,"type":"integer","minimum":160,"maximum":1920},"maxHeight":{"default":640,"type":"integer","minimum":160,"maximum":1920}},"required":["revision","end"],"additionalProperties":false}}}}}},"/projects/{id}/editor/renders":{"get":{"operationId":"get__projects_id_editor_renders","summary":"List completed versioned native renders","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"after","in":"query","schema":{"type":"string","format":"uuid"},"description":"Use pagination.nextCursor."},{"name":"view","in":"query","schema":{"type":"string","enum":["full","compact"],"default":"full"},"description":"compact omits the potentially large timeline snapshot when polling. full preserves the existing response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EditorRender"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Lists final and preview renders created after feedback API deployment. Preserves source revision, timeline snapshot, output range/profile and asset ID. New renders include layoutAudit from the isolated renderer: caption geometry and collisions for the exact rendered range in project seconds. Warnings and unchecked transforms are preserved; download readiness is not a visual quality pass. Historical renders without this evidence return null. Compact list views retain layoutAudit while omitting the full snapshot."}},"/projects/{id}/editor/renders/{renderId}":{"get":{"operationId":"get__projects_id_editor_renders_renderId","summary":"Read a render version and its status","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"renderId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"view","in":"query","schema":{"type":"string","enum":["full","compact"],"default":"full"},"description":"compact omits the potentially large timeline snapshot when polling. full preserves the existing response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorRender"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The render ID is the accepted native render operation ID. Progress comes from its persistent native receipt. After import, Create retains the snapshot and asset mapping independently of the editor session. Output time origin is settings.start. Command completion is not render completion. layoutAudit preserves caption overlap/safe-area warnings and unvalidated transforms for the exact exported range; null means no saved geometry check. Completed/downloadable does not certify layout quality."}},"/projects/{id}/editor/batches":{"post":{"operationId":"post__projects_id_editor_batches","summary":"Apply or dry-run an atomic group of edits","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/EditorOperation"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"1–100 edits in one native transaction. On failure all edits roll back. dryRun validates with the real editor and restores the timeline and undo/redo history. Later edits may reference earlier result IDs using $result.0.trackId or $result.1.clipId. No render, undo or redo inside a batch. Read the operation receipt; interrupted operations remain unknown and require inspection. Native layout.reflow dry runs may include previews: each entry names its commandIndex and proposed data, with previewOnly=true, committed=false and requiresRenderedReview=true. Inspect data.mediaFraming for normalized media rectangles, frame intersection, area fraction and retained rectangle fraction, alongside the caption audit. These are geometric estimates, not opaque pixel counts, subject recognition or visual approval. Temporary clip IDs in a preview are not saved objects. Older receipts may omit previews; no evidence is invented or backfilled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"commands":{"minItems":1,"maxItems":100,"type":"array","items":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","const":"track.add"},"name":{"type":"string","minLength":1,"maxLength":160},"number":{"type":"integer","exclusiveMinimum":0,"maximum":1000000000}},"required":["action","name"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"track.update"},"id":{"type":"string","minLength":1,"maxLength":80},"name":{"type":"string","minLength":1,"maxLength":160},"locked":{"type":"boolean"}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"track.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.add"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"start":{"default":0,"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","assetId","trackId","end"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.update"},"id":{"type":"string","minLength":1,"maxLength":80},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"start":{"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.replace"},"id":{"type":"string","minLength":1,"maxLength":80},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["action","id","assetId"],"additionalProperties":false,"description":"Replace only the source of an existing media clip. Requires timeline capabilities.clipSourceReplacementVersion >= 1 and an imported project asset. Preserves clip ID, source trim, position, track, audio/video switches, transforms, keyframes and effects. Replacement duration must cover the unchanged trim/time map. Does not regenerate media, delete/recreate the clip, ripple other clips, or rewrite past exports. Captions use caption.update; source-specific tracking/stabilization analysis must be recomputed explicitly. Supports revision checks, idempotency, atomic batches, dry-run and Undo/Redo. Inspect the resulting rendered picture and sound."},{"type":"object","properties":{"action":{"type":"string","const":"clip.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.split"},"id":{"type":"string","minLength":1,"maxLength":80},"at":{"type":"number","minimum":0,"maximum":1800}},"required":["action","id","at"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.duplicate"},"id":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"trackId":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.add"},"clipId":{"type":"string","minLength":1,"maxLength":80},"type":{"type":"string","minLength":1,"maxLength":80},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"transitionId":{"type":"string","maxLength":250}},"required":["action","clipId","type"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.update"},"clipId":{"type":"string","minLength":1,"maxLength":80},"id":{"type":"string","minLength":1,"maxLength":80},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"transitionId":{"type":"string","maxLength":250}},"required":["action","clipId","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.delete"},"clipId":{"type":"string","minLength":1,"maxLength":80},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","clipId","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"transition.add"},"transitionId":{"type":"string","minLength":1,"maxLength":250},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"reverse":{"default":false,"type":"boolean"}},"required":["action","trackId","position","duration"],"additionalProperties":false,"oneOf":[{"required":["transitionId"],"not":{"required":["maskAssetId"]}},{"required":["maskAssetId"],"not":{"required":["transitionId"]}}],"description":"Add a timeline transition from exactly one source: transitionId from the installed catalog, or maskAssetId for an owned PNG/JPEG attached and imported into this project. Owned masks require capabilities.ownedTransitionMasksVersion >= 1. Duration and reverse use the native brightness animation; this is not spatial mirroring. The mask affects the selected track during its interval: arrange visual overlap and preview every join. Reuse an approved raster mask by linking it to another project; no server paths, URLs, SVG uploads or Lottie documents are accepted. Supports revision checks, atomic batches, dry-run and Undo/Redo."},{"type":"object","properties":{"action":{"type":"string","const":"transition.update"},"id":{"type":"string","minLength":1,"maxLength":80},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"transition.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.add"},"text":{"type":"string","minLength":1,"maxLength":2000,"description":"Exact visible text. Actual newline characters create line breaks; literal backslash-n is visible text. Prefer lines for explicit wrapping."},"lines":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","maxLength":2000},"description":"Authored lines, one array entry per explicit line break. The server joins them with real newline characters; the native renderer can wrap an overlong entry again. Inspect rendered line breaks at the current profile and font size. Use instead of text; no escaping or embedded newline syntax is needed. Empty entries create intentional blank lines."},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","position","duration"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.update"},"id":{"type":"string","minLength":1,"maxLength":80},"text":{"type":"string","minLength":1,"maxLength":2000,"description":"Exact visible text. Actual newline characters create line breaks; literal backslash-n is visible text. Prefer lines for explicit wrapping."},"lines":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","maxLength":2000},"description":"Authored lines, one array entry per explicit line break. The server joins them with real newline characters; the native renderer can wrap an overlong entry again. Inspect rendered line breaks at the current profile and font size. Use instead of text; no escaping or embedded newline syntax is needed. Empty entries create intentional blank lines."},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","id"],"additionalProperties":false,"description":"Partial update: send only the fields being intentionally changed. Omitted format fields preserve their stored values. To reclassify a graphic without changing its appearance, send only action:caption.update, id and format:{role:title}; do not add offset_x/offset_y=0, size=1, style, animation, placement or appearance defaults. Zero offsets explicitly move the caption and are not a request to preserve it. Read exact full clip properties when changing transforms; preserve native curves. For existing rendered work, compare the resulting timeline through editor/changes before claiming unrelated layout, timing or media were preserved."},{"type":"object","properties":{"action":{"type":"string","const":"caption.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.import"},"text":{"type":"string","minLength":1,"maxLength":150000},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","text"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.styleAll"},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","format"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.preset"},"name":{"type":"string","minLength":1,"maxLength":60},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","name","format"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"profile.set"},"width":{"type":"integer","minimum":32,"maximum":3840},"height":{"type":"integer","minimum":32,"maximum":3840},"fps":{"type":"object","properties":{"num":{"type":"integer","minimum":1,"maximum":60000},"den":{"type":"integer","minimum":1,"maximum":1001}},"required":["num","den"],"additionalProperties":false}},"required":["action","width","height","fps"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"layout.reflow"},"format":{"type":"string","enum":["9:16","1:1","16:9"]},"preset":{"description":"Opt-in footage-and-copy composition for square or landscape. Requires capabilities.semanticAdPanelVersion >= 1; omitted keeps the classic layout.","type":"string","const":"ad-panel"},"blocks":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"clipId":{"type":"string","minLength":1,"maxLength":80},"sequenceId":{"description":"For ad-panel product clips only: declares one shot sequence sharing a hero slot through overlaps such as dissolves. Does not verify continuity or alpha.","type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"role":{"type":"string","enum":["headline","subtitle","logo","cta","product","background"]},"fit":{"type":"string","enum":["contain","cover"],"description":"Use contain for every foreground block; cover is only available for full-canvas backgrounds. Explicit fitting preserves the complete foreground subject."}},"required":["clipId","role","fit"],"additionalProperties":false}}},"required":["action","format","blocks"],"additionalProperties":false,"description":"Version 1 semantic layout: requires capabilities.semanticLayoutVersion >= 1 and roles for every visual clip; audio is unchanged. Portrait 1080x1920, square 1080x1080 and landscape 1920x1080 use different safe, disjoint foreground blocks. Rebuilds text wrapping and font size; preserves approved text, clip timing, media and audio. Captions use contained fades and spatial transforms are rebuilt. Rejects unreadable text, locked tracks, unassigned media and unsupported spatial effects. Returns all-frame caption clearance evidence and optional mediaFraming v1 with per-clip normalized bounding rectangles, canvas intersection, area fraction and retained source-rectangle fraction. Measurements are geometry, not subject recognition or a quality certificate. Batch dry runs expose proposed layouts in previews[].data after rollback; preview IDs may be temporary. Render and review each format before delivery. Undo restores the prior layout."},{"type":"object","properties":{"action":{"type":"string","const":"layout.suggest"},"clipId":{"type":"string","minLength":1,"maxLength":80},"clearancePixels":{"type":"number","minimum":0,"maximum":100},"safeArea":{"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"additionalProperties":false},"protectedRegions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}}},"required":["action","clipId"],"additionalProperties":false,"description":"Read-only native placement proposal for one existing editable caption; requires capabilities.captionPlacementPlanVersion >= 1. Measures every visible frame including animated bounds and overlapping captions, then finds the closest rigid pixel translation clearing safeArea and supplied protectedRegions. Default clearance is 2 project pixels. Returns feasible, revision, unapplied commands, before/after audits and requiresRenderedReview:true. Preserves words, typography, timing, scale, rotation, opacity and other clips. Infeasible returns no commands: explicitly revise layout or typography. Rejects clipped/unsupported geometry and locked tracks. Geometry and supplied regions are not subject recognition or visual certification. Poll the existing operation statusUrl. Apply returned commands only against the current revision after approval. A dry-run batch retains the proposal under previews[].data; temporary IDs/revisions require re-planning after preceding edits are committed. Existing command/batch authorization and idempotency still apply."},{"type":"object","properties":{"action":{"type":"string","const":"layout.audit"},"safeArea":{"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"required":["left","right","top","bottom"],"additionalProperties":false},"protectedRegions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}}},"required":["action"],"additionalProperties":false,"description":"Checks every visible editable-caption frame. geometryVersion=2 matches native scale, gravity, rotation and origin transforms. Direct commands return audit findings without rendering. With capabilities.layoutAuditPreviewVersion >= 1, batch dry runs retain each audit under previews[].data with its commandIndex, previewOnly:true and committed:false, after exact rollback. Inspect failures and unchecked coverage; later commands can change the audited state. Unmodeled caption effects/margins/display layouts remain not_checked. This is geometry evidence, not raster or semantic quality certification."},{"type":"object","properties":{"action":{"type":"string","const":"undo"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"redo"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"render"}},"required":["action"],"additionalProperties":false}]}},"dryRun":{"default":false,"type":"boolean"}},"required":["revision","commands"],"additionalProperties":false}}}}}},"/image-typography/plan":{"post":{"operationId":"post__image_typography_plan","summary":"Measure static typography and safe-area fit before generating an image","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/TypographyPlan"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true,"description":"Source-independent, read-only calculation using the exact installed font metrics used by image patches. Supply canvas dimensions, a normalized rectangle, literal typography and optional normalized canvas safe-area margins. Returns measured rows, font hashes, required space, preview-size metrics and actionable fit conflicts without media, jobs, uploads, billing, automatic shrinking or changed copy. Font size is not cap height. Conflicting positions are diagnostic only. Opaque rectangles only; rounded corners and custom brand fonts are not supported. Geometry is not visual-quality or glyph-coverage certification. Recheck with actual source dimensions before applying.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"canvas":{"type":"object","properties":{"width":{"type":"integer","exclusiveMinimum":0,"maximum":40000},"height":{"type":"integer","exclusiveMinimum":0,"maximum":40000}},"required":["width","height"],"additionalProperties":false},"mask":{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"number","const":0}},"required":["kind","x","y","width","height"],"additionalProperties":false},"typography":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"default":16,"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"default":8,"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"default":"center","type":"string","enum":["top","center","bottom"]},"rows":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"default":"sans","description":"Installed DejaVu family, not a custom uploaded brand font.","type":"string","enum":["sans","serif","mono"]},"weight":{"default":"regular","type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"default":"center","type":"string","enum":["left","center","right"]}},"required":["text","fontSizePixels","color"],"additionalProperties":false}}},"required":["background","rows"],"additionalProperties":false},"safeArea":{"default":{"left":0,"right":0,"top":0,"bottom":0},"type":"object","properties":{"left":{"default":0,"type":"number","minimum":0,"maximum":1},"right":{"default":0,"type":"number","minimum":0,"maximum":1},"top":{"default":0,"type":"number","minimum":0,"maximum":1},"bottom":{"default":0,"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"previewWidth":{"default":360,"type":"integer","minimum":160,"maximum":4096}},"required":["canvas","mask","typography"],"additionalProperties":false}}}}}},"/assets/{id}/typography":{"get":{"operationId":"get__assets_id_typography","summary":"Read exact recorded typography for an owned image","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/AssetTypography"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns available:true only for the exact completed image-patch output with valid recorded typography. Includes source hash, originating job, original rectangle, literal rows, font settings and measured row bounds. No raw storage URLs or source files. Other images return available:false; do not infer styles from a screenshot when this record exists. Current bytes are verified when an edit runs. Owning an image does not grant access to unrelated jobs or assets."}},"/assets/{id}/typography-edits":{"post":{"operationId":"post__assets_id_typography_edits","summary":"Change selected text properties without guessing the existing layout","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read the image typography descriptor first and supply its sourceSha256. changes contains only properties to update: background, paddingPixels, gapPixels, verticalAlign or indexed rowUpdates (text, font, weight, fontSizePixels, color, align). Every omitted property and the exact recorded rectangle are inherited. Background-only edits preserve all text settings and placement. Original bytes and unchanged font hashes are verified before publication. A changed source, changed font or text that no longer fits fails without publishing, shrinking or rewriting. Produces a new flattened PNG through the existing durable image-patch worker; originals stay immutable, outside-mask pixels are verified, retries are idempotent and prepared publication can resume. General image patches remain available for new panels or changed rectangles. Source must be in the selected project, brand or linked library. Inspect the output; exact inheritance is not proof of visual quality.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"sourceSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"changes":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"type":"string","enum":["top","center","bottom"]},"rowUpdates":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":0,"maximum":19},"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"type":"string","enum":["sans","serif","mono"]},"weight":{"type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"type":"string","enum":["left","center","right"]}},"required":["index"],"additionalProperties":false}}},"additionalProperties":false},"name":{"default":"Typography revision","type":"string","minLength":1,"maxLength":120},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]}},"required":["projectId","sourceSha256","changes"],"additionalProperties":false}}}}}},"/assets/{id}/image-exports":{"post":{"operationId":"post__assets_id_image_exports","summary":"Crop an exact image region or export dimensions without regenerating artwork","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Read image-info for the sourceSha256, then export PNG, JPEG or WebP through the durable production worker. Rechecks source bytes, applies EXIF orientation, converts to sRGB and verifies encoded dimensions/format. Optional sourceRegion extracts a selected rectangle in integer pixels of the auto-oriented image before resizing; use image-info dimensions and inspect the original to choose bounds. Out-of-bounds rectangles fail without publication. For a single panel from a collage, set sourceRegion and matching output width/height with PNG to avoid scaling. Results include the effective sourceRegion, regionCropped and fitCropped separately. contain preserves the full image with centered padding; cover explicitly crops centrally. Neither stretches. Upscaling requires allowUpscale:true and adds no generated detail. JPEG requires an explicit opaque background; PNG is lossless and has no quality setting. Single-frame sources and outputs up to 40 megapixels, source up to 5 GiB. Produces a new flattened asset, preserves source artwork and its recorded typography, supports cancellation and same-byte prepared-publication recovery. No provider generation. Edit typography on the retained source then export again; this derivative does not claim editable layers. Inspect legibility and subject clearance. Exact dimensions alone do not establish placement suitability or ad performance.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sourceSha256":{"type":"string","pattern":"^[a-f0-9]{64}$","description":"Exact source bytes from GET /assets/{id}/image-info. The worker verifies this hash before encoding."},"sourceRegion":{"description":"Optional exact rectangular crop in integer pixels of the auto-oriented source from image-info. Extracted before resizing; must fit entirely inside the source. Omit to use the complete image. Set output width/height to the region size for an unscaled PNG crop.","type":"object","properties":{"left":{"type":"integer","minimum":0,"maximum":16383},"top":{"type":"integer","minimum":0,"maximum":16383},"width":{"type":"integer","minimum":1,"maximum":16384},"height":{"type":"integer","minimum":1,"maximum":16384}},"required":["left","top","width","height"],"additionalProperties":false},"name":{"default":"Image export","type":"string","minLength":1,"maxLength":180},"width":{"type":"integer","minimum":1,"maximum":16384},"height":{"type":"integer","minimum":1,"maximum":16384},"format":{"default":"png","type":"string","enum":["png","jpeg","webp"]},"fit":{"default":"contain","description":"contain preserves the entire picture with centered padding; cover explicitly authorizes centered cropping. Neither mode stretches the image.","type":"string","enum":["contain","cover"]},"background":{"default":"transparent","description":"Padding and alpha-flattening color. JPEG requires an explicit opaque hex color.","anyOf":[{"type":"string","const":"transparent"},{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}]},"allowUpscale":{"default":false,"description":"Allow deterministic interpolation when the selected fit needs larger source pixels. Adds no generated detail. False rejects instead of quietly delivering a smaller size.","type":"boolean"},"quality":{"description":"JPEG/WebP encoder quality; defaults to90. Not applicable to lossless PNG.","type":"integer","minimum":1,"maximum":100},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]}},"required":["projectId","sourceSha256","width","height"],"additionalProperties":false}}}}}},"/assets/{id}/image-patches":{"post":{"operationId":"post__assets_id_image_patches","summary":"Apply a localized image or exact text correction while preserving unselected pixels","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Choose either editedAssetId for an aligned candidate, or typography for deterministic exact text on an opaque rectangular background (no candidate or provider generation). Typography rows use literal copy, hex colors, installed DejaVu sans/serif/mono regular/bold fonts, explicit fontSizePixels, alignment, padding and gaps. Each row must fit at its requested size; no automatic shrinking, wrapping, cropping or copy rewrite. Typography requires a rectangle with zero feathering, covers the old contents of that region, and returns measured row bounds/font hashes in result.typography. Inspect glyphs and mobile legibility; custom brand fonts are not supported here. Candidate mode composes an already edited image inside a rectangle or owned grayscale/alpha mask. White selects the candidate, black or transparent preserves the original, gray blends; rectangle feathering stays inside its bounds. Both images and mask must have identical auto-oriented dimensions; single JPEG/PNG/WebP images up to 40 megapixels and 5 GiB. No generation, resizing, alignment or original overwrite. The new lossless PNG is decoded again to verify exact sRGB RGBA8 pixels; the result reports changed/selected/preserved counts and outside-mask hashes. Inspect the selected area and seams: preservation is not a quality verdict. Sources must belong to this project, its selected brand or explicitly linked project library. Poll the production job; failed prepared publication can resume through its existing resume endpoint without recompositing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"mask":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"integer","minimum":0,"maximum":128}},"required":["kind","x","y","width","height"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"asset"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["kind","assetId"],"additionalProperties":false}],"description":"Rectangle in normalized display coordinates, or an equally sized mask image: opaque white uses the edited image, black or transparent preserves the original, gray blends. Feathering stays inside the rectangle."},"name":{"default":"Localized image correction","type":"string","minLength":1,"maxLength":120},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]},"editedAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647,"description":"An already edited, aligned full image with exactly the original display dimensions. No generation is performed."}},"required":["projectId","mask","editedAssetId"],"additionalProperties":false},{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"mask":{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"number","const":0}},"required":["kind","x","y","width","height"],"additionalProperties":false},"name":{"default":"Localized image correction","type":"string","minLength":1,"maxLength":120},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]},"typography":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"default":16,"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"default":8,"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"default":"center","type":"string","enum":["top","center","bottom"]},"rows":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"default":"sans","description":"Installed DejaVu family, not a custom uploaded brand font.","type":"string","enum":["sans","serif","mono"]},"weight":{"default":"regular","type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"default":"center","type":"string","enum":["left","center","right"]}},"required":["text","fontSizePixels","color"],"additionalProperties":false}}},"required":["background","rows"],"additionalProperties":false},"typographyIntegrity":{"description":"Optional source and unchanged-font preconditions. A mismatch fails without publishing.","type":"object","properties":{"sourceSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"fontSha256s":{"minItems":1,"maxItems":20,"type":"array","items":{"anyOf":[{"type":"string","pattern":"^[a-f0-9]{64}$"},{"type":"null"}]}}},"required":["sourceSha256","fontSha256s"],"additionalProperties":false}},"required":["projectId","mask","typography"],"additionalProperties":false}]}}}}}},"/assets/{id}/finishes":{"post":{"operationId":"post__assets_id_finishes","summary":"Normalize audio, duck music and encode a new derivative","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Optional sourceTempo (0.25–4) changes the tempo of an audio-only source while preserving pitch. Use sourceAudio=keep and no added voice/music/stems; omitted duration uses source duration divided by tempo. Finish the narration separately, then use the returned new asset in the timeline. sourceTimeMapping reports the nominal mapping; re-analyze new audio for caption timing and intelligibility. It never rewrites the original, generates a voice, or retimes existing timeline captions. Optional isolated voice and music stems use timeline offsets in seconds. Music ducking requires an isolated voice bus: supply a voice stem or explicitly classify an isolated retained voice source with sourceAudioRole=voice. The default mixed source track is not speech isolation. For an assembled mix use sourceAudio=keep; replace removes the entire source mix. Uses two-pass loudness normalization and remeasures encoded AAC. Returns pass/warning measurements, never an intelligibility guarantee. MP4 with compatible picture copied, or H.264 encoding when needed, and AAC audio; M4A AAC for audio-only. Images require duration and voice/music. Explicit output profiles support up to 4K area and 30 minutes; compatible source picture streams are preserved when the profile is unchanged. Source media, output and isolated audio stems support 5 GiB. Original media stays unchanged. Completed video finishes may expose result.thumbnail.status (ready or unavailable). Thumbnails are private and follow the output retention; an unavailable thumbnail does not invalidate the finished video. GET /assets/{id} reports hasThumbnail. Legacy jobs may omit thumbnail status. Completed finish result.pictureProcessing reports mode stream_copy, encode or not_applicable; reason compatible_profile_and_codec, requested_profile_change, incompatible_source_codec, still_image_to_video or no_video_stream; and actual sourceCodec/outputCodec. pictureStreamCopied remains compatible. These are processing receipts, not proof of visual quality or decoded-frame identity. Older jobs may omit pictureProcessing. Completed finishes expose audioBuses with isolated role membership and supplied timing/gain/fades, and duckingParameters when compression was applied. Parameters are threshold (linear amplitude), ratio, attack/release (milliseconds), and makeup (linear gain). Null means no sidechain compression was applied; older jobs can omit the field. These receipts do not establish intelligibility or listening quality.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"default":"Finished media","type":"string","minLength":1,"maxLength":120},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"voice":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":1800},"gainDb":{"default":0,"type":"number","minimum":-40,"maximum":12}},"required":["assetId"],"additionalProperties":false},"music":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"start":{"default":0,"type":"number","minimum":0,"maximum":1800},"gainDb":{"default":-14,"type":"number","minimum":-40,"maximum":0},"duck":{"default":true,"type":"boolean"}},"required":["assetId"],"additionalProperties":false},"sourceTempo":{"type":"number","minimum":0.25,"maximum":4},"sourceAudio":{"default":"keep","description":"Source audio is the entire rendered timeline mix, including narration, music and sound effects. Keep it when those are already assembled. Replace removes it all; without replacement voice/music/stems the result is silent. Mute unwanted generated-clip audio on individual timeline clips before delivery.","type":"string","enum":["keep","replace"]},"sourceAudioRole":{"default":"mix","type":"string","enum":["mix","voice","music","ambience","sound"]},"stems":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"role":{"type":"string","enum":["voice","music","ambience","sound"]},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"sourceStart":{"default":0,"type":"number","minimum":0,"maximum":1800},"sourceEnd":{"type":"number","exclusiveMinimum":0,"maximum":1800},"gainDb":{"default":0,"type":"number","minimum":-60,"maximum":12},"fadeIn":{"default":0,"type":"number","minimum":0,"maximum":1800},"fadeOut":{"default":0,"type":"number","minimum":0,"maximum":1800},"duck":{"default":true,"type":"boolean"}},"required":["assetId","role"],"additionalProperties":false}},"targetLufs":{"default":-16,"type":"number","minimum":-30,"maximum":-8},"maxTruePeakDbtp":{"default":-1,"type":"number","minimum":-6,"maximum":-0.5},"output":{"type":"object","properties":{"width":{"type":"integer","minimum":160,"maximum":3840},"height":{"type":"integer","minimum":160,"maximum":3840},"fit":{"default":"contain","type":"string","enum":["contain","cover"]},"fps":{"default":"30","type":"string","enum":["24","25","30","60"]},"quality":{"default":"high","type":"string","enum":["standard","high"]},"audioBitrateKbps":{"default":"192","type":"string","enum":["128","192","256"]}},"required":["width","height"],"additionalProperties":false},"retention":{"default":"30_days","type":"string","enum":["30_days","permanent"]}},"additionalProperties":false}}}}}},"/assets/{id}/archive":{"post":{"operationId":"post__assets_id_archive","summary":"Create a permanent campaign copy","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Copies the owned source bytes into durable private storage and creates a new asset with no automatic expiry. Does not restore already expired media. Account deletion still removes campaign copies.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"default":"Campaign master","type":"string","minLength":1,"maxLength":120}},"additionalProperties":false}}}}}},"/production-jobs/{jobId}/resume":{"post":{"operationId":"post__production_jobs_jobId_resume","summary":"Resume a delivery or publication of prepared media","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Explicit recovery of a failed delivery from validated frozen and finishing receipts, or a standalone finish/archive/image-patch/image-export job with a complete durable output receipt. A delivery may retain completed masters while finishing a confirmed frozen picture with no prior finish, reusing a completed child not yet recorded by its parent, or publishing a complete prepared child output. If the clean render has neither an admission record nor a child receipt, recovery can submit that missing render for the first time. It never replays an uncertain native render or regenerates provider media. Delivery recovery preserves frozen revisions, completed masters, completed evidence and policy, and requeues failed reviews. result.recoveryAttempts records each recovered master and its mode, original child identity, prior state and error. Finish/archive/image-patch/image-export recovery publishes the same prepared bytes and reuses any committed asset; no encoding, image composition or object upload is repeated. Prior errors remain in result.recoveryAttempts. The same resume key returns the existing attempt, including after completion; use a new key after another failure. Cancelled jobs, admitted but unfinished or uncertain renders, expired outputs and finishes without a complete receipt are not resumed. Source media stays unchanged. No paid generation or duplicate final notification.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/production-jobs":{"get":{"operationId":"get__production_jobs","summary":"List production work","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductionJob"}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Use projectId for team project access, or account owner access for the account-wide queue. limit 1–100 and after UUID paginate results."}},"/production-jobs/{jobId}":{"get":{"operationId":"get__production_jobs_jobId","summary":"Read job status and output measurements","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A delivery may return queued with result.reviewWait after its masters finish. Both reviews run on their separate worker; other production jobs can proceed. Review IDs, startedAt and deadline persist through restart. This wait does not regenerate media or consume retry attempts. Completed delivery still requires both reviews and exposes the final quality result and subtitle sidecars."}},"/production-jobs/{jobId}/cancel":{"post":{"operationId":"post__production_jobs_jobId_cancel","summary":"Cancel queued or running media finishing","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProductionJob"},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A native editor transaction already applying cannot be cancelled; inspect its operation and use a new edit to revert if needed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/templates":{"get":{"operationId":"get__templates","summary":"Search latest immutable template versions","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"q","in":"query","schema":{"description":"Case-insensitive literal name search on the latest version. % and _ are ordinary characters.","type":"string","maxLength":120}},{"name":"brandId","in":"query","schema":{"description":"Only recipes whose latest version belongs to this owned brand.","type":"integer","exclusiveMinimum":0,"maximum":2147483647}},{"name":"category","in":"query","schema":{"description":"Filter default command actions. A recipe may belong to more than one category; variants can change allowed action slots.","type":"string","enum":["transitions","captions","effects","clips","timeline"]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Account owner library. Optional q searches literal names case-insensitively; brandId selects an owned brand; category is transitions, captions, effects, clips or timeline. All filters apply to the latest version only. Results keep the full recipe and add summary with default-command categories, action counts, commandCount and slotCount. Summary is not a rendered preview or an assurance that assets are still available. An additive preview contains a private version-bound rendered example when published; check its state before using its asset/contentUrl. Action slots are classified using their defaults; a variant may change them. limit 1–100; after is the previous pagination.nextCursor UUID. Keep filters unchanged while paging. Reads never start an editor, render or generation; use an explicit version when applying variants."},"post":{"operationId":"post__templates","summary":"Publish a versioned brand template","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Owner account library. Supply a client UUID, version 1, named typed slots and editor commands. Whole-value {{slotName}} placeholders are substituted. choices enforce brand color/font/text rules. Publish the next sequential version for changes; older versions remain reproducible.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":100000},"name":{"type":"string","minLength":1,"maxLength":120},"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"slots":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-z][a-zA-Z0-9_]{0,39}$"},"additionalProperties":{"type":"object","properties":{"type":{"type":"string","enum":["text","number","asset","color"]},"default":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]},"choices":{"minItems":1,"maxItems":50,"type":"array","items":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["type","default"],"additionalProperties":false}},"commands":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}}}},"required":["id","version","name","slots","commands"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}}]}}}}}}}},"/templates/{templateId}":{"get":{"operationId":"get__templates_templateId","summary":"Get a template version","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/templates/{templateId}/preview-candidates":{"get":{"operationId":"get__templates_templateId_preview_candidates","summary":"Find rendered examples for a recipe version","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"query","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"maximum":100000}},{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Owner-only recent completed MP4 renders, up to limit (default 25, maximum 100), whose project and revision exactly match a completed non-dry-run variant of the chosen immutable recipe version. No editor, generation or render is started. Candidate media may include the project content and customized slot values; this is an example, not a promise about future variants."}},"/templates/{templateId}/preview":{"post":{"operationId":"post__templates_templateId_preview","summary":"Publish a rendered example for a recipe version","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Account-owner metadata operation; it never renders or charges. Requires an owned completed non-dry-run variant job and an owned completed MP4 render of the same project and exact resulting timeline revision. One immutable example per recipe version. Identical retries return that publication; a different example returns 409. Old versions retain their examples. Expired or removed media becomes unavailable, not a broken playable link. Read preview from GET templates or GET templates/{templateId}?version=N. New publications require a new recipe version.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":100000},"variantJobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"renderId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["version","variantJobId","renderId"],"additionalProperties":false}}}}}},"/templates/{templateId}/variants":{"post":{"operationId":"post__templates_templateId_variants","summary":"Queue template variants into separate projects","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID. Retry the identical request with the same key. Changed inputs require a new key; reuse with different inputs returns 409. Keys are scoped to the owning account.","schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"},"items":{"type":"array","items":{"$ref":"#/components/schemas/ProductionJob"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"1–20 already-started editor projects, each with current revision and synced assets. Each variant is an atomic edit transaction and a separate job. Include profile.set in the template for aspect variants. dryRun restores each target. Poll items, then render the completed revisions. Retrying an interrupted submission uses the same key to recover the same item jobs. No cross-project transaction is claimed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"dryRun":{"default":false,"type":"boolean"},"variants":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"values":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["projectId","revision"],"additionalProperties":false}}},"required":["version","variants"],"additionalProperties":false}}}}}},"/webhooks":{"get":{"operationId":"get__webhooks","summary":"List delivery endpoints","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Account owner settings; signing secrets are never listed."},"post":{"operationId":"post__webhooks","summary":"Register a signed HTTPS job lifecycle webhook","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Returns a signing secret once. Public HTTPS/443 destinations with public IPv4 DNS only. Redirects and private/reserved addresses are rejected. Supports production, review and native-render completed/failed/cancelled events, plus generation completed/failed/cancelled/blocked/review_required. Generation state transitions are recorded durably in the same database transaction as the job update. Events are collected only for their owning account and subscriptions registered before the transition; no historical backfill. A review_required event means reconcile the existing submission, not resubmit it. Read current job status from data.statusUrl; event bodies contain metadata, not media links. Delivery is at least once: deduplicate body.id. Verify HMAC-SHA256(secret, X-Mango9-Timestamp + \".\" + exact raw body), compare with X-Mango9-Signature v1=hex, and reject timestamps outside five minutes. No API keys or media bytes are sent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"events":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string","enum":["production.completed","production.failed","production.cancelled","review.completed","review.failed","review.cancelled","render.completed","render.failed","render.cancelled","generation.completed","generation.failed","generation.cancelled","generation.review_required","generation.blocked"]}}},"required":["url","events"],"additionalProperties":false}}}}}},"/webhooks/{webhookId}":{"delete":{"operationId":"delete__webhooks_webhookId","summary":"Disable a webhook","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}/deliveries":{"get":{"operationId":"get__webhooks_webhookId_deliveries","summary":"Inspect webhook attempts and delivery history","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"limit 1–100 and after UUID paginate history. Retries use exponential backoff from 30 seconds, capped at six hours, with 12 automatic attempts. Non-2xx and redirects fail. The event ID is stable across retries."}},"/webhooks/{webhookId}/deliveries/{deliveryId}/retry":{"post":{"operationId":"post__webhooks_webhookId_deliveries_deliveryId_retry","summary":"Retry an exhausted webhook delivery","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}}},"/production-status":{"get":{"operationId":"get__production_status","summary":"Read account queue and delivery telemetry","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Counts by kind/state, oldest job age, capacity limits and delivery failures. Least recently served account goes first; FIFO within an account. This is operational telemetry, not an SLA."}},"/assets/{id}/delivery-link":{"post":{"operationId":"post__assets_id_delivery_link","summary":"Create or reuse a revocable media delivery link","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Maps to the existing Create share API. Returns a share page and direct downloadUrl for tools that cannot send an Authorization header. Anyone holding the link can read this asset until revocation, source expiry or account suspension; keep it private. Does not make an account library public. Creating a link does not send it anywhere.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}}},"delete":{"operationId":"delete__assets_id_delivery_link","summary":"Revoke delivery links for this asset","security":[{"centralSession":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Error; inspect error.code, error.message and meta.requestId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Immediately revokes the existing Create share link for this asset, including one created in the user interface."}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"m9c_<64 hex>"},"centralSession":{"type":"apiKey","in":"cookie","name":"__Host-m9-create","description":"Central-managed HttpOnly cookie. Mutations require Origin equal to Create origin. Login as uses its scoped HttpOnly cookie and x-m9-support selector."}},"schemas":{"Balance":{"type":"object","required":["balanceCents","currency"],"properties":{"balanceCents":{"type":"integer"},"reservedCents":{"type":"integer","minimum":0},"availableCents":{"type":"integer","minimum":0},"reservationScope":{"const":"this_create_server"},"asOf":{"type":"string","format":"date-time"},"currency":{"const":"USD"}}},"Brand":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"description":{"type":"string"}}},"Project":{"type":"object","required":["id","scenes"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"brandId":{"type":"integer","minimum":1},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1"]},"scenes":{"type":"array","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"image":{"type":"integer","minimum":1},"video":{"type":"integer","minimum":1},"audio":{"type":"integer","minimum":1}}}}}},"Asset":{"type":"object","required":["id","contentUrl"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"projectId":{"type":"integer","minimum":1},"brandId":{"type":"integer","minimum":1},"mime":{"type":"string"},"size":{"type":["number","null"]},"duration":{"type":["number","null"]},"category":{"type":["string","null"]},"source":{"type":["string","null"]},"generationId":{"type":["integer","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"deletedAt":{"type":["string","null"],"format":"date-time"},"hasThumbnail":{"type":"boolean"},"contentUrl":{"type":"string"},"typographyUrl":{"type":"string"}}},"Generation":{"type":"object","required":["id","state"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"projectId":{"type":"integer","minimum":1},"sceneId":{"type":"string","format":"uuid"},"kind":{"enum":["image","video","audio"]},"modelKey":{"type":"string"},"modelLabel":{"type":"string"},"prompt":{"type":"string"},"storyboard":{"anyOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"shots":{"minItems":2,"maxItems":15,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"prompt":{"type":"string","minLength":1,"maxLength":500,"description":"Complete instructions for this shot. The overview prompt is not appended or silently truncated."},"durationSeconds":{"type":"integer","minimum":1,"maximum":12}},"required":["id","prompt","durationSeconds"],"additionalProperties":false}}},"required":["version","shots"],"additionalProperties":false},{"type":"null"}]},"settings":{"type":"object","additionalProperties":true},"mediaReferences":{"type":"object","properties":{"videos":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"audio":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"additionalProperties":false,"description":"Owned media asset IDs. Kling Motion requires one video; Wan reference mode accepts up to five videos and five audio files. Duration and billing are measured by the server. Use references for image asset IDs."},"references":{"type":"array","items":{"type":"integer","minimum":1}},"state":{"type":"string","description":"queued, waiting, submitting, processing, completed, failed, cancelled, blocked, or review"},"parentGenerationId":{"type":["integer","null"]},"outputs":{"type":["array","null"],"items":{"type":"integer","minimum":1},"description":"IDs of the generated output assets. Use these integer values in image references or editor assetId; the generation id is a different identifier."},"estimatedCredits":{"type":["number","null"]},"actualCredits":{"type":["number","null"]},"submittedAt":{"type":["string","null"],"format":"date-time"},"ingestion":{"anyOf":[{"type":"object","properties":{"phase":{"type":"string","enum":["retrieving","checking","storing","retrying"]},"outputIndex":{"type":"integer","minimum":0,"maximum":1000},"outputCount":{"type":"integer","minimum":1,"maximum":1001},"receivedBytes":{"type":"integer","minimum":0,"maximum":5368709120},"totalBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":5368709120},{"type":"null"}]},"observedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"stale":{"type":"boolean"}},"required":["phase","outputIndex","outputCount","receivedBytes","totalBytes","observedAt","stale"]},{"type":"null"}],"readOnly":true,"description":"Explicit worker observation while processing: retrieving, checking, storing or retrying an already-generated file. receivedBytes and totalBytes describe only the current output transfer, never overall completion. stale means no recent observation; null means unknown or terminal. No provider URLs, tokens or permission to resubmit."},"submissionDiagnostic":{"type":["object","null"],"description":"Safe evidence for new rejected or uncertain provider submissions. Transport status and digest do not establish that a task was not created. Unknown outcomes require reconciliation before retrying.","properties":{"version":{"const":1},"stage":{"enum":["transport","response","acknowledgement"]},"category":{"type":"string"},"httpStatus":{"type":"integer","minimum":1},"providerCode":{"type":"integer","minimum":1},"responseSha256":{"type":"string"},"recordedAt":{"type":["string","null"],"format":"date-time"},"fields":{"type":"array","items":{"enum":["first_frame_url","last_frame_url","reference_image_urls","reference_video_urls","reference_audio_urls","duration","resolution","aspect_ratio","generate_audio","output_format","prompt"]},"description":"Allowlisted upstream parameter names implicated by recorded evidence. Empty means no field evidence; never infer a cause."},"recovery":{"enum":["correct_request","fix_connection","retry_later","reconcile","inspect_result"],"description":"Historical submission guidance. Current generation error.recovery takes precedence after callback reconciliation or a later terminal result."}}},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean","description":"True only for an explicitly rejected busy-service request. It never authorizes automatic paid retries."},"recovery":{"enum":["correct_request","fix_connection","retry_later","reconcile","inspect_result"]},"fields":{"type":"array","items":{"enum":["first_frame_url","last_frame_url","reference_image_urls","reference_video_urls","reference_audio_urls","duration","resolution","aspect_ratio","generate_audio","output_format","prompt"]}}}}}},"Export":{"type":"object","required":["id","state"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"projectId":{"type":"integer","minimum":1},"clips":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"transition":{"default":"cut","type":"string","enum":["cut","dissolve","fade-black","wipe-left","wipe-right","wipe-up","wipe-down","slide-left","slide-right","zoom-in"]},"transitionDuration":{"default":0.6,"type":"number","minimum":0.1,"maximum":2},"motion":{"default":"none","type":"string","enum":["none","zoom-in","zoom-out","pan-left","pan-right","rise","rotate-in","pulse"]},"fit":{"default":"contain","type":"string","enum":["contain","cover"]},"look":{"default":"none","type":"string","enum":["none","warm","cool","mono"]},"title":{"default":"","type":"string","maxLength":160},"titlePosition":{"default":"bottom","type":"string","enum":["top","center","bottom"]},"volume":{"default":1,"type":"number","minimum":0,"maximum":1}},"required":["assetId","start","end"]}},"aspectRatio":{"type":"string"},"state":{"type":"string","enum":["queued","processing","native-importing","completed","failed"]},"assetId":{"type":["integer","null"]},"contentUrl":{"type":["string","null"]},"error":{"type":["object","null"]}}},"EditorSession":{"type":"object","required":["projectId","state","editorUrl","statusUrl"],"properties":{"recovery":{"type":["object","null"],"readOnly":true,"properties":{"code":{"const":"missing_project_media"},"assetIds":{"type":"array","items":{"type":"integer","minimum":1}},"action":{"const":"restore_or_replace_sources"},"timelinePreserved":{"const":true}},"description":"Missing owned sources prevent native startup; resolve these sources before retrying. Unused expired library entries may be safely archived without changing the timeline."},"projectId":{"type":"integer","minimum":1},"statusUrl":{"type":"string"},"state":{"type":"string"},"editorUrl":{"type":"string"},"imported":{"type":"number"},"lastSeen":{"type":["number","null"]},"app":{"type":["object","null"]},"cloudExport":{"type":["object","null"]},"error":{"type":["string","null"]}}},"ApiKey":{"type":"object","required":["id","name","scopes","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scopes":{"type":"array","deprecated":true,"description":"Legacy compatibility metadata. Keys have no separate read/write restrictions; account and project permissions apply.","items":{"type":"string","enum":["projects:read","projects:write","models:read","assets:read","assets:write","generations:read","generations:write","editor:read","editor:write","exports:read","exports:write"]}},"createdAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"token":{"type":"string","description":"Present only in the key-creation response; never returned again."}}},"EditorOperation":{"type":"object","required":["id","state","statusUrl"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"enum":["queued","running","completed","failed","expired","unknown"]},"statusUrl":{"type":"string"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"data":{"type":["object","null"],"additionalProperties":true},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"EditorTimeline":{"type":"object","required":["apiVersion","revision","tracks","clips","assets"],"properties":{"apiVersion":{"const":1},"updatedAt":{"type":"number"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"profile":{"type":"object","properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"fps":{"type":"object","properties":{"num":{"type":"integer","minimum":1},"den":{"type":"integer","minimum":1}}}}},"capabilities":{"type":"object","properties":{"ownedTransitionMasksVersion":{"type":"integer","description":"Version 1 enables transition.add with an owned imported PNG/JPEG maskAssetId instead of an installed transitionId. Supports duration/reverse, editable native timeline transitions, dry-run and Undo/Redo. Link the same approved raster mask to another project before reuse; no arbitrary paths, SVG documents or Lottie inputs. Read transitions[].maskAssetId for the current project source. Arrange clip overlap and inspect preview and final output."},"clipSourceReplacementVersion":{"type":"integer","description":"Version 1 enables in-place clip.replace: asset source changes while clip ID, timing, track, properties, audio switches and effects remain. Requires an imported project asset covering the existing source interval; use revision-bound commands or batches and inspect a rendered result."},"extendedLinearTimeMapping":{"type":"boolean"},"captionGeometryReflow":{"type":"boolean"},"captionPlacementPlanVersion":{"type":"integer","description":"Version 1 enables layout.suggest: an unapplied revision-bound nearest translation for an existing caption, measured against every visible caption frame and supplied protected regions. Preserves typography, timing, animation and other media; render review still required."},"semanticAdPanelVersion":{"type":"integer","description":"Version 1 enables optional ad-panel layout.reflow for square and landscape. Product sequenceId groups share a hero slot across deliberate overlaps; active copy is arranged beside footage. Exact approved words, source media, timing and audio remain. Read capability first, dry-run, render and review; no quality certification."},"semanticLayoutVersion":{"type":"integer","description":"Version 1 supports role-based layout.reflow for every visual clip, explicit contain/cover fitting, readable text geometry and all-frame caption clearance. Optional result.mediaFraming v1 reports native base-transform rectangles and crop retention. In dry-run batches this evidence appears under previews[].data after exact rollback, explicitly uncommitted. Geometry does not certify prominence, subject visibility or readability; requires a new render and format-specific visual review."},"renderAudioVersion":{"type":"integer","description":"Version 2 preserves the native timeline mix losslessly until the import worker encodes browser-compatible AAC once, without re-encoding picture frames. Historical exports are unchanged."},"captionOffsetVersion":{"type":"integer","description":"Version 2 honors settled caption offset_x/offset_y in project pixels across scale and gravity. Size edits preserve existing pixel displacement. Older runtimes should use size=1 for exact pixel placement; raw native clip location coordinates have scale-dependent displacement."},"captionRendererVersion":{"type":"integer","description":"Version 3 adds appearance.background_mode (lines or block), joining line backings into one panel when block is selected. Omitted mode preserves lines. Version 2 separates multiline caption backings and paints all backings below glyphs. Existing caption.rendererVersion values describe the stored immutable geometry; absent means version 1. To refresh an existing caption through the current renderer, submit caption.update with its id and no changed content, then audit spacing and preview before a new export. Existing exports and source assets are preserved."}}},"tracks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"number":{"type":"number"},"locked":{"type":"boolean"}}}},"clips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"assetId":{"type":["integer","null"]},"kind":{"enum":["media","caption"]},"trackId":{"type":"string"},"position":{"type":"number"},"start":{"type":"number"},"end":{"type":"number"},"properties":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":true}},"caption":{"type":"object","additionalProperties":true}}}},"assets":{"type":"array","items":{"type":"object","required":["id","imported"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":"string"},"mime":{"type":"string"},"imported":{"type":"boolean","description":"For media, true when clip.add can use the imported file. For a private font, true only after this project has registered its exact pinned font; use font.registered and renderFamily for caption styling."},"font":{"type":"object","required":["renderFamily","registered"],"properties":{"renderFamily":{"type":"string"},"registered":{"type":"boolean","description":"Session-local Qt registration matches the owned asset and pinned digest. False during download or before registration; no font substitution is claimed."}}}}}},"transitions":{"type":"array","items":{"type":"object","additionalProperties":true}},"captionPresets":{"type":"array","items":{"type":"object","additionalProperties":true}},"history":{"type":"object","properties":{"undo":{"type":"boolean"},"redo":{"type":"boolean"}}},"rendering":{"type":"boolean"},"export":{"type":"object","properties":{"state":{"type":["string","null"]},"requestId":{"type":["string","null"]},"progress":{"type":["number","null"]},"assetId":{"type":["integer","null"]},"contentUrl":{"type":"string"},"error":{"type":["string","null"]}}}}},"EditorTimelineSummary":{"type":"object","required":["apiVersion","revision","tracks","clips","selection"],"properties":{"apiVersion":{"const":1},"updatedAt":{"type":"number"},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"profile":{"type":"object","properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"fps":{"type":"object","properties":{"num":{"type":"integer","minimum":1},"den":{"type":"integer","minimum":1}}}}},"capabilities":{"type":"object","properties":{"ownedTransitionMasksVersion":{"type":"integer","description":"Version 1 enables transition.add with an owned imported PNG/JPEG maskAssetId instead of an installed transitionId. Supports duration/reverse, editable native timeline transitions, dry-run and Undo/Redo. Link the same approved raster mask to another project before reuse; no arbitrary paths, SVG documents or Lottie inputs. Read transitions[].maskAssetId for the current project source. Arrange clip overlap and inspect preview and final output."},"clipSourceReplacementVersion":{"type":"integer","description":"Version 1 enables in-place clip.replace: asset source changes while clip ID, timing, track, properties, audio switches and effects remain. Requires an imported project asset covering the existing source interval; use revision-bound commands or batches and inspect a rendered result."},"extendedLinearTimeMapping":{"type":"boolean"},"captionGeometryReflow":{"type":"boolean"},"captionPlacementPlanVersion":{"type":"integer","description":"Version 1 enables layout.suggest: an unapplied revision-bound nearest translation for an existing caption, measured against every visible caption frame and supplied protected regions. Preserves typography, timing, animation and other media; render review still required."},"semanticAdPanelVersion":{"type":"integer","description":"Version 1 enables optional ad-panel layout.reflow for square and landscape. Product sequenceId groups share a hero slot across deliberate overlaps; active copy is arranged beside footage. Exact approved words, source media, timing and audio remain. Read capability first, dry-run, render and review; no quality certification."},"semanticLayoutVersion":{"type":"integer","description":"Version 1 supports role-based layout.reflow for every visual clip, explicit contain/cover fitting, readable text geometry and all-frame caption clearance. Optional result.mediaFraming v1 reports native base-transform rectangles and crop retention. In dry-run batches this evidence appears under previews[].data after exact rollback, explicitly uncommitted. Geometry does not certify prominence, subject visibility or readability; requires a new render and format-specific visual review."},"renderAudioVersion":{"type":"integer","description":"Version 2 preserves the native timeline mix losslessly until the import worker encodes browser-compatible AAC once, without re-encoding picture frames. Historical exports are unchanged."},"captionOffsetVersion":{"type":"integer","description":"Version 2 honors settled caption offset_x/offset_y in project pixels across scale and gravity. Size edits preserve existing pixel displacement. Older runtimes should use size=1 for exact pixel placement; raw native clip location coordinates have scale-dependent displacement."},"captionRendererVersion":{"type":"integer","description":"Version 3 adds appearance.background_mode (lines or block), joining line backings into one panel when block is selected. Omitted mode preserves lines. Version 2 separates multiline caption backings and paints all backings below glyphs. Existing caption.rendererVersion values describe the stored immutable geometry; absent means version 1. To refresh an existing caption through the current renderer, submit caption.update with its id and no changed content, then audit spacing and preview before a new export. Existing exports and source assets are preserved."}}},"tracks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"number":{"type":"number"},"locked":{"type":"boolean"}}}},"clips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"assetId":{"type":["integer","null"]},"kind":{"enum":["media","caption"]},"trackId":{"type":"string"},"position":{"type":"number"},"start":{"type":"number"},"end":{"type":"number"},"properties":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":true}},"caption":{"type":"object","additionalProperties":true},"opacity":{"type":"object","properties":{"kind":{"enum":["constant","animated","unavailable"]},"value":{"type":"number"},"keyframeCount":{"type":"integer","minimum":1},"openingFade":{"type":["object","null"],"properties":{"start":{"type":"number"},"end":{"type":"number"},"durationSeconds":{"type":"number"},"sourceFirstFrame":{"type":"integer","minimum":1},"sourceLastFrame":{"type":"integer","minimum":1},"from":{"const":0},"to":{"const":1}}}}}}}},"assets":{"type":"array","items":{"type":"object","required":["id","imported"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":"string"},"mime":{"type":"string"},"imported":{"type":"boolean","description":"For media, true when clip.add can use the imported file. For a private font, true only after this project has registered its exact pinned font; use font.registered and renderFamily for caption styling."},"font":{"type":"object","required":["renderFamily","registered"],"properties":{"renderFamily":{"type":"string"},"registered":{"type":"boolean","description":"Session-local Qt registration matches the owned asset and pinned digest. False during download or before registration; no font substitution is claimed."}}}}}},"transitions":{"type":"array","items":{"type":"object","additionalProperties":true}},"captionPresets":{"type":"array","items":{"type":"object","additionalProperties":true}},"history":{"type":"object","properties":{"undo":{"type":"boolean"},"redo":{"type":"boolean"}}},"rendering":{"type":"boolean"},"export":{"type":"object","properties":{"state":{"type":["string","null"]},"requestId":{"type":["string","null"]},"progress":{"type":["number","null"]},"assetId":{"type":["integer","null"]},"contentUrl":{"type":"string"},"error":{"type":["string","null"]}}},"selection":{"type":"object","required":["view","partial","totalClips","selectedClips","inspectFullClipBeforeEditing"],"properties":{"view":{"const":"summary"},"partial":{"type":"boolean"},"totalClips":{"type":"integer","minimum":1},"selectedClips":{"type":"integer","minimum":1},"selectedClipIds":{"type":"array","items":{"type":"string"}},"inspectFullClipBeforeEditing":{"const":true}}},"transitionCount":{"type":"integer","minimum":1},"assetCount":{"type":"integer","minimum":1},"captionPresetCount":{"type":"integer","minimum":1},"transitionSummary":{"type":"object","properties":{"version":{"const":1},"nativeTransitionCount":{"type":"integer","minimum":1},"opacityAnimatedMediaCount":{"type":"integer","minimum":1},"openingOpacityFadeCount":{"type":"integer","minimum":1},"openingOpacityFades":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number"},"end":{"type":"number"},"durationSeconds":{"type":"number"},"sourceFirstFrame":{"type":"integer","minimum":1},"sourceLastFrame":{"type":"integer","minimum":1},"from":{"const":0},"to":{"const":1},"clipId":{"type":"string"},"trackId":{"type":"string"},"overlappingLowerClipIds":{"type":"array","items":{"type":"string"}}}}},"scope":{"const":"selected_incoming_clips"},"renderedQualityVerified":{"const":false},"note":{"type":"string"}}}}},"MediaReview":{"type":"object","required":["id","assetId","state","statusUrl"],"properties":{"artifactRetention":{"type":"object","properties":{"policy":{"enum":["7_days","30_days","campaign"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"status":{"enum":["retained","expired","not_ready"]},"deletedAt":{"type":["string","null"],"format":"date-time"},"cleanupState":{"type":["string","null"],"enum":["completed","failed",null]},"manifestCount":{"type":"integer","minimum":1}}},"id":{"type":"string","format":"uuid"},"assetId":{"type":"integer","minimum":1},"projectId":{"type":["integer","null"]},"state":{"enum":["queued","running","completed","failed","cancelled"]},"attempts":{"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"statusUrl":{"type":"string"},"error":{"type":["object","null"]},"supplementalEvidence":{"type":"object","description":"GET-only scoped supplemental evidence; original report unchanged.","properties":{"version":{"const":1},"sourceMatch":{"enum":["exact_bytes","unavailable"]},"timeCoordinates":{"const":"source_asset_seconds"},"qualityCertificate":{"const":false},"reviews":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Each entry may include localWordAlignment with exact-source candidate timing and caption-comparison counts plus child receipt/artifact locators, or localTextRecognition with availability, exact source hash, sampled-only coverage, up to six decoded-frame locators, truncation, child statusUrl and child-relative evidence paths. qualityCertificate and coverageComplete remain false."}},"savedInterpretationsHasMore":{"type":"boolean"},"savedResponseInterpretations":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Read-only versioned window interpretations; original invalid receipt and incomplete coverage unchanged."},"hasMore":{"type":"boolean"},"listUrl":{"type":"string"},"note":{"type":"string"}}},"result":{"type":["object","null"],"properties":{"analysisVersion":{"type":"string"},"sourceSha256":{"type":"string"},"sourceAssetId":{"type":"integer","minimum":1},"sourceRevision":{"type":["string","null"]},"renderId":{"type":["string","null"]},"durationSeconds":{"type":"number"},"timeOrigin":{"type":"number"},"status":{"enum":["pass","warning","fail"]},"coverageComplete":{"type":"boolean"},"technicalStatus":{"type":"string"},"perceptual":{"type":"object","additionalProperties":true,"description":"Each new stage includes referenceEvidence from its durable media manifest: status references_submitted, none_submitted, manifest_unavailable, submission_uncertain, not_submitted or not_applicable; references identify original and submitted image hashes. Older stages may omit it. Requested references are not proof of submission or successful identity comparison; qualityCertificate remains false."},"perceptualProgress":{"type":"object","additionalProperties":true},"metadata":{"type":"object","additionalProperties":true},"checks":{"type":"object","additionalProperties":true},"findings":{"type":"array","items":{"type":"object","additionalProperties":true}},"transcript":{"type":"object","additionalProperties":true},"artifacts":{"type":"array","items":{"type":"object","required":["name","mime","size","sha256","contentUrl"],"properties":{"name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"integer","minimum":1},"sha256":{"type":"string"},"contentUrl":{"type":"string"},"timestamp":{"type":"number"},"timelineTimestamp":{"type":"number"}}}}}}}},"EditorRender":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"integer","minimum":1},"revision":{"type":"string"},"kind":{"enum":["final","preview"]},"state":{"enum":["rendering","uploading","completed","failed"]},"settings":{"type":"object","additionalProperties":true},"snapshot":{"type":"object","additionalProperties":true},"layoutAudit":{"type":["object","null"],"description":"Revision-bound caption geometry from the isolated renderer. Null for historical renders without evidence; this is not a semantic or raster quality certificate.","properties":{"version":{"type":"integer","minimum":1},"status":{"enum":["pass","warning","not_checked"]},"timeOrigin":{"const":"project_seconds"},"range":{"type":["object","null"],"properties":{"start":{"type":"number"},"end":{"type":"number"}}},"checkedFrameBounds":{"type":"integer","minimum":1},"protectedRegionCount":{"type":"integer","minimum":1},"failures":{"type":"array","items":{"type":"object","additionalProperties":true}},"unchecked":{"type":"array","items":{"type":"object","additionalProperties":true}},"qualityCertificate":{"const":false}}},"assetId":{"type":["integer","null"]},"contentUrl":{"type":["string","null"]},"error":{"type":["object","string","null"]}}},"TypographyPlan":{"type":"object","required":["version","readOnly","applied","fits","canvas","mask","typography","rectangleBounds","rows","conflicts","copyChanged","visualQualityVerified"],"properties":{"version":{"const":1},"readOnly":{"const":true},"applied":{"const":false},"fits":{"type":"boolean"},"canvas":{"type":"object","properties":{"width":{"type":"integer","exclusiveMinimum":0,"maximum":40000},"height":{"type":"integer","exclusiveMinimum":0,"maximum":40000}},"required":["width","height"],"additionalProperties":false},"mask":{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"number","const":0}},"required":["kind","x","y","width","height"],"additionalProperties":false},"typography":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"default":16,"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"default":8,"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"default":"center","type":"string","enum":["top","center","bottom"]},"rows":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"default":"sans","description":"Installed DejaVu family, not a custom uploaded brand font.","type":"string","enum":["sans","serif","mono"]},"weight":{"default":"regular","type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"default":"center","type":"string","enum":["left","center","right"]}},"required":["text","fontSizePixels","color"],"additionalProperties":false}}},"required":["background","rows"],"additionalProperties":false},"rectangleBounds":{"type":"object","required":["left","top","width","height"],"properties":{"left":{"type":"integer"},"top":{"type":"integer"},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}}},"available":{"type":"object","properties":{"width":{"type":"integer"},"height":{"type":"integer"}}},"required":{"type":"object","properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}}},"safeArea":{"default":{"left":0,"right":0,"top":0,"bottom":0},"type":"object","properties":{"left":{"default":0,"type":"number","minimum":0,"maximum":1},"right":{"default":0,"type":"number","minimum":0,"maximum":1},"top":{"default":0,"type":"number","minimum":0,"maximum":1},"bottom":{"default":0,"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"safeBounds":{"type":"object","properties":{"left":{"type":"integer","minimum":1},"top":{"type":"integer","minimum":1},"right":{"type":"integer","minimum":1},"bottom":{"type":"integer","minimum":1}}},"previewWidth":{"type":"integer","minimum":1},"rows":{"type":"array","items":{"type":"object","required":["text","font","weight","fontSizePixels","color","align","width","height","left","top","fontSha256"],"properties":{"text":{"type":"string"},"font":{"enum":["sans","serif","mono"]},"fontFamily":{"type":"string"},"weight":{"enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":1},"color":{"type":"string"},"align":{"enum":["left","center","right"]},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"left":{"type":"integer"},"top":{"type":"integer"},"fontSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"index":{"type":"integer","minimum":0},"preview":{"type":"object","properties":{"fontSizePixels":{"type":"number"},"glyphWidthPixels":{"type":"number"},"glyphHeightPixels":{"type":"number"}}}}}},"conflicts":{"type":"array","items":{"type":"object","required":["code","message"],"properties":{"code":{"enum":["padding","font_height","row_bounds","stack_height","safe_area"]},"row":{"type":"integer","minimum":0},"message":{"type":"string"}}}},"wrapped":{"const":false},"copyChanged":{"const":false},"roundedCorners":{"const":false},"fontSizeIsCapHeight":{"const":false},"visualQualityVerified":{"const":false},"note":{"type":"string"}}},"AssetTypography":{"oneOf":[{"type":"object","required":["available","assetId","readOnly","reason"],"properties":{"available":{"const":false},"assetId":{"type":"integer","minimum":1},"readOnly":{"const":true},"reason":{"type":"string"}}},{"type":"object","required":["available","assetId","jobId","sourceSha256","width","height","mask","typography","rows","updateUrl","planUrl"],"properties":{"available":{"const":true},"assetId":{"type":"integer","minimum":1},"jobId":{"type":"string","format":"uuid"},"sourceSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"mask":{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"number","const":0}},"required":["kind","x","y","width","height"],"additionalProperties":false},"typography":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"default":16,"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"default":8,"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"default":"center","type":"string","enum":["top","center","bottom"]},"rows":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"default":"sans","description":"Installed DejaVu family, not a custom uploaded brand font.","type":"string","enum":["sans","serif","mono"]},"weight":{"default":"regular","type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"default":"center","type":"string","enum":["left","center","right"]}},"required":["text","fontSizePixels","color"],"additionalProperties":false}}},"required":["background","rows"],"additionalProperties":false},"rows":{"type":"array","items":{"type":"object","required":["text","font","weight","fontSizePixels","color","align","width","height","left","top","fontSha256"],"properties":{"text":{"type":"string"},"font":{"enum":["sans","serif","mono"]},"fontFamily":{"type":"string"},"weight":{"enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":1},"color":{"type":"string"},"align":{"enum":["left","center","right"]},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"left":{"type":"integer"},"top":{"type":"integer"},"fontSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"index":{"type":"integer","minimum":0},"preview":{"type":"object","properties":{"fontSizePixels":{"type":"number"},"glyphWidthPixels":{"type":"number"},"glyphHeightPixels":{"type":"number"}}}}}},"readOnly":{"const":true},"layeredImage":{"const":false},"currentBytesVerified":{"const":false},"updateUrl":{"type":"string"},"planUrl":{"type":"string"},"note":{"type":"string"}}}]},"ProductionJob":{"type":"object","required":["id","kind","state","statusUrl"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"enum":["finish","archive","variant","delivery","narration-captions","motion-analysis","stem-separation","image-patch","image-export"]},"state":{"enum":["queued","running","completed","failed","cancelled"]},"projectId":{"type":["integer","null"]},"assetId":{"type":["integer","null"]},"attempts":{"type":"integer","minimum":1},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"statusUrl":{"type":"string"},"result":{"type":["object","null"],"properties":{"mode":{"enum":["vocals_accompaniment","four_stems"]},"commonGainDb":{"type":"number"},"listeningChecked":{"type":"boolean"},"stems":{"type":"array","items":{"type":"object","required":["name","assetId","contentUrl","duration","sha256"],"properties":{"name":{"enum":["vocals","accompaniment","drums","bass","other"]},"assetId":{"type":"integer","minimum":1},"contentUrl":{"type":"string"},"duration":{"type":"number"},"sha256":{"type":"string"},"mime":{"const":"audio/wav"},"sampleRate":{"const":44100},"channels":{"const":2},"bitsPerSample":{"const":24}}}},"sourceAssetId":{"type":"integer","minimum":1},"assetId":{"type":"integer","minimum":1},"contentUrl":{"type":"string"},"retention":{"enum":["30_days","permanent"]},"thumbnail":{"type":"object","description":"Optional private output thumbnail status. Absence on legacy jobs is unknown, not failure. Thumbnail preparation does not regenerate video.","required":["status"],"properties":{"status":{"enum":["ready","unavailable"]},"reason":{"type":"string"}}},"pictureStreamCopied":{"type":"boolean"},"pictureProcessing":{"type":"object","description":"Actual picture handling for a completed finish; older records may omit it. No visual-quality or frame-identity certificate.","required":["mode","reason","sourceCodec","outputCodec"],"properties":{"mode":{"enum":["stream_copy","encode","not_applicable"]},"reason":{"enum":["compatible_profile_and_codec","requested_profile_change","incompatible_source_codec","still_image_to_video","no_video_stream"]},"sourceCodec":{"type":["string","null"]},"outputCodec":{"type":["string","null"]}}},"duckingApplied":{"type":"boolean"},"duckingParameters":{"type":["object","null"],"description":"Explicitly applied sidechaincompress settings; null when not applied, absent on older jobs. Threshold/makeup use linear amplitude/gain and attack/release use milliseconds.","required":["threshold","ratio","attack","release","makeup"],"properties":{"threshold":{"type":"number"},"ratio":{"type":"number"},"attack":{"type":"number"},"release":{"type":"number"},"makeup":{"type":"number"}}},"audioBuses":{"type":"array","description":"Original source and isolated stem membership with supplied role, offsets, source trims, gain, fades and duck exemptions. No local paths.","items":{"type":"object","required":["role"],"properties":{"role":{"enum":["voice","music","ambience","sound","mix"]},"assetId":{"type":"integer","minimum":1},"source":{"const":"original"},"position":{"type":"number"},"sourceStart":{"type":"number"},"sourceEnd":{"type":"number"},"gainDb":{"type":"number"},"fadeIn":{"type":"number"},"fadeOut":{"type":"number"},"duck":{"type":"boolean"}}}},"audio":{"type":"object","properties":{"status":{"enum":["pass","warning","not_applicable"]},"present":{"type":"boolean"},"silent":{"type":"boolean"},"integratedLufs":{"type":["number","null"]},"truePeakDbtp":{"type":["number","null"]},"targetLufs":{"type":"number"},"maximumTruePeakDbtp":{"type":"number"},"intelligibility":{"const":"not_checked"}}},"operation":{"anyOf":[{"$ref":"#/components/schemas/EditorOperation"},{"type":"string","enum":["track","stabilize"]}]},"renderRequired":{"type":"boolean"},"reviewWait":{"type":"object","required":["ids","startedAt","deadline"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}},"startedAt":{"type":"string","format":"date-time"},"deadline":{"type":"string","format":"date-time"}}},"editedAssetId":{"type":["integer","null"]},"sourceSha256":{"type":"string"},"editedSha256":{"type":"string"},"maskSha256":{"type":"string"},"outputSha256":{"type":"string"},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"preservation":{"type":"object","properties":{"version":{"const":1},"pixelSpace":{"const":"auto-oriented sRGB RGBA8"},"selectedPixels":{"type":"integer","minimum":1},"changedPixels":{"type":"integer","minimum":1},"preservedPixels":{"type":"integer","minimum":1},"sourceOutsideSha256":{"type":"string"},"outputOutsideSha256":{"type":"string"},"outputDecodedSha256":{"type":"string"},"outsideMaskPreserved":{"type":"boolean"},"alignmentVerified":{"const":false},"visualQualityVerified":{"const":false},"mask":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"rectangle"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"featherPixels":{"default":0,"type":"integer","minimum":0,"maximum":128}},"required":["kind","x","y","width","height"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"asset"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["kind","assetId"],"additionalProperties":false}]},"note":{"type":"string"}}},"format":{"enum":["png","jpeg","webp"]},"sourceWidth":{"type":"integer","minimum":1},"sourceHeight":{"type":"integer","minimum":1},"fit":{"enum":["contain","cover"]},"upscaled":{"type":"boolean"},"cropped":{"type":"boolean"},"padded":{"type":"boolean"},"dimensionsVerified":{"type":"boolean"},"sourceArtworkUrl":{"type":"string"},"generatedDetail":{"const":false},"layeredImage":{"const":false},"visualQualityVerified":{"const":false},"typography":{"type":"object","required":["version","request","rectangleBounds","rows","fit","wrapped","copyChanged","visualQualityVerified"],"properties":{"version":{"const":1},"request":{"type":"object","properties":{"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Opaque fill for the selected rectangle; covers any previous lettering in this region."},"paddingPixels":{"default":16,"type":"integer","minimum":0,"maximum":4096},"gapPixels":{"default":8,"type":"integer","minimum":0,"maximum":4096},"verticalAlign":{"default":"center","type":"string","enum":["top","center","bottom"]},"rows":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001f\\u007f\\u2028\\u2029]+$"},"font":{"default":"sans","description":"Installed DejaVu family, not a custom uploaded brand font.","type":"string","enum":["sans","serif","mono"]},"weight":{"default":"regular","type":"string","enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":8,"maximum":512},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"align":{"default":"center","type":"string","enum":["left","center","right"]}},"required":["text","fontSizePixels","color"],"additionalProperties":false}}},"required":["background","rows"],"additionalProperties":false},"rectangleBounds":{"type":"object","properties":{"left":{"type":"integer","minimum":1},"top":{"type":"integer","minimum":1},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}}},"rows":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"font":{"enum":["sans","serif","mono"]},"fontFamily":{"type":"string"},"weight":{"enum":["regular","bold"]},"fontSizePixels":{"type":"integer","minimum":1},"color":{"type":"string"},"align":{"enum":["left","center","right"]},"left":{"type":"integer","minimum":1},"top":{"type":"integer","minimum":1},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"fontSha256":{"type":"string"}}}},"fit":{"const":"exact_requested_sizes"},"wrapped":{"const":false},"copyChanged":{"const":false},"visualQualityVerified":{"const":false},"note":{"type":"string"}}}}},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Envelope":{"type":"object","required":["data","meta"],"properties":{"data":{},"meta":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"apiVersion":{"const":"1"}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]}}}}},"Error":{"type":"object","required":["error","meta"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object"}}}},"meta":{"type":"object"}}},"ApiKeyInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"expiresInDays":{"default":30,"type":"integer","minimum":1,"maximum":90}},"required":["name"],"additionalProperties":false},"BrandInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"default":"","type":"string","maxLength":5000}},"required":["name"],"additionalProperties":false},"EditorCommandInput":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"command":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","const":"track.add"},"name":{"type":"string","minLength":1,"maxLength":160},"number":{"type":"integer","exclusiveMinimum":0,"maximum":1000000000}},"required":["action","name"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"track.update"},"id":{"type":"string","minLength":1,"maxLength":80},"name":{"type":"string","minLength":1,"maxLength":160},"locked":{"type":"boolean"}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"track.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.add"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"default":0,"type":"number","minimum":0,"maximum":1800},"start":{"default":0,"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","assetId","trackId","end"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.update"},"id":{"type":"string","minLength":1,"maxLength":80},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"start":{"type":"number","minimum":0,"maximum":3600},"end":{"type":"number","exclusiveMinimum":0,"maximum":3600},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.replace"},"id":{"type":"string","minLength":1,"maxLength":80},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["action","id","assetId"],"additionalProperties":false,"description":"Replace only the source of an existing media clip. Requires timeline capabilities.clipSourceReplacementVersion >= 1 and an imported project asset. Preserves clip ID, source trim, position, track, audio/video switches, transforms, keyframes and effects. Replacement duration must cover the unchanged trim/time map. Does not regenerate media, delete/recreate the clip, ripple other clips, or rewrite past exports. Captions use caption.update; source-specific tracking/stabilization analysis must be recomputed explicitly. Supports revision checks, idempotency, atomic batches, dry-run and Undo/Redo. Inspect the resulting rendered picture and sound."},{"type":"object","properties":{"action":{"type":"string","const":"clip.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.split"},"id":{"type":"string","minLength":1,"maxLength":80},"at":{"type":"number","minimum":0,"maximum":1800}},"required":["action","id","at"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"clip.duplicate"},"id":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"trackId":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.add"},"clipId":{"type":"string","minLength":1,"maxLength":80},"type":{"type":"string","minLength":1,"maxLength":80},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"transitionId":{"type":"string","maxLength":250}},"required":["action","clipId","type"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.update"},"clipId":{"type":"string","minLength":1,"maxLength":80},"id":{"type":"string","minLength":1,"maxLength":80},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"transitionId":{"type":"string","maxLength":250}},"required":["action","clipId","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"effect.delete"},"clipId":{"type":"string","minLength":1,"maxLength":80},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","clipId","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"transition.add"},"transitionId":{"type":"string","minLength":1,"maxLength":250},"maskAssetId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"reverse":{"default":false,"type":"boolean"}},"required":["action","trackId","position","duration"],"additionalProperties":false,"oneOf":[{"required":["transitionId"],"not":{"required":["maskAssetId"]}},{"required":["maskAssetId"],"not":{"required":["transitionId"]}}],"description":"Add a timeline transition from exactly one source: transitionId from the installed catalog, or maskAssetId for an owned PNG/JPEG attached and imported into this project. Owned masks require capabilities.ownedTransitionMasksVersion >= 1. Duration and reverse use the native brightness animation; this is not spatial mirroring. The mask affects the selected track during its interval: arrange visual overlap and preview every join. Reuse an approved raster mask by linking it to another project; no server paths, URLs, SVG uploads or Lottie documents are accepted. Supports revision checks, atomic batches, dry-run and Undo/Redo."},{"type":"object","properties":{"action":{"type":"string","const":"transition.update"},"id":{"type":"string","minLength":1,"maxLength":80},"trackId":{"type":"string","minLength":1,"maxLength":80},"position":{"type":"number","minimum":0,"maximum":1800},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800},"properties":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"boolean"},{"type":"string","maxLength":30000},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":36000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":1,"maximum":216001,"description":"One-based SOURCE frame at the project frame rate, not absolute timeline frame. Account for clip.start (source trim); clip.position does not offset this coordinate. At sourceStart=0 a 0.4-second fade at30fps uses frames1 and13 even when the clip sits at timeline25s. Visible source frames run from round(start*fps)+1 through ceil(end*fps). Curves entirely beyond that interval may never animate in the export. Inspect an actual rendered frame."},"value":{"type":"number"},"interpolation":{"default":"linear","type":"string","enum":["linear","bezier","constant"]},"left":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false},"right":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"additionalProperties":false}},"required":["frame","value"],"additionalProperties":false}}},"required":["keyframes"],"additionalProperties":false}]},"description":"Native clip values and keyframes. Every keyframe.frame is a one-based source coordinate at project fps; it is NOT an absolute timeline frame. For timeline time t within a clip, source time = clip.start + t - clip.position. Use round(sourceTime*fps)+1, and account for the exclusive clip.end at the final visible frame. An untrimmed still placed at25s still starts at source frame1. For spatial animation prefer the owned motion-plan API, which reports firstSourceFrame/lastSourceFrame. Clip has_video/has_audio accept -1 (automatic), 0/false (disabled), or 1/true (enabled); booleans are normalized before native execution. Numeric keyframes are preserved. location_x/location_y are signed native movement coordinates, not universal canvas percentages. Their pixel displacement depends on fitted source size, scale and gravity. With center gravity, displacement = location * (canvas dimension + scaled fitted source dimension) / 2. Values near -1/+1 move the source off the corresponding canvas edge; -20 is far off screen. Prefer layout.reflow for role-based placement and inspect a rendered frame. scale selects the base fit: 0 Crop/cover, 1 Best Fit/contain, 2 Stretch, 3 None/native size. scale_x/scale_y multiply that fitted base, not necessarily native source dimensions; values above 1 enlarge the image. Keep both equal to preserve aspect. Measure source subject bounds at the start, middle and end before computing a crop; rendered-preview bounds already include the current transform and cannot be substituted for source bounds. volume is linear gain, not dB; alpha is 0вЂ“1. Caption format offsets are pixels instead. Read editor/catalog for supported properties and native ranges."}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"transition.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.add"},"text":{"type":"string","minLength":1,"maxLength":2000,"description":"Exact visible text. Actual newline characters create line breaks; literal backslash-n is visible text. Prefer lines for explicit wrapping."},"lines":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","maxLength":2000},"description":"Authored lines, one array entry per explicit line break. The server joins them with real newline characters; the native renderer can wrap an overlong entry again. Inspect rendered line breaks at the current profile and font size. Use instead of text; no escaping or embedded newline syntax is needed. Empty entries create intentional blank lines."},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","position","duration"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.update"},"id":{"type":"string","minLength":1,"maxLength":80},"text":{"type":"string","minLength":1,"maxLength":2000,"description":"Exact visible text. Actual newline characters create line breaks; literal backslash-n is visible text. Prefer lines for explicit wrapping."},"lines":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","maxLength":2000},"description":"Authored lines, one array entry per explicit line break. The server joins them with real newline characters; the native renderer can wrap an overlong entry again. Inspect rendered line breaks at the current profile and font size. Use instead of text; no escaping or embedded newline syntax is needed. Empty entries create intentional blank lines."},"position":{"type":"number","minimum":0,"maximum":1800},"duration":{"type":"number","exclusiveMinimum":0,"maximum":1800},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","id"],"additionalProperties":false,"description":"Partial update: send only the fields being intentionally changed. Omitted format fields preserve their stored values. To reclassify a graphic without changing its appearance, send only action:caption.update, id and format:{role:title}; do not add offset_x/offset_y=0, size=1, style, animation, placement or appearance defaults. Zero offsets explicitly move the caption and are not a request to preserve it. Read exact full clip properties when changing transforms; preserve native curves. For existing rendered work, compare the resulting timeline through editor/changes before claiming unrelated layout, timing or media were preserved."},{"type":"object","properties":{"action":{"type":"string","const":"caption.delete"},"id":{"type":"string","minLength":1,"maxLength":80}},"required":["action","id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.import"},"text":{"type":"string","minLength":1,"maxLength":150000},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","text"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.styleAll"},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","format"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"caption.preset"},"name":{"type":"string","minLength":1,"maxLength":60},"format":{"type":"object","properties":{"role":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]},"style":{"type":"string","maxLength":80},"animation":{"type":"string","enum":["none","fade","pop","bounce","rise","slide"]},"placement":{"type":"string","enum":["top","center","bottom"],"description":"Base vertical anchor: top 20%, center 50%, bottom 79% of the full project height, before pixel offsets."},"size":{"type":"number","minimum":0.1,"maximum":5,"description":"Uniform clip scale multiplier; 1 is unchanged. Prefer appearance.font_size for precise text size in project pixels."},"scale_y":{"type":"number","minimum":0.1,"maximum":5},"offset_x":{"type":"number","minimum":-10000,"maximum":10000,"description":"Horizontal displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is right. The editor accounts for clip scale and gravity. Existing pixel displacement is retained when changing caption size."},"offset_y":{"type":"number","minimum":-10000,"maximum":10000,"description":"Vertical displacement in full-project PIXELS at the settled animation pose, not native coordinates; positive is down. On a 1920px-high project, -192 moves up 192px even when the caption is scaled. Entrance animations can temporarily move outside the settled pose; check layout.audit and rendered frames."},"rotation":{"type":"number","minimum":-360,"maximum":360},"clip_opacity":{"type":"number","minimum":0,"maximum":1},"appearance":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"boolean","description":"Adds or removes a backing without resetting the selected preset stroke, shadow or glow. For a plain custom card, explicitly set stroke:false, shadow:false and glow:false, or choose a boxed preset. Preserve deliberately requested decorative effects."},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background_mode":{"type":"string","enum":["lines","block"],"description":"Renderer 3 or newer: lines keeps separate per-line backings (default when omitted); block draws one panel behind the complete caption. Requires background:true. Preserves text wrapping, spacing and timing."},"opacity":{"type":"number","minimum":0,"maximum":1,"description":"Background opacity only. Use clip_opacity on format to fade the whole caption."},"padding":{"type":"number","minimum":0,"maximum":60},"corners":{"type":"number","minimum":0,"maximum":60},"font":{"type":"string","minLength":1,"maxLength":160},"weight":{"anyOf":[{"type":"number","const":400},{"type":"number","const":500},{"type":"number","const":600},{"type":"number","const":700},{"type":"number","const":900}]},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"case":{"type":"string","enum":["original","upper","lower","title"]},"align":{"type":"string","enum":["left","center","right"]},"tracking":{"type":"number","minimum":-3,"maximum":20},"line_spacing":{"type":"number","minimum":0.8,"maximum":3},"font_size":{"anyOf":[{"type":"number","minimum":8,"maximum":400},{"type":"null"}]},"stroke":{"type":"boolean"},"stroke_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_width":{"type":"number","minimum":0,"maximum":30},"glow":{"type":"boolean"},"glow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"glow_amount":{"type":"number","minimum":0,"maximum":40},"shadow":{"type":"boolean"},"shadow_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"shadow_opacity":{"type":"number","minimum":0,"maximum":1},"shadow_blur":{"type":"number","minimum":0,"maximum":40},"shadow_distance":{"type":"number","minimum":0,"maximum":100},"shadow_angle":{"type":"number","minimum":-180,"maximum":180},"curve":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false,"description":"Use the caption catalog appearance keys. font_size and tracking are project pixels; font_size supports 8вЂ“400. Use size=1 to avoid further scaling. Colors use #RRGGBB, background/stroke/shadow use booleans."}},"additionalProperties":false}},"required":["action","name","format"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"profile.set"},"width":{"type":"integer","minimum":32,"maximum":3840},"height":{"type":"integer","minimum":32,"maximum":3840},"fps":{"type":"object","properties":{"num":{"type":"integer","minimum":1,"maximum":60000},"den":{"type":"integer","minimum":1,"maximum":1001}},"required":["num","den"],"additionalProperties":false}},"required":["action","width","height","fps"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"layout.reflow"},"format":{"type":"string","enum":["9:16","1:1","16:9"]},"preset":{"description":"Opt-in footage-and-copy composition for square or landscape. Requires capabilities.semanticAdPanelVersion >= 1; omitted keeps the classic layout.","type":"string","const":"ad-panel"},"blocks":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"clipId":{"type":"string","minLength":1,"maxLength":80},"sequenceId":{"description":"For ad-panel product clips only: declares one shot sequence sharing a hero slot through overlaps such as dissolves. Does not verify continuity or alpha.","type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"role":{"type":"string","enum":["headline","subtitle","logo","cta","product","background"]},"fit":{"type":"string","enum":["contain","cover"],"description":"Use contain for every foreground block; cover is only available for full-canvas backgrounds. Explicit fitting preserves the complete foreground subject."}},"required":["clipId","role","fit"],"additionalProperties":false}}},"required":["action","format","blocks"],"additionalProperties":false,"description":"Version 1 semantic layout: requires capabilities.semanticLayoutVersion >= 1 and roles for every visual clip; audio is unchanged. Portrait 1080x1920, square 1080x1080 and landscape 1920x1080 use different safe, disjoint foreground blocks. Rebuilds text wrapping and font size; preserves approved text, clip timing, media and audio. Captions use contained fades and spatial transforms are rebuilt. Rejects unreadable text, locked tracks, unassigned media and unsupported spatial effects. Returns all-frame caption clearance evidence and optional mediaFraming v1 with per-clip normalized bounding rectangles, canvas intersection, area fraction and retained source-rectangle fraction. Measurements are geometry, not subject recognition or a quality certificate. Batch dry runs expose proposed layouts in previews[].data after rollback; preview IDs may be temporary. Render and review each format before delivery. Undo restores the prior layout."},{"type":"object","properties":{"action":{"type":"string","const":"layout.suggest"},"clipId":{"type":"string","minLength":1,"maxLength":80},"clearancePixels":{"type":"number","minimum":0,"maximum":100},"safeArea":{"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"additionalProperties":false},"protectedRegions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}}},"required":["action","clipId"],"additionalProperties":false,"description":"Read-only native placement proposal for one existing editable caption; requires capabilities.captionPlacementPlanVersion >= 1. Measures every visible frame including animated bounds and overlapping captions, then finds the closest rigid pixel translation clearing safeArea and supplied protectedRegions. Default clearance is 2 project pixels. Returns feasible, revision, unapplied commands, before/after audits and requiresRenderedReview:true. Preserves words, typography, timing, scale, rotation, opacity and other clips. Infeasible returns no commands: explicitly revise layout or typography. Rejects clipped/unsupported geometry and locked tracks. Geometry and supplied regions are not subject recognition or visual certification. Poll the existing operation statusUrl. Apply returned commands only against the current revision after approval. A dry-run batch retains the proposal under previews[].data; temporary IDs/revisions require re-planning after preceding edits are committed. Existing command/batch authorization and idempotency still apply."},{"type":"object","properties":{"action":{"type":"string","const":"layout.audit"},"safeArea":{"type":"object","properties":{"left":{"type":"number","minimum":0,"maximum":0.4},"right":{"type":"number","minimum":0,"maximum":0.4},"top":{"type":"number","minimum":0,"maximum":0.4},"bottom":{"type":"number","minimum":0,"maximum":0.4}},"required":["left","right","top","bottom"],"additionalProperties":false},"protectedRegions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","exclusiveMinimum":0,"maximum":1},"height":{"type":"number","exclusiveMinimum":0,"maximum":1},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","minimum":0,"maximum":1800}},"required":["name","x","y","width","height","start","end"],"additionalProperties":false}}},"required":["action"],"additionalProperties":false,"description":"Checks every visible editable-caption frame. geometryVersion=2 matches native scale, gravity, rotation and origin transforms. Direct commands return audit findings without rendering. With capabilities.layoutAuditPreviewVersion >= 1, batch dry runs retain each audit under previews[].data with its commandIndex, previewOnly:true and committed:false, after exact rollback. Inspect failures and unchecked coverage; later commands can change the audited state. Unmodeled caption effects/margins/display layouts remain not_checked. This is geometry evidence, not raster or semantic quality certification."},{"type":"object","properties":{"action":{"type":"string","const":"undo"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"redo"}},"required":["action"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"render"}},"required":["action"],"additionalProperties":false}]}},"required":["revision","command"],"additionalProperties":false},"EditorRenderInput":{"type":"object","properties":{"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["revision"],"additionalProperties":false},"ProjectInput":{"type":"object","properties":{"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"name":{"type":"string","minLength":1,"maxLength":120},"aspectRatio":{"default":"16:9","type":"string","enum":["16:9","9:16","1:1"]},"scenes":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string","maxLength":120}},"required":["title"],"additionalProperties":false}}},"required":["name"],"additionalProperties":false},"SceneInput":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"default":"New scene","type":"string","maxLength":120}},"required":["id"],"additionalProperties":false},"GenerationInput":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"sceneId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"modelKey":{"type":"string","minLength":1,"maxLength":120},"prompt":{"type":"string","minLength":1,"maxLength":30000},"references":{"default":[],"description":"Owned image asset IDs, not generation job IDs. For a generated image, wait for its generation to complete and read outputs (the array of asset IDs); use that exact asset ID. Never infer asset IDs from a generation ID or sequence. Null is only an empty optional reference slot.","maxItems":30,"type":"array","items":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},{"type":"null"}]}},"mediaReferences":{"type":"object","properties":{"videos":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"audio":{"default":[],"maxItems":5,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"additionalProperties":false,"description":"Owned media asset IDs. Kling Motion requires one video; Wan reference mode accepts up to five videos and five audio files. Duration and billing are measured by the server. Use references for image asset IDs."},"speakerId":{"anyOf":[{"type":"string","const":"narrator"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}],"description":"Separate voice generation only: narrator or the stable character UUID from the approved plan. Omit for native-video dialogue, images, music and sound effects; native video speech is directed in prompt using the catalog audio setting."},"dialogueLineIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Separate character voice generation only. Ordered approved dialogue line UUIDs from this scene, all from the same character speakerId. Omit for native-video dialogue, images, music and sound effects. For native video, put the exact approved speech and character direction in prompt and use the model catalog audio setting."},"settings":{"default":{},"type":"object","propertyNames":{"type":"string","maxLength":40},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}},"identityBindings":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"identityId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"alias":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,39}$"}},"required":["identityId","version","alias"],"additionalProperties":false}},"storyboard":{"type":"object","properties":{"version":{"type":"number","const":1},"shots":{"minItems":2,"maxItems":15,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,80}$"},"prompt":{"type":"string","minLength":1,"maxLength":500,"description":"Complete instructions for this shot. The overview prompt is not appended or silently truncated."},"durationSeconds":{"type":"integer","minimum":1,"maximum":12}},"required":["id","prompt","durationSeconds"],"additionalProperties":false}}},"required":["version","shots"],"additionalProperties":false},"parentGenerationId":{"description":"Previous generation job ID of the SAME media kind, project and scene. For image-to-video, put the completed image asset ID in references and omit this field; an image job is not a parent video generation.","type":"integer","exclusiveMinimum":0,"maximum":2147483647},"policyRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"policyOverrides":{"type":"object","properties":{"version":{"type":"number","const":1},"preserveOriginals":{"type":"boolean","const":true},"captions":{"type":"string","enum":["editable","none"]},"narration":{"type":"string","enum":["separate","source","none"]},"sourceAudio":{"type":"string","enum":["muted","ambience","dialogue"]},"generatedText":{"type":"string","enum":["none","incidental"]},"allowedIncidentalText":{"maxItems":3,"type":"array","items":{"type":"string","enum":["signage","packaging","logo"]}},"textRoles":{"maxItems":5,"type":"array","items":{"type":"string","enum":["subtitle","title","brand","contact","disclosure"]}}},"additionalProperties":false}},"required":["projectId","sceneId","modelKey","prompt"],"additionalProperties":false},"ExportInput":{"type":"object","properties":{"projectId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"clips":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assetId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"start":{"type":"number","minimum":0,"maximum":1800},"end":{"type":"number","exclusiveMinimum":0,"maximum":1800},"transition":{"default":"cut","type":"string","enum":["cut","dissolve","fade-black","wipe-left","wipe-right","wipe-up","wipe-down","slide-left","slide-right","zoom-in"]},"transitionDuration":{"default":0.6,"type":"number","minimum":0.1,"maximum":2},"motion":{"default":"none","type":"string","enum":["none","zoom-in","zoom-out","pan-left","pan-right","rise","rotate-in","pulse"]},"fit":{"default":"contain","type":"string","enum":["contain","cover"]},"look":{"default":"none","type":"string","enum":["none","warm","cool","mono"]},"title":{"default":"","type":"string","maxLength":160},"titlePosition":{"default":"bottom","type":"string","enum":["top","center","bottom"]},"volume":{"default":1,"type":"number","minimum":0,"maximum":1}},"required":["assetId","start","end"]}}},"required":["projectId","clips"],"additionalProperties":false},"LinkInput":{"type":"object","properties":{"assetIds":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}}},"required":["assetIds"],"additionalProperties":false},"Inline0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":100000},"name":{"type":"string","minLength":1,"maxLength":120},"brandId":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647},"slots":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-z][a-zA-Z0-9_]{0,39}$"},"additionalProperties":{"type":"object","properties":{"type":{"type":"string","enum":["text","number","asset","color"]},"default":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]},"choices":{"minItems":1,"maxItems":50,"type":"array","items":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["type","default"],"additionalProperties":false}},"commands":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}}}},"required":["id","version","name","slots","commands"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/Inline0/$defs/__schema0"}}]}}}}}}