The limit that applies to every endpoint
This covers every endpoint, on every path, whether authenticated or public.
Sustained abuse is treated more harshly: an IP exceeding 600 requests in 60 seconds is blocked
for 10 minutes, and every request during that period returns 429.
Additional limits on specific endpoints
Some endpoints carry a second, narrower limit on top of the 120 req/min above. Where both apply, whichever is reached first rejects the request.The authentication limit is deliberately strict and is shared across all callers, not per
client. Exchange your credentials for a token once and reuse it for the token’s lifetime rather
than authenticating per request — see Authentication.
Handling a 429
A rejected request returns status429 with an empty body.
Because every window is a fixed 60 seconds, you do not need a header to recover correctly:
- Throttled at 120 req/min — wait until the current minute elapses. Waiting a full 60 seconds always clears it.
- Blocked after sustained abuse — wait 10 minutes. Retrying sooner will not succeed and extends the pattern that triggered the block.
Staying under the limits
- Use pagination rather than polling. List endpoints return a cursor; page through results instead of re-requesting the collection.
- Use webhooks instead of polling for state changes. Waiting for
bill.approvedcosts nothing; polling a bill every few seconds until it changes is the most common way integrations hit the limit. - Batch overnight work with a delay between requests. 120 req/min is two per second sustained; a bulk import should pace itself rather than burst.
- Reuse tokens. Re-authenticating per request will hit the auth limit long before the general one.