> ## Documentation Index
> Fetch the complete documentation index at: https://docs.peeker.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> One flat 600/min lane per API key, with a clean 429 backoff path.

You can make **600 requests per minute per API key**. Live and sandbox keys have **separate buckets** - exhausting one never throttles the other. There are no per-endpoint sub-lanes; the same lane covers reads and writes.

When you exceed it you'll get `429 rate_limited` with `details.retry_after_seconds`. Wait that long, then retry.

Live `POST /domains/import` can also return `429 rate_limited` with
`details.reason: "cloudflare_account_capacity"` when all eligible Cloudflare
accounts are already handling synchronous imports. Use
`POST /domains/import/jobs` for bulk async imports; that endpoint queues the
job under the normal Partner API rate limit instead of rejecting because
Cloudflare accounts are busy.

## The 429 response

```json theme={"theme":{"light":"one-light","dark":"one-dark-pro"}}
{
	"error": {
		"code": "rate_limited",
		"message": "API rate limit exceeded",
		"details": {
			"retry_after_seconds": 12
		}
	}
}
```

HTTP status: `429`. Always pair it with the `Peeker-Request-Id` response header in your logs.

## Backoff with jitter

Honor `retry_after_seconds`, then add a small random delay so a fleet of workers doesn't sync into the next window.

```bash theme={"theme":{"light":"one-light","dark":"one-dark-pro"}}
# bash - wait the suggested time + 0–1 second jitter, retry once.
RESPONSE=$(curl -sS -o body.json -w "%{http_code}" \
  -H "Authorization: Bearer $PEEKER_KEY" \
  -H "Content-Type: application/json" \
  -d "$BODY" \
  https://api.peeker.ai/partner/v1/orders)

if [ "$RESPONSE" = "429" ]; then
  WAIT=$(jq -r '.error.details.retry_after_seconds // 5' body.json)
  sleep "$(awk "BEGIN { print $WAIT + (rand() * 1) }")"
  curl -sS \
    -H "Authorization: Bearer $PEEKER_KEY" \
    -H "Content-Type: application/json" \
    -d "$BODY" \
    https://api.peeker.ai/partner/v1/orders
fi
```

## Live and sandbox are separate

<Note>
  `pk_live_…` and `pk_test_…` keep independent counters. You can hammer sandbox during integration
  without affecting live traffic.
</Note>

## Need more than 600/min?

Email support with your typical and peak request rates and we'll raise the cap. We don't auto-throttle - production accounts that need more get more.

## Webhooks aren't rate-limited

The webhooks Peeker sends *to you* aren't subject to your API rate limit - they're a separate channel. If your endpoint is slow, Peeker retries with backoff (see [webhooks → retries](/webhooks#retries-and-deadletter)) without consuming your API quota.
