Skip to main content
HTTP 429 · type rate_limit. Spending POSTs (creates, turns, refreshes, estimates) are limited per key — 60/minute on a new account. You’ve exceeded that rate. Nothing was charged. Two things are deliberately not limited this way:
  • Reads (GET) are not rate-limited at all — polling is never the thing we throttle.
  • Expensive work is limited by concurrency, not rate — that’s the separate concurrency_cap.
Spend ceilings are also not rate limits — running out of money is a 402/403, never a 429.

The shape

Headers ride along: Retry-After, plus x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset.

How to fix

  • Honor Retry-After (or retry_after_s) with backoff. Retrying a spending POST is safe when you send the same Idempotency-Key — a replay never bills twice.
  • Watch x-ratelimit-remaining and pace proactively instead of bouncing off the limit.
  • If you’re burning the bucket on POST /v1/sessions/estimate (it’s free but sits in the spending-POST bucket as its only guard), batch or debounce your quoting.
  • Sustained legitimate volume above the default? Ask us to raise the key’s limit.

Reproduce it

Hammer the free estimate endpoint past 60/min on an fn_test_ key ($0):