Two different things, often confused.
Rate limits (an abuse brake)
| Limit | Value | Scope |
|---|---|---|
| Requests | 120 per minute | Per key |
| Deploys | 100 per hour | Per billing account |
| Failed authentications | 60 per 5 minutes | Per source address |
Going over any of them gives 429 with code rate_limited. Only the
per-minute request limit sends a Retry-After header, so do not make your
retry logic depend on one being there: on a deploy or authentication 429 there
is nothing to read, and retrying immediately just burns the next window.
The monthly allowance (billing)
- 5,000 requests included per billing account per UTC calendar month
- $1.00 per 100,000 requests after that, taken from account credit
- Pooled per account, not per key. Per-key counts exist for attribution only
- Resets on the 1st, UTC
Going over does not block anything. Requests keep working and the overage is posted to account credit in batches rather than as one ledger line per request.
Reading your usage
Every counted response carries headers:
X-Api-Quota-Limit: 5000
X-Api-Quota-Remaining: 4943
X-Api-Quota-Used: 57
The headers are absent on refusals, on purpose
A 401, 429, or a locked 402 does not carry quota headers, because a
rejected caller must not be able to read how busy a live key is.
GET /api/v1/account returns the same figures in the body, along with the period
dates, overage_rate ($1.00) and overage_unit_requests (100,000). The
Developer tab shows the month's usage, a per-key split, and the previous twelve
months.
What does not count
These are refused before metering, so they do not spend the allowance:
401bad or missing key429rate limited402API locked because hourly billing is not unlocked403suspended or closed account403read-only key attempting a writeOPTIONSpreflight
Everything else counts, including a 404 for a server id you do not own and a
400 for a malformed body.
Staying under it
5,000 requests a month is small if you poll. A monitoring check every minute is about 43,200 requests in a 30-day month. After the 5,000 included requests, that is about 38,200 billable requests, or roughly $0.38. Two habits help:
- Poll a list, not each server.
GET /api/v1/serversreturns every server in one request, with the same fields the detail endpoint gives. This month's transfer per server is onGET /api/v1/accountunderbandwidth.servers, so you do not need a request per box to see who is using the pool. - Poll fast only while something is happening. Every ten seconds during a deploy is fine. Every ten seconds forever is a bill.