Skip to main content

Endpoints

Compressed catalog of every 2026-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

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}/cancel to be a DELETE. It’s a POST.
  • Confusing POST /canvases/{id}/share with 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} without share_token= on a share-only-visible canvas. You’ll get 404 — the call resolves through the key’s team access, not the share link.
  • Treating POST /canvases/{id}/export as async. It’s synchronous. No Task envelope. 409 + Retry-After: 10 is the retry signal when a design task is running on the canvas.

Upstream