# Framelane - [Overview](https://docs.framelane.io/introduction/overview.md): Framelane is a developer API for GPU-accelerated video rendering and AI media processing. - [Quickstart](https://docs.framelane.io/introduction/quickstart.md): Upload media, submit your first render, and download the output in under 10 minutes. - [Authentication](https://docs.framelane.io/introduction/authentication.md): All API requests require a Bearer API key. - [Self-provisioning for agents](https://docs.framelane.io/introduction/self-provisioning.md): How an autonomous agent discovers Framelane and provisions its own API key — no human, no browser. - [Uploading media](https://docs.framelane.io/introduction/uploads.md): Upload local files to Framelane before using them in renders or tasks. - [Workspace brand kits](https://docs.framelane.io/introduction/brand-kits.md): Reuse approved colors, media, and custom fonts in the console, editor and API. - [Errors](https://docs.framelane.io/introduction/errors.md): Framelane uses structured error codes in all error responses. - [Rate Limits](https://docs.framelane.io/introduction/rate-limits.md): Per-IP and per-workspace rate limits protect the API from abuse. - [Production Checklist](https://docs.framelane.io/introduction/production-checklist.md): Before going live, verify these items. - [Changelog](https://docs.framelane.io/introduction/changelog.md): Renderer and API changes that alter what an existing request draws, and what is new. - [Renders](https://docs.framelane.io/renders/overview.md): Compose and render video from a timeline of elements. - [Playground](https://docs.framelane.io/renders/playground.md): Build a composition visually, preview it in your browser with WebGPU, then copy the exact render request. - [Elements](https://docs.framelane.io/renders/elements.md): Every field accepted by each element type — required fields, defaults, and constraints. - [Preview](https://docs.framelane.io/renders/preview.md): Validate a composition for free, or render a cheap single frame, window clip, or whole-timeline contact sheet before spending a full render. - [Video Examples](https://docs.framelane.io/renders/examples/video.md): Request bodies for video element features. - [Audio Examples](https://docs.framelane.io/renders/examples/audio.md): Request bodies for audio element features. - [Text Examples](https://docs.framelane.io/renders/examples/text.md): Request bodies for text element features. - [Image Examples](https://docs.framelane.io/renders/examples/image.md): Request bodies for image element features. - [Color Adjustments](https://docs.framelane.io/renders/examples/color-adjustments.md): Request bodies for brightness, contrast, LUT, and other color controls. - [Effects Examples](https://docs.framelane.io/renders/examples/effects.md): Request bodies for visual effects on video, image, and shape elements. - [Motion Examples](https://docs.framelane.io/renders/examples/motion.md): Request bodies for element and character motion presets. - [Word Animation Examples](https://docs.framelane.io/renders/examples/word-animation.md): Request bodies for word-level animations. - [Transition Examples](https://docs.framelane.io/renders/examples/transitions.md): Request bodies for transitions between video clips. - [Layered Video Composition](https://docs.framelane.io/renders/recipes/layered-video-composition.md): Stack multiple video layers with vintage and bokeh effects, add a picture-in-picture overlay, and sequence text with fade, difference, overlay, and evaporate motion — all in 4K from a single request. - [TikTok Captions](https://docs.framelane.io/renders/recipes/tik-tok-captions.md): 9:16 vertical reel with sequential karaoke captions — mix color, box, and glow word animations across different fonts and styles in a single request. - [Text Behind the Speaker](https://docs.framelane.io/renders/recipes/text-behind-speaker.md): A z-depth sandwich — giant title text sits behind a cutout speaker, karaoke captions float on top, and a logo sting opens the clip. The viral motion-graphics format that looks like it required rotoscoping. - [Cutting](https://docs.framelane.io/projects/cutting.md): Take source ranges out of video and audio in one atomic project op, by time or by transcript words, and let the rest of the timeline close up. - [Tasks](https://docs.framelane.io/tasks/overview.md): Standalone AI media jobs that run outside a render. - [Transcribe](https://docs.framelane.io/tasks/transcribe.md): Convert speech to text with word-level timestamps and speaker labels. - [Webhooks](https://docs.framelane.io/webhooks/overview.md): Subscribe to job lifecycle events with HMAC-signed, retry-guaranteed delivery. - [Events](https://docs.framelane.io/webhooks/events.md): All webhook event types and their payload shapes. - [Signature Verification](https://docs.framelane.io/webhooks/signature-verification.md): Verify HMAC-SHA256 signatures to ensure payloads come from Framelane. - [Retry Schedule](https://docs.framelane.io/webhooks/retry-schedule.md): Framelane retries failed webhook deliveries automatically on an exponential back-off schedule. - [Author a video](https://docs.framelane.io/guides/author-video.md): The renderer semantics an agent must know to author a RenderRequest that renders right the first time — timing, layering, positioning, and the silent defaults that trip agents up. - [Measure a reference](https://docs.framelane.io/guides/measure-reference.md): Extract exact colors, positions, and timings from reference footage instead of authoring from memory — the cheapest way to match a look. - [Render Video](https://docs.framelane.io/guides/render-video.md): Submit a render job, wait for completion, and return the signed artifact URL. - [Transcribe](https://docs.framelane.io/guides/transcribe.md): Transcribe audio or video to text with word-level timestamps and optional speaker diarisation. - [Generate Social Clip](https://docs.framelane.io/guides/generate-social-clip.md): Trim a source segment, crop to 9:16, transcribe, and render TikTok-style multi-style karaoke captions. - [Batch Tasks](https://docs.framelane.io/guides/batch-tasks.md): Submit N tasks in parallel, track all to completion, and return a results map. - [Webhook Setup](https://docs.framelane.io/guides/webhook-setup.md): Register a webhook endpoint, verify the signing secret, and handle events idempotently. - [TypeScript SDK](https://docs.framelane.io/sdks/typescript.md): Official TypeScript SDK for the Framelane API. - [Python SDK](https://docs.framelane.io/sdks/python.md): Official Python SDK for the Framelane API. - [MCP Server](https://docs.framelane.io/mcp/overview.md): Connect Framelane to Claude, Cursor, or any MCP-capable agent framework. - [Agent Skills](https://docs.framelane.io/agent-skills/overview.md): Written workflows that teach an AI agent to make video with Framelane, served by the MCP server and installable as an agent-skills bundle. - [API Reference](https://docs.framelane.io/api-reference/introduction.md): REST endpoints for renders, AI tasks, uploads, webhooks, and account management. - [RenderRequest schema reference](https://docs.framelane.io/api-reference/render-request.md): Every field the render API accepts on a RenderRequest, generated from the pydantic source of truth so it never drifts. - [List render and task capabilities](https://docs.framelane.io/api-reference/capabilities/list-render-and-task-capabilities.md): Return the catalog of everything an agent can use in a render or task — effects, motions, transitions, output/input formats, element types, task parameters, and global limits — each flagged with whether it is supported today. - [Create a workspace and send an OTP verification email](https://docs.framelane.io/api-reference/signup/create-a-workspace-and-send-an-otp-verification-email.md): Creates a new workspace and API key, then sends a 6-digit OTP to the supplied email address. Calling this endpoint again with the same email rotates the API key and re-sends the OTP (idempotent). The rotated key is gated until you re-verify with the new OTP, so knowing an email alone never yields a… - [Verify email with OTP code](https://docs.framelane.io/api-reference/signup/verify-email-with-otp-code.md): Submit the 6-digit OTP sent to the email supplied during signup. On success the workspace is marked as email-verified and the OTP is consumed. After 5 wrong guesses the code is invalidated and a new signup call is required to obtain a fresh one. - [Sync a Clerk session to a Framelane workspace](https://docs.framelane.io/api-reference/auth/sync-a-clerk-session-to-a-framelane-workspace.md): Verify a Clerk session token and create, adopt or return the workspace for that Clerk user. On first login a Workspace and initial API key are created and the plaintext key is returned once. If an email-signup workspace already exists for the verified Clerk primary email it is adopted instead, keepi… - [Submit a render job](https://docs.framelane.io/api-reference/renders/submit-a-render-job.md): Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY `ok` + `violations[]` lint of the composition: the render i… - [List renders](https://docs.framelane.io/api-reference/renders/list-renders.md): Returns a cursor-paginated list of render jobs for the authenticated workspace. - [Get a render](https://docs.framelane.io/api-reference/renders/get-a-render.md): Fetch a render's status. Pass `wait` (seconds) to long-poll: the request holds until the render reaches a terminal status (`completed`/`failed`/`cancelled`) or the hold elapses, then returns the current status — one call instead of a poll loop, which is the agent-first way to wait (also covers previ… - [Cancel a render](https://docs.framelane.io/api-reference/renders/cancel-a-render.md): Cancel a render job. Best-effort — a render already picked up by a worker may finish before the cancel signal is observed. A no-op if the render has already reached a terminal status (`completed`, `failed`, or `cancelled`). - [Download render artifact](https://docs.framelane.io/api-reference/renders/download-render-artifact.md): Redirects to a short-lived signed GCS URL for the completed render artifact. - [Get render poster image](https://docs.framelane.io/api-reference/renders/get-render-poster-image.md): Redirects to a short-lived signed URL for a completed render's poster IMAGE — e.g. a contact-sheet preview PNG. This is the pixels-you-can-embed counterpart to the MCP `get_render_preview` tool. Returns 422 if the render output is a video; use `/download` for that. - [Validate or preview a composition](https://docs.framelane.io/api-reference/preview/validate-or-preview-a-composition.md): Validate a RenderRequest cheaply, or preview it at a single frame or over a short window without a full render. Pass `dry_run: true` for the free linter (cross-element and whole-timeline invariants, no render); it also returns the translated render `task`. A pixel preview reuses the exact render pip… - [Create a project](https://docs.framelane.io/api-reference/projects/create-a-project.md): Create a stateful editing project from a RenderRequest, or empty. Elements without an id are assigned one so ops can address them. Returns the full project at version 1, plus an ADVISORY `ok` + `violations[]` lint of the seed composition — a project is allowed to hold an invalid head while you repai… - [List projects](https://docs.framelane.io/api-reference/projects/list-projects.md): Cursor-paginated projects for the workspace. Each item is a compact summary. `kind` defaults to `project`, so templates are listed only with `kind=template` or `kind=all`. - [Get a project](https://docs.framelane.io/api-reference/projects/get-a-project.md): Returns a project. `view=summary` (default) omits the full request; `view=full` includes it. A published template from another workspace reads here too, read-only: every write route answers 404 for it. - [Rename a project](https://docs.framelane.io/api-reference/projects/rename-a-project.md): Rename a project or template. Bumps `updated_at`; the head and its version are unchanged. - [Delete a project](https://docs.framelane.io/api-reference/projects/delete-a-project.md): Soft-delete a project. It stops appearing in list/get calls, but its op history and any renders submitted from it are kept. - [Apply targeted edits](https://docs.framelane.io/api-reference/projects/apply-targeted-edits.md): 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` replac… - [Preview or validate the project head](https://docs.framelane.io/api-reference/projects/preview-or-validate-the-project-head.md): 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. - [Refresh the project thumbnail](https://docs.framelane.io/api-reference/projects/refresh-the-project-thumbnail.md): 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… - [Render the project head](https://docs.framelane.io/api-reference/projects/render-the-project-head.md): Submit the current project head to the render engine as a standard (billable) render. Idempotency-Key note: reusing a key returns the original job unconditionally -- the body (here, the project head at submission time) is not compared, so a key reused after the project changed still replays the earl… - [Templates](https://docs.framelane.io/api-reference/templates.md): Start a project from a template, save a project as one, or swap a template into an open project. - [List templates](https://docs.framelane.io/api-reference/templates/list-templates.md): The template gallery, newest first. No API key needed: without one the list is the public catalogue. With one, `scope` defaults to `all`, adding your own templates (`scope: workspace` on each card). Filter with `category`, `q` (name, title or description contains, case-insensitive), `aspect` and `fa… - [Get a template](https://docs.framelane.io/api-reference/templates/get-a-template.md): One template by project id or listing slug, with its `render_request`, so it can be inspected before it is used. No API key needed for a published template. - [Publish a template](https://docs.framelane.io/api-reference/templates/publish-a-template.md): Admin workspaces only. List one of your template projects in the gallery. `status: published` makes it public, which needs every media URL in its composition on the shared CDN (`template_assets_not_shared` lists the rest) and no `webhook_url` (`template_has_webhook`), since every copy inherits it; a… - [Update a template listing](https://docs.framelane.io/api-reference/templates/update-a-template-listing.md): Admin workspaces only. Send only the fields that change; null clears an optional one. A listing that ends up published is checked like a new one. - [Unpublish a template](https://docs.framelane.io/api-reference/templates/unpublish-a-template.md): Admin workspaces only. Deletes the listing; the template project stays. - [Extract a brand kit from a URL](https://docs.framelane.io/api-reference/brand-kits/extract-a-brand-kit-from-a-url.md) - [List brand kits](https://docs.framelane.io/api-reference/brand-kits/list-brand-kits.md) - [Get a brand kit](https://docs.framelane.io/api-reference/brand-kits/get-a-brand-kit.md) - [Edit brand kit library details](https://docs.framelane.io/api-reference/brand-kits/edit-brand-kit-library-details.md) - [Delete an extracted brand kit](https://docs.framelane.io/api-reference/brand-kits/delete-an-extracted-brand-kit.md) - [Runtime shaders](https://docs.framelane.io/api-reference/shaders.md): 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. - [Compile and store a shader](https://docs.framelane.io/api-reference/shaders/compile-and-store-a-shader.md): 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. - [List shaders](https://docs.framelane.io/api-reference/shaders/list-shaders.md): This workspace's shaders and the shared ones, newest first, without variant text. - [Get a shader](https://docs.framelane.io/api-reference/shaders/get-a-shader.md): One shader; `?view=full` adds its source and the compiled variants' text. - [Delete a shader](https://docs.framelane.io/api-reference/shaders/delete-a-shader.md): Remove one of this workspace's shaders. Renders already made with it are unaffected (a render carries the compiled variants); a document that still names it is refused with `shader_not_found` at its next render. - [Render one frame of a shader](https://docs.framelane.io/api-reference/shaders/render-one-frame-of-a-shader.md): Queue a one-frame preview (a PNG, not billed) of the shader on a full-canvas shape over a three-hue fill, at `time` with `params`. Poll the returned job with GET /v1/renders/{id}, as for any preview. - [Transcribe task](https://docs.framelane.io/api-reference/tasks/transcribe-task.md): Submit a media URL for transcription. Runs asynchronously — the task is accepted with `202` and moves through `queued` → `processing` → a terminal status; poll `GET /v1/tasks/{task_id}` or pass `wait` there to long-poll. Supports word-level timestamps and speaker diarisation. - [List tasks](https://docs.framelane.io/api-reference/tasks/list-tasks.md): Returns a cursor-paginated list of tasks for the workspace. Filter by type or status. - [Get a task](https://docs.framelane.io/api-reference/tasks/get-a-task.md): Fetch a task's status. Pass `wait` (seconds) to long-poll: the request holds until the task reaches a terminal status (`completed`/`failed`/`cancelled`) or the hold elapses, then returns the current status — one call instead of a poll loop. When it returns still in-flight, `Retry-After: 0` is set; r… - [Cancel a task](https://docs.framelane.io/api-reference/tasks/cancel-a-task.md): Cancel a task job. Best-effort — a task already picked up by a worker may finish before the cancel signal is observed. A no-op if the task has already reached a terminal status (`completed`, `failed`, or `cancelled`). - [Download task artifact](https://docs.framelane.io/api-reference/tasks/download-task-artifact.md): Redirects to a short-lived signed GCS URL for the completed task artifact. - [Request a file upload URL](https://docs.framelane.io/api-reference/uploads/request-a-file-upload-url.md): Returns a GCS resumable upload URL and the corresponding CDN source URL. PUT your file bytes directly to `upload_url` with the correct `Content-Type` header. Once the upload completes, pass `source_url` as the `source_url` field in any render or task request. - [Register webhook](https://docs.framelane.io/api-reference/webhooks/register-webhook.md): Register an HTTPS endpoint to receive job events. The signing secret is returned once — use it to verify HMAC signatures on payloads. - [List webhooks](https://docs.framelane.io/api-reference/webhooks/list-webhooks.md): Returns a cursor-paginated list of webhook endpoints registered for the workspace. - [Get webhook](https://docs.framelane.io/api-reference/webhooks/get-webhook.md): Fetch a single webhook endpoint's configuration. - [Update webhook](https://docs.framelane.io/api-reference/webhooks/update-webhook.md): Update a webhook's URL, subscribed event types, or enabled state. Omitted fields are left unchanged. - [Delete webhook](https://docs.framelane.io/api-reference/webhooks/delete-webhook.md): Permanently remove a webhook endpoint. Framelane stops delivering events to it immediately. - [Send test event](https://docs.framelane.io/api-reference/webhooks/send-test-event.md): Send a synthetic `webhook.test` event to the endpoint and return the delivery result, so you can verify the URL and signature handling before relying on real job events. - [Rotate signing secret](https://docs.framelane.io/api-reference/webhooks/rotate-signing-secret.md): Rotate the workspace signing secret. Framelane signs every delivery with a single workspace-level secret, so rotation re-keys all webhook endpoints and per-request `webhook_url` callbacks in the workspace — not just this one. - [List delivery attempts](https://docs.framelane.io/api-reference/webhooks/list-delivery-attempts.md): Returns the delivery history for a webhook endpoint, newest first. - [Retry a delivery](https://docs.framelane.io/api-reference/webhooks/retry-a-delivery.md): Manually retry a failed webhook delivery. Creates a new delivery record. - [Get workspace](https://docs.framelane.io/api-reference/workspace/get-workspace.md): Returns the workspace associated with the authenticated API key. - [Update workspace](https://docs.framelane.io/api-reference/workspace/update-workspace.md): Update the workspace display name. - [Get workspace usage](https://docs.framelane.io/api-reference/workspace/get-workspace-usage.md): Returns render minutes, render count, task count, and egress bytes for the requested period. Pass `period` as `7d`, `30d`, or `90d` for a rolling window ending now; omit it for the current calendar-month billing period (the window the FREE-plan render-minute cap also resets on). - [List workspace media assets](https://docs.framelane.io/api-reference/workspace/list-workspace-media-assets.md): Returns a cursor-paginated list of the workspace's uploaded video, audio and image assets that are ready for use. Optionally filter by `kind` (`video`, `audio` or `image`). - [Delete workspace](https://docs.framelane.io/api-reference/workspace/delete-workspace.md): Permanently delete the workspace and ALL associated data (API keys, render jobs, tasks, webhooks). This action is irreversible. - [Create API key](https://docs.framelane.io/api-reference/api-keys/create-api-key.md): Create a new API key for the workspace. The plaintext key is returned once. - [List API keys](https://docs.framelane.io/api-reference/api-keys/list-api-keys.md): Returns all API keys for the workspace, including revoked ones. - [Revoke API key](https://docs.framelane.io/api-reference/api-keys/revoke-api-key.md): Revoke an API key. Revoked keys are rejected on all subsequent requests. - [Create a Paddle Customer Portal session](https://docs.framelane.io/api-reference/billing/create-a-paddle-customer-portal-session.md): Returns a short-lived URL to the Paddle Customer Portal where the user can manage their subscription, payment method, and invoices. - [Expressiveness contract plan](https://docs.framelane.io/dev/expressiveness-contract-plan.md) - [Brand kit release](https://docs.framelane.io/providers/brand-kit-release.md) - [Tastelabs](https://docs.framelane.io/providers/tastelabs.md) - [Render node preview contract](https://docs.framelane.io/render-node-preview-contract.md) ## OpenAPI Specs - [openapi](/openapi.json) - [tastelabs-openapi](/providers/tastelabs-openapi.json) ## Optional - [GitHub](https://github.com/framelane) - [Status](https://status.framelane.io) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.