API overview
The Corte API exposes the platform to your code: trigger Applications, run your Workflows with custom inputs, generate with any Corte model, and manage uploaded assets — from scripts, backends, or agents like Claude Code (see MCP).
Base URL: https://api.corte.so
:::tip Looking for endpoint-by-endpoint detail? This page is the tour. Every resource, parameter, and response shape lives in the API reference. :::
Authentication
Create a key in Settings → API (see API keys) and send it on every request:
Authorization: Bearer corte_sk_…
:::warning Keys act as you
Generations, LLM steps, and workflow runs started with your key spend your
credits, exactly as if you'd clicked Generate in the app. Watch your balance
with GET /v1/usage, or in Settings → Usage.
:::
Quick start
List the model catalog, start a generation, and poll it to completion:
# 1. What models exist, and what do they cost?
curl -s https://api.corte.so/v1/models?kind=video \
-H "Authorization: Bearer corte_sk_…"
# 2. Start a generation ({ model, params } — params match the model kind)
curl -s -X POST https://api.corte.so/v1/generations \
-H "Authorization: Bearer corte_sk_…" \
-H "content-type: application/json" \
-d '{
"model": "kling-3",
"params": { "prompt": "Slow dolly-in on a foggy ridgeline at dawn", "durationSeconds": 5, "aspectRatio": "16:9" }
}'
# 3. Poll until succeeded / failed — results land in resultUrls
curl -s https://api.corte.so/v1/generations/GEN_ID \
-H "Authorization: Bearer corte_sk_…"
POST /v1/generations returns the job and a credit estimate, so you can
account for spend before the result lands. Cancel an in-flight job with
POST /v1/generations/:id/cancel.
The surface at a glance
| Area | Endpoints |
|---|---|
| Models & generations | GET /v1/models, POST /v1/generations, GET /v1/generations/:id, POST /v1/generations/:id/cancel |
| Applications | GET /v1/applications, POST /v1/applications/:id/run |
| Workflows | GET /v1/workflows, GET /v1/workflows/:id, POST /v1/workflows/:id/execute, GET /v1/workflows/:id/runs/:runId |
| Assets | POST /v1/uploads/import, POST /v1/uploads/ticket, POST /v1/uploads/:storageId/commit, GET /v1/storage/usage, DELETE /v1/storage/:id |
| Keys & account | POST /v1/api-keys, GET /v1/api-keys, DELETE /v1/api-keys/:id, GET /v1/account, GET /v1/usage |
Each area has a full reference page: Models, Generations, Applications, Workflows and runs, Files, Transcriptions, Projects, and Account & keys.
Applications are the same 43 curated experiences as in Studio:
GET /v1/applications describes each one's input requirements
(minImages/maxImages, inputKind, acceptsText) and presets, and
POST /v1/applications/:id/run with { imageStorageIds?, videoStorageId?, audioStorageId?, text?, presetId? } returns a standard generation job you poll
like any other.
For running pipelines with your own inputs, see Workflows via the API.
Errors
Every error has the same shape, with a conventional HTTP status:
{ "error": { "code": "insufficient_credits", "message": "…" } }
| Code | Status | Meaning |
|---|---|---|
unauthenticated | 401 | Missing or invalid API key. |
insufficient_credits | 402 | Not enough credits for the estimated cost — top up or upgrade. |
forbidden | 403 | The key's account can't access this resource. |
not_found | 404 | Unknown id (or a resource owned by someone else). |
invalid_params | 400 | The request body doesn't match the model/endpoint contract. |
provider_unavailable | 503 | An upstream model provider is down — retry later. |
The complete list, with handling guidance, is in Errors.
Good to know
- Generation is asynchronous. Create, then poll
GET /v1/generations/:iduntilsucceededorfailed. There are no webhooks yet — poll politely. - Estimates up front. Creation responses include a credit estimate, so a 402 fires before any spend, not after.
- Workflows run fully server-side. API-started runs behave identically to runs from the app — see Workflows via the API.