Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.
The SkSL body: half4 main(float2 uv) (uv 0 to 1 from the top-left), or Jitter's half4 jitterMain(float2 uv). No uniform declarations: uniforms come from the prelude and params.
{"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":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/shaders/compile-and-store-a-shader","slug":"/api-reference/shaders/compile-and-store-a-shader","pageMetadata":{"title":"Compile and store a shader","description":"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned `id` as `effects[].shader.id` on a video, image, shape, frame or instance; `POST /v1/shaders/{id}/probe` renders one frame of it first.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders","href":"/api-reference/shaders/compile-and-store-a-shader","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned \", _jsx(_components.code, {\n children: \"id\"\n }), \" as \", _jsx(_components.code, {\n children: \"effects[].shader.id\"\n }), \" on a video, image, shape, frame or instance; \", _jsx(_components.code, {\n children: \"POST /v1/shaders/{id}/probe\"\n }), \" renders one frame of it first.\"]\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":"Compile and store a shader","description":"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned `id` as `effects[].shader.id` on a video, image, shape, frame or instance; `POST /v1/shaders/{id}/probe` renders one frame of it first.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders","href":"/api-reference/shaders/compile-and-store-a-shader","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["shaders"],"summary":"Compile and store a shader","description":"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned `id` as `effects[].shader.id` on a video, image, shape, frame or instance; `POST /v1/shaders/{id}/probe` renders one frame of it first.","operationId":"create_shader","security":["a09b721c-3ac3-43cb-b599-b0bb1b8067ee"],"requestBody":"7a6d3aab-b987-4a4b-bcba-27c60c8aecef","responses":{"201":"a1f5b7e7-65f6-48a1-a368-4c025c549933","401":"ce8e673b-d088-41c2-88fd-36720233b2c8","422":"523eb009-c077-4ae9-9d0a-44e1125bbfb3","503":"fa55048e-c49d-41ce-a3dd-e4a72d3002bd"},"method":"post","type":"path","servers":["374e059c-6af0-4c50-a102-7400af30babb"],"path":"/v1/shaders","baseUrlOptions":["https://api.framelane.io"],"title":"Compile and store a shader","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"A label, carried into renders as the entry's name.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"source":{"type":"string","minLength":1,"title":"Source","description":"The SkSL body: `half4 main(float2 uv)` (uv 0 to 1 from the top-left), or Jitter's `half4 jitterMain(float2 uv)`. No `uniform` declarations: uniforms come from the prelude and `params`.","isRequired":true,"uniqueKey":"source","typeLabel":"string"},"lang":{"type":"string","const":"sksl","title":"Lang","description":"The source language; SkSL is the only one.","default":"sksl","uniqueKey":"lang","typeLabel":"string"},"jitter":{"oneOf":[{"type":"boolean","title":"Jitter","description":"Compile in Jitter's dialect. Omitted: when the source defines `jitterMain`.","uniqueKey":"jitter.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Jitter","description":"Compile in Jitter's dialect. Omitted: when the source defines `jitterMain`.","uniqueKey":"jitter.oneOf.1","typeLabel":"null"}],"uniqueKey":"jitter","typeLabel":"boolean | null"},"params":{"items":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name","description":"A letter, then letters, digits and single underscores; not a prelude name (`time` is taken by `u_time`). The shader reads it as `u_\u003cname>`.","example":"speed","isRequired":true,"uniqueKey":"params.items.[INDEX].name","typeLabel":"string"},"type":{"type":"string","enum":["float","color","vec2"],"title":"Type","description":"`float`, `color` (straight-alpha RGBA) or `vec2`.","isRequired":true,"uniqueKey":"params.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"default":{"oneOf":[{"type":"number","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.0","typeLabel":"number"},{"type":"string","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"params.items.[INDEX].default.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","maxItems":2,"minItems":2,"uniqueKey":"params.items.[INDEX].default.oneOf.2","typeLabel":"number[]"},{"type":"null","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.3","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].default","typeLabel":"number | string | number[] | null"},"min":{"oneOf":[{"type":"number","title":"Min","description":"Lowest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].min.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min","description":"Lowest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].min.oneOf.1","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].min","typeLabel":"number | null"},"max":{"oneOf":[{"type":"number","title":"Max","description":"Highest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].max.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max","description":"Highest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].max.oneOf.1","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].max","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["name","type"],"title":"ShaderParamSpec","description":"A declared param: bound in the shader as `u_\u003cname>`, set per effect by name.","uniqueKey":"params.items.[INDEX]","typeLabel":"ShaderParamSpec · object"},"type":"array","title":"Params","description":"The params the source reads, in order.","default":[],"uniqueKey":"params","typeLabel":"ShaderParamSpec · object[]"}},"additionalProperties":false,"type":"object","required":["name","source"],"title":"ShaderCreate","description":"``POST /v1/shaders``: compile an SkSL source and store it.","uniqueKey":"","typeLabel":"ShaderCreate · object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","source":"\u003cstring>","lang":"sksl","jitter":true,"params":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"a1f5b7e7-65f6-48a1-a368-4c025c549933":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"id":{"type":"string","title":"Id","description":"Its id, for `effects[].shader.id`.","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"name":{"type":"string","title":"Name","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"lang":{"type":"string","title":"Lang","isRequired":true,"uniqueKey":"lang","typeLabel":"string"},"hash":{"type":"string","title":"Hash","description":"SHA-256 of \"sksl\\n\" + source, 64 lowercase hex digits: the entry's identity.","isRequired":true,"uniqueKey":"hash","typeLabel":"string"},"jitter":{"type":"boolean","title":"Jitter","description":"Compiled in Jitter's dialect.","isRequired":true,"uniqueKey":"jitter","typeLabel":"boolean"},"status":{"type":"string","enum":["compiled","failed"],"title":"Status","description":"`failed` shaders cannot render; `errors` says why.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"params":{"items":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name","description":"A letter, then letters, digits and single underscores; not a prelude name (`time` is taken by `u_time`). The shader reads it as `u_\u003cname>`.","example":"speed","isRequired":true,"uniqueKey":"params.items.[INDEX].name","typeLabel":"string"},"type":{"type":"string","enum":["float","color","vec2"],"title":"Type","description":"`float`, `color` (straight-alpha RGBA) or `vec2`.","isRequired":true,"uniqueKey":"params.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"default":{"oneOf":[{"type":"number","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.0","typeLabel":"number"},{"type":"string","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"params.items.[INDEX].default.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","maxItems":2,"minItems":2,"uniqueKey":"params.items.[INDEX].default.oneOf.2","typeLabel":"number[]"},{"type":"null","title":"Default","description":"Its value where an effect does not set it. Omitted: 0, transparent black or [0, 0].","uniqueKey":"params.items.[INDEX].default.oneOf.3","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].default","typeLabel":"number | string | number[] | null"},"min":{"oneOf":[{"type":"number","title":"Min","description":"Lowest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].min.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min","description":"Lowest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].min.oneOf.1","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].min","typeLabel":"number | null"},"max":{"oneOf":[{"type":"number","title":"Max","description":"Highest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].max.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max","description":"Highest value an effect may set (a vec2's each component).","uniqueKey":"params.items.[INDEX].max.oneOf.1","typeLabel":"null"}],"uniqueKey":"params.items.[INDEX].max","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["name","type"],"title":"ShaderParamSpec","description":"A declared param: bound in the shader as `u_\u003cname>`, set per effect by name.","uniqueKey":"params.items.[INDEX]","typeLabel":"ShaderParamSpec · object"},"type":"array","title":"Params","isRequired":true,"uniqueKey":"params","typeLabel":"ShaderParamSpec · object[]"},"shared":{"type":"boolean","title":"Shared","description":"A shared shader every workspace can use, and none can delete.","isRequired":true,"uniqueKey":"shared","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","title":"Created At","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"errors":{"items":{"properties":{"line":{"type":"integer","title":"Line","description":"1-based line in the source; 0 when the error is not in it (a param).","isRequired":true,"uniqueKey":"errors.items.[INDEX].line","typeLabel":"integer"},"col":{"type":"integer","title":"Col","description":"1-based column in the source; 0 with line 0.","isRequired":true,"uniqueKey":"errors.items.[INDEX].col","typeLabel":"integer"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"type":"object","required":["line","col","message"],"title":"ShaderCompileError","uniqueKey":"errors.items.[INDEX]","typeLabel":"ShaderCompileError · object"},"type":"array","title":"Errors","description":"The compiler's errors, with positions.","default":[],"uniqueKey":"errors","typeLabel":"ShaderCompileError · object[]"},"variant_hashes":{"additionalProperties":{"type":"string","uniqueKey":"variant_hashes.additionalProperties","typeLabel":"string"},"type":"object","title":"Variant Hashes","description":"SHA-256 of each variant (`glsl330`, `glsles300`, `wgsl`), as the engines check them.","default":{},"uniqueKey":"variant_hashes","typeLabel":"Variant Hashes · object"},"source":{"oneOf":[{"type":"string","title":"Source","description":"The SkSL source (`?view=full`).","uniqueKey":"source.oneOf.0","typeLabel":"string"},{"type":"null","title":"Source","description":"The SkSL source (`?view=full`).","uniqueKey":"source.oneOf.1","typeLabel":"null"}],"uniqueKey":"source","typeLabel":"string | null"},"variants":{"oneOf":[{"type":"object","title":"Variants","description":"The compiled variants' text (`?view=full`).","additionalProperties":{"type":"string","uniqueKey":"variants.oneOf.0.additionalProperties","typeLabel":"string"},"uniqueKey":"variants.oneOf.0","typeLabel":"Variants · object"},{"type":"null","title":"Variants","description":"The compiled variants' text (`?view=full`).","uniqueKey":"variants.oneOf.1","typeLabel":"null"}],"uniqueKey":"variants","typeLabel":"Variants · object | null"}},"type":"object","required":["id","name","lang","hash","jitter","status","params","shared","created_at","updated_at"],"title":"ShaderOut","description":"A stored shader. `variants` and `source` come back with `?view=full` only.","uniqueKey":"","typeLabel":"ShaderOut · object"},"examples":{"Example":{"title":"Example","value":{"id":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","name":"\u003cstring>","lang":"\u003cstring>","hash":"\u003cstring>","jitter":true,"status":"compiled","params":[{"name":"speed","type":"float","default":123,"min":123,"max":123}],"shared":true,"created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","errors":[],"variant_hashes":{},"source":"\u003cstring>","variants":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"ce8e673b-d088-41c2-88fd-36720233b2c8":{"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"},"523eb009-c077-4ae9-9d0a-44e1125bbfb3":{"description":"`shader_compile_error`: the source did not compile (`details.errors` lists each error with its line and column; the failed shader is stored as `details.shader_id`), or `source_too_large`.","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"},"fa55048e-c49d-41ce-a3dd-e4a72d3002bd":{"description":"`shader_compiler_unavailable`: no compiler on this deployment, or it timed out.","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":{"a09b721c-3ac3-43cb-b599-b0bb1b8067ee":{"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":"Compile and store a shader - Framelane","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-25T13:55:55.765Z","originalFileLocation":"api-reference/shaders/compile-and-store-a-shader.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=\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.\">\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=\"Compile and store a shader - Framelane\">\u003cmeta data-mint-head property=\"og:description\" content=\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Framelane\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader\">\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=\"Compile and store a shader - Framelane\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.\">\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/shaders/compile-and-store-a-shader\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/shaders/compile-and-store-a-shader.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/shaders/compile-and-store-a-shader#webpage\",\"url\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader\",\"name\":\"Compile and store a shader\",\"description\":\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.\",\"dateModified\":\"2026-10-25T13:55:55.765Z\",\"isPartOf\":{\"@id\":\"https://docs.framelane.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Shaders\",\"item\":\"https://docs.framelane.io/api-reference/shaders\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Compile and store a shader\",\"item\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader#apireference\",\"headline\":\"Compile and store a shader\",\"name\":\"Compile and store a shader\",\"description\":\"Compile an SkSL source into the GLSL and WGSL variants the render engines run, and store it. Use the returned id as effects[].shader.id on a video, image, shape, frame or instance; POST /v1/shaders/{id}/probe renders one frame of it first.\",\"url\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader\",\"mainEntityOfPage\":{\"@id\":\"https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader#webpage\"},\"image\":\"https://cdn-assets.framelane.io/shared/images/og-docs.png\",\"dateModified\":\"2026-10-25T13:55:55.765Z\",\"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","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","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","description":"Write a shader in SkSL, compile it once, and run it in any element's effect chain, on the render farm and in the preview alike.","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","description":"This workspace's shaders and the shared ones, newest first, without variant text.","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":"Compile and store a shader - 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"]}