Build integrations with the Cuevue REST API. Manage projects, workflow stages, custom fields, comments, subtasks, team members, and webhooks programmatically.
All API requests require a bearer token. Generate an API key from Settings → API & Integrations in your workspace. Keys use the cue_sk_ prefix.
curl https://cuevue.io/api/v1/projects \ -H "Authorization: Bearer cue_sk_your_key_here"
Keys carry one of three permission tiers: read (browse everything), write (create and update content), and admin. Admin-grade operations — managing members, workflow stages, custom field definitions, and webhooks, plus deletes — require an admin key. A plain write key no longer performs admin operations.
All endpoints are relative to /api/v1. Request and response bodies use JSON.
| GET | /projects |
| POST | /projects |
| GET | /projects/:id |
| PATCH | /projects/:id |
| DELETE | /projects/:id |
| PATCH | /projects/:id/custom-fields |
| PATCH | /projects/batch |
| GET | /projects/:id/versions |
| GET | /projects/:id/comments |
| POST | /projects/:id/comments |
| GET | /projects/:id/comments/:commentId |
| DELETE | /projects/:id/comments/:commentId |
| GET | /projects/:id/subtasks |
| POST | /projects/:id/subtasks |
| GET | /subtasks/:id |
| PATCH | /subtasks/:id |
| DELETE | /subtasks/:id |
| GET | /workflow |
| GET | /workflow/stages |
| POST | /workflow/stages |
| GET | /workflow/stages/:id |
| PATCH | /workflow/stages/:id |
| DELETE | /workflow/stages/:id |
| GET | /fields |
| POST | /fields |
| GET | /fields/:id |
| PATCH | /fields/:id |
| DELETE | /fields/:id |
| PATCH | /fields/reorder |
| GET | /members |
| POST | /members |
| GET | /members/:id |
| PATCH | /members/:id |
| DELETE | /members/:id |
| GET | /webhooks |
| POST | /webhooks |
| GET | /webhooks/:id |
| PATCH | /webhooks/:id |
| DELETE | /webhooks/:id |
| GET | /webhooks/:id/deliveries |
| POST | /webhooks/:id/test |
| GET | /space |
List endpoints return cursor-based pagination. Pass limit (max 100, default 25) and use the returned cursor value to fetch the next page.
{
"data": [ ... ],
"pagination": {
"cursor": "eyJ2IjoiMjAyNi0wMy0xMCIsImlkIjoiYWJjMTIzIn0",
"has_more": true,
"total": 142
}
}When has_more is false, you have reached the end. Pass sort and order to control sort direction.
Errors return a consistent JSON envelope with an error object:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request body",
"details": {
"title": "Required"
}
}
}| Status | Code |
|---|---|
| 400 | VALIDATION_ERROR |
| 401 | UNAUTHORIZED |
| 403 | FORBIDDEN |
| 404 | NOT_FOUND |
| 429 | RATE_LIMITED |
| 500 | INTERNAL_ERROR |
The API enforces per-key rate limits. Current limits are returned in response headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Max requests per window |
| X-RateLimit-Remaining | Requests remaining |
| X-RateLimit-Reset | Window reset time (Unix epoch) |
Default limit: 120 requests/minute for read operations, 60 requests/minute for writes. When rate limited, the response includes retry_after_ms in the error body.
Receive real-time notifications when events happen in your workspace. Register a webhook endpoint and subscribe to the events you need.
| project.created | A project was created |
| project.updated | A project was updated |
| project.deleted | A project was deleted |
| status.changed | A project changed workflow stage |
| custom_field.updated | Custom field values changed |
| comment.created | A comment was added |
| version.created | A new version was uploaded |
| subtask.created | A subtask was created |
| subtask.updated | A subtask was updated |
| member.added | A member joined the space |
| member.removed | A member was removed |
{
"event": "project.updated",
"timestamp": "2026-03-26T14:30:00.000Z",
"space_id": "uuid",
"data": {
"project": { ... }
}
}Each webhook delivery includes a X-Cue-Signature header containing an HMAC-SHA256 signature. Verify it using the signing secret returned when you create the webhook:
import crypto from "crypto";
function verifyWebhook(body: string, signature: string, secret: string) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected),
);
}Webhooks that fail are retried with exponential backoff (up to 3 attempts). After repeated failures, the endpoint is automatically disabled.
Cuevue supports the Model Context Protocol (MCP), allowing AI assistants and LLM-powered tools to interact with your workspace. The MCP server exposes resources, resource templates, prompts, and a broad set of tools that map to the REST API. Per-tool permission gating mirrors your key's tier: read tools browse, write tools mutate, and admin-grade tools (member, stage, custom-field definition, and webhook management, plus deletes) require an admin key or scope.
Pick your assistant for the exact config. Hosted clients (Claude.ai, ChatGPT) connect over OAuth with no key; desktop and SDK clients use a config snippet or API key.
On Claude.ai (Pro/Max/Team/Enterprise), open Settings → Connectors, click "Add custom connector", and paste this URL — then approve access. Claude Desktop uses the same Connectors flow. No API key needed either way.
https://cuevue.io/api/mcp
No key to copy — you approve access on a consent screen, and the connection spans every space you can access.
Open Claude ConnectorsRead-only keys can browse resources like cuevue://projects/recent, cuevue://workflow/stages, and templates such as cuevue://projects/{episode_id}.
Tools span projects, subtasks, versions, transcripts, comments, markers, version media (delivered as short-lived signed URLs), review links, documents, directory entries, custom fields, members, workflow, webhooks, and space config — plus list_spaces for discovery. High-cardinality lists are cursor-paginated. Directory listings may include people and bookmark information visible to space members.
Hosted clients such as Claude.ai and ChatGPT can connect over OAuth 2.1 instead of a static key. Add Cuevue as a custom connector and point it at the MCP server URL:
https://cuevue.io/api/mcp
The client discovers authentication automatically — Cuevue serves RFC 9728 protected-resource metadata at /.well-known/oauth-protected-resource/api/mcp and supports dynamic client registration. On connect, you approve access on a consent screen; no key copy-paste is needed.
An OAuth connection spans all of your spaces. Every tool accepts an optional space_id; call list_spaces to discover the spaces you can target. Approved scopes follow the same read/write/admin tiers as API keys.
Questions? Contact support | Download OpenAPI spec