Rate Limits
Per-tier quotas, 429 semantics, and Retry-After behaviour.
The SurfacedBy API is rate-limited per key. Limits are enforced at two windows: per minute and per calendar month. Exceeding either returns a 429 response.
Quotas by surface
| Surface | Per minute | Per month |
|---|---|---|
| Business tier (public API) | 60 | 50,000 |
| Professional tier (public API) | 60 | 10,000 |
| Console API (per key) | 120 | 100,000 |
Quotas are per key. If you have multiple keys on a Business account, each key gets its own per-minute budget; they do not share a pool.
Response headers
Every response includes:
X-RateLimit-Limit- the per-minute limit for this key.X-RateLimit-Remaining- requests left in the current minute window.X-RateLimit-Reset- Unix epoch seconds when the current window resets.
On 429 responses you also get:
Retry-After- seconds to wait before retrying. Honour this value exactly.
429 response shape
The body is a standard problem document (see Errors):
Burst behaviour
The per-minute limit is a fixed window, not a token bucket. When a new minute starts, your budget resets to the full allowance. There is no separate burst allowance on top.
503 rate_limit_unavailable
Rarely, the rate limiter itself is temporarily unavailable. When that happens, the API fails closed with a 503 and a short Retry-After. Treat this the same as a 429 for retry purposes. See Errors.
Designing around the limits
- Batch reads by pulling larger pages (respecting the per-endpoint maximum page size) rather than many single-record requests.
- Cache aggressively on your side. Analytics data updates at most daily in practice, so refetching every minute is wasted budget.
- Use webhooks instead of polling whenever you can.