REST API reference
Inspect real routes, authenticate locally, submit idempotently and retrieve your own results.

Before you start
- Use a same-PC script or HTTP client, not a web page or cloud connector.
- Enable the desktop server and prepare a key with the scopes your workflow needs.
Steps
Check health and the live schema
Use the current base URL from Settings.
GET /v1/healthandGET /v1/openapi.jsondo not need a key, but still enforce Origin/Host checks. All other REST routes below require a bearer key.curl.exe http://127.0.0.1:47831/v1/status -H "Authorization: Bearer <your local API key>"Use only implemented routes
GET /v1/health— health, no key required.GET /v1/openapi.json— OpenAPI 3.1, no key required.GET /v1/statusGET /v1/modelsGET /v1/voicesGET /v1/charactersPOST /v1/charactersPATCH /v1/characters/{id}POST /v1/referencesPOST /v1/jobsGET /v1/jobsGET /v1/jobs/{id}GET /v1/jobs/{id}/waitPOST /v1/jobs/{id}/cancelPOST /v1/outputs/{id}/extendPOST /v1/outputs/{id}/editPOST /v1/outputs/{id}/upscaleGET /v1/outputs/{id}/contentHEAD /v1/outputs/{id}/content
Replace
{id}with the relevant character, job or output identifier. Read operations needread; reference uploads, job submission, cancellation and output follow-ups needgenerate; character writes needcharacters./mcpis the separate MCP transport, not a REST operation.Prepare references and submit once
Read
/v1/modelsbefore choosing a model and job fields from OpenAPI. Send JSON withContent-Type: application/json.POST /v1/jobsand output extend/edit/upscale requireIdempotency-Key(1–200 visible ASCII characters). Keep that key and identical body on retry: replay returns the same job, while different content with the same key returns 409. New work returns 201; a replay returns 200 withidempotent-replayed: true.Upload references as raw media bytes to
/v1/references, not JSON file paths. Video requiresX-Rights-Confirmed: true; optionalX-File-Namesupplies a name.Wait, paginate and download
Use
GET /v1/jobs/{id}/wait?timeout=50; timeout is clamped to 0–50 seconds (default 30). Inspectx-wait-resultand the returned job; a wait timeout is not job failure. Wait again on the same job untildone,failedorcancelled.GET /v1/jobs?limit=20&cursor=…returns newest first withnextCursor; the maximum page size is 100. Download your own output with GET content; HEAD reads headers and single byte ranges are supported.Handle errors without duplicate spending
REST errors use
application/problem+jsonwithcode,detailand optional fielderrors. Resolve 401 credentials, 403 scope/Origin, 404 ownership or missing resource, 409 conflict, 422 field validation, and 429 rate/cap separately. HonourRetry-Afterfor rate limiting. Never create a replacement generation merely because waiting or downloading failed.
When it worked
Your client reads the schema, submits one idempotent job, waits by ID and downloads a key-owned output.
If something goes wrong
Why is a job visible in the app but 404 through my key?
Keys can only access their own jobs, outputs and references, not UI jobs or another key’s resources.
Why does retry return 409?
Check the problem code. idempotency_conflict means the same idempotency key was reused with different content; restore the original request rather than blindly generating a new key.
