API · 3 min read

Errors

The error envelope, the common codes, and the rate limits.

Every error is JSON with a stable code, a message for people, and a requestId to quote.

The error envelope

{
  "requestId": "…",
  "error": {
    "code": "INVALID_PRESENTATION_ID",
    "message": "presentationId query parameter is required.",
    "hint": "…"
  }
}
  • error.code is upper snake case and stable; match on it.
  • error.message is for people and can change.
  • error.hint, when there is one, says where to look next.
  • requestId is what to quote in a bug report.

Only error, with its code and message, is on every error; requestId and hint are present when the endpoint has them. The OAuth endpoints answer with RFC 6749 bodies instead, {"error": "…", "error_description": "…"}.

Common codes

StatusCodeMeaning
401UNAUTHORIZED, INVALID_ACCESS_TOKENThe credential is missing, expired, or revoked. See Authentication.
404NOT_FOUNDNo endpoint at that /api path. The body's hint names the OpenAPI document and the MCP server, and docs names the API overview.
404PRESENTATION_NOT_FOUNDNo presentation at that address, or one you cannot read.
405METHOD_NOT_ALLOWEDThe endpoint exists, but not for that HTTP method.
422IDEMPOTENCY_KEY_REUSEDThe same Idempotency-Key with a different body.
429CONTEXT_RATE_LIMITEDThe per-IP window on /api/presentations/context. Wait Retry-After seconds.

The live creation endpoints under /v1/presentations add their own. In every case nothing was written.

StatusCodeMeaning
400LIVE_APPEND_ONLYAn append removed, reordered, or inserted a slide before one already sent. The message names the first slide that moved.
404NO_OPEN_CREATIONNothing is open under that id. A finalized presentation answers this.
409LIVE_TARGET_CHANGEDAn append sent a slug, handle, org, or visibility different from the one the creation started with. Leave them out and the originals are used.
409LIVE_REVISION_CONFLICTThe baseRevision you sent is behind the current live.revision. Read the presentation, then append after what is there.
409LIVE_APPEND_IN_PROGRESSAnother append or narration upload was still being written after 20 seconds. Try again.
409CREATION_SUPERSEDEDAnother publish of the same presentation replaced the open creation.

Rate limits

GET and POST /api/presentations/context are limited per IP: 60 requests per 10 minutes without a credential, 300 with one. Every response from the endpoint carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (seconds) and RateLimit-Policy (60;w=600 without a credential, 300;w=600 with one). A 429 adds Retry-After. In the batch form each item costs one slot, and items past the window come back as CONTEXT_RATE_LIMITED rows rather than failing the request.

The documentation MCP server, POST /docs/mcp, allows 120 requests per 10 minutes per IP.

Publishing endpoints have no request window.

Back to the API overview. For the tool-level view of the same API, see the MCP servers.