Fabric documentation

Handling rate limits

The four budgets, the headers on every response, and what to do at 429.

Requests are limited per organization, not per key. Minting a second key does not buy more capacity; it just gives you two ways to spend the same allowance.

The budgets

Each operation belongs to a cost class, because reading a page of products and starting an enrichment run are not the same kind of request.

ClassBurstSustainedApplies to
Read20/s600/minEvery GET
Write10/s300/minValue edits, definitions, views, lists, webhooks
Job2/s100/hourImports, exports, AI helpers, publish runs
Spend1/s20/hourEnrichment runs and re-enrichment

Burst and sustained are enforced independently: a client may spike briefly and still be held to the longer budget.

The headers

Every response carries the state of the budget it drew on, so you need not hit a 429 to learn where you stand.

RateLimit-Limit: 600
RateLimit-Remaining: 594
RateLimit-Reset: 41

RateLimit-Reset is seconds until the window rolls.

At 429

A 429 adds Retry-After, in seconds. Wait that long — it is the real answer, not an estimate.

{
  "code": "rate_limited",
  "status": 429,
  "title": "Too many requests",
  "detail": "Over the read budget for this organization. Retry in 12s."
}

Retry on 429, 503 and a network failure. Do not retry a 400, 403, 404 or 422: the request will be refused identically next time, and a loop of them counts against the same budget.

Throttling comes before the scope check

A 429 can arrive on a request that would also have failed for permissions. Fix the throttling first, then read what the retry says.