Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.
The knobs shared by a standalone preview and a stored-project preview.
Everything except which composition to preview: an at frame or a
window clip (mutually exclusive), the draft width, dry_run for
validate-only, and an optional target-duration check.
Timeline seconds for a single-frame preview, snapped to the frame grid. Returns an unlabelled PNG, viewable inline via get_render_preview; a window preview is video and is not. Mutually exclusive with 'window' and 'contact_sheet'.
For a dry-run (not a contact sheet): the render task this composition translates to, the JSON the render engine parses. It is the lenient translation a preview dispatches: a feature a real submit would refuse is left out and reported in violations. Source URLs are as submitted. Absent otherwise.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Framelane","colors":{"primary":"#0070f3","light":"#3b82f6","dark":"#1d4ed8"},"logo":{"light":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-light.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a819adfb6e5b9a97575f20c034d41c77","dark":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-dark.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=14e93bd67dd1fedf3c655cbebd17e046"},"favicon":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/favicon.ico?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a0cbeea069121bb5f6014ae0b57c8b8b","api":{"playground":{"display":"interactive"}},"navbar":{"links":[{"href":"https://console.framelane.io","label":"Console"}],"primary":{"type":"button","label":"Get API Key","href":"https://console.framelane.io/signup"}},"footer":{"socials":{"x":"https://twitter.com/framelane","github":"https://github.com/framelane"}},"seo":{"metatags":{"og:type":"website","og:site_name":"Framelane","og:image":"https://cdn-assets.framelane.io/shared/images/og-docs.png","robots":"index, follow"},"indexing":"all"},"contextual":{"options":["copy","view","claude","chatgpt","download-spec"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/framelane"},{"anchor":"Status","icon":"signal-bars","href":"https://status.framelane.io"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"itis-c7dc7146","hasAudioNarration":false,"actualSubdomain":"itis-c7dc7146","customDomains":["docs.framelane.io"],"gitSource":{"type":"github","owner":"itishq","repo":"framelane-api","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf86d0737ceb5e7109b3ae","collectionId":"43553988-d245-46c7-9e69-6860d4cdb8de","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf86d0737ceb5e7109b3ae"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adf86d0737ceb5e7109b3ae","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API Reference","count":65},{"language":"default","tag":"Documentation","count":41},{"language":"default","tag":"Webhooks","count":13},{"language":"default","tag":"Projects","count":10},{"language":"default","tag":"Renders","count":10},{"language":"default","tag":"Get Started","count":9},{"language":"default","tag":"Render Examples","count":9},{"language":"default","tag":"Account","count":9},{"language":"default","tag":"Guides","count":7},{"language":"default","tag":"Tasks","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/projects/preview-or-validate-the-project-head","slug":"/api-reference/projects/preview-or-validate-the-project-head","pageMetadata":{"title":"Preview or validate the project head","description":"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/preview","href":"/api-reference/projects/preview-or-validate-the-project-head","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Preview or validate the project head","description":"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/preview","href":"/api-reference/projects/preview-or-validate-the-project-head","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["projects"],"summary":"Preview or validate the project head","description":"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.","operationId":"preview_project","security":["67f2115c-3b9d-4dbd-ba3c-2d57c2c39b12"],"parameters":["1f793ae6-ca6b-4b71-90a3-8704fb40b6c9"],"requestBody":"3cab1797-2e84-4799-bab6-b845a39362b5","responses":{"200":"0ef8a0c9-d48e-4d87-bc33-656eaaf42786","202":"ebf0cd16-98fb-4578-babb-35da06e7155c","401":"09259f4b-cdd8-4ee3-bba7-78156b982773","404":"03bab54a-7514-45f4-bd8f-31b5bd345049","422":"f5fbfe9b-dfe2-4e7c-acff-96713d2cb10d"},"method":"post","type":"path","servers":["374e059c-6af0-4c50-a102-7400af30babb"],"path":"/v1/projects/{project_id}/preview","baseUrlOptions":["https://api.framelane.io"],"title":"Preview or validate the project head","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"1f793ae6-ca6b-4b71-90a3-8704fb40b6c9":{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"at":{"oneOf":[{"type":"number","title":"At","description":"Timeline seconds for a single-frame preview, snapped to the frame grid. Returns an unlabelled PNG, viewable inline via `get_render_preview`; a `window` preview is video and is not. Mutually exclusive with 'window' and 'contact_sheet'.","minimum":0,"uniqueKey":"at.oneOf.0","typeLabel":"number"},{"type":"null","title":"At","description":"Timeline seconds for a single-frame preview, snapped to the frame grid. Returns an unlabelled PNG, viewable inline via `get_render_preview`; a `window` preview is video and is not. Mutually exclusive with 'window' and 'contact_sheet'.","uniqueKey":"at.oneOf.1","typeLabel":"null"}],"uniqueKey":"at","typeLabel":"number | null"},"window":{"oneOf":[{"type":"object","title":"PreviewWindow","description":"Time range for a short clip preview (with audio), or the range a contact_sheet spans.","required":["from","to"],"properties":{"from":{"type":"number","minimum":0,"title":"From","description":"Window start in timeline seconds.","isRequired":true,"uniqueKey":"window.oneOf.0.from","typeLabel":"number"},"to":{"type":"number","exclusiveMinimum":0,"title":"To","description":"Window end in timeline seconds.","isRequired":true,"uniqueKey":"window.oneOf.0.to","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"window.oneOf.0","typeLabel":"PreviewWindow · object"},{"type":"null","description":"Time range for a short clip preview (with audio), or the range a contact_sheet spans.","uniqueKey":"window.oneOf.1","typeLabel":"null"}],"uniqueKey":"window","typeLabel":"PreviewWindow · object | null"},"contact_sheet":{"oneOf":[{"type":"object","title":"ContactSheetOptions","description":"Produce a contact sheet (grid of composition-aware frames) instead of a single frame or clip.","properties":{"detail":{"type":"string","enum":["overview","balanced","detailed"],"title":"Detail","description":"Cell budget CEILING, not a target: overview 9, balanced 16, detailed 36. Actual count is ~1 cell/second of the sampled range (min 4), snapped up to fill a grid (4s->4, 6s->6), so all tiers match below ~10s.","default":"balanced","uniqueKey":"contact_sheet.oneOf.0.detail","typeLabel":"enum\u003cstring>"},"columns":{"oneOf":[{"type":"integer","title":"Columns","description":"Grid columns. Defaults to a near-square layout.","maximum":12,"minimum":1,"uniqueKey":"contact_sheet.oneOf.0.columns.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Columns","description":"Grid columns. Defaults to a near-square layout.","uniqueKey":"contact_sheet.oneOf.0.columns.oneOf.1","typeLabel":"null"}],"uniqueKey":"contact_sheet.oneOf.0.columns","typeLabel":"integer | null"},"max_cells":{"oneOf":[{"type":"integer","title":"Max Cells","description":"Hard cap on the number of cells, below the tier budget.","maximum":64,"minimum":1,"uniqueKey":"contact_sheet.oneOf.0.max_cells.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Cells","description":"Hard cap on the number of cells, below the tier budget.","uniqueKey":"contact_sheet.oneOf.0.max_cells.oneOf.1","typeLabel":"null"}],"uniqueKey":"contact_sheet.oneOf.0.max_cells","typeLabel":"integer | null"}},"additionalProperties":false,"uniqueKey":"contact_sheet.oneOf.0","typeLabel":"ContactSheetOptions · object"},{"type":"null","description":"Produce a contact sheet (grid of composition-aware frames) instead of a single frame or clip.","uniqueKey":"contact_sheet.oneOf.1","typeLabel":"null"}],"uniqueKey":"contact_sheet","typeLabel":"ContactSheetOptions · object | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Preview width in px; height derives from the aspect ratio. Defaults to a small draft width.","maximum":3840,"minimum":16,"uniqueKey":"width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Preview width in px; height derives from the aspect ratio. Defaults to a small draft width.","uniqueKey":"width.oneOf.1","typeLabel":"null"}],"uniqueKey":"width","typeLabel":"integer | null"},"dry_run":{"type":"boolean","title":"Dry Run","description":"Validate only: run the linter and return violations, no render.","default":false,"uniqueKey":"dry_run","typeLabel":"boolean"},"target_duration_sec":{"oneOf":[{"type":"number","title":"Target Duration Sec","description":"Optional target timeline length; emits TARGET_DURATION_MISSED when outside tolerance.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"target_duration_sec.oneOf.0","typeLabel":"number"},{"type":"null","title":"Target Duration Sec","description":"Optional target timeline length; emits TARGET_DURATION_MISSED when outside tolerance.","uniqueKey":"target_duration_sec.oneOf.1","typeLabel":"null"}],"uniqueKey":"target_duration_sec","typeLabel":"number | null"},"target_tolerance_sec":{"type":"number","minimum":0,"title":"Target Tolerance Sec","default":0.5,"uniqueKey":"target_tolerance_sec","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"PreviewOptions","description":"The knobs shared by a standalone preview and a stored-project preview.\n\nEverything except *which* composition to preview: an ``at`` frame or a\n``window`` clip (mutually exclusive), the draft ``width``, ``dry_run`` for\nvalidate-only, and an optional target-duration check.","uniqueKey":"","typeLabel":"PreviewOptions · object"},"examples":{"Example":{"title":"Example","value":{"at":1,"window":{"from":1,"to":123},"contact_sheet":{"detail":"balanced","columns":6,"max_cells":32},"width":1928,"dry_run":false,"target_duration_sec":1,"target_tolerance_sec":0.5}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"0ef8a0c9-d48e-4d87-bc33-656eaaf42786":{"description":"Validation result (dry-run).","content":{"application/json":{"schema":{"properties":{"kind":{"type":"string","title":"Kind","description":"'validation' (dry-run), 'frame', 'window', or 'contact_sheet'.","isRequired":true,"uniqueKey":"kind","typeLabel":"string"},"ok":{"type":"boolean","title":"Ok","description":"True when there are no error-severity violations.","isRequired":true,"uniqueKey":"ok","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the previewed project in the authenticated console. Absent for an inline preview.","uniqueKey":"editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the previewed project in the authenticated console. Absent for an inline preview.","uniqueKey":"editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"editor_url","typeLabel":"string | null"},"violations":{"items":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. 'DANGLING_TRANSITION'.","isRequired":true,"uniqueKey":"violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"violations.items.[INDEX].message","typeLabel":"string"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity","description":"'error' blocks a good render; 'warning' is advisory.","default":"error","uniqueKey":"violations.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"path":{"oneOf":[{"type":"string","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].path","typeLabel":"string | null"},"pointer":{"oneOf":[{"type":"string","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].pointer","typeLabel":"string | null"},"target_id":{"oneOf":[{"type":"string","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].target_id","typeLabel":"string | null"},"bbox":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].bbox","typeLabel":"number[] | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].time","typeLabel":"number | null"}},"type":"object","required":["code","message"],"title":"Violation","uniqueKey":"violations.items.[INDEX]","typeLabel":"Violation · object"},"type":"array","title":"Violations","uniqueKey":"violations","typeLabel":"Violation · object[]"},"job":{"oneOf":[{"type":"object","title":"JobOut","description":"For a pixel preview: the preview render job to poll via GET /v1/renders/{id} (is_preview=true, not billed). Absent for a dry-run.","required":["id","kind","workspace_id","status","created_at","updated_at"],"properties":{"id":{"type":"string","title":"Id","description":"Unique job ID. Prefix indicates type: `render_` or `task_`.","example":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"job.oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","enum":["render","task"],"title":"JobKind","description":"Whether this is a `render` or a `task`.","example":"render","isRequired":true,"uniqueKey":"job.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"workspace_id":{"type":"string","title":"Workspace Id","description":"ID of the workspace that owns this job.","example":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","isRequired":true,"uniqueKey":"job.oneOf.0.workspace_id","typeLabel":"string"},"status":{"type":"string","enum":["ingesting","queued","processing","completed","failed","cancelled"],"title":"JobStatus","description":"Current lifecycle state: `queued` → `processing` → `completed` / `failed` / `cancelled`.","x-enumDescriptions":{"ingesting":"External source files are being probed for duration before the render is queued.","queued":"Accepted and waiting for a worker to pick it up.","processing":"Actively rendering or processing.","completed":"Finished successfully; the output artifact is available.","failed":"Terminated with an error (see `error`).","cancelled":"Cancelled by the caller before completion."},"example":"queued","isRequired":true,"uniqueKey":"job.oneOf.0.status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO-8601 UTC timestamp when the job was created.","isRequired":true,"uniqueKey":"job.oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO-8601 UTC timestamp of the last status change.","isRequired":true,"uniqueKey":"job.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"is_preview":{"type":"boolean","title":"Is Preview","description":"True for a cheap preview render. Previews are not billed and are excluded from the renders list.","default":false,"example":false,"uniqueKey":"job.oneOf.0.is_preview","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"job.oneOf.0.editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"job.oneOf.0.editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.editor_url","typeLabel":"string | null"},"task_type":{"oneOf":[{"type":"string","title":"TaskType","description":"For `task` jobs only — the specific AI operation.","enum":["transcribe"],"x-enumDescriptions":{"transcribe":"Speech-to-text transcription (via AssemblyAI) with optional analysis. Returns the transcript inline on the task's `result` object — there is no file artifact, so `output` is null and `/v1/tasks/{id}/download` returns 404."},"example":"transcribe","uniqueKey":"job.oneOf.0.task_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"For `task` jobs only — the specific AI operation.","example":"transcribe","uniqueKey":"job.oneOf.0.task_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.task_type","typeLabel":"enum\u003cstring> | null"},"progress_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Progress Percent","description":"0–100 progress indicator updated by the render engine.","default":0,"example":0,"uniqueKey":"job.oneOf.0.progress_percent","typeLabel":"integer"},"progress_stage":{"oneOf":[{"type":"string","title":"ProgressStage","description":"Current processing phase within a job.","enum":["downloading","compositing","encoding","uploading"],"x-enumDescriptions":{"downloading":"Fetching source media.","compositing":"Compositing the scene on the GPU.","encoding":"Encoding the output video.","uploading":"Uploading the finished artifact to storage."},"example":"compositing","uniqueKey":"job.oneOf.0.progress_stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Current processing phase within a job.","example":"compositing","uniqueKey":"job.oneOf.0.progress_stage.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.progress_stage","typeLabel":"enum\u003cstring> | null"},"output":{"oneOf":[{"type":"object","title":"JobOutput","description":"Populated once `status == completed`. Contains the signed artifact URL.","properties":{"url":{"oneOf":[{"type":"string","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"job.oneOf.0.output.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"job.oneOf.0.output.oneOf.0.url.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.url","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"job.oneOf.0.output.oneOf.0.width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"job.oneOf.0.output.oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"job.oneOf.0.output.oneOf.0.height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"job.oneOf.0.output.oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.height","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"job.oneOf.0.output.oneOf.0.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"job.oneOf.0.output.oneOf.0.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.duration","typeLabel":"number | null"},"size_bytes":{"oneOf":[{"type":"integer","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes","typeLabel":"integer | null"}},"uniqueKey":"job.oneOf.0.output.oneOf.0","typeLabel":"JobOutput · object"},{"type":"null","description":"Populated once `status == completed`. Contains the signed artifact URL.","uniqueKey":"job.oneOf.0.output.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output","typeLabel":"JobOutput · object | null"},"result":{"oneOf":[{"type":"object","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"additionalProperties":true,"uniqueKey":"job.oneOf.0.result.oneOf.0","typeLabel":"Result · object"},{"type":"null","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"uniqueKey":"job.oneOf.0.result.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.result","typeLabel":"Result · object | null"},"error":{"oneOf":[{"type":"object","title":"JobError","description":"Populated when `status == failed`. Contains a structured error code.","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_source","source_not_found","source_too_large","asset_not_ready","codec_unsupported","decode_failed","encode_failed","timeout","out_of_memory","gpu_error","upload_failed","provider_error","ingest_failed","render_refused","internal","cancelled"],"title":"ErrorCode","description":"Machine-readable error code.","x-enumDescriptions":{"invalid_source":"A source URL was malformed or inaccessible.","source_not_found":"A source URL returned 404.","source_too_large":"A source file exceeded the maximum allowed size.","asset_not_ready":"A referenced asset was still ingesting when the job ran.","codec_unsupported":"A source used a codec the renderer cannot decode.","decode_failed":"A source file could not be decoded.","encode_failed":"The output could not be encoded.","timeout":"Processing exceeded the time limit.","out_of_memory":"The renderer ran out of GPU memory.","gpu_error":"A GPU hardware/driver error occurred.","upload_failed":"The output artifact failed to upload to storage.","provider_error":"An upstream provider (e.g. AssemblyAI) returned an error.","ingest_failed":"An external source could not be probed (unreachable, not a media file, or timed out).","render_refused":"The renderer refused the composition by name: a runtime shader that did not compile or ran over its GPU time budget, or an operation, a component or a nested composition it could not apply. `error_message` carries the engine's words; change what it names and submit again.","internal":"An unexpected internal error occurred.","cancelled":"The job was cancelled."},"example":"invalid_source","isRequired":true,"uniqueKey":"job.oneOf.0.error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","description":"Human-readable error description.","example":"Source URL returned 404.","isRequired":true,"uniqueKey":"job.oneOf.0.error.oneOf.0.message","typeLabel":"string"}},"uniqueKey":"job.oneOf.0.error.oneOf.0","typeLabel":"JobError · object"},{"type":"null","description":"Populated when `status == failed`. Contains a structured error code.","uniqueKey":"job.oneOf.0.error.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.error","typeLabel":"JobError · object | null"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Caller-supplied key-value pairs echoed back on every webhook and response.","example":{"project_id":"proj_123","user_ref":"usr_abc"},"uniqueKey":"job.oneOf.0.metadata","typeLabel":"Metadata · object"},"completed_at":{"oneOf":[{"type":"string","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","format":"date-time","uniqueKey":"job.oneOf.0.completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","uniqueKey":"job.oneOf.0.completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.completed_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"job.oneOf.0","typeLabel":"JobOut · object"},{"type":"null","description":"For a pixel preview: the preview render job to poll via GET /v1/renders/{id} (is_preview=true, not billed). Absent for a dry-run.","uniqueKey":"job.oneOf.1","typeLabel":"null"}],"uniqueKey":"job","typeLabel":"JobOut · object | null"},"sheet":{"oneOf":[{"type":"object","title":"ContactSheetPlan","description":"For a contact_sheet: the sampling plan (cells + grid shape). Present even on a dry-run.","required":["columns","rows","width","window"],"properties":{"columns":{"type":"integer","title":"Columns","isRequired":true,"uniqueKey":"sheet.oneOf.0.columns","typeLabel":"integer"},"rows":{"type":"integer","title":"Rows","isRequired":true,"uniqueKey":"sheet.oneOf.0.rows","typeLabel":"integer"},"width":{"type":"integer","title":"Width","description":"Per-cell width in px.","isRequired":true,"uniqueKey":"sheet.oneOf.0.width","typeLabel":"integer"},"window":{"properties":{"from":{"type":"number","minimum":0,"title":"From","description":"Window start in timeline seconds.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window.from","typeLabel":"number"},"to":{"type":"number","exclusiveMinimum":0,"title":"To","description":"Window end in timeline seconds.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window.to","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["from","to"],"title":"PreviewWindow","description":"Timeline range the sheet spans.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window","typeLabel":"PreviewWindow · object"},"cells":{"items":{"properties":{"index":{"type":"integer","title":"Index","description":"Position in the grid, row-major from 0.","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].index","typeLabel":"integer"},"at":{"type":"number","title":"At","description":"Timeline seconds of this frame (snapped to the frame grid).","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].at","typeLabel":"number"},"reason":{"type":"string","enum":["first_frame","element_start","transition","caption","uniform","last_frame"],"title":"SampleReason","description":"Why this moment was sampled.","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].reason","typeLabel":"enum\u003cstring>"}},"type":"object","required":["index","at","reason"],"title":"ContactSheetCell","description":"One frame in the grid: where it is on the timeline and why it was picked.","uniqueKey":"sheet.oneOf.0.cells.items.[INDEX]","typeLabel":"ContactSheetCell · object"},"type":"array","title":"Cells","uniqueKey":"sheet.oneOf.0.cells","typeLabel":"ContactSheetCell · object[]"}},"uniqueKey":"sheet.oneOf.0","typeLabel":"ContactSheetPlan · object"},{"type":"null","description":"For a contact_sheet: the sampling plan (cells + grid shape). Present even on a dry-run.","uniqueKey":"sheet.oneOf.1","typeLabel":"null"}],"uniqueKey":"sheet","typeLabel":"ContactSheetPlan · object | null"},"task":{"oneOf":[{"type":"object","title":"Task","description":"For a dry-run (not a contact sheet): the render task this composition translates to, the JSON the render engine parses. It is the lenient translation a preview dispatches: a feature a real submit would refuse is left out and reported in `violations`. Source URLs are as submitted. Absent otherwise.","additionalProperties":true,"uniqueKey":"task.oneOf.0","typeLabel":"Task · object"},{"type":"null","title":"Task","description":"For a dry-run (not a contact sheet): the render task this composition translates to, the JSON the render engine parses. It is the lenient translation a preview dispatches: a feature a real submit would refuse is left out and reported in `violations`. Source URLs are as submitted. Absent otherwise.","uniqueKey":"task.oneOf.1","typeLabel":"null"}],"uniqueKey":"task","typeLabel":"Task · object | null"}},"type":"object","required":["kind","ok"],"title":"PreviewResponse","uniqueKey":"","typeLabel":"PreviewResponse · object"},"examples":{"Example":{"title":"Example","value":{"kind":"\u003cstring>","ok":true,"editor_url":"\u003cstring>","violations":[{"code":"\u003cstring>","message":"\u003cstring>","severity":"error","path":"\u003cstring>","pointer":"\u003cstring>","target_id":"\u003cstring>","bbox":[123],"time":123}],"job":{"id":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","kind":"render","workspace_id":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","status":"queued","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","is_preview":false,"editor_url":"\u003cstring>","task_type":"transcribe","progress_percent":0,"progress_stage":"compositing","output":{"url":"https://cdn-user.framelane.io/render_01J.../output.mp4","width":1920,"height":1080,"duration":15.3,"size_bytes":12582912},"result":{"language_code":"en","text":"Welcome back to the show."},"error":{"code":"invalid_source","message":"Source URL returned 404."},"metadata":{"project_id":"proj_123","user_ref":"usr_abc"},"completed_at":"2023-11-07T05:31:56Z"},"sheet":{"columns":123,"rows":123,"width":123,"window":{"from":1,"to":123},"cells":[{"index":123,"at":123,"reason":"first_frame"}]},"task":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"ebf0cd16-98fb-4578-babb-35da06e7155c":{"description":"Preview render queued; poll via GET /v1/renders/{id}.","content":{"application/json":{"schema":{"properties":{"kind":{"type":"string","title":"Kind","description":"'validation' (dry-run), 'frame', 'window', or 'contact_sheet'.","isRequired":true,"uniqueKey":"kind","typeLabel":"string"},"ok":{"type":"boolean","title":"Ok","description":"True when there are no error-severity violations.","isRequired":true,"uniqueKey":"ok","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the previewed project in the authenticated console. Absent for an inline preview.","uniqueKey":"editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the previewed project in the authenticated console. Absent for an inline preview.","uniqueKey":"editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"editor_url","typeLabel":"string | null"},"violations":{"items":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. 'DANGLING_TRANSITION'.","isRequired":true,"uniqueKey":"violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"violations.items.[INDEX].message","typeLabel":"string"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity","description":"'error' blocks a good render; 'warning' is advisory.","default":"error","uniqueKey":"violations.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"path":{"oneOf":[{"type":"string","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].path","typeLabel":"string | null"},"pointer":{"oneOf":[{"type":"string","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].pointer","typeLabel":"string | null"},"target_id":{"oneOf":[{"type":"string","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].target_id","typeLabel":"string | null"},"bbox":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].bbox","typeLabel":"number[] | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].time","typeLabel":"number | null"}},"type":"object","required":["code","message"],"title":"Violation","uniqueKey":"violations.items.[INDEX]","typeLabel":"Violation · object"},"type":"array","title":"Violations","uniqueKey":"violations","typeLabel":"Violation · object[]"},"job":{"oneOf":[{"type":"object","title":"JobOut","description":"For a pixel preview: the preview render job to poll via GET /v1/renders/{id} (is_preview=true, not billed). Absent for a dry-run.","required":["id","kind","workspace_id","status","created_at","updated_at"],"properties":{"id":{"type":"string","title":"Id","description":"Unique job ID. Prefix indicates type: `render_` or `task_`.","example":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"job.oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","enum":["render","task"],"title":"JobKind","description":"Whether this is a `render` or a `task`.","example":"render","isRequired":true,"uniqueKey":"job.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"workspace_id":{"type":"string","title":"Workspace Id","description":"ID of the workspace that owns this job.","example":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","isRequired":true,"uniqueKey":"job.oneOf.0.workspace_id","typeLabel":"string"},"status":{"type":"string","enum":["ingesting","queued","processing","completed","failed","cancelled"],"title":"JobStatus","description":"Current lifecycle state: `queued` → `processing` → `completed` / `failed` / `cancelled`.","x-enumDescriptions":{"ingesting":"External source files are being probed for duration before the render is queued.","queued":"Accepted and waiting for a worker to pick it up.","processing":"Actively rendering or processing.","completed":"Finished successfully; the output artifact is available.","failed":"Terminated with an error (see `error`).","cancelled":"Cancelled by the caller before completion."},"example":"queued","isRequired":true,"uniqueKey":"job.oneOf.0.status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO-8601 UTC timestamp when the job was created.","isRequired":true,"uniqueKey":"job.oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO-8601 UTC timestamp of the last status change.","isRequired":true,"uniqueKey":"job.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"is_preview":{"type":"boolean","title":"Is Preview","description":"True for a cheap preview render. Previews are not billed and are excluded from the renders list.","default":false,"example":false,"uniqueKey":"job.oneOf.0.is_preview","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"job.oneOf.0.editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"job.oneOf.0.editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.editor_url","typeLabel":"string | null"},"task_type":{"oneOf":[{"type":"string","title":"TaskType","description":"For `task` jobs only — the specific AI operation.","enum":["transcribe"],"x-enumDescriptions":{"transcribe":"Speech-to-text transcription (via AssemblyAI) with optional analysis. Returns the transcript inline on the task's `result` object — there is no file artifact, so `output` is null and `/v1/tasks/{id}/download` returns 404."},"example":"transcribe","uniqueKey":"job.oneOf.0.task_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"For `task` jobs only — the specific AI operation.","example":"transcribe","uniqueKey":"job.oneOf.0.task_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.task_type","typeLabel":"enum\u003cstring> | null"},"progress_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Progress Percent","description":"0–100 progress indicator updated by the render engine.","default":0,"example":0,"uniqueKey":"job.oneOf.0.progress_percent","typeLabel":"integer"},"progress_stage":{"oneOf":[{"type":"string","title":"ProgressStage","description":"Current processing phase within a job.","enum":["downloading","compositing","encoding","uploading"],"x-enumDescriptions":{"downloading":"Fetching source media.","compositing":"Compositing the scene on the GPU.","encoding":"Encoding the output video.","uploading":"Uploading the finished artifact to storage."},"example":"compositing","uniqueKey":"job.oneOf.0.progress_stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Current processing phase within a job.","example":"compositing","uniqueKey":"job.oneOf.0.progress_stage.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.progress_stage","typeLabel":"enum\u003cstring> | null"},"output":{"oneOf":[{"type":"object","title":"JobOutput","description":"Populated once `status == completed`. Contains the signed artifact URL.","properties":{"url":{"oneOf":[{"type":"string","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"job.oneOf.0.output.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"job.oneOf.0.output.oneOf.0.url.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.url","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"job.oneOf.0.output.oneOf.0.width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"job.oneOf.0.output.oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"job.oneOf.0.output.oneOf.0.height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"job.oneOf.0.output.oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.height","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"job.oneOf.0.output.oneOf.0.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"job.oneOf.0.output.oneOf.0.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.duration","typeLabel":"number | null"},"size_bytes":{"oneOf":[{"type":"integer","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output.oneOf.0.size_bytes","typeLabel":"integer | null"}},"uniqueKey":"job.oneOf.0.output.oneOf.0","typeLabel":"JobOutput · object"},{"type":"null","description":"Populated once `status == completed`. Contains the signed artifact URL.","uniqueKey":"job.oneOf.0.output.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.output","typeLabel":"JobOutput · object | null"},"result":{"oneOf":[{"type":"object","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"additionalProperties":true,"uniqueKey":"job.oneOf.0.result.oneOf.0","typeLabel":"Result · object"},{"type":"null","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"uniqueKey":"job.oneOf.0.result.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.result","typeLabel":"Result · object | null"},"error":{"oneOf":[{"type":"object","title":"JobError","description":"Populated when `status == failed`. Contains a structured error code.","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_source","source_not_found","source_too_large","asset_not_ready","codec_unsupported","decode_failed","encode_failed","timeout","out_of_memory","gpu_error","upload_failed","provider_error","ingest_failed","render_refused","internal","cancelled"],"title":"ErrorCode","description":"Machine-readable error code.","x-enumDescriptions":{"invalid_source":"A source URL was malformed or inaccessible.","source_not_found":"A source URL returned 404.","source_too_large":"A source file exceeded the maximum allowed size.","asset_not_ready":"A referenced asset was still ingesting when the job ran.","codec_unsupported":"A source used a codec the renderer cannot decode.","decode_failed":"A source file could not be decoded.","encode_failed":"The output could not be encoded.","timeout":"Processing exceeded the time limit.","out_of_memory":"The renderer ran out of GPU memory.","gpu_error":"A GPU hardware/driver error occurred.","upload_failed":"The output artifact failed to upload to storage.","provider_error":"An upstream provider (e.g. AssemblyAI) returned an error.","ingest_failed":"An external source could not be probed (unreachable, not a media file, or timed out).","render_refused":"The renderer refused the composition by name: a runtime shader that did not compile or ran over its GPU time budget, or an operation, a component or a nested composition it could not apply. `error_message` carries the engine's words; change what it names and submit again.","internal":"An unexpected internal error occurred.","cancelled":"The job was cancelled."},"example":"invalid_source","isRequired":true,"uniqueKey":"job.oneOf.0.error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","description":"Human-readable error description.","example":"Source URL returned 404.","isRequired":true,"uniqueKey":"job.oneOf.0.error.oneOf.0.message","typeLabel":"string"}},"uniqueKey":"job.oneOf.0.error.oneOf.0","typeLabel":"JobError · object"},{"type":"null","description":"Populated when `status == failed`. Contains a structured error code.","uniqueKey":"job.oneOf.0.error.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.error","typeLabel":"JobError · object | null"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Caller-supplied key-value pairs echoed back on every webhook and response.","example":{"project_id":"proj_123","user_ref":"usr_abc"},"uniqueKey":"job.oneOf.0.metadata","typeLabel":"Metadata · object"},"completed_at":{"oneOf":[{"type":"string","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","format":"date-time","uniqueKey":"job.oneOf.0.completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","uniqueKey":"job.oneOf.0.completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"job.oneOf.0.completed_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"job.oneOf.0","typeLabel":"JobOut · object"},{"type":"null","description":"For a pixel preview: the preview render job to poll via GET /v1/renders/{id} (is_preview=true, not billed). Absent for a dry-run.","uniqueKey":"job.oneOf.1","typeLabel":"null"}],"uniqueKey":"job","typeLabel":"JobOut · object | null"},"sheet":{"oneOf":[{"type":"object","title":"ContactSheetPlan","description":"For a contact_sheet: the sampling plan (cells + grid shape). Present even on a dry-run.","required":["columns","rows","width","window"],"properties":{"columns":{"type":"integer","title":"Columns","isRequired":true,"uniqueKey":"sheet.oneOf.0.columns","typeLabel":"integer"},"rows":{"type":"integer","title":"Rows","isRequired":true,"uniqueKey":"sheet.oneOf.0.rows","typeLabel":"integer"},"width":{"type":"integer","title":"Width","description":"Per-cell width in px.","isRequired":true,"uniqueKey":"sheet.oneOf.0.width","typeLabel":"integer"},"window":{"properties":{"from":{"type":"number","minimum":0,"title":"From","description":"Window start in timeline seconds.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window.from","typeLabel":"number"},"to":{"type":"number","exclusiveMinimum":0,"title":"To","description":"Window end in timeline seconds.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window.to","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["from","to"],"title":"PreviewWindow","description":"Timeline range the sheet spans.","isRequired":true,"uniqueKey":"sheet.oneOf.0.window","typeLabel":"PreviewWindow · object"},"cells":{"items":{"properties":{"index":{"type":"integer","title":"Index","description":"Position in the grid, row-major from 0.","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].index","typeLabel":"integer"},"at":{"type":"number","title":"At","description":"Timeline seconds of this frame (snapped to the frame grid).","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].at","typeLabel":"number"},"reason":{"type":"string","enum":["first_frame","element_start","transition","caption","uniform","last_frame"],"title":"SampleReason","description":"Why this moment was sampled.","isRequired":true,"uniqueKey":"sheet.oneOf.0.cells.items.[INDEX].reason","typeLabel":"enum\u003cstring>"}},"type":"object","required":["index","at","reason"],"title":"ContactSheetCell","description":"One frame in the grid: where it is on the timeline and why it was picked.","uniqueKey":"sheet.oneOf.0.cells.items.[INDEX]","typeLabel":"ContactSheetCell · object"},"type":"array","title":"Cells","uniqueKey":"sheet.oneOf.0.cells","typeLabel":"ContactSheetCell · object[]"}},"uniqueKey":"sheet.oneOf.0","typeLabel":"ContactSheetPlan · object"},{"type":"null","description":"For a contact_sheet: the sampling plan (cells + grid shape). Present even on a dry-run.","uniqueKey":"sheet.oneOf.1","typeLabel":"null"}],"uniqueKey":"sheet","typeLabel":"ContactSheetPlan · object | null"},"task":{"oneOf":[{"type":"object","title":"Task","description":"For a dry-run (not a contact sheet): the render task this composition translates to, the JSON the render engine parses. It is the lenient translation a preview dispatches: a feature a real submit would refuse is left out and reported in `violations`. Source URLs are as submitted. Absent otherwise.","additionalProperties":true,"uniqueKey":"task.oneOf.0","typeLabel":"Task · object"},{"type":"null","title":"Task","description":"For a dry-run (not a contact sheet): the render task this composition translates to, the JSON the render engine parses. It is the lenient translation a preview dispatches: a feature a real submit would refuse is left out and reported in `violations`. Source URLs are as submitted. Absent otherwise.","uniqueKey":"task.oneOf.1","typeLabel":"null"}],"uniqueKey":"task","typeLabel":"Task · object | null"}},"type":"object","required":["kind","ok"],"title":"PreviewResponse","uniqueKey":"","typeLabel":"PreviewResponse · object"},"examples":{"Example":{"title":"Example","value":{"kind":"\u003cstring>","ok":true,"editor_url":"\u003cstring>","violations":[{"code":"\u003cstring>","message":"\u003cstring>","severity":"error","path":"\u003cstring>","pointer":"\u003cstring>","target_id":"\u003cstring>","bbox":[123],"time":123}],"job":{"id":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","kind":"render","workspace_id":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","status":"queued","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","is_preview":false,"editor_url":"\u003cstring>","task_type":"transcribe","progress_percent":0,"progress_stage":"compositing","output":{"url":"https://cdn-user.framelane.io/render_01J.../output.mp4","width":1920,"height":1080,"duration":15.3,"size_bytes":12582912},"result":{"language_code":"en","text":"Welcome back to the show."},"error":{"code":"invalid_source","message":"Source URL returned 404."},"metadata":{"project_id":"proj_123","user_ref":"usr_abc"},"completed_at":"2023-11-07T05:31:56Z"},"sheet":{"columns":123,"rows":123,"width":123,"window":{"from":1,"to":123},"cells":[{"index":123,"at":123,"reason":"first_frame"}]},"task":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"09259f4b-cdd8-4ee3-bba7-78156b982773":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"03bab54a-7514-45f4-bd8f-31b5bd345049":{"description":"Project not found.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"f5fbfe9b-dfe2-4e7c-acff-96713d2cb10d":{"description":"Unsupported source.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"67f2115c-3b9d-4dbd-ba3c-2d57c2c39b12":{"ApiKey":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"ApiKey"}}},"servers":{"374e059c-6af0-4c50-a102-7400af30babb":{"url":"https://api.framelane.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"ApiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKey","name":"Authorization"}],"title":"ApiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"itis-c7dc7146","siteName":"Framelane","title":"Preview or validate the project head - Framelane","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-25T13:55:55.643Z","originalFileLocation":"api-reference/projects/preview-or-validate-the-project-head.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Framelane\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Preview or validate the project head - Framelane\">\u003cmeta data-mint-head property=\"og:description\" content=\"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Framelane\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cdn-assets.framelane.io/shared/images/og-docs.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Preview or validate the project head - Framelane\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cdn-assets.framelane.io/shared/images/og-docs.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Framelane\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0070f3\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/projects/preview-or-validate-the-project-head.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.framelane.io/#organization\",\"name\":\"Framelane\",\"url\":\"https://docs.framelane.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-light.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a819adfb6e5b9a97575f20c034d41c77\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.framelane.io#website\",\"name\":\"Framelane\",\"url\":\"https://docs.framelane.io\",\"publisher\":{\"@id\":\"https://docs.framelane.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head#webpage\",\"url\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head\",\"name\":\"Preview or validate the project head\",\"description\":\"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\",\"dateModified\":\"2026-10-25T13:55:55.643Z\",\"isPartOf\":{\"@id\":\"https://docs.framelane.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Projects\",\"item\":\"https://docs.framelane.io/api-reference/projects/create-a-project\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preview or validate the project head\",\"item\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head#apireference\",\"headline\":\"Preview or validate the project head\",\"name\":\"Preview or validate the project head\",\"description\":\"Validate the project head cheaply, or preview it at a frame or window without a full render. Same free linter and faithful sliced preview as POST /v1/preview, against the stored head instead of an inline request.\",\"url\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head\",\"mainEntityOfPage\":{\"@id\":\"https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head#webpage\"},\"image\":\"https://cdn-assets.framelane.io/shared/images/og-docs.png\",\"dateModified\":\"2026-10-25T13:55:55.643Z\",\"publisher\":{\"@id\":\"https://docs.framelane.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.framelane.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Framelane\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Framelane","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/framelane"},{"anchor":"Status","icon":"signal-bars","href":"https://status.framelane.io"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/mcp/overview"}]},{"tab":"API Reference","groups":[{"group":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"},{"title":"RenderRequest schema reference","href":"/api-reference/render-request"}]},{"group":"Discovery","pages":[{"title":"List render and task capabilities","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/capabilities","href":"/api-reference/capabilities/list-render-and-task-capabilities"}]},{"group":"Onboarding","pages":[{"title":"Create a workspace and send an OTP verification email","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/signup","href":"/api-reference/signup/create-a-workspace-and-send-an-otp-verification-email"},{"title":"Verify email with OTP code","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/signup/verify","href":"/api-reference/signup/verify-email-with-otp-code"},{"title":"Sync a Clerk session to a Framelane workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/auth/sync","href":"/api-reference/auth/sync-a-clerk-session-to-a-framelane-workspace"}]},{"group":"Renders","pages":[{"title":"Submit a render job","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/renders","href":"/api-reference/renders/submit-a-render-job"},{"title":"List renders","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders","href":"/api-reference/renders/list-renders"},{"title":"Get a render","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}","href":"/api-reference/renders/get-a-render"},{"title":"Cancel a render","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/renders/{render_id}","href":"/api-reference/renders/cancel-a-render"},{"title":"Download render artifact","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}/download","href":"/api-reference/renders/download-render-artifact"},{"title":"Get render poster image","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}/poster","href":"/api-reference/renders/get-render-poster-image"}]},{"group":"Preview","pages":[{"title":"Validate or preview a composition","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/preview","href":"/api-reference/preview/validate-or-preview-a-composition"}]},{"group":"Projects","pages":[{"title":"Create a project","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects","href":"/api-reference/projects/create-a-project"},{"title":"List projects","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/projects","href":"/api-reference/projects/list-projects"},{"title":"Get a project","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/projects/{project_id}","href":"/api-reference/projects/get-a-project"},{"title":"Rename a project","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/projects/{project_id}","href":"/api-reference/projects/rename-a-project"},{"title":"Delete a project","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/projects/{project_id}","href":"/api-reference/projects/delete-a-project"},{"title":"Apply targeted edits","description":"Apply an atomic batch of ops to the project head. Returns the new version, the ids touched, a compact diff, and validation that rides along for free. Pass `if_version` for optimistic concurrency (409 on mismatch), and `dry_run` to see the same result without saving a version. `apply_template` replaces the composition with a template's and records the template as the project's source.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/ops","href":"/api-reference/projects/apply-targeted-edits"},{"title":"Preview or validate the project head","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/preview","href":"/api-reference/projects/preview-or-validate-the-project-head"},{"title":"Refresh the project thumbnail","description":"Queue a poster frame of the head: a single-frame preview (not billed) at the first moment the contact-sheet planner picks after zero. When it completes, the project's `thumbnail_url` and `thumbnail_version` update; the thumbnail is stale while `thumbnail_version` is below `version`. A call while one is in flight for the same version returns that job instead of queueing another. Saving a template and publishing one ask for a thumbnail on their own.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/thumbnail","href":"/api-reference/projects/refresh-the-project-thumbnail"},{"title":"Render the project head","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/renders","href":"/api-reference/projects/render-the-project-head"}]},{"group":"Templates","pages":[{"title":"Templates","href":"/api-reference/templates"},{"title":"List templates","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/templates","href":"/api-reference/templates/list-templates"},{"title":"Get a template","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/templates/{id_or_slug}","href":"/api-reference/templates/get-a-template"},{"title":"Publish a template","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/templates","href":"/api-reference/templates/publish-a-template"},{"title":"Update a template listing","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/templates/{listing_id}","href":"/api-reference/templates/update-a-template-listing"},{"title":"Unpublish a template","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/templates/{listing_id}","href":"/api-reference/templates/unpublish-a-template"}]},{"group":"Brand Kits","pages":[{"title":"Extract a brand kit from a URL","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/brand-kits","href":"/api-reference/brand-kits/extract-a-brand-kit-from-a-url"},{"title":"List brand kits","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/brand-kits","href":"/api-reference/brand-kits/list-brand-kits"},{"title":"Get a brand kit","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/get-a-brand-kit"},{"title":"Override brand kit fields","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/override-brand-kit-fields"},{"title":"Delete a brand kit","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/delete-a-brand-kit"}]},{"group":"Shaders","pages":[{"title":"Runtime shaders","href":"/api-reference/shaders"},{"title":"Compile and store a shader","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders","href":"/api-reference/shaders/compile-and-store-a-shader"},{"title":"List shaders","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/shaders","href":"/api-reference/shaders/list-shaders"},{"title":"Get a shader","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/shaders/{shader_id}","href":"/api-reference/shaders/get-a-shader"},{"title":"Delete a shader","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/shaders/{shader_id}","href":"/api-reference/shaders/delete-a-shader"},{"title":"Render one frame of a shader","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders/{shader_id}/probe","href":"/api-reference/shaders/render-one-frame-of-a-shader"}]},{"group":"Tasks","pages":[{"title":"Transcribe task","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/tasks/transcribe","href":"/api-reference/tasks/transcribe-task"},{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks","href":"/api-reference/tasks/list-tasks"},{"title":"Get a task","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks/{task_id}","href":"/api-reference/tasks/get-a-task"},{"title":"Cancel a task","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/tasks/{task_id}","href":"/api-reference/tasks/cancel-a-task"},{"title":"Download task artifact","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks/{task_id}/download","href":"/api-reference/tasks/download-task-artifact"}]},{"group":"Uploads","pages":[{"title":"Request a file upload URL","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/uploads","href":"/api-reference/uploads/request-a-file-upload-url"}]},{"group":"Webhooks","pages":[{"title":"Register webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks","href":"/api-reference/webhooks/register-webhook"},{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Get webhook","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/get-webhook"},{"title":"Update webhook","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/update-webhook"},{"title":"Delete webhook","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/delete-webhook"},{"title":"Send test event","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/test","href":"/api-reference/webhooks/send-test-event"},{"title":"Rotate signing secret","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/rotate-secret","href":"/api-reference/webhooks/rotate-signing-secret"},{"title":"List delivery attempts","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks/{webhook_id}/deliveries","href":"/api-reference/webhooks/list-delivery-attempts"},{"title":"Retry a delivery","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/deliveries/{delivery_id}/retry","href":"/api-reference/webhooks/retry-a-delivery"}]},{"group":"Account","pages":[{"group":"Workspace","pages":[{"title":"Get workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace","href":"/api-reference/workspace/get-workspace"},{"title":"Update workspace","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/workspace","href":"/api-reference/workspace/update-workspace"},{"title":"Get workspace usage","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace/usage","href":"/api-reference/workspace/get-workspace-usage"},{"title":"List workspace media assets","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace/assets","href":"/api-reference/workspace/list-workspace-media-assets"},{"title":"Delete workspace","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/workspace","href":"/api-reference/workspace/delete-workspace"}]},{"group":"API Keys","pages":[{"title":"Create API key","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/api-keys","href":"/api-reference/api-keys/create-api-key"},{"title":"List API keys","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Revoke API key","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/api-keys/{key_id}","href":"/api-reference/api-keys/revoke-api-key"}]},{"group":"Billing","pages":[{"title":"Create a Paddle Customer Portal session","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/billing/portal","href":"/api-reference/billing/create-a-paddle-customer-portal-session"}]}]}]}]},"title":"Preview or validate the project head - Framelane","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}