{"openapi":"3.1.0","info":{"title":"ReelParcel Customer API","version":"1.0.0","description":"Owner-scoped operations for app facts, private media, creative batches, quotes, and renders. Use a ReelParcel integration token. A no-card hosted trial, when available, requires the customer to approve the exact current revision in their signed-in account; agent-token approval alone does not qualify. Billing and account deletion stay in the website."},"servers":[{"url":"https://reelparcel.com"}],"security":[{"BearerAuth":[]}],"tags":[{"name":"Account"},{"name":"Projects"},{"name":"Assets"},{"name":"Batches"},{"name":"Creatives"},{"name":"Renders"}],"paths":{"/api/v1/account":{"get":{"tags":["Account"],"operationId":"getAccount","summary":"Read account credits, trial eligibility and usage","responses":{"200":{"description":"Account summary","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"account":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":["string","null"]},"creditsAvailable":{"type":"integer","minimum":0},"trial":{"type":"object","required":["eligible","available","used","reason"],"properties":{"eligible":{"type":"boolean"},"available":{"type":"boolean"},"used":{"type":"boolean"},"reason":{"type":"string"}}}},"required":["id","email","creditsAvailable","trial"]}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"account:read"}},"/api/v1/templates":{"get":{"tags":["Creatives"],"operationId":"listTemplates","summary":"List supported templates and media limits","responses":{"200":{"description":"Template and limit definitions","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"templates":{"type":"array","items":{"type":"string"}},"outputs":{"type":"array","items":{"type":"string"}},"limits":{"type":"object"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}}}},"/api/v1/projects":{"get":{"tags":["Projects"],"operationId":"listProjects","summary":"List saved app workspaces","responses":{"200":{"description":"Owned projects","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","required":["id","appName","benefit","approvedFacts","audience","tone","defaults","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"appName":{"type":"string"},"benefit":{"type":"string"},"approvedFacts":{"type":"object","additionalProperties":{"type":"string"}},"audience":{"type":"string"},"tone":{"type":"string"},"defaults":{"type":"object","properties":{"accentColor":{"type":"string"},"defaultCta":{"type":"string"},"destinationUrl":{"type":"string","format":"uri"}},"required":["accentColor","defaultCta"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"projects:read"},"post":{"tags":["Projects"],"operationId":"createProject","summary":"Save an app and approved facts","requestBody":{"required":true,"description":"App facts supplied or confirmed by the customer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"responses":{"201":{"description":"Project created","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"project":{"type":"object","required":["id","appName","benefit","approvedFacts","audience","tone","defaults","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"appName":{"type":"string"},"benefit":{"type":"string"},"approvedFacts":{"type":"object","additionalProperties":{"type":"string"}},"audience":{"type":"string"},"tone":{"type":"string"},"defaults":{"type":"object","properties":{"accentColor":{"type":"string"},"defaultCta":{"type":"string"},"destinationUrl":{"type":"string","format":"uri"}},"required":["accentColor","defaultCta"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"projects:write"}},"/api/v1/projects/{projectId}":{"get":{"tags":["Projects"],"operationId":"getProject","summary":"Read one saved app","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned project","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"project":{"type":"object","required":["id","appName","benefit","approvedFacts","audience","tone","defaults","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"appName":{"type":"string"},"benefit":{"type":"string"},"approvedFacts":{"type":"object","additionalProperties":{"type":"string"}},"audience":{"type":"string"},"tone":{"type":"string"},"defaults":{"type":"object","properties":{"accentColor":{"type":"string"},"defaultCta":{"type":"string"},"destinationUrl":{"type":"string","format":"uri"}},"required":["accentColor","defaultCta"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"projects:read"},"patch":{"tags":["Projects"],"operationId":"updateProject","summary":"Update saved app facts","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Only the fields being changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"}}}},"responses":{"200":{"description":"Updated project","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"project":{"type":"object","required":["id","appName","benefit","approvedFacts","audience","tone","defaults","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"appName":{"type":"string"},"benefit":{"type":"string"},"approvedFacts":{"type":"object","additionalProperties":{"type":"string"}},"audience":{"type":"string"},"tone":{"type":"string"},"defaults":{"type":"object","properties":{"accentColor":{"type":"string"},"defaultCta":{"type":"string"},"destinationUrl":{"type":"string","format":"uri"}},"required":["accentColor","defaultCta"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"projects:write"},"delete":{"tags":["Projects"],"operationId":"deleteProject","summary":"Delete a saved app and its private assets","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Project deleted","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","required":["deleted"],"properties":{"deleted":{"const":true}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"An active signed upload still blocks deletion.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"projects:write"}},"/api/v1/projects/{projectId}/upload-handoff":{"get":{"tags":["Assets"],"operationId":"getUploadHandoff","summary":"Give the owner an account-bound private browser upload link","description":"For a saved project owned by this account, returns a signed one-hour Workspace URL. The signed values are in the URL fragment, not the initial HTTP request. The owner signs in and uploads; the agent then lists completed project assets. This link does not carry a bearer token or grant agent browser access. Hosted uploads must be enabled.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owner upload handoff","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"handoff":{"type":"object"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:write"},"post":{"tags":["Assets"],"operationId":"verifyUploadHandoff","summary":"Verify a signed browser upload handoff for its account owner","description":"Workspace sends the signed fragment in the JSON body after the owner signs in. Verification confirms owner, saved app and one-hour expiry; it does not complete an upload or create an asset.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"The handoff and signature values from the owner's link fragment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyUploadHandoff"}}}},"responses":{"200":{"description":"Verified handoff","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"handoff":{"type":"object"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:write"}},"/api/v1/assets":{"get":{"tags":["Assets"],"operationId":"listAssets","summary":"List reusable private assets","parameters":[{"name":"projectId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned assets","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"assets":{"type":"array","items":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:read"}},"/api/v1/assets/uploads":{"post":{"tags":["Assets"],"operationId":"createAssetUpload","summary":"Prepare a private signed upload","description":"Optional Idempotency-Key retains one asset for identical owner/project/credential-bound requests for at least 24 hours (extended during active associated work). Changed normalized metadata conflicts. Retry after an uncertain response with the same key: pending assets receive a fresh usable grant for the same private object; completed assets return uploaded status without another token. Signing uncertainty retains a bounded hold until retention cleanup.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"description":"The source media metadata and owning project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssetUpload"}}}},"responses":{"200":{"description":"Previously completed asset","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"asset":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}},"201":{"description":"Signed upload details","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"asset":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"Changed idempotency request or storage quota exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"410":{"description":"The original pending source has expired; use a fresh key.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"413":{"description":"The source media exceeds its size limit.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"415":{"description":"The source media type is unsupported.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:write"}},"/api/v1/assets/{assetId}/preview":{"get":{"tags":["Assets"],"operationId":"previewAsset","summary":"Read one bounded uploaded image preview","description":"Owner-bound private image preview for an uploaded image asset. The service signs a 60-second Supabase contain transform capped at 720×1280, downloads at most 2 MiB, and returns image bytes without exposing its signed URL. The requested transform must succeed; source-file fallback is disabled. Recordings, pending uploads, deleted assets, and other users' assets return 404. No image is stored or analyzed by this operation. assets:read also grants temporary signed source preview links in listAssets.","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Bounded image bytes","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"502":{"description":"The transform failed, returned unsupported content, or exceeded the byte cap.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:read"}},"/api/v1/assets/{assetId}/complete":{"post":{"tags":["Assets"],"operationId":"completeAssetUpload","summary":"Verify a private upload","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}},"responses":{"200":{"description":"Verified asset","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"asset":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:write"}},"/api/v1/projects/{projectId}/assets":{"get":{"tags":["Assets"],"operationId":"listProjectAssets","summary":"List private assets for one project","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned project assets","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"assets":{"type":"array","items":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"assets:read"}},"/api/v1/projects/{projectId}/batches":{"get":{"tags":["Batches"],"operationId":"listBatches","summary":"List saved batches","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned batches","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batches":{"type":"array","items":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:read"},"post":{"tags":["Batches"],"operationId":"createBatch","summary":"Create a named batch","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Creating a batch spends no render credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBatch"}}}},"responses":{"201":{"description":"Batch created","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"reviewUrl":{"type":"string","format":"uri"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:write"}},"/api/v1/projects/{projectId}/batches/next":{"post":{"tags":["Batches"],"operationId":"makeNextBatch","summary":"Create three editable drafts atomically","description":"Creates editable template and media starters, not three materially distinct factual angles. An operator or agent must revise and verify product-specific copy before approval or export. Uses only the owner's uploaded assets and saved app facts. desiredOutcome names the private batch and is not inserted into public draft copy. With two or more screenshots, image-only batches use the full selected order plus two shorter ordered cuts. When one recording is selected too, walkthrough uses it and the two image variants use ordered cuts. Multiple selected recordings return 400 instead of silently dropping media; create a manual batch to use other recordings separately. The response includes an advisory exact-field diversity diagnostic, not a semantic media-fit or post-readiness verdict. Drafts are not approved and no credits are spent. Retries with the same key and normalized input return the original batch; changing input with that key returns 409.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"description":"Desired outcome and ordered owned asset IDs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MakeNextBatch"}}}},"responses":{"200":{"description":"Original batch returned for an identical retry","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"reviewUrl":{"type":"string","format":"uri"}}}}}}}},"201":{"description":"New batch and review link","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"reviewUrl":{"type":"string","format":"uri"}}}}}}}},"400":{"description":"More than one recording was selected for automatic batch creation.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The idempotency key was reused with a changed request.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:write"}},"/api/v1/batches/{batchId}":{"get":{"tags":["Batches"],"operationId":"getBatch","summary":"Read revisions and approval state","parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned batch","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"reviewUrl":{"type":"string","format":"uri"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:read"}},"/api/v1/batches/{batchId}/duplicate":{"post":{"tags":["Batches"],"operationId":"duplicateBatch","summary":"Duplicate a batch's current drafts","description":"Copies the current draft specs into a new batch in the same project. Approvals are not copied and no credits are spent.","parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Optional name for the duplicated batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateBatch"}}}},"responses":{"201":{"description":"Batch duplicated","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"reviewUrl":{"type":"string","format":"uri"}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:write"}},"/api/v1/batches/{batchId}/items":{"post":{"tags":["Creatives"],"operationId":"addCreative","summary":"Add a creative slot","parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Add up to ten creative slots to a batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCreativeItem"}}}},"responses":{"201":{"description":"Creative slot created","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"item":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:write"}},"/api/v1/creatives/{creativeId}/revisions":{"post":{"tags":["Creatives"],"operationId":"reviseCreative","summary":"Save an immutable creative draft","description":"Optional Idempotency-Key retains identical normalized requests for at least 24 hours, extended during associated active work. Ordered source IDs remain material. Auth and credential binding are checked before replay. Identical retries return the original historical revision without moving the current pointer; changed input returns 409. Omission preserves ordinary new-revision behavior.","parameters":[{"name":"creativeId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"description":"A new draft invalidates any prior approval.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRevision"}}}},"responses":{"200":{"description":"Historical revision replay","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"revision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}}}}}}}}},"201":{"description":"Revision created","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"revision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The idempotency key was reused with changed input.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:write"}},"/api/v1/revisions/{revisionId}/approve":{"post":{"tags":["Creatives"],"operationId":"approveCreative","summary":"Approve an exact revision","parameters":[{"name":"revisionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Approval requires the revision fingerprint and customer authorization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRevision"}}}},"responses":{"200":{"description":"Revision approved","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"revision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"creatives:approve"}},"/api/v1/renders":{"get":{"tags":["Renders"],"operationId":"listRenders","summary":"List recent render history","responses":{"200":{"description":"Owned renders","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"renders":{"type":"array","items":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:read"},"post":{"tags":["Renders"],"operationId":"renderApprovedCreatives","summary":"Render an approved, quoted batch","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"description":"A quote ID is required. The quoted trial or prepaid funding source is used; no credits are purchased automatically.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBatchRender"}}}},"responses":{"200":{"description":"Existing render returned for an idempotent retry","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}},"202":{"description":"Render accepted","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"402":{"description":"The trial is unavailable or the account lacks unspent paid credits.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:write"}},"/api/v1/renders/quote":{"post":{"tags":["Renders"],"operationId":"quoteExports","summary":"Quote a hosted trial or paid credits for approved revisions","parameters":[{"name":"funding","in":"query","required":false,"description":"auto prefers the one-output trial when eligible, then paid credits. Trial requires account-side approval of one exact current revision.","schema":{"type":"string","enum":["auto","trial","paid"],"default":"auto"}}],"requestBody":{"required":true,"description":"Quoting spends no credits. A trial quote identifies fundingKind=trial and costCents=0.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRenderQuote"}}}},"responses":{"201":{"description":"Quote created","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"quote":{"type":"object","required":["id","batchId","revisionIds","creditsRequired","creditsAvailable","expiresAt","fundingKind"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"revisionIds":{"type":"array","items":{"type":"string","format":"uuid"}},"creditsRequired":{"type":"integer"},"creditsAvailable":{"type":"integer"},"expiresAt":{"type":"string","format":"date-time"},"fundingKind":{"type":"string","enum":["trial","paid"]},"costCents":{"type":"integer","minimum":0,"description":"Present as zero for a hosted trial quote."}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"402":{"description":"The requested funding is unavailable or exhausted.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:write"}},"/api/v1/renders/{renderId}":{"get":{"tags":["Renders"],"operationId":"getRender","summary":"Read render status","parameters":[{"name":"renderId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned render","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:read"}},"/api/v1/renders/{renderId}/download":{"get":{"tags":["Renders"],"operationId":"getRenderDownloads","summary":"Read a completed render with temporary private download links","parameters":[{"name":"renderId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Owned render and temporary private links","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:read"}},"/api/v1/renders/{renderId}/pack":{"get":{"tags":["Renders"],"operationId":"getRenderPack","summary":"Read pack metadata and temporary private output URLs","description":"Each artifact separates requested spec from optional observed encoded-file metadata, bytes and SHA-256. Legacy observed is null. Download URLs expire; keep them private.","parameters":[{"name":"renderId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Render pack metadata and temporary private links","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","required":["pack"],"properties":{"pack":{"type":"object","properties":{"artifacts":{"type":"array","items":{"type":"object","properties":{"spec":{"type":"object"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."},"jobId":{"type":"string","format":"uuid"},"downloadUrl":{"type":"string","format":"uri"}}}}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:read"}},"/api/v1/renders/{renderId}/cancel":{"post":{"tags":["Renders"],"operationId":"cancelRender","summary":"Cancel a queued render","parameters":[{"name":"renderId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}},"responses":{"200":{"description":"Render cancellation result","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"401":{"description":"The bearer token is missing, expired, or revoked.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"403":{"description":"The token lacks the required scope or the resource is not owned by the account.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"404":{"description":"The requested owner-scoped resource was not found.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"409":{"description":"The request conflicts with the current resource state.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"429":{"description":"The token or account rate limit was exceeded.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}},"503":{"description":"The requested hosted capability is not configured.","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"x-required-scope":"renders:write"}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ReelParcel integration token"}},"schemas":{"CreateProject":{"type":"object","properties":{"appName":{"type":"string","minLength":1,"maxLength":100},"benefit":{"default":"","type":"string","maxLength":500},"approvedFacts":{"default":{},"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":80},"additionalProperties":{"type":"string","maxLength":500}},"audience":{"default":"","type":"string","maxLength":500},"tone":{"default":"","type":"string","maxLength":500},"defaults":{"type":"object","properties":{"accentColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"defaultCta":{"type":"string","minLength":1,"maxLength":80},"destinationUrl":{"type":"string","maxLength":2048,"format":"uri"}},"required":["accentColor","defaultCta"],"additionalProperties":false}},"required":["appName","benefit","approvedFacts","audience","tone","defaults"],"additionalProperties":false},"UpdateProject":{"type":"object","properties":{"appName":{"type":"string","minLength":1,"maxLength":100},"benefit":{"default":"","type":"string","maxLength":500},"approvedFacts":{"default":{},"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":80},"additionalProperties":{"type":"string","maxLength":500}},"audience":{"default":"","type":"string","maxLength":500},"tone":{"default":"","type":"string","maxLength":500},"defaults":{"type":"object","properties":{"accentColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"defaultCta":{"type":"string","minLength":1,"maxLength":80},"destinationUrl":{"type":"string","maxLength":2048,"format":"uri"}},"required":["accentColor","defaultCta"],"additionalProperties":false}},"additionalProperties":false},"CreateAssetUpload":{"type":"object","properties":{"projectId":{"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)$"},"label":{"type":"string","minLength":1,"maxLength":80},"filename":{"type":"string","minLength":1,"maxLength":150},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string","minLength":1,"maxLength":100},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"width":{"type":"integer","minimum":16,"maximum":4096},"height":{"type":"integer","minimum":16,"maximum":4096},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":60}},"required":["projectId","label","filename","kind","contentType","bytes","width","height"],"additionalProperties":false},"VerifyUploadHandoff":{"type":"object","additionalProperties":false,"required":["handoff","signature"],"properties":{"handoff":{"type":"string","minLength":1,"maxLength":1024},"signature":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"CreateBatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"required":["name"],"additionalProperties":false},"MakeNextBatch":{"type":"object","properties":{"desiredOutcome":{"type":"string","maxLength":120},"assetIds":{"minItems":1,"maxItems":8,"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":["desiredOutcome","assetIds"],"additionalProperties":false},"CreateCreativeItem":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":80}},"required":["title"],"additionalProperties":false},"CreateRevision":{"type":"object","properties":{"spec":{"type":"object","properties":{"schemaVersion":{"type":"number","const":1},"brief":{"type":"object","properties":{"appName":{"type":"string","minLength":1,"maxLength":60},"benefit":{"type":"string","minLength":1,"maxLength":160},"hook":{"type":"string","minLength":1,"maxLength":120},"body":{"type":"string","minLength":1,"maxLength":320},"cta":{"type":"string","minLength":1,"maxLength":80},"template":{"type":"string","enum":["walkthrough","problem-solution","tips"]},"accentColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"disclosure":{"type":"string","maxLength":48}},"required":["appName","benefit","hook","body","cta","template","accentColor"],"additionalProperties":false},"assetIds":{"minItems":1,"maxItems":8,"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)$"}},"output":{"oneOf":[{"type":"object","properties":{"format":{"type":"string","const":"mp4"},"durationSeconds":{"type":"integer","minimum":1,"maximum":30},"audioMode":{"type":"string","enum":["silent","preserve-source"]},"videoLayout":{"type":"string","enum":["standard","tiktok-conservative","evidence-pair"]},"evidenceAction":{"type":"string","minLength":1,"maxLength":48},"evidenceFocus":{"type":"object","properties":{"input":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false},"result":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["input","result"],"additionalProperties":false},"videoFocus":{"type":"object","properties":{"timeSeconds":{"type":"number"},"region":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["timeSeconds","region"],"additionalProperties":false},"sourceLedBeats":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"startSeconds":{"type":"number"},"endSeconds":{"type":"number"},"label":{"type":"string"},"contextSeconds":{"description":"Seconds of complete moving source before this beat's detail crop; defaults to 0.7 when omitted.","type":"number","minimum":0.35,"maximum":1,"multipleOf":0.001},"region":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["startSeconds","endSeconds","label","region"],"additionalProperties":false}},"sourceLedEditorial":{"type":"boolean"},"recordingEdit":{"type":"object","properties":{"version":{"type":"number","const":2},"sourceRange":{"type":"object","properties":{"inUs":{"type":"integer","minimum":0,"maximum":9007199254740991},"outUs":{"type":"integer","exclusiveMinimum":0,"maximum":60000000}},"required":["inUs","outUs"],"additionalProperties":false},"focus":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","const":"full-app"},"detailRegion":{"description":"Optional operator-selected real source pixels, repeated in an inspection strip below the complete moving app. Review the exact phone-size video.","type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"source-led"},"beats":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"startSeconds":{"type":"number"},"endSeconds":{"type":"number"},"label":{"type":"string"},"contextSeconds":{"type":"number","minimum":0.35,"maximum":1,"multipleOf":0.001},"region":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["startSeconds","endSeconds","label","region"],"additionalProperties":false}}},"required":["mode","beats"],"additionalProperties":false}]}},"required":["version","focus"],"additionalProperties":false}},"required":["format","durationSeconds"],"additionalProperties":false},{"type":"object","properties":{"format":{"type":"string","const":"carousel-zip"},"productBodies":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":320}},"carouselMode":{"type":"string","enum":["compact-single-v1","focus-single-v1"]},"focusRegion":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["format"],"additionalProperties":false}]},"caption":{"type":"object","properties":{"text":{"type":"string","maxLength":2200},"altText":{"type":"string","maxLength":500}},"required":["text"],"additionalProperties":false},"factKeys":{"maxItems":30,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}}},"required":["schemaVersion","brief","assetIds","output","caption","factKeys"],"additionalProperties":false},"origin":{"type":"string","enum":["human","external-agent","deterministic"]}},"required":["spec","origin"],"additionalProperties":false,"description":"Immutable creative draft. A focus-single-v1 carousel uses exactly one owned screenshot; output.focusRegion selects 0.08–1 of its width and 0.08–0.6 of its height, and the complete screenshot appears before the labeled detail. MP4 uses one recording or 1–8 uploaded screenshots in assetIds order. Generic output.durationSeconds is a maximum; silent screenshot storyboards run for max(6 seconds, 2 seconds per screenshot), with equal time per screenshot. Optional output.videoLayout=tiktok-conservative supports silent screenshots only; output.durationSeconds is the integer final length, at least ceil(3.5 + 2 × screenshot count), including 1.5 seconds opening and two seconds closing. This is approximate draft composition, not verified TikTok composer or caption clearance. output.audioMode defaults to silent for legacy revisions; preserve-source requires one uploaded recording with an audio stream. Unsupported or missing audio fails the render rather than producing a silent file. Optional output.videoFocus for one recording specifies a real timeSeconds and normalized source region, then appends a labeled two-second paused detail after the full uncropped recording. Region width is 0.08–1, height 0.08–0.6, and the full source plus detail must fit output.durationSeconds. Optional legacy output.sourceLedBeats for one recording has 1–5 contiguous segments, each at least 1.2 seconds, covering the complete uploaded source; each segment has startSeconds, endSeconds, a short label, and normalized region. The full source must fit the integer output.durationSeconds (maximum 30). Version-two output.recordingEdit can instead select sourceRange {inUs,outUs} at integer microsecond precision and focus.mode full-app or source-led; its beats are relative to the selected output. It cannot combine with legacy sourceLedBeats, videoFocus or screenshot layouts. The owner must choose a range that truly shows the action and result, then review the exact video before account approval."},"ApproveRevision":{"type":"object","properties":{"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"}},"required":["fingerprint"],"additionalProperties":false},"CreateRenderQuote":{"type":"object","properties":{"batchId":{"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)$"},"revisionIds":{"minItems":1,"maxItems":10,"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":["batchId","revisionIds"],"additionalProperties":false},"CreateBatchRender":{"type":"object","properties":{"quoteId":{"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":["quoteId"],"additionalProperties":false},"DuplicateBatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false},"Project":{"type":"object","required":["id","appName","benefit","approvedFacts","audience","tone","defaults","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"appName":{"type":"string"},"benefit":{"type":"string"},"approvedFacts":{"type":"object","additionalProperties":{"type":"string"}},"audience":{"type":"string"},"tone":{"type":"string"},"defaults":{"type":"object","properties":{"accentColor":{"type":"string"},"defaultCta":{"type":"string"},"destinationUrl":{"type":"string","format":"uri"}},"required":["accentColor","defaultCta"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Asset":{"type":"object","required":["id","projectId","status"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string"},"originalFilename":{"type":"string"},"kind":{"type":"string","enum":["image","recording"]},"contentType":{"type":"string"},"bytes":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"},"durationSeconds":{"type":"number"},"status":{"type":"string","enum":["pending","uploaded","deleted"]},"previewUrl":{"type":"string","format":"uri"},"signedUrl":{"type":"string","format":"uri"},"uploadMethod":{"type":"string","enum":["PUT"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Batch":{"type":"object","required":["id","projectId","name","items","diversity","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["id","batchId","position","title","revisionCount"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"title":{"type":"string"},"currentRevision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"revisionCount":{"type":"integer"}}}},"diversity":{"type":"object","description":"Advisory exact-field comparison of current revisions only; does not assess claim accuracy, media fit, or post readiness and never gates approval.","required":["level","comparedRevisions","distinctSourceSelections","distinctCopyVariants","distinctTemplates","warnings"],"properties":{"level":{"type":"string","const":"advisory"},"comparedRevisions":{"type":"integer"},"distinctSourceSelections":{"type":"integer"},"distinctCopyVariants":{"type":"integer"},"distinctTemplates":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string","enum":["repeated-source-selection","repeated-copy","repeated-template"]}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Revision":{"type":"object","required":["id","creativeId","revision","status","spec","fingerprint","origin","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"creativeId":{"type":"string","format":"uuid"},"revision":{"type":"integer"},"status":{"type":"string","enum":["draft","approved","superseded"]},"spec":{"type":"object"},"fingerprint":{"type":"string","pattern":"^[0-9a-f]{64}$"},"origin":{"type":"string","enum":["human","external-agent","deterministic"]},"createdAt":{"type":"string","format":"date-time"},"approvedAt":{"type":"string","format":"date-time"}}},"Render":{"type":"object","required":["id","batchId","quoteId","status","items","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"batchId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","partially_succeeded","succeeded","failed","cancelled"]},"items":{"type":"array","items":{"type":"object","properties":{"creativeId":{"type":"string","format":"uuid"},"revisionId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"status":{"type":"string"},"progress":{"type":"number"},"error":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"observed":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}},"ObservedArtifact":{"anyOf":[{"oneOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"mp4"},"mimeType":{"type":"string","const":"video/mp4"},"codec":{"type":"string","const":"h264"},"durationSeconds":{"type":"number","exclusiveMinimum":0,"maximum":30.1},"audio":{"anyOf":[{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false},{"type":"object","properties":{"present":{"type":"boolean","const":true},"mode":{"type":"string","const":"preserve-source"},"codec":{"type":"string","const":"aac"}},"required":["present","mode","codec"],"additionalProperties":false}]}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","audio"],"additionalProperties":false},{"type":"object","properties":{"version":{"type":"number","const":1},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":104857600},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"height":{"type":"integer","exclusiveMinimum":0,"maximum":4096},"format":{"type":"string","const":"carousel-zip"},"mimeType":{"type":"string","const":"application/zip"},"codec":{"type":"string","const":"png"},"durationSeconds":{"type":"null"},"slideCount":{"type":"integer","minimum":1,"maximum":12},"audio":{"type":"object","properties":{"present":{"type":"boolean","const":false},"mode":{"type":"string","const":"silent"},"codec":{"type":"null"}},"required":["present","mode","codec"],"additionalProperties":false}},"required":["version","bytes","sha256","width","height","format","mimeType","codec","durationSeconds","slideCount","audio"],"additionalProperties":false}]},{"type":"null"}],"description":"Versioned observations of actual encoded bytes, independently checksum-verified at completion. Requested spec remains separate. Null means unknown, including legacy jobs; no private storage identity or source URL is included."}}}}