Skip to main content

Money

Every monetary value is an integer count of minor units of its stated currency. One order carries one currency, a three-letter uppercase ISO 4217 code matching ^[A-Z]{3}$. Lower case is rejected. A mixed-currency order has no single amount to check against and is refused.

Identifiers

A malformed identifier answers exactly like an unknown one. Sending not-a-uuid returns 404 ORDER_NOT_FOUND rather than a validation error, so an id-guessing caller learns nothing from the difference.

Error shape

Every error, on every endpoint, has the same two fields.
Codes are contractual and stable. Messages are written for a human reading a log and may be reworded without notice — never match on them.

Rate limits

A refusal is 429 RATE_LIMITED with a Retry-After header in whole seconds, never below 1. Honour it — retrying sooner only spends the next window.
Limits are enforced as a token bucket, so a short burst above the sustained rate is admitted. That burst allowance is not contractual and should not be designed against.

Size limits

Pagination

limit is clamped rather than rejected: a value above the maximum silently becomes the maximum, and a non-numeric value becomes the default.
The two endpoints end differently. The catalogue gives you a next_cursor that goes null. GET /orders returns no cursor field at all — continue from the order_id of the last order in the page, and stop when a page comes back shorter than limit.