Skip to main content
Limits are per credential and per family, so a burst of writes can never drain your read allowance. Each family is a token bucket with two numbers: a burst, which is how many requests you can make instantaneously, and a per-minute quota, which is the rate the bucket refills at. Refill is continuous rather than a window reset, so a client that spreads its calls never sees a cliff.

The families

These are the deployment’s current defaults, read from the rate limiter’s configuration. They are not encoded in the OpenAPI contract and are tuned per tier, so treat them as the numbers to design against rather than as a guarantee. Read the RateLimit headers if you need the live figure.
Two deliberate choices in that table are worth knowing. sessions is generous because a transcript backfill is a burst of small writes, not abuse. exports is tight because one export dumps an entire knowledge graph, and the generic write bucket would let a client queue thirty of those in a breath. The export poll routes are routed back to reads on purpose, so a polling loop cannot throttle its own download.

The headers

Every response carries these, success and 429 alike.
These are the field shapes from the IETF RateLimit header draft. The quoted policy name is the literal string default on every response, including for a request that was metered against search or exports. The value that varies with the family is q. Do not parse the name expecting a family label. On a 429 you additionally get:
Retry-After is whole seconds, computed from your actual bucket state rather than a fixed backoff.

Reading and respecting them

The pattern that keeps you out of trouble: read r on successful responses and slow down before it reaches zero, rather than treating the 429 as your signal.

When you are limited

detail names the family that refused you, which is the fastest way to find out which bucket your traffic actually lands in.

Two caps that are not rate limits

Both are concurrency or capacity limits rather than request rates, and both come back as their own code. A webhook endpoint may subscribe to up to 20 event types, or to everything with *, so the endpoint cap is rarely the binding constraint.

If limiting itself fails

The limiter fails open. If its store cannot be reached, the request proceeds without RateLimit headers rather than failing. A missing header is not an error and is not a signal to retry: it means the limiter could not answer, not that you have no quota.

Next

Errors

The problem envelope and the full code catalogue.

Idempotency

How to retry a write safely after a 429 or a timeout.