Limits are per key, reported on every response, and enforced with a token bucket so short bursts are fine and sustained overuse is not.
RateLimit-Limit: 600 RateLimit-Remaining: 573 RateLimit-Reset: 41 # seconds until the bucket refills Retry-After: 12 # only on 429
| Plan | Sustained | Burst |
|---|---|---|
| Test | 60 / min | 120 |
| Starter | 600 / min | 1,200 |
| Growth | 3,000 / min | 6,000 |
| Enterprise | Negotiated | Negotiated |
On 429, wait `Retry-After` seconds. Do not retry immediately, and do not retry on a fixed interval — if many workers share a key they will synchronise and hammer the reset boundary together. Add jitter.
const wait = (Number(res.headers.get("Retry-After")) || 1) * 1000;
await sleep(wait + Math.random() * 500); // jitter mattersNot every call costs one unit. A cross-seller compare does more work than a metadata lookup and is weighted accordingly; the weight consumed is returned in `RateLimit-Cost`.