Base URL
Request format
Response format
A single record comes back as the object itself. A collection comes back in an envelope with the rows indata and paging state in page:
next_cursor is absent on the last page. Branch on has_more, not on the presence
of the cursor, and never construct a cursor yourself. See
Pagination.
Every refusal, at every status, uses the error envelope instead.
Identifiers
IDs are opaque strings with a type prefix, such asprod_01J8Z... or order_01J8Z....
Treat them as opaque. The prefix is useful when reading a log, but do not parse an ID
to infer a type, a tenant, or a creation time, and do not assume a length.
Timestamps
RFC 3339, in UTC:Money
Every monetary value is an integer in the currency’s minor unit, paired with a currency code. There are no decimals anywhere in this API.1999 with "usd" is
19.99 USD. This is the single most common source of a wrong number in a new
integration, so read Money before you send an amount.
Unknown fields are refused, not ignored
If you send a body key or a query parameter this API does not define, the request is refused with400. It is not silently dropped.
This is deliberate. A typo that is ignored looks like a working integration until
someone notices the field never took effect, and by then it has been wrong in
production for weeks. Being refused at the first call is the cheaper failure. See
Query parameters.
