When it fires
POST /v1/trades (or POST /v1/trades/{id}/confirm for a high-value trade) when your account already has the
maximum number of trades in flight for your key’s tier. A trade is in flight from the moment it is accepted
until it settles (completed, failed or rejected). Trades placed through the Kash app count too: the limit
is per account, not per key.
Nothing was placed. The request was refused before anything was written, so retrying it, with the same
Idempotency-Key or clientRequestId, is a fresh attempt and never a duplicate.
Why the limit exists
Your account’s trades execute one after another, in the order you placed them. A queue deeper than Kash can work through in time would not make your trades faster; the tail would expire unexecuted. Refusing at the door tells you immediately and lets you decide what to resend. Your key’s tier sets the maximum; the response body’smaxInFlight gives it. A trade stops counting once it settles, or after a timeout if it has not settled.
This is separate from RATE_LIMIT_EXCEEDED: that limits how fast requests
arrive; this limits how many trades are unfinished.
Response body
In addition to the standard fields, the problem body carries two top-level members:inFlight: how many of your trades were in flight when you were refusedmaxInFlight: your limit
How to fix
- Honour
Retry-After. The TypeScript SDK retries 429 responses automatically and honoursRetry-After. - Track your trades to completion (webhooks or
GET /v1/trades/{id}) and keep fewer than your limit outstanding, instead of firing and forgetting.
Related codes
RATE_LIMIT_EXCEEDED— 429, requests arriving faster than your tier allowsTRADE_ADMISSION_BUSY— 503, trading as a whole is busy