# Splice (film.fun) > Splice is film.fun's AI filmmaking studio. Its Agent API lets scripts and LLM agents do what the dashboard does: create productions, generate images, video, voice, music and sound, edit media, plan shots, render Motion compositions and use the public template library. Authenticate with an agent key (`sk_…`). Every generation spends credits from the same account as the web app. Base URL: `https://splice.film.fun`. All agent routes live under `/api/agents/*`. Send the key as `Authorization: Bearer sk_…` (or `x-api-key: sk_…`). Create keys at https://splice.film.fun/dashboard/api-keys. The secret is shown once, and a key acts as the user who created it. New accounts get 100 free credits. Generation is asynchronous. A generate call returns `201 {production_item_id, job_id?, production_id}` straight away. Poll `GET /api/agents/productions/{production_id}/items/{production_item_id}` until `status` is `completed` (read `media_url`, or `answer` for vision-language) or `failed` (read `error_message`). There are no webhooks for agent calls. Send an `Idempotency-Key` header on every generate/edit call so that a retry never charges twice. ## Quickstart ```bash export SPLICE_API_KEY=sk_... # from /dashboard/api-keys B=https://splice.film.fun/api/agents H="Authorization: Bearer $SPLICE_API_KEY" # 1. Get the default production. It is created the first time. curl -s "$B/session" -H "$H" # → {"creation_id":"","production_id":"","creation":{…}} # Or make a new one: POST $B/productions {"title":"My short","aspect_ratio":"9:16"} # 2. Pick a model. is_default marks the default; tool_costs is the price in credits. curl -s "$B/tools/generator-tools/video/models" -H "$H" # 3. Generate. Use the creation_id. Model settings go in "parameters". curl -s -X POST "$B/generate/video" -H "$H" -H 'Content-Type: application/json' \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"production_id":"","prompt":"A paper boat drifts down a rainy street, slow dolly","modelId":"minimaxH3MaxTurbo","parameters":{"duration":6,"aspectRatio":"9:16"}}' # → 201 {"production_item_id":"","job_id":"","production_id":""} # 4. Poll every 3-10 s. Video takes about 1-5 min, images about 5-30 s. curl -s "$B/productions//items/" -H "$H" # → {"id":"","status":"completed","media_url":"https://…mp4",…} ``` Or use the CLI, a single-file Node 18+ client with no dependencies. It prints JSON when piped and has documented exit codes: ```bash curl -fsSL https://splice.film.fun/cli/splice.mjs -o splice.mjs node splice.mjs generate video --prompt "A paper boat in the rain" --model minimaxH3MaxTurbo --param duration=6 --wait ``` ## MCP server Splice is also a remote MCP server at `https://splice.film.fun/api/mcp` (Streamable HTTP). It authenticates with OAuth or the same agent key and exposes 114 tools: account and models (`list_models`, `recommend_model`: the top 3 enabled models for an intent, free, `get_balance`), craft guides and checks, free (`get_model_guide`: call it before prompting a model for the first time; `list_guides`, `get_craft_guide`, `get_video_motion_guide`, `check_video_prompt`, `pack_multishot`, `lint_multishot`, `motion_design_brief`, `gsap_for_use_case`, `motion_quality_check`, `production_brief`, `production_qa`; the same guides as `splice://guides/models/{id}` and `splice://guides/{kind}/{name}` resources), the production look, free except an optional priced read (`extract_moodboard_look` measures a moodboard's palette for free and, with `aesthetic: true`, reads its lighting, grade, texture, lens, era and mood for a quoted price; `set_production_look` makes the board the production look; `get_production_look`; `update_look`; generate tools and shot takes then add a short style suffix in words and report `look_applied`, `use_look: false` skips it), production style LoRAs for MiniMax H3 video (`list_loras`, `get_lora`, `train_lora`: quotes first and trains only with `max_credits` and the user's `likeness_consent`; `cancel_lora`; `set_universe {style_lora_id}` makes one the production style, applied to H3 video automatically, `use_style_lora: false` skips it, results carry `style_lora`), productions, scripts and the Universe (`list_productions`, `create_production`, `get_production`, `update_production`, `list_series`, `list_scripts`, `get_script`, `create_script`, `update_script`, `get_universe`, `set_universe`, `get_universe_bundle`, `list_universe_entities`), library and uploads (`list_characters`, `list_locations`, `list_props`, `create_entity`, `set_entity_reference_image`, `add_entity_to_production`, `upload_media`, `import_media`), generate and edit (`generate_image`, `generate_video`, `generate_voice`, `generate_music`, `edit_image`, `upscale_image`, `upscale_video`, `enhance_audio`, `generate_media`, `edit_media`), jobs (`get_job`, `list_items`, `cancel_job`, `get_idempotency_result`), Motion compositions (`list_compositions`, `get_composition`, `create_composition`, `edit_composition` (editor ops plus set_text / set_font / set_timing / replace_media / fade_in shortcuts, and apply_animation_preset / update_tween / remove_tween on the Animation timeline's tweens), `list_composition_revisions`, `revert_composition`, `render_composition`), Studio timelines (`list_studios`, `get_studio`, `get_studio_item`, `create_studio`, `edit_studio` (up to 50 ops, all or nothing, with `base_revision` and `dry_run`: tracks, add/move/trim/split items, every inspector property, transitions, captions, auto_assemble, add_voiceover with ducking), `export_studio` (spends; `dry_run` prices it), `get_studio_export`, `list_studio_revisions`, `revert_studio`), production stages, free (`get_production_stages`: each stage's status and the next step with the tool to call; `draft_pipeline` drafts a linked script, storyboard and shotlist from a pitch; `list_storyboards`, `get_storyboard`, `create_storyboard`, `update_storyboard`, `create_shotlist`, `add_shots`, `update_shot`, `remove_shot`, `reorder_shots`, `list_shotboards`, `get_shotboard`, `promote_shotlist`; the path is script → storyboard → shotlist → `match_scene` / `generate_shot` takes → `create_studio` cut → `export_studio`) and `search` / `fetch`. Scopes: `splice:read`, `splice:generate` (spends credits) and `splice:compose` (free Motion and Studio timeline edits). Generate tools return `{job_id, production_id, status: "pending"}` straight away; poll `get_job`, which also reports `cost` once charged. Mention a Universe entity as `@slug` in a generate_image / generate_video prompt or a shot-framing input and Splice attaches its reference images automatically; the result lists the `references` it attached and `warnings` for any it couldn't. Give every character, location, prop and set a reference SHEET as its default image first (`generate_media` kind `character-sheet` / `location-sheet` / `prop-sheet` / `set-sheet`, then `set_entity_reference_image`, then `add_entity_to_production` with a slug): the sheet is what a mention attaches, and it keeps them consistent from shot to shot. Splice then checks every output that references a character for the SAME PERSON (face check, 0.25 credits; production setting off | flag | auto_regenerate): results carry `face_check`, `check_faces` checks one output on demand, `get_face_check` reads results, `regenerate_mismatch` re-runs a drifted output with a new seed (dry_run quotes, max_credits caps) and `set_face_check_mode` changes the setting; `list_shot_takes` takes `face_check: fail`. Unknown tool arguments are rejected with the accepted list. Billing, scopes and credits are the same as the HTTP routes. Tool-by-tool table with scopes: https://splice.film.fun/developers#mcp-tools ```bash claude mcp add --transport http splice https://splice.film.fun/api/mcp --header "Authorization: Bearer sk_..." ``` Cursor (`~/.cursor/mcp.json`): `{"mcpServers": {"splice": {"url": "https://splice.film.fun/api/mcp", "headers": {"Authorization": "Bearer sk_..."}}}}` Without a key, MCP clients that support OAuth (claude.ai connectors, Claude Desktop, Claude Code via `/mcp`, Codex via `codex mcp add splice --url https://splice.film.fun/api/mcp`, Cursor, ChatGPT, Grok custom connectors at grok.com/connectors, Grok Build via `grok mcp add --transport http splice https://splice.film.fun/api/mcp`) sign the user in with their film.fun account instead: add the URL alone. Step-by-step setup for each assistant, with plans, example prompts, credits and disconnecting: [Use Splice in Claude, ChatGPT, Grok, Claude Code and Codex](https://splice.film.fun/connect) ([markdown](https://splice.film.fun/connect.md)). Grok via the xAI API: add a remote MCP tool to a Responses API request (`https://api.x.ai/v1/responses`) or `xai_sdk.tools.mcp(...)`: `{"type": "mcp", "server_url": "https://splice.film.fun/api/mcp", "server_label": "splice", "authorization": "sk_..."}`. The key may be sent with or without the `Bearer ` prefix. Steps: [Connect from Grok](https://splice.film.fun/connect#grok). ChatGPT: add a custom MCP server (newer accounts: Plugins → + → Add custom MCP server; others: Settings → Apps → Advanced settings → Developer mode → Create app) with the URL `https://splice.film.fun/api/mcp` and OAuth authentication; ChatGPT registers itself, then you sign in to Splice and approve. `search` and `fetch` follow OpenAI's shape (search returns `{results: [{id, title, url}]}`, fetch returns `{id, title, text, url, metadata}`) over your productions, media items and compositions plus public templates and docs, so Pro plans (read/fetch only) can use them too. Steps: [Connect from ChatGPT](https://splice.film.fun/connect#chatgpt). The server also exposes resources: `splice://models` (every model with its live price), `splice://docs/pricing`, `splice://docs/getting-started`, `splice://docs/authentication`, `splice://docs/mcp` and `splice://docs/connect`. A second, public MCP server needs no sign-in and spends nothing: `https://splice.film.fun/api/mcp/docs`. Its read-only tools are `search_docs`, `get_doc`, `list_models` (live prices), `get_pricing`, `list_templates` and `get_template`. Discovery: [MCP server card](https://splice.film.fun/.well-known/mcp/server-card.json) (tools and resources), [SEP-2127 card](https://splice.film.fun/api/mcp/server-card), [AI Catalog](https://splice.film.fun/.well-known/ai-catalog.json), [ARD manifest](https://splice.film.fun/.well-known/ard.json), [API catalog (RFC 9727)](https://splice.film.fun/.well-known/api-catalog), [Agent Skills index](https://splice.film.fun/.well-known/agent-skills/index.json). ## Text fields are Markdown Long-form text is GitHub-flavoured Markdown, sent and returned as plain strings: production `description`, Universe `premise` and `lore`, `character_info.backstory`, `location_info.description` / `story_context`, prop `product_info.description`, media `metadata.description`, shotlist/storyboard descriptions, review comments and notes, share-link and template descriptions, task descriptions and notes. Use **bold**, *italic*, `## headings`, `- lists`, `- [ ] tasks`, `> quotes`, `[links](https://…)`, tables and `---`. A single newline is a line break; leave a blank line between paragraphs. Raw HTML is not rendered (tags are removed), links must be http(s)/mailto/tel, and images show only from film.fun media hosts. Keep `` marker comments in `lore` intact (they delimit an imported "From Arena" section). Scripts use their own Markdown conventions (see the scripts routes). ## Docs - [Developer portal](https://splice.film.fun/developers) ([markdown](https://splice.film.fun/developers.md)): MCP and REST quickstarts, auth, the error envelope, rate limits, idempotency, async jobs, pagination, versioning and deprecation, sandbox, status and support. - [Use Splice in Claude, ChatGPT, Grok, Claude Code and Codex](https://splice.film.fun/connect) ([markdown](https://splice.film.fun/connect.md)): connecting each AI assistant step by step, what each plan supports, example prompts, credits and how to disconnect. - [agents.md](https://splice.film.fun/agents.md): which interface to use, in one page. [auth.md](https://splice.film.fun/auth.md): OAuth and key flows step by step. - Every docs page answers `Accept: text/markdown` with markdown (the homepage is also at [/index.md](https://splice.film.fun/index.md)); template pages too (`/templates/{slug}.md`). Ask questions in natural language at `POST https://splice.film.fun/ask` (NLWeb). - [Full API reference](https://splice.film.fun/llms-full.txt): every route with full descriptions and scopes (section 17), request bodies, polling, idempotency, errors, credits, templates, Motion and shot-sheet pipelines. - [Agent manifest (JSON)](https://splice.film.fun/api/agents/manifest.json): a machine-readable catalog of every `/api/agents/*` route, with methods, scopes, error codes and feature flags. It needs no key and is kept in sync with the code by CI. - [CLI](https://splice.film.fun/cli/splice.mjs): the `splice` command-line client. Run `node splice.mjs help`. - [OpenAPI spec](https://splice.film.fun/api/openapi) and [Swagger UI](https://splice.film.fun/api-docs): cover the core routes only. The manifest is the complete list. - [Pricing (markdown)](https://splice.film.fun/pricing.md): what a credit is, the credit packs, how to pay, and the live price of every model. Model prices are dynamic: read [pricing.json](https://splice.film.fun/pricing.json) or the MCP `list_models` tool before spending. Human page: [/pricing](https://splice.film.fun/pricing). ## Key endpoints - `GET /api/agents/session`: the default production (`creation_id`); created if missing. - `GET /api/agents/balance`: the credit balance, `{balance: {total, available, …}}`. - `POST /api/agents/credits/purchase`: top up with Solana (USDC, SOL or AUDD). `{pack_id: starter|creator|pro|studio}` returns 402 with a Solana Pay URL (`payment_required.solana_pay.url`) that any wallet can pay, or a person can scan as a QR code. - `GET /api/agents/credits/packs`: the packs and what each costs right now in USDC, SOL and AUDD. - `GET /api/agents/credits/purchase/{transaction_id}`: poll after paying; it finds the payment on chain and applies the credits (`status: pending|completed`). - Agent wallet: the CLI can hold a Solana keypair and top up by itself: `splice wallet create`, fund it once (USDC plus ~0.01 SOL for fees), then `splice credits buy starter`. Spending is capped per purchase and per day. - `GET|POST /api/agents/productions`: list or create productions. - `GET /api/agents/tools/generator-tools/{generator}/models`: the models for one generator, with cost and capabilities. - `POST /api/agents/generate/{image|video|video-animate|video-image-audio|voice|music|sfx|lipsync|shot-framing|composition-render|…}`: start a generation. - `POST /api/agents/edit/{clip|image|image-upscale|video-reframe|caption-burner|media-merge|…}`: edit existing media. - `POST /api/agents/productions/{id}/publish-to-studio`: publish a finished video to film.fun Studio as an episode (plus an optional clip), using the Studio account the key's owner connected in Splice. Scope `studio:write`; re-publishing updates rather than duplicates. - `GET /api/agents/productions/{id}/items/{itemId}`: poll one result. - `POST /api/agents/productions/{id}/media`: upload a file (multipart, max 4.5 MB). - `GET /api/public/generation-templates`: the public template library. It needs no key; each template carries a ready-to-run generation payload. ## All endpoints Every `/api/agents/*` route, generated from the manifest. `[id]` is the production id (`creation_id`). Scopes, body notes and flags are in [llms-full.txt](https://splice.film.fun/llms-full.txt) section 17 and in [manifest.json](https://splice.film.fun/api/agents/manifest.json). ### arena-imports - `POST /api/agents/arena-imports`: Import an Arena competition's media pack into a production's Universe (free): {competition_id, production_id: | "new", title?, strateg… ### balance - `GET /api/agents/balance`: Credit summary ### characters - `GET POST /api/agents/characters`: Client library - `GET PUT /api/agents/characters/[characterId]`: Fetch / update one client-library character ### compositions - `GET POST /api/agents/compositions`: List (GET) or create (POST) Motion (Hyperframes) compositions - `GET PATCH DELETE /api/agents/compositions/[compositionId]`: Fetch (GET, full payload), update (PATCH: { ops: [{ op, ...args }] } like the production-scoped route, or payload, plus title/description/t… - `POST /api/agents/compositions/[compositionId]/duplicate`: Clone a composition (title gets " (copy)") - `GET /api/agents/compositions/[compositionId]/revisions`: Newest-first version history for one composition, without payloads (a payload can be 50KB+) - `POST /api/agents/compositions/[compositionId]/revisions/revert`: Restore a composition to an earlier revision by revision_id ### credits - `GET /api/agents/credits/packs`: Credit packs with their price now in each Solana token: { packs: [{ id, name, credits, price_usd, credits_per_usd, quotes: { USDC|SOL|AUDD:… - `POST /api/agents/credits/purchase`: Buy a credit pack with Solana (USDC, SOL or AUDD) - `GET /api/agents/credits/purchase/[transactionId]`: Status of a credit purchase - `POST /api/agents/credits/transfer`: Transfer credits ### edit - `POST /api/agents/edit/caption-burner`: Burn captions onto video - `POST /api/agents/edit/clip`: Clip a video to a time range (ms or seconds) - `POST /api/agents/edit/enhance-audio`: Enhance audio by mode: enhance (default; denoise then restore speech clarity and bandwidth, Resemble Enhance, resembleEnhanceSpeech, up to… - `POST /api/agents/edit/image`: Edit image (inpaint / outpaint / variation) - `POST /api/agents/edit/image-color-grade`: Color grade - `POST /api/agents/edit/image-draw`: Draw on image - `POST /api/agents/edit/image-layers`: Break an image into editable layers (background, cut-outs, text, shapes; 45 credits) - `POST /api/agents/edit/image-multiple`: Batch image edits - `POST /api/agents/edit/image-upscale`: Upscale image - `POST /api/agents/edit/isolate-voice`: Clean dialogue: remove music, background noise and room tone and keep the voice alone (ElevenLabs Voice Isolator, elevenlabsVoiceIsolation) - `POST /api/agents/edit/media-merge`: Concatenate videos (input_urls[], in order). parameters.outputAspectRatio (e.g. "16:9") or width/height set the output shape; every input i… - `POST /api/agents/edit/video`: Change a clip from an instruction and keep the rest (Forge video-edit; default Kling 4.0 edit, klingV4VideoEdit; other edit models via mode… - `POST /api/agents/edit/video-camera-control`: Turn a still (image_url) into a 1-15 s clip where only the camera moves around the subject (MiniMax H3 Max Camera Controls). moves: 1-3 of… - `POST /api/agents/edit/video-extend`: Continue a video with new footage from a prompt (MiniMax H3 Max extend, minimaxH3MaxExtend). video_url (1.6–60 s, ≤50 MB) + prompt (what ha… - `POST /api/agents/edit/video-recast`: Replace the people in a 5-30 s clip (no shot over 15 s) with the people in 1-4 photos, left to right (MiniMax H3 Max Recast); motion, camer… - `POST /api/agents/edit/video-reframe`: Reframe a video to 9:16 / 4:5 / 1:1 / 16:9 - `POST /api/agents/edit/video-relight`: Relight a clip and keep its people, motion and camera. model minimaxH3MaxRelight (default): lighting {preset: golden-hour|neon-night|overca… - `POST /api/agents/edit/video-style`: A 5-15 s, 768p clip with sound in a look (MiniMax H3 Max Styles): style retro-toon-70s | vhs | low-poly | hand-drawn | 16bit-pixel, prompt… - `POST /api/agents/edit/video-upscale`: Upscale a video to a higher resolution ### generate - `POST /api/agents/generate/auto-sfx`: Auto-SFX for video - `POST /api/agents/generate/character-sheet`: Character reference sheet - `POST /api/agents/generate/composition-render`: Render a Hyperframes HTML composition to MP4 (HTML + assets -> MP4 via headless Chrome + FFmpeg) - `POST /api/agents/generate/image`: Text-to-image generation. @slug mentions in the prompt (or entities: [slug]) attach the Universe entity's reference image as referenceImage… - `POST /api/agents/generate/lipsync`: Lip sync audio to a face - `POST /api/agents/generate/location-sheet`: Location reference sheet - `POST /api/agents/generate/music`: Music generation - `POST /api/agents/generate/prop-sheet`: Prop reference sheet - `POST /api/agents/generate/set-sheet`: Set reference sheet - `POST /api/agents/generate/sfx`: Sound effects - `POST /api/agents/generate/shot-framing`: Compose a shot from entities + prompt (@slug + item:) - `POST /api/agents/generate/text`: Text generation with a Forge text model: { prompt, model?, parameters? }. model "murekaLyrics" writes song lyrics ([Verse]/[Chorus]) from a… - `POST /api/agents/generate/timeline-export`: Render timeline to video - `POST /api/agents/generate/video`: Text/image-to-video generation. @slug mentions (or entities: [slug]) attach the entity's reference image with the model's label ([Image1],… - `POST /api/agents/generate/video-animate`: Animate still image to video - `POST /api/agents/generate/video-image-audio`: Compose video from image + audio - `POST /api/agents/generate/video-keyframes`: Keyframes to video (FLUX 3 Max, bflFlux3MaxKeyframes): { prompt, keyframes: [{ image_url, time, prompt? }] (2-10; seconds from the start, s… - `POST /api/agents/generate/vision-language`: Vision + language reasoning - `POST /api/agents/generate/voice`: Text-to-speech. text = only the words to speak (all of it is read aloud); style_instruction = how to say them (tone, accent, pace; Gemini 3… - `POST /api/agents/generate/voice-changer`: Voice conversion ### idempotency - `GET /api/agents/idempotency/[key]`: Look up a generate/edit request by its Idempotency-Key (the caller's own keys only; another account's key is a 404) ### items - `GET /api/agents/items/[itemId]`: Get one item by id alone (e.g. an asset id copied from a Library card; item: also accepted): searches the productions you can edit, mos… ### locations - `GET POST /api/agents/locations`: Client library - `GET PUT /api/agents/locations/[locationId]`: Fetch / update one client-library location - `PUT /api/agents/locations/[locationId]/sets/[setId]`: Set a location set's default image: { sheet_url?, avatar_url? } (https or null) ### manifest.json - `GET /api/agents/manifest.json`: This manifest ### me - `GET /api/agents/me`: Who this key or OAuth grant acts as: { account: { username, avatar_url }, credential: { kind: api_key|oauth, scopes, expires_at } }. No sid… ### productions - `GET POST /api/agents/productions`: List / create productions (description is Markdown) - `GET PATCH DELETE /api/agents/productions/[id]`: Single production ### productions/[id]/characters - `GET POST /api/agents/productions/[id]/characters`: Production-scoped characters (import + list) ### productions/[id]/clips - `GET POST /api/agents/productions/[id]/clips`: List clips or create a draft - `GET PATCH DELETE /api/agents/productions/[id]/clips/[clipId]`: Read / partial-update / soft-delete a clip draft - `POST /api/agents/productions/[id]/clips/[clipId]/publish-transcription`: Apply segments + corrections to source transcription, retime cues, write a new transcription - `POST /api/agents/productions/[id]/clips/[clipId]/publish-video`: Render a new video/audio file via the cog-clip-export model ### productions/[id]/compositions - `GET /api/agents/productions/[id]/compositions`: The key owner's Motion compositions bound to this production or unbound (owner/editor access), newest first, without payloads. ?limit (≤200… - `GET PATCH /api/agents/productions/[id]/compositions/[compositionId]`: GET: { composition, version, summary: { stage, layers[] }, html } (?include_html=false drops html; ETag = version) ### productions/[id]/draft-pipeline - `POST /api/agents/productions/[id]/draft-pipeline`: One pitch drafts the PLAN half of the pipeline: generates a 60-second script, creates it, then chains the stage bridges (script→storyboard… ### productions/[id]/entity-slugs - `GET POST DELETE /api/agents/productions/[id]/entity-slugs`: @slug CRUD for production entities ### productions/[id]/face-checks - `GET POST /api/agents/productions/[id]/face-checks`: Face consistency checks (is it still the same person as the Universe character?) - `POST /api/agents/productions/[id]/face-checks/regenerate`: Re-run an output whose face check failed: the same generation and parameters with a new seed (a shot take comes back as a new take of its s… - `GET PUT /api/agents/productions/[id]/face-checks/settings`: The production's automatic face-check setting { mode: off | flag (default) | auto_regenerate, max_attempts (1-5, default 2), max_credits (n… ### productions/[id]/items - `GET /api/agents/productions/[id]/items`: List production items - `GET /api/agents/productions/[id]/items/[itemId]`: Get one item by id, fetched directly (any item in the production, not just the newest 50): id, status, media_url, job_id, job_status, cance… - `POST /api/agents/productions/[id]/items/[itemId]/cancel`: Cancel a pending/processing generation ### productions/[id]/locations - `GET POST /api/agents/productions/[id]/locations`: Production-scoped locations ### productions/[id]/look - `GET PUT /api/agents/productions/[id]/look`: The production look: {moodboard_id, enabled, moodboard {id, title, revision}, look, palette_words, context}. PUT {moodboard_id?: uuid|null,… ### productions/[id]/loras - `GET POST /api/agents/productions/[id]/loras`: Production style LoRAs (MiniMax H3 video) - `GET PATCH DELETE /api/agents/productions/[id]/loras/[loraId]`: One style LoRA. GET {lora} (reading also moves a training on once its image clips finish: poll it) - `POST /api/agents/productions/[id]/loras/[loraId]/cancel`: Cancel a style LoRA training while it is preparing or queued (409 otherwise); the training hold is refunded. → {lora} - `POST /api/agents/productions/[id]/loras/captions`: Draft training captions: {item_ids (≤ 50)} → {captions {itemId: text}, sources {itemId: prompt|vision|none}} (each item's own generation pr… - `POST /api/agents/productions/[id]/loras/quote`: Price a style LoRA training without spending: {mode, steps?, clip_item_ids, image_item_ids?, auto_scale_input?} → {mode, steps, billed_step… ### productions/[id]/media - `POST /api/agents/productions/[id]/media`: Upload media: multipart/form-data with the file in "file" (max 4.5 MB); optional name, type, tags (JSON array), metadata (JSON object) - `POST /api/agents/productions/[id]/media/import`: Import a video from a link into the production library (spends 2 credits per minute (rounded up) of the span: up to 60 s = 2, 61-120 s = 4,… ### productions/[id]/moodboards - `GET POST /api/agents/productions/[id]/moodboards`: List or create moodboards (visual reference boards) - `GET PATCH DELETE /api/agents/productions/[id]/moodboards/[moodboardId]`: Read / update / delete a moodboard - `POST /api/agents/productions/[id]/moodboards/[moodboardId]/items`: Append up to 50 images/notes to a moodboard - `GET PATCH DELETE /api/agents/productions/[id]/moodboards/[moodboardId]/look`: A moodboard's look (palette swatches {hex, name, weight, role?}, descriptors lighting/contrast/colour_grade/texture/lens/era/composition/ty… - `POST /api/agents/productions/[id]/moodboards/[moodboardId]/look/extract`: Build a board's look. {palette?: true (FREE: 5-8 named, weighted swatches measured from the board images, deterministic), aesthetic?: boole… ### productions/[id]/props - `GET POST /api/agents/productions/[id]/props`: Production-scoped props ### productions/[id]/publish-to-studio - `POST /api/agents/productions/[id]/publish-to-studio`: Publish this production's generated video to film.fun Studio (studio.film.fun, the episodic platform) with the agent key's owner's Studio c… ### productions/[id]/quote - `POST /api/agents/productions/[id]/quote`: Itemised quote before a multi-step job; spends nothing ### productions/[id]/readiness - `GET /api/agents/productions/[id]/readiness`: Decision-helper that wraps /stages with a suggested_next_steps array ordered by the canonical pipeline (universe → moodboard → script → sto… ### productions/[id]/reference-analysis - `POST /api/agents/productions/[id]/reference-analysis`: Read a reference video for its STRUCTURE and get back a timed shot plan ### productions/[id]/scripts - `GET POST /api/agents/productions/[id]/scripts`: List or create persisted scripts for a production - `GET PUT /api/agents/productions/[id]/scripts/[scriptId]`: Read or update one script - `GET POST /api/agents/productions/[id]/scripts/[scriptId]/cast`: A script's cast against the production's Universe characters (the editor's Cast panel) - `POST /api/agents/productions/[id]/scripts/[scriptId]/edit`: Edit a script by scene: {ops, dry_run?, base_revision?, summary?}. Ops: replace_scene {scene, markdown}, insert_scene {markdown, after?|bef… - `GET POST /api/agents/productions/[id]/scripts/[scriptId]/revisions`: Script version history ### productions/[id]/share-links - `GET POST /api/agents/productions/[id]/share-links`: List / create share links (frame.io-style review or present) - `GET PATCH DELETE /api/agents/productions/[id]/share-links/[linkId]`: Read share link with comments + decisions (split-approval polling target) ### productions/[id]/shot-sheet - `GET PATCH /api/agents/productions/[id]/shot-sheet`: Shot Sheet aggregator - `GET /api/agents/productions/[id]/shot-sheet/cost-preview`: Count-only cost preview for the bulk shot-sheet generators - `GET /api/agents/productions/[id]/shot-sheet/from-script`: One-shot composer for "decompose this script" agent loops - `POST /api/agents/productions/[id]/shot-sheet/seedance`: Send one shot in a Shot Sheet to Seedance 2 video generation - `POST /api/agents/productions/[id]/shot-sheet/seedance/all`: Bulk: generate video for every shot in a Shot Sheet (or shot_ids), one shot at a time - `POST /api/agents/productions/[id]/shot-sheet/stills`: Generate the still frame for one shot in a Shot Sheet - `POST /api/agents/productions/[id]/shot-sheet/stills/all`: Bulk: generate stills for every shot in a Shot Sheet in parallel ### productions/[id]/shot-takes - `GET POST /api/agents/productions/[id]/shot-takes`: Shot-aware generation: new takes of one shotlist shot, attached to the shot - `POST /api/agents/productions/[id]/shot-takes/hero`: Make a take its shot's hero: { take_id }. Circles it (the previous hero is demoted) and writes its media onto the shot (asset_url, asset_it… - `POST /api/agents/productions/[id]/shot-takes/review`: Review a take: { take_id, decision: approve|reject|clear, note? }. For the production's owner, editors and members with the reviewer role - `POST /api/agents/productions/[id]/shot-takes/scene`: Match a whole scene: every AI shot without a hero in a scene (scene_id) or the whole shotlist (no scene_id), in order, each matched to the… ### productions/[id]/shotboards - `GET POST /api/agents/productions/[id]/shotboards`: Shotboards (shown as "Shot boards" in the UI): per-shot planning, first/last frames, prompts and the chosen take - `GET PATCH DELETE /api/agents/productions/[id]/shotboards/[shotboardId]`: Read / update / delete a shotboard ### productions/[id]/shotlists - `GET POST /api/agents/productions/[id]/shotlists`: List or create shot lists for a production - `GET PUT /api/agents/productions/[id]/shotlists/[shotlistId]`: Read or replace fields on a shot list ### productions/[id]/stage-status - `GET /api/agents/productions/[id]/stage-status`: Where the production is in its stages (universe (optional; recommended when shots name people or places) → moodboard (the production look)… ### productions/[id]/stages - `GET /api/agents/productions/[id]/stages`: Aggregated production stage state ### productions/[id]/storyboards - `GET POST /api/agents/productions/[id]/storyboards`: List or create storyboards for a production - `GET PUT /api/agents/productions/[id]/storyboards/[storyboardId]`: Read or replace fields on a storyboard ### productions/[id]/studio - `GET POST /api/agents/productions/[id]/studio/projects`: List Studio (video editor) timelines (any production role), or create one: {name, aspect_ratio?, width?, height?, ops? (the edit ops, appli… - `GET PATCH DELETE /api/agents/productions/[id]/studio/projects/[projectId]`: Read / update / delete a Studio project linked to this production - `POST /api/agents/productions/[id]/studio/projects/[projectId]/edit`: Edit a Studio timeline with up to 50 ops, all or nothing: {ops, base_revision?, summary?, dry_run?, snap?}. Ops: add/remove/update/reorder_… - `POST GET /api/agents/productions/[id]/studio/projects/[projectId]/export`: Render a Studio timeline to MP4 (spends credits): {quality?, loudness?, measure_loudness?, dry_run? (price only), max_credits? (402 over_ma… - `GET /api/agents/productions/[id]/studio/projects/[projectId]/items/[itemId]`: One timeline item (by id or exact name) as the editor's inspector shows it, in the names edit ops take - `GET /api/agents/productions/[id]/studio/projects/[projectId]/revisions`: Newest-first version history of a Studio timeline: every saved change (editor, agents, API) with author, source (ui | agent-chat | mcp | ap… - `POST /api/agents/productions/[id]/studio/projects/[projectId]/revisions/revert`: Restore a Studio timeline to an earlier revision ({revision, base_revision?, summary?}) ### productions/[id]/studio-handoff - `GET /api/agents/productions/[id]/studio-handoff`: Browser handoff URL ### productions/[id]/studio-link - `GET PUT /api/agents/productions/[id]/studio-link`: The production's film.fun Studio setting: {link: {enabled, studio_project_id, studio_project_url, studio_project_title, linked_at, linked_b… ### productions/[id]/takes - `GET POST /api/agents/productions/[id]/takes`: List or create takes for the shoot stage - `GET PUT DELETE /api/agents/productions/[id]/takes/[takeId]`: Read, update, or archive a single take ### productions/[id]/tasks - `GET POST /api/agents/productions/[id]/tasks`: Tasks - `GET PATCH DELETE /api/agents/productions/[id]/tasks/[taskId]`: Read / update / delete a single task - `POST /api/agents/productions/[id]/tasks/[taskId]/notes`: Append to a task notes thread (use parent task GET for the thread itself) ### productions/[id]/transcriptions - `GET POST /api/agents/productions/[id]/transcriptions`: List or create/upsert a transcription - `GET PATCH DELETE /api/agents/productions/[id]/transcriptions/[transcriptionId]`: Read / partial-update / soft-delete a transcription ### productions/[id]/universe - `GET POST /api/agents/productions/[id]/universe`: Universe ### productions/[id]/universe-bundle - `GET /api/agents/productions/[id]/universe-bundle`: One-shot read: Universe + all production characters/locations/sets/props ### productions/[id]/universe-entities - `GET /api/agents/productions/[id]/universe-entities`: The production's Universe entities as mentions: { entities: [{ slug, mention ("@slug"), entity_type, entity_id, name, reference_image_url,… ### productions/[id]/variants - `POST /api/agents/productions/[id]/variants`: Make variants of one shotlist that each change exactly ONE thing ### props - `GET POST /api/agents/props`: Client library - `GET PUT /api/agents/props/[propId]`: Fetch / update one client-library prop ### series - `GET /api/agents/series`: Discovery: distinct series_id values across the agent's editable productions, with episode_count + max_episode_number + latest_created_at p… ### session - `GET /api/agents/session`: Default session + creation/production id ### shotlists - `POST /api/agents/shotlists/[shotlistId]/promote`: Promote a shotlist to a fresh shotboard ### skill - `POST /api/agents/skill/brand-dna/extract`: Extract brand DNA (palette / typography / voice / values) from a URL or pasted text ### tools - `GET /api/agents/tools/generator-tools`: List every generator tool with its enabled models embedded (?include=models, default) - `GET /api/agents/tools/generator-tools/[generatorToolId]/models`: List models + capabilities for a generator - `GET /api/agents/tools/generator-tools/image/models`: List image-generation models + capabilities (alias for generator-tools/[id]/models with id=image) ### transcribe - `POST /api/agents/transcribe`: Audio/video -> text (JSON audio_url OR multipart file <=4.5MB) ### video-templates - `GET POST /api/agents/video-templates`: List the agent client's video templates (filter by ?kind=script|storyboard|shotlist), or create one - `POST /api/agents/video-templates/[templateId]/apply`: Apply a video template to a target production, creating a new scripts/storyboards/shotlists row seeded from the template's payload ## Optional - [Splice](https://splice.film.fun): the web app. Everything an agent makes shows up in the user's dashboard. - [Template library](https://splice.film.fun/templates): browse templates, with previews. - [Studio API](https://studio.film.fun/llms.txt): publish episodes and series (a separate product and key type, `ff_sk_…`). - [ReelKit](https://reelkit.fun): an optional agent layer on top of Splice that adds scheduling, approvals, spend caps and social posting. You don't need it to use this API.