Skip to main content
Every API key is constrained by two independent limits. Hitting either one returns a 429 Too Many Requests.

The two budgets

The per-minute limit catches bursts. The monthly quota keeps things fair across the developer pool. Both are enforced at the Cloudflare edge, so a 429 comes back fast — within a few milliseconds — and doesn’t burn a database round-trip.

Headers

Every authenticated response carries the monthly-quota state:
  • X-RateLimit-Limit — your tier’s monthly quota.
  • X-RateLimit-Remaining — quota left in the current month.
  • X-RateLimit-Reset — Unix timestamp (seconds) when the monthly counter rolls.
The per-minute limit doesn’t get its own header today; if you hit it, the 429 body and Retry-After header tell you the score.

What a 429 looks like

When you exceed either limit:
Two distinct error codes tell you which limit you hit:
  • rate_limit_exceeded — per-minute burst. Retry-After is in seconds; the budget refills on a sliding window.
  • quota_exceeded — monthly quota. Retry-After is the seconds until the 1st-of-month UTC rollover. You need to wait, upgrade to Partner, or request additional capacity.

Backing off

A polite client respects Retry-After and exponentially backs off if it keeps hitting the wall. A naive retry loop is the fastest way to get a key flagged for abuse.

Stay under the limit

The single biggest lever is client-side caching. Most TCG data — sets, series, creature definitions — changes infrequently; caching responses for even a few minutes drops your request volume by 10× or more. For predictable workloads (e.g., a nightly sync), schedule the work and avoid bursting. For interactive workloads (e.g., a deck builder), cache by card ID and only fetch on demand.