Card PricesCard PricesCardPrices

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: 60

RateLimit-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

PlanRequests / Minute
Starter60
Growth300
Professional1,000
Enterprise2,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.