When it fires
You exceeded a rate limit. Authenticated requests are limited per user (shared by every key on the account) and per key; anonymous reads are limited per client IP. Limits use a sliding one-minute window. Authenticated limits depend on your key’s tier. Read the limit that applied fromX-RateLimit-Limit. See Rate limits.
The same code is also returned during a temporary authentication lockout: after too many failed authentication attempts from one source, requests from it are refused for a period given by Retry-After.
Response headers
A 429 from the rate limiter carries:Retry-After: <seconds>, how long to wait before the next requestX-RateLimit-Limit: <n>, the limit that appliedX-RateLimit-Remaining: 0X-RateLimit-Reset: <unix-seconds>, when the window resets
detail field names which limit (account or key) refused the request.
Why it happens
- A burst of traffic, such as a polling loop without backoff.
- A retry storm: every consumer retried at the same instant after a transient failure.
- Sustained traffic above your tier’s limit.
How to fix
- Honour
Retry-After. The TypeScript SDK does this automatically and exposes the value asKashRateLimitError.retryAfterSeconds. - Add jitter to retries so multiple consumers don’t synchronise.
- Replace polling with webhooks where you can.
- If you hit the limit during normal operation, move to a higher tier. See Rate limits.
Related codes
RATE_LIMIT_UNAVAILABLE— 503: the API could not check your limit.EXCEEDEDmeans it checked and you are over.TRADE_IN_FLIGHT_LIMIT_EXCEEDED— also 429, limits unfinished trades rather than request rateWEBHOOK_REPLAY_LIMIT_REACHED— also 429, specific to webhook redelivery