Endpoints
Compressed catalog of every2026-05-01 endpoint by router, with scope and a one-line purpose. Not a substitute for the OpenAPI spec — a scannable index.
Base URL: https://api.moda.app/v1
Tasks
Prefer: wait=<s> accepted on POST /tasks and POST /tasks/{id}/cancel. Max 30s. See task-envelope.md.
Remix
Without a
prompt: completes synchronously, returns status: "succeeded" inline. With a prompt: queues a task, returns non-terminal envelope; poll.
Canvases
See
canvases-and-exports.md for the export semantics and the share-token read pattern.
Brand kits
See
brand-kits.md for update semantics.
Uploads
Deduplicates by content hash. See
uploads.md.
Organizations
Role scoped: admins see all, members see their own.
Credits
Share links
Usage / events (observability)
Admins see everything; members see only their own keys’ events.
Cross-cutting request headers
Cross-cutting response headers
Common wrong guesses
- Using the operation ID (
startTask) as the path. Operation IDs are for SDKs; the HTTP path is what matters. - Expecting
/tasks/{id}/cancelto be a DELETE. It’s a POST. - Confusing
POST /canvases/{id}/sharewith generating a share link on every call. It creates one if missing, returns the existing one otherwise. It also blocks on thumbnail generation by default. - Calling
GET /canvases/{id}withoutshare_token=on a share-only-visible canvas. You’ll get404— the call resolves through the key’s team access, not the share link. - Treating
POST /canvases/{id}/exportas async. It’s synchronous. No Task envelope.409 + Retry-After: 10is the retry signal when a design task is running on the canvas.
Upstream
- Full OpenAPI spec:
docs.moda.app/openapi/moda-public-api.yaml - Per-endpoint docs:
docs.moda.app/api/*