{"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/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","requestBody":{"required":true,"description":"The source media metadata and owning project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssetUpload"}}}},"responses":{"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":"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"}}}}}}}},"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","parameters":[{"name":"creativeId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"A new draft invalidates any prior approval.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRevision"}}}},"responses":{"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 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/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"}},"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"}},"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"}},"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"}},"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"}},"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","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"}}}}}}}},"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"}},"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},"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},"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"}},"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 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). It cannot combine with videoFocus or tiktok-conservative layout. The operator must 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"}},"required":["creativeId","revisionId","jobId","status","progress"]}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"packDownloadUrl":{"type":"string"}}}}}}