Rate Limits
Understanding Card Prices rate limits and how to handle them.
Rate Limit Headers
Every response includes standard rate-limit headers (no X- prefix):
RateLimit-Limit: 60
RateLimit-Remaining: 59
RateLimit-Reset: 60RateLimit-Reset is the number of seconds until the current window resets. On a 429 response the
API also sends a Retry-After header.
Limits by Plan
| Plan | Requests / Minute |
|---|---|
| Starter | 60 |
| Growth | 300 |
| Professional | 1,000 |
| Enterprise | 2,000 |
Rate limits are enforced per team (shared across all of the team's API keys) using a fixed 60-second window in Redis.
Handling 429 Responses
When rate-limited, the API responds with:
{
"error": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. See the RateLimit-Limit header for your plan's limit."
}Read the Retry-After header and back off with jitter:
async function fetchWithRetry(url: string, options: RequestInit, retries = 3) {
for (let i = 0; i < retries; i++) {
const res = await fetch(url, options)
if (res.status !== 429) return res
const retryAfter = Number(res.headers.get("Retry-After") ?? 1)
const jitter = Math.random() * 1000
await new Promise((r) => setTimeout(r, retryAfter * 1000 + jitter))
}
throw new Error("Max retries exceeded")
}Running low on your monthly credit allowance also returns 429, but with
{ "error": "CREDITS_EXHAUSTED" } — check the error code, not just the status, to tell the two
apart. See Quickstart → Handle Errors.