Credits, keys and workspaces
Prices, quotes, holds, budgets, workspaces and branding. 19 tools.
Callable by name
Not listed on connect, to keep the list short. Call them directly by name, or find them with tools.
apply_brand_kit
Use a workspace's brand kit in a project
Copy a workspace's brand kit overlays into a project as the project's own list, to edit for this film or to use ANOTHER workspace's kit (any workspace of the account). Without workspace_id, the project's own workspace. A project with no list of its own already shows its workspace's kit. Free.
| Input | Type | Description |
|---|---|---|
project_id required | string | Project id. |
workspace_id | string | The workspace whose kit to copy. Default: the project's own. |
expected_version | integer | The project's edit_version (from get_project or the last project-level write's response). Optional: when sent, the write is refused with a conflict (current_version, last_writer) if anyone changed the project settings since — nothing is written. Omit to write unconditionally. |
apply_brand_pack
Apply a branding pack to a project
Apply one of the workspace's packs to a project: its theme, then its channel mark, then its overlays. A piece the pack does not carry is left alone. The steps are not one transaction: if a step fails, the error lists the steps already applied. Themes apply to new scenes; scenes already made keep their look. Free.
| Input | Type | Description |
|---|---|---|
project_id required | string | Project id. |
pack_id required | string | Pack id (list_brand_packs). |
create_budget
Give a sub-agent a capped budget
Creates a hard-capped budget and returns an api_key bound to it, shown once, to hand to an agent you spawn. That key can read anything this account can, and quote, hold and create smaller budgets inside its own; it cannot spend past its cap, nor past any budget it nests in. Called with a budget key, the new budget nests in yours. Other spending calls are not yet open to budget keys (they return budget_key_scope). Revoke with revoke_budget.
| Input | Type | Description |
|---|---|---|
cap required | number | Most credits the budget may ever spend or hold. |
label | string | A name for your own bookkeeping, e.g. the sub-agent's task. |
expires_at | string | ISO timestamp; after it the budget and its key stop working. |
create_cli_token
Key for a CLI session on one project
Mint a long-lived API key scoped to ONE project, for a command-line session on the user's machine (typecut dev, typecut add, or plain curl): it lasts days (default 30, up to 90) instead of the connector's hour or an upload link's 2 hours. Send it as Authorization: Bearer <token> to https://app.typecut.ai/api/v1. It reaches only this project (read, edit, export/import its HyperFrames folder, render) and POST /uploads, which files local images, video and other files into it; it cannot mint further keys. The token is shown once: hand it to the CLI (e.g. TYPECUT_TOKEN in the environment), never paste it into a scene. The user can revoke it in Settings → API keys. Free.
| Input | Type | Description |
|---|---|---|
project_id required | string | The project the key is for. |
ttl_days | integer | Lifetime in days, 1–90. Default 30. |
label | string | A name to recognise the key by in Settings → API keys. Default: the project name. |
create_workspace
Create a workspace
Create a workspace — one per brand, channel or client. It holds the defaults its projects inherit (language, aspect ratio, and later voice, theme, branding) and is the boundary a workspace-scoped API key is locked to. Free; plan-limited: over the limit it returns 402 plan_limit_reached with limit and current — tell the user, do not retry. Check list_workspaces first and reuse a workspace that already fits instead of making a near-duplicate. Needs an account-level key (a workspace-scoped key gets 403). Returns the id to pass as workspace_id to create_project.
| Input | Type | Description |
|---|---|---|
name required | string | Workspace name, e.g. the channel or brand. Max 100 characters. |
description | string | One line on what goes in it. |
language | string | Default narration language as a locale, e.g. "en-us", "fr-fr". Default en-us. |
aspect_ratio | string | Default aspect ratio for new projects: "16:9", "9:16", "4:3" or "1:1". |
content_context | string | Standing context for everything made here: audience, subject, tone. |
get_budget
Read a budget
Free. A budget's cap, spent, held and remaining (the least left anywhere up its chain).
| Input | Type | Description |
|---|---|---|
budget_id required | string | The budget_id from create_budget. |
get_price_book
Read every price
Free. The whole price book: one line per thing that costs credits (image, video, voice per character, music, transcription, composition, render, analysis, the production base per minute), each classed pass-through (model generation) or tool (Typecut's own work), in credits and USD at list (1 credit = $0.01). Use it to budget before you plan; use estimate_project to price one project. price_book_version changes whenever any price does. A non-empty drift means an estimate may differ from the charge — say so.
No inputs.
hold_credits
Reserve credits
Reserves credits so parallel work cannot spend them: pass a quote_id (holds its credits_max) or credits. Moves no credits; lowers credits_available on get_account until released or expired (ttl_seconds, default 3600). Pass idempotency_key so a retry returns the same hold. Release it with release_hold when the work is done or abandoned.
| Input | Type | Description |
|---|---|---|
quote_id | string | A quote id from quote; the hold is its credits_max. |
credits | number | Credits to hold, when not holding a quote. |
idempotency_key | string | Any unique string; a retry with the same key returns the same hold. |
ttl_seconds | number | How long the hold lasts, 60–86400. Default 3600. |
reason | string | A label for your own bookkeeping. |
list_brand_packs
List a workspace's branding packs
The branding packs a workspace keeps: each one a name plus a theme, a channel mark and overlay rules. Apply one to a project with apply_brand_pack. Free, reads only.
| Input | Type | Description |
|---|---|---|
workspace_id required | string | Workspace id (list_catalog lists them). |
list_workspaces
List workspaces
List the workspaces (channels) on this account. A workspace carries the defaults a new project inherits — language, aspect ratio, voice, branding — so start here when creating a project and the user has not said where it belongs. If exactly one workspace exists, just use it without asking.
No inputs.
quote
Quote operations before running them
Free; spends nothing, holds nothing. Prices a list of operations against the price book and returns credits_expected and credits_max (and USD at list), per line and in total, with a quote_id and the price_book_version it was priced from. Operations: {type:"generation", slug, quantity?, units?, provider?} for a price-book line (units = characters for TTS, seconds for per-second lines); {type:"scenes", media_source, count, quality_tier?}; {type:"project", template_slug?, duration_seconds?, ...} (same inputs as estimate_project; add authoring:"own" when you write every scene yourself, so no scene media is priced). Budget against credits_max. bound:"estimate" means nothing enforces the max yet; the receipt (get_generation / get_project) says what was charged.
| Input | Type | Description |
|---|---|---|
operations required | array | What you intend to run. 1–50 operations. e.g. [{"type":"generation","slug":"tts","units":1200},{"type":"scenes","media_source":"ai-image","count":4}]. |
release_hold
Release a credit hold
Gives back what a hold still reserves. Safe to retry: a closed hold reports released: 0.
| Input | Type | Description |
|---|---|---|
hold_id required | string | The hold_id from hold_credits. |
revoke_budget
Revoke a budget
Stops a budget and every budget under it: their keys stop working and their holds are released. Idempotent.
| Input | Type | Description |
|---|---|---|
budget_id required | string | The budget_id to revoke. |
save_brand_pack
Create or replace a branding pack
Create a branding pack in a workspace, or replace the pack with the same id. A pack is: id (lowercase, up to 40), name, and any of theme_slug (a theme from list_catalog("themes")), mark (the channel mark: url, position, scale, opacity, formula; null to take it off) and overlays (rules, as set_overlays). Upload a logo first with create_upload and pass its public_url as mark.url. The free-plan Typecut watermark is not part of a pack. Up to 12 packs a workspace. Free.
| Input | Type | Description |
|---|---|---|
workspace_id required | string | Workspace id. |
pack required | object | The pack: { id, name, theme_slug?, mark?, overlays? }. |
set_brand_kit
Set a workspace's brand kit overlays
Set the overlay rules of a WORKSPACE's brand kit (the whole list, same rule shape as set_overlays). Every project in the workspace that has no overlay list of its own shows them, with no work per project: set the logo, the subscribe button and the end card once. Free.
| Input | Type | Description |
|---|---|---|
workspace_id required | string | Workspace id (list_catalog lists them). |
rules required | array | The whole list of rules (see set_overlays). |
set_branding
Put the channel mark on a project, and give it motion
Set the pinned brand mark (the corner "bug") on a project: image, corner, size, opacity, and a MOTION FORMULA. Until this tool the mark was reachable only from the settings panel, so a film built through the API came out unbranded even for a channel that has a logo. Every field is optional and only what you send changes; sending a url for an unbranded project turns the mark on. formula is what makes it live, and it is EITHER a built-in slug OR any active row author_formula has written — list_formulas is the current catalog. On the notated clock: "none" is a static stamp (the default), "corner" fades it up over a small rise, "pop" snaps it in, "breather" sways once a bar, "tick" squashes it on every downbeat of the project's own measured grid, "ghost" rests it low and lifts it on a scene cue. On the MEASURED clock, off the analysed audio: "pulse" breathes the mark with the narration, "goo" puts a white backdrop behind it whose contour rides the voice, "halo" surrounds it with a field of reaching bars. These need a scene whose audio has been analysed — get_scene_context reports which sources a scene has, and a look that follows audio the scene does not have simply holds still. The motion is compiled against the same bars the composition uses, so it lands with the music rather than near it; with no measured score it falls back to a steady grid. Amplitudes are capped and ticks have a cooldown — a mark cannot be made to strobe. Free, and it changes nothing else about the project. Re-render to see it in the MP4.
| Input | Type | Description |
|---|---|---|
project_id required | string | Project id. |
url | string | Logo image URL (PNG with transparency reads best). Send null to clear it, which also takes the mark off. |
enabled | boolean | Turn the mark on or off without touching the image. |
position | string | Corner: "top-left", "top-right", "bottom-left" or "bottom-right" (default bottom-right). |
scale | number | Mark width as a fraction of frame width, 0.04–0.40 (default 0.12). |
opacity | number | 0–1 (default 1). A formula treats this as its ceiling rather than overriding it. |
formula | string | Motion: a built-in ("none", "corner", "pop", "breather", "tick", "ghost", or the audio-reactive "pulse", "goo", "halo") or any active slug from list_formulas. |
expected_version | integer | The project's edit_version (from get_project or the last project-level write's response). Optional: when sent, the write is refused with a conflict (current_version, last_writer) if anyone changed the project settings since — nothing is written. Omit to write unconditionally. |
set_environment
Which environment does my work run on?
Free. Without environment: where this account's calls run now ({environment, source, switchable, worker, choices}). With environment ("staging" or "production"): switch it. Admin accounts only; for everyone else it is production and cannot change. Staging runs every call from this account (its agents, keys and browser) on the staging worker, to test a change before production gets it; switch back to production when done. Effective from the next call.
| Input | Type | Description |
|---|---|---|
environment | string | "staging" or "production". Omit to read. |
set_project_role
Mark a project reference (read-only) or working
A project, scene or link you were handed to LEARN FROM is read-only context unless the user says "work in" it. role "reference" marks it: reads and copy_scenes from it still work, but any mutating tool aimed at it is refused unless the call repeats confirm_project_id (the user said to). role "working" releases it, and needs confirm_project_id = project_id. Use "reference" on the project behind a link you were given to take style from. Free.
| Input | Type | Description |
|---|---|---|
project_id required | string | The project. |
role required | "reference" | "working" | reference = read-only for agents; working = release it. |
confirm_project_id | string | role "working" only: repeat project_id, and only when the user said to work in it. |
set_workspace_mix_profile
Read or set a workspace's default audio mix
Read or set the workspace's DEFAULT mix profile: how music ducks under voice (mix: mode bed|off and the duck dials) and where the voice / music / sfx buses sit (voMasterVolume / musicMasterVolume / sfxMasterVolume, 0..2). Set it once and every project created in that workspace afterwards starts with it — no per-project mixing, which is what makes projects made in bulk or by agents sound right without review. A new project takes, in order: the project named by create_project mix_from_project_id, else this default, else the standard (music ducks under voice); an explicit mix in the creation still wins. Existing projects are never changed — use set_mix on those. No arguments beyond workspace_id = read (profile is null when none is set). from_project_id copies that project's current profile (duck + bus levels; film-specific moments are never copied) into the workspace default — the quickest way: mix one project by ear with set_mix, then adopt it. profile sets it directly, in the shape a read returns; clear: true removes it. Needs edit rights on the workspace.
| Input | Type | Description |
|---|---|---|
workspace_id required | string | Workspace id (list_workspaces). |
from_project_id | string | Copy this project's current audio profile into the workspace default (read as you). |
profile | object | The profile to store: { mix: { mode: "bed", duckDb: -8, … }, voMasterVolume?, musicMasterVolume?, sfxMasterVolume? }. mix is required; moments are dropped; levels clamp to 0..2. |
clear | boolean | Remove the workspace default (new projects get the standard again). |