Pagination, errors & rate limits
Lists and pagination
List endpoints return:
{
"data": [ ... ],
"page": { "next_cursor": "a2V5c2V0…", "has_more": true, "total": 132 }
}
Pass ?limit= (1–100, default 25) and ?cursor= with the previous page's
next_cursor. Cursors are opaque; do not construct them. total is included where
it is cheap to compute.
Ids
| Resource | Id |
|---|---|
| Account, shop, collection, design variant | UUID |
| Design | Public short id (d8Xk2mQz) |
| Order | Short reference A1B2C3D4-E5F6 (the full UUID is also accepted and returned as uuid) |
Money and time
Money is { "amount": "49.00", "currency": "AUD" } with a decimal string amount.
Timestamps are ISO 8601 in UTC.
Errors
Errors are RFC 9457 problem details with Content-Type: application/problem+json:
{
"type": "https://api.merchable.co/docs/errors#validation",
"title": "Validation failed",
"status": 422,
"detail": "One or more fields are invalid.",
"errors": { "items.0.quantity": ["must be greater than 0"] },
"request_id": "F-Ab12…"
}
Every type links to the matching section below (/docs/errors#<fragment>).
bad_request
400 — malformed request: invalid JSON, or a missing Idempotency-Key on POST /v1/orders.
unauthenticated
401 — missing, invalid, expired or revoked credential. The response carries a WWW-Authenticate challenge.
insufficient_scope
403 — the credential is valid but lacks the scope the operation needs (each operation in the reference lists it).
not_found
404 — no such resource in your account. Resources belonging to other accounts return the same 404.
conflict
409 — an Idempotency-Key replayed with a different body, or an order that can no longer be cancelled.
validation
422 — field errors (in the errors map) or a business rule the request breaks (in detail), such as a minimum order quantity or a declined card.
rate_limited
429 — see Rate limits below; retry after Retry-After seconds.
internal
5xx — retry with backoff and include request_id when contacting support.
Rate limits
| Bucket | Limit |
|---|---|
| Per credential, read requests | 600 per minute |
| Per credential, write requests | 120 per minute |
| Per IP, unauthenticated | 60 per minute |
Every response carries RateLimit-Limit, RateLimit-Remaining and
RateLimit-Reset (seconds until the window resets). A 429 also carries
Retry-After.
Request ids
Every response has an X-Request-Id header (also in error bodies). Quote it when
reporting a problem.