Envelopes
Success is{"data": …}. Lists add "pagination": {"limit", "offset", "count"}; limit defaults to 50 and caps at 200.
Errors are {"error": {"code", "message", "details"}}. Branch on code, never on message. details carries the specifics named in the error reference.
Idempotency
Every POST needs anIdempotency-Key (document uploads are the one exception).
- Same key and same body: the original response again, with
Idempotent-Replayed: true. Nothing executes twice. - Same key and a different body:
409 idempotency_key_reused. - Same key while the first request is still running:
409 idempotency_request_in_progress.
Amounts and timestamps
Amounts are decimal strings: four decimals on money ("5000.0000"), eight on units ("40.00000000"). Never send floats. Timestamps are UTC; market-data timestamps carry a Z.
Identifiers
Every resource has a UUIDid. Money objects also carry a human-readable reference you quote when you contact Ladder:
Environments
Two hosts, and on each host two kinds of key:
Keys are not shared between hosts: a UAT key is refused on production and the other way round. Every endpoint page on this site has a server selector for the two hosts, and the code samples take the host as a constant you switch.
Sandbox versus live
Rate limit
120 requests per minute per key. Over it you get429 rate_limited with a Retry-After header in seconds. Spread polling out, and prefer webhooks to polling.