Base URL
Authentication
All API requests (except public OAuth callbacks and webhooks) require anAuthorization header:
sp_live_...) for server-to-server use and Supabase JWTs issued to browser sessions. See Authentication for details.
Response format
Every response uses a consistent JSON shape. Success — the data directly (or a domain-specific envelope):success: false plus a human-readable message:
Pagination
Paginated list endpoints use a Stripe-style contract:limit: number of records to return, default15, max100starting_after: fetch the next page after the given object IDending_before: fetch the previous page before the given object ID
/assets, /products, /team/members, and /invites.
Status codes
Rate limits
Limits are per-team, bucketed by endpoint tier:
Exceeding a limit returns
429 with a Retry-After header.
Async jobs
Expensive generation endpoints (/generate/image and /render) are always async. They return 202 Accepted with a job_id immediately — clients then poll GET /jobs/:id for the result. This avoids long-running HTTP requests and stays within Cloudflare Worker CPU limits.
pending → processing → completed | failed.
The work runs on Cloudflare Queues with automatic retries and a dead-letter queue for failed messages.