API and MCP

On every plan. Create a key in Settings → API and MCP, then send it as Authorization: Bearer cr_live_…. Errors are JSON: { "code": "MACHINE_CODE", "error": "message" }.

MCP

Server URL: (Streamable HTTP). Tools: list_projects, get_review, add_note, resolve_note, set_approval, export_markers.

REST

CallWhat it does
GET /api/meWho the key belongs to and their workspaces.
GET /api/workspaces/{id}Projects, members and storage.
GET /api/projects/{id}Files with their version stacks, approvals and note counts.
GET /api/versions/{id}/reviewOne version: media, checks, alignment with the last version, and every note.
POST /api/versions/{id}/notes{ "t": 12.5, "t2"?: 15, "text": "…" } leaves a note.
POST /api/notes/{id}/resolve{ "resolved": true }
POST /api/notes/{id}/replies{ "text": "…" }
POST /api/versions/{id}/approval{ "status": "approved" | "needs_changes" | "in_review" }
GET /api/versions/{id}/markers?format=resolve-edl, premiere-csv, fcpxml, avid-txt or csv.
POST /api/versions/{id}/markers/importSend an exported marker file back; markers marked done resolve their notes.
POST /api/projects/{id}/uploadsStart a resumable upload: { "fileName", "size", "assetId"? }, then PUT /api/uploads/{versionId}/parts/{n} 16 MB parts and POST …/complete. Or, faster: POST /api/uploads/{versionId}/sign { "parts": [1, 2, …] } (up to 64) answers storage links, and each part is PUT to its link straight (exactly its size); GET /api/uploads/{versionId} lists the parts that landed either way.

Example