HTTP API for managing workspaces, projects, scenes, and renders programmatically — same surface area the editor UI uses.
Base URL
https://app.typecut.ai/v1
Authentication
Bearer API keys. Create one in Settings → API keys (available on Creator plans and up), then send it on every request:
Authorization: Bearer tc_live_…
GET/projects
List projects
Returns the projects the authenticated API key can access. Account-level keys see all projects in the account; workspace-scoped keys see only projects in their workspace. Cursor-paginated (created_at DESC, id DESC).
Parameters
Name
In
Description
cursor
query
limit
query
Response — 200
Field
Type
Description
datarequired
Project[]
next_cursorrequired
string | null
200 A page of projects.400 Invalid query parameters.401 Missing or invalid API key.
POST/projects
Create a project
Create a new project. Mode-discriminated by `mode`:
- `templates` — runs the full plan → scaffold → generate pipeline from a template + a topic (`prompt`) or your own `script` (markdown-structured supported). The main path.
- `blank` — an empty project with one chapter, no planning; edit it via later API calls.
For `templates`, call GET /v1/projects/requirements first to learn the required inputs (and preview a script's parsed structure).
Request body
Variant 1 — CreateTemplateProjectRequest
Field
Type
Description
moderequired
"templates"
Creation mode "templates" runs the full plan → scaffold → generate pipeline from a template + a topic (prompt) or your own script.
templateSlugrequired
string
Template to generate from (its scene vocabulary + pacing). Required.
workspaceId
string | null
Workspace to place the project in. Required when the account has multiple workspaces (else a 422 lists the candidates); omitted for workspace-scoped keys.
prompt
string
A topic/brief — the model writes the script. Provide this OR `script`.
sources
object[]
Reference links to ground the generation. We read each (article text, YouTube transcript, PDF, or a website's pages) into a structured digest that feeds the script. The `kind` is detected server-side.
script
string
Your own finished narration, used as the source. Provide this OR `prompt`. May be a markdown document (see `scriptFormat`): `# Title`, `## Chapters`, paragraphs become beats. Text is used verbatim (see `scriptFidelity`).
scriptFidelity
"verbatim" | "adapt"
How faithfully to keep your `script`. 'verbatim' (segment only, never reword) or 'adapt' (default — the model may restructure/rephrase).
scriptFormat
"markdown" | "plaintext" | "auto"
How to parse `script` into chapters/blocks. 'auto' (default) detects markdown headings (`#`/`##`); 'markdown' forces it; 'plaintext' treats it as flat prose. With markdown headings, `##` define chapters and `#` becomes the project title.
name
string
Project name. Defaults to the script `# H1`, else the topic, else the template.
usePresets
boolean
Fill unset fields from the workspace presets (voice, captions, etc.). Default true.
bulkGenerate
boolean
Run generation (TTS + scenes) after scaffolding. Default true. False = plan only.
ttsPresetId
string | null
Voice (tts_presets id). Required unless the workspace has a default voice.
durationSeconds
integer
Target length (prompt mode). Ignored in verbatim script mode (length is implied).
aspectRatio
"16:9" | "9:16" | "4:3" | "1:1"
Aspect ratio. Defaults to the workspace preset, else 16:9.
musicTrackId
string | null
Optional background music (music_tracks id; see GET /v1/catalogs/music).
audio
object
Audio mix masters (0–2), mirroring the editor VO/Music/SFX faders. Each is applied multiplicatively in the render mix. Omit any to keep the editor-neutral default (vo 1, music 0.3, sfx 0.7). Read back via GET /v1/projects/{id} → `audio`.
logo
object
Channel logo / watermark — a static image pinned to a corner of every scene. `scale` is logo width as a fraction of video width (default 0.12). Omit to inherit the workspace branding preset. Read back via GET /v1/projects/{id} → `logo`.
Variant 2 — CreateBlankProjectRequest
Field
Type
Description
moderequired
"blank"
Creation mode. "blank" creates an empty project with one chapter, no LLM planning. Additional modes (e.g. "prompt") will be added in a future release.
name
string
Project name. Defaults to "Untitled Project".
workspaceId
string | null
Workspace to place the project in. Required for workspace-scoped API keys (may be omitted — the scoped workspace is used).
aspectRatio
"16:9" | "9:16" | "4:3" | "1:1"
Project aspect ratio. Defaults to "16:9".
ttsPresetId
string | null
Optional default TTS preset for the project.
Response — 201
Field
Type
Description
datarequired
object
201 Project created.400 Invalid request body.401 Missing or invalid API key.402 Plan limit reached (free tier project cap, lapsed subscription, etc).403 API key cannot create projects in the requested workspace.
GET/media
List media assets
Returns the media library assets the API key can access (confirmed, excluding scene thumbnails). RLS-scoped to the account; workspace-scoped keys see only their workspace. Cursor-paginated (created_at DESC, id DESC). Optional `project_id` filter.
Parameters
Name
In
Description
cursor
query
limit
query
project_id
query
Response — 200
Field
Type
Description
datarequired
MediaAsset[]
next_cursorrequired
string | null
200 A page of media assets.400 Invalid query parameters.401 Missing or invalid API key.
POST/media
Add media to the library
Record an already-hosted asset URL into the project media library. This is for URLs that are already reachable (e.g. your own hosted file); it does not upload a file. Rate-limited per account.
Request body
Field
Type
Description
urlrequired
string
Absolute http(s) URL of an already-hosted asset.
content_typerequired
string
MIME type, e.g. image/png.
category
"upload" | "archival"
file_name
string
project_id
string | null
source_url
string | null
width
integer | null
height
integer | null
Response — 201
Field
Type
Description
datarequired
object
201 Media asset recorded.400 Invalid request body.401 Missing or invalid API key.403 project_id is outside the key's workspace scope.404 project_id not found for this account.429 Rate limit exceeded.
GET/projects/{id}
Get a project
Fetch one project by id. Returns 404 (not 403) when the project exists but is not accessible by the API key — so callers cannot probe for existence.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
Project
A video project. Belongs to one workspace (or workspace_id null). Status drives the FE lifecycle.
200 Project found.401 Missing or invalid API key.404 Project not found or not accessible.
GET/projects/{id}/trace
Get a project generation trace
A token-light audit of how a project was planned and generated — what template resolved, whether it drove the plan, the pacing decision, per-scene/model summaries, and LLM step summaries. Compact by default; opt into detail with ?include=raw (full structure_config/prompt_config/catalog + per-element model list) and/or ?include=prompts (full LLM prompt blobs). 404 (not 403) when not accessible.
Parameters
Name
In
Description
idrequired
path
include
query
Response — 200
Field
Type
Description
data
object
200 The project trace digest.401 Missing or invalid API key.404 Project not found or not accessible.
GET/workspaces
List workspaces
Returns the workspaces the API key can access. Account-level keys see all workspaces; workspace-scoped keys see only the one they are scoped to. Cursor-paginated.
Parameters
Name
In
Description
cursor
query
limit
query
Response — 200
Field
Type
Description
datarequired
Workspace[]
next_cursorrequired
string | null
200 A page of workspaces.400 Invalid query parameters.401 Missing or invalid API key.
GET/workspaces/{id}
Get a workspace
Fetch one workspace by id. Returns 404 (not 403) when the workspace exists but is not accessible by the API key.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
Workspace
A workspace — per-show preset container. Holds defaults (voice, visual style, transitions, captions), brand assets, and editorial context. Projects belong to workspaces. (The underlying table is `channels`.)
200 Workspace found.401 Missing or invalid API key.404 Workspace not found or not accessible.
POST/discovery/search
Search open & archival assets
Entity-grounded asset search across open / archival sources (Wikimedia Commons, NASA, ...). Resolves the query to a real-world entity, fans out to the sources, filters to commercially-usable licenses, and returns ranked candidates with license + provenance. Read-only; no asset is downloaded or stored by this call.
Request body
Field
Type
Description
queryrequired
string
Subject to search — a topic, person, place, event, or object.
kind
"image" | "video"
Media kind. Defaults to "image" (entity-specific video is sparse).
limit
integer
Max results to return. Defaults to 24.
Response — 200
Field
Type
Description
datarequired
object
200 Ranked, license-cleared candidates.400 Invalid request body.401 Missing or invalid API key.502 Upstream discovery engine error.
POST/compositions
Create a scene from raw NJS
Submit a raw NJS scene script directly — no prompt, no LLM. The script is transpiled server-side; any declared gen elements (gen:image / gen:video / gen:stock-image / gen:stock-video / gen:html) resolve asynchronously. Returns the scene id and a public `share_url` that renders the scene live as those elements resolve. Intended for agents that already produce NJS (see the NJS reference at njs.typecut.ai). The public viewer and its polling endpoint (`GET /api/share/{token}`) need no authentication.
Request body
Field
Type
Description
njsrequired
string
A raw NJS scene script. Transpiled server-side; declared gen elements (gen:image / gen:video / gen:stock-image / gen:stock-video / gen:html) resolve asynchronously after the scene is created.
workspace_id
string | null
Workspace (channel) to create the scene in. Required for account-level API keys; workspace-scoped keys may omit it (the scoped workspace is used).
settings
object
Optional render settings; each field overrides the matching value in the NJS `config:` block.
Response — 201
Field
Type
Description
datarequired
object
201 Scene created; gen elements (if any) are resolving asynchronously.400 Invalid request body.401 Missing or invalid API key.402 Plan limit reached.403 API key cannot create scenes in the requested workspace.422 NJS failed to transpile — diagnostics are in the error `detail`.
GET/projects/{id}/render
Get render status
Poll the latest render job for a project: phase, per-scene progress, stitch progress, and the final MP4 URL (`render_url` / `job.output_url`) once completed.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
object
200 Current render status.404 Project not found or not accessible.
POST/projects/{id}/render
Render a project to video
Trigger a full project video render. Validates readiness first: every chapter must have TTS audio and every scene must have visual content. On readiness failure the 422 response carries machine-readable `blockers` (chapter ids missing audio, scene ids missing visuals) so callers can resolve them programmatically. Credits are deducted up front and refunded automatically if the render cannot be queued. Poll GET /projects/{id}/render for progress and the final MP4 URL.
Parameters
Name
In
Description
idrequired
path
Request body
Field
Type
Description
renderMode
"canvas" | "hyperframe"
Render backend. Defaults to hyperframe.
Response — 202
Field
Type
Description
datarequired
object
202 Render queued.402 Insufficient credits.404 Project not found or not accessible.409 Project is already rendering.422 Project not ready to render — `blockers` lists the chapters missing audio and scenes missing visuals.503 Render queue unavailable (credits were refunded).
GET/projects/{id}/resolution
Get resolution status
What's resolved vs unresolved in a project, and the estimated credits to resolve the rest. A scene is resolved once it has renderable content; voice-over is tracked per chapter. Read-only counterpart to POST /projects/{id}/resolve — the counts match the editor's readiness UI exactly (shared logic).
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
object
200 Resolution status + cost quote.404 Project not found or not accessible.
POST/projects/{id}/resolve
Resolve (generate) unresolved work
Generate everything unresolved in a scope — its unresolved scenes (composition) plus voice-over. Mirrors the editor's "Generate everything" actions; each underlying generation charges and refunds itself. Scenes with nothing to generate from are skipped (`skipped_unresolvable`). Pass `dryRun:true` for the credit quote without firing anything (identical numbers to GET /projects/{id}/resolution).
Parameters
Name
In
Description
idrequired
path
Request body
Field
Type
Description
scope
"project" | "chapter" | "block"
What to resolve. `chapter` requires `chapterId`; `block` requires `blockId`.
chapterId
string
blockId
string
dryRun
boolean
When true, returns the credit quote without firing any generation.
Response — 200
Field
Type
Description
datarequired
object
200 Dry-run quote — nothing was fired.202 Resolution started — generations were queued.400 Invalid scope (e.g. chapter scope without chapterId).403 Subscription inactive (past_due / unpaid).404 Project, chapter, or block not found.
GET/catalogs/{catalog}
List a value catalog
The discoverability layer: every value project creation/editing accepts by id or slug is listable here, straight from the live registries. Catalogs: `transitions` (scene transition slugs + render mode + default duration), `caption-styles` (caption style ids + preview clips), `voices` (TTS presets — system + your own), `music` (published music tracks + license info). Pass the returned slug/id values to the matching creation or editing fields.
Parameters
Name
In
Description
catalogrequired
path
Response — 200
Field
Type
Description
datarequired
object[]
Catalog rows; the shape depends on the catalog (see description).
200 Catalog rows.404 Unknown catalog.
POST/scenes/{sceneId}/attach-media
Attach media to a scene
Set a scene's background to an image or video URL. The first editor-mutation primitive on the API: it shares the editor's media-attach service, so the change appears live in any open editor (via Realtime, applied in place) and behaves identically to picking media in the UI. Scene ids are globally unique, so the flat path is unambiguous.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
media_urlrequired
string
Public URL of the image or video to use as the scene background.
is_video
boolean
Set true when media_url points to a video.
thumbnail_url
string | null
Optional pre-generated thumbnail written to the scene chip.
Response — 200
Field
Type
Description
datarequired
object
200 Media attached; scene background updated.400 Invalid request body.401 Missing or invalid API key.403 Plan does not include API access.404 Scene not found or not accessible.
POST/scenes/{sceneId}/elements
Add an element to a scene
Append one element — motion design, an image, or a text box — to an existing composition. SPENDS CREDITS: the new line goes through the generate-composition raw-NJS path, which transpiles, persists, and dispatches a resolve job. Asynchronous; poll the scene. Contrast PATCH on the same path, which edits existing elements for free.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
kindrequired
"motion-design" | "image" | "text"
promptrequired
string
Creative prompt for motion-design/image, or the literal copy for text.
at_seconds
number
area
object
Response — 202
Field
Type
Description
datarequired
object
202 Element accepted and generating.400 Invalid request body or parameters.401 Missing or invalid API key.402 Insufficient credits.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
PATCH/scenes/{sceneId}/elements
Edit elements in a scene
Element-level edits on a scene, expressed as patches against its NJS source. This is the same vocabulary and the same applier the editor canvas uses for a drag, resize, retime, recolour or restyle, so an API caller and a person on the canvas produce identical results. Read the scene first to get current line numbers. Spends no credits — an edit is a source rewrite plus a transpile, not a generation. Scene ids are globally unique, so the flat path is unambiguous.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
patchesrequired
object[]
expect_lines
object[]
Optimistic concurrency. Patches address source by line number, so pass the exact text you expect at the lines you are touching; a mismatch returns 409 rather than silently applying nothing. Omit to skip the check.
expected_version
integer
Optimistic concurrency at the ROW level — the scene's composition_version as you last read it. expect_lines guards the APPLY (are my line numbers still right?); this guards the WRITE (has anyone rewritten this scene since?). Without it, a user with the scene open in the editor can be silently overwritten, or overwrite you. A mismatch returns 409 and nothing is written. The response carries the resulting compositionVersion for your next call.
Response — 200
Field
Type
Description
successrequired
true
datarequired
object
200 Patches applied; scene re-transpiled and persisted.400 Invalid request body, or no patch matched the source.401 Missing or invalid API key.403 Plan does not include API access.404 Scene not found or not accessible.409 Stale write: a line in expect_lines no longer matches, expected_version is behind, or the row changed while the edit was being transpiled. Nothing was written.422 The patched script failed to transpile.
POST/themes
Create a theme
Author a private theme owned by your account — a palette (colours keyed by role) and an optional type pairing. Reference the returned `slug` as `themeSlug` when creating a project. Only the safe design fields are settable here; image-generation routing and prompt directives are managed by the system.
Request body
Field
Type
Description
namerequired
string
Display name for the theme.
colorsrequired
object
Palette keyed by semantic role. bg, ink and accent are required; the rest optional.
fonts
object
Type pairing. Each font must be a published font family (see GET /v1/catalogs/fonts).
defaultMode
"light" | "dark"
How the palette reads. Default 'light'.
Response — 201
Field
Type
Description
datarequired
object
201 The created theme.400 Invalid body.401 Missing or invalid API key.
GET/scenes/{sceneId}/genhtml
Describe a scene's gen:html sub-compositions
Return the visual-unit map of every resolved gen:html sub-composition in a scene — the same "what's inside this composition" structure the editor canvas exposes on double-click, but read statically from the hosted blob (no browser). Each unit carries its id/label, whether it is a timed `.clip` layer, and its animation lanes (properties + times); engine fills also return the parsed window.__DATA__ (their editable surface) with confidence "partial". Read-only. Scene ids are globally unique, so the flat path is unambiguous.
Parameters
Name
In
Description
sceneIdrequired
path
element_id
query
Describe only the composition with this element id (the id returned in `element_id`, derived from the blob's composition id).
Response — 200
Field
Type
Description
datarequired
object
200 The scene's gen:html unit maps.401 Missing or invalid API key.403 Plan does not include API access.404 Scene not found or not accessible.
POST/scenes/{sceneId}/genhtml
Edit a gen:html sub-composition's inner units
Apply deterministic, LLM-free edits to inner units of a resolved gen:html sub-composition: delete_unit removes the unit's element subtree; hide_unit hides it in place. The hosted blob is rewritten IMMUTABLY (a new copy is hosted and the scene's resolution swaps to it) — the previous URL is returned so the edit can be reverted. Unit keys come from GET …/genhtml.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
element_idrequired
string
The Composition element id (as returned by GET …/genhtml).
opsrequired
object[]
Response — 200
Field
Type
Description
datarequired
object
200 The edit result.400 Invalid body.404 Scene or composition not found.422 Edit could not be applied (e.g. unit not found in the blob).
POST/scenes
Create a scene
Create a scene in a chapter. A prompt-only body makes a draft composition scene (generation pending); a `media_url` body makes a resolved "uploaded" scene with its background already set. Shares scene-crud-service with the Director chat.
Request body
Field
Type
Description
chapter_idrequired
string
block_id
string | null
anchor_text
string | null
title
string | null
prompt
string | null
duration
number | null
media_url
string | null
is_video
boolean
thumbnail_url
string | null
position
integer | null
Response — 201
Field
Type
Description
datarequired
object
201 Scene created.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/scenes/{sceneId}
Get a scene
Read one scene in full, including its NJS composition source and `composition_version`. Read a scene before rewriting it — patches address the source by line number.
Parameters
Name
In
Description
sceneIdrequired
path
Response — 200
Field
Type
Description
datarequired
Scene
200 The scene.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
PATCH/scenes/{sceneId}
Update a scene
Update a scene's own fields. To adjust one element inside the composition, prefer PATCH /scenes/{sceneId}/elements — it patches source lines instead of replacing the script.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
title
string | null
prompt
string | null
duration
number | null
njs_script
string | null
captions_enabled
boolean | null
caption_style_id
string | null
block_id
string | null
Response — 200
Field
Type
Description
datarequired
object
200 Scene updated.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
DELETE/scenes/{sceneId}
Delete a scene
Soft-delete: the scene becomes a restorable tombstone rather than being removed, so other clients reconcile the removal and the change can be undone.
Parameters
Name
In
Description
sceneIdrequired
path
Response — 200
Field
Type
Description
datarequired
object
200 Scene soft-deleted.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/scenes/{sceneId}/render
Get single-scene render status
Poll for the rendered clip. The URL lands on the scene once the job completes.
Parameters
Name
In
Description
sceneIdrequired
path
Response — 200
Field
Type
Description
data
object
200 Render status.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
POST/scenes/{sceneId}/render
Render a single scene
Render one scene to a standalone MP4 — no project stitch, no audio bed. SPENDS CREDITS. Shares render-scene-service with the Studio render button. Poll with GET on the same path.
Parameters
Name
In
Description
sceneIdrequired
path
Request body
Field
Type
Description
resolution
string
Response — 202
Field
Type
Description
data
object
202 Render queued.400 Invalid request body or parameters.401 Missing or invalid API key.402 Insufficient credits.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/projects/{id}/storyboard
Get the storyboard
The structural map of a project: chapters, script blocks, and the scenes anchored to each block, with voice-over status and durations. The orientation call — read this before editing so you address real ids. Scene detail is deliberately excluded; use GET /scenes/{id}.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
data
object
200 The storyboard.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/projects/requirements
Inspect creation requirements
Dry-run of the template-driven creation resolver: given a template and a workspace, reports what the workspace presets would prefill, what is still required, and what the template offers as optional — creating nothing. Same resolver POST /projects runs, so an agent can ask exactly the right questions before spending anything.
Parameters
Name
In
Description
templateSlugrequired
query
workspaceId
query
usePresets
query
Response — 200
Field
Type
Description
data
object
200 Resolved requirements.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
POST/projects/{id}/chapters
Create a chapter
Create a chapter. Pair with POST /chapters/{chapterId}/blocks and POST /scenes to build a project's structure headlessly, using the same services the Director chat uses.
Parameters
Name
In
Description
idrequired
path
Request body
Field
Type
Description
title
string | null
position
integer | null
Response — 201
Field
Type
Description
datarequired
object
201 Chapter created.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
POST/projects/{id}/generate-scenes
Bulk-generate scenes
Start bulk scene generation on a planned draft — the "Generate scenes" button, headless. Valid only from status='draft' with a script. SPENDS CREDITS: the bulk estimate is deducted upfront, with refund-on-failure.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
object
200 Bulk generation started.400 Invalid request body or parameters.401 Missing or invalid API key.402 Insufficient credits.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
POST/projects/{id}/share
Create a share link
Mint a public share link. Same gate as the editor Share button: the project must be fully resolved — no unresolved scenes, no chapter missing voice-over — before a link is minted.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
object
200 Share link.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.409 Conflict with a concurrent change.
POST/chapters/{chapterId}/blocks
Add a script block
Add a block to the chapter's script. Blocks live in chapters.script_blocks; narration blocks are what voice-over and scene anchors attach to.
Parameters
Name
In
Description
chapterIdrequired
path
Request body
Field
Type
Description
type
"narration" | "direction" | "note" | "heading"
contentrequired
string
position
integer | null
Response — 201
Field
Type
Description
datarequired
object
201 Block added.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
PATCH/chapters/{chapterId}/blocks/{blockId}
Rewrite a script block
Replace a block's text. Timing derived from the OLD text — pauses, silence trims, scene anchors — is cleared, because offsets into replaced text would be meaningless. Re-anchor scenes afterwards if the block carried any.
Parameters
Name
In
Description
chapterIdrequired
path
blockIdrequired
path
Request body
Field
Type
Description
contentrequired
string
Response — 200
Field
Type
Description
datarequired
object
200 Block updated.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
POST/chapters/{chapterId}/reorder-scenes
Reorder a chapter's scenes
Set the full scene order. The body must list EVERY non-deleted scene id in the chapter exactly once — full-order semantics, so a stale caller cannot silently interleave with a concurrent edit.
Parameters
Name
In
Description
chapterIdrequired
path
Request body
Field
Type
Description
scene_idsrequired
string[]
Response — 200
Field
Type
Description
datarequired
object
200 New order applied.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/projects/{id}/theme
Get the project theme
The project's visual identity: theme slug, colour roles, font roles, light/dark.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
ProjectTheme
200 The theme.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
PATCH/projects/{id}/theme
Switch or restyle the theme
Exactly one of `slug` (switch to an existing theme) or `restyle` (fork-on-edit). A restyle never mutates a shared preset: it copies the current theme into a private user theme with the patch applied and repoints the project at the fork. NOTE: themes are baked into each scene at generation time, so already-generated scenes keep their look until regenerated — the response repeats this in `note`.
Parameters
Name
In
Description
idrequired
path
Request body
Field
Type
Description
slug
string
restyle
object
Response — 200
Field
Type
Description
datarequired
object
200 Theme switched or forked.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/projects/{id}/captions
Get caption settings
The project-level caption default. Scene overrides live on the scene.
Parameters
Name
In
Description
idrequired
path
Response — 200
Field
Type
Description
datarequired
ProjectCaptions
200 Caption settings.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
PATCH/projects/{id}/captions
Set caption settings
Set any subset of the caption default. Unlike a theme change this is free and needs no regeneration — captions are a render overlay, so the change lands on the next render. `style` is a fine-tune partial, DEEP-merged over the existing one; pass null to clear it. Preset ids come from GET /catalogs/caption-styles.
Parameters
Name
In
Description
idrequired
path
Request body
Field
Type
Description
enabled
boolean
styleId
string | null
colorScheme
"default" | "theme"
alignment
string | null
fontSize
number | null
style
object | null
Response — 200
Field
Type
Description
datarequired
ProjectCaptions
200 Updated caption settings.400 Invalid request body or parameters.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.404 Not found, or not accessible with this key.
GET/liked-shares
List liked shares
The staff "liked shares" collection — every share hearted on a /share/<token> page — as a flat list an ingestion client can enumerate without DB or browser access. STAFF ONLY: the key's account needs an admin role; other keys get 403. Shared collection, not per-account.
Response — 200
Field
Type
Description
datarequired
object[]
200 Liked shares, newest first.401 Missing or invalid API key.403 Plan does not include API access, or the action is not permitted.
GET/pricing
Get the pricing catalog
Plans, credit packs, marketing-flagged features, and per-generation estimates, assembled from the DB. PUBLIC — no authentication, CORS-open and CDN-cached, because the marketing site fetches it cross-origin.
Response — 200
200 Pricing catalog.
Prefer a conversation?
The same capabilities are coming to agents over MCP.