# Rate limits

How many requests and uploads your plan allows per minute, and what to do on a 429.


When you go over a limit, the API returns `429 rate_limited` with a `Retry-After` header holding the seconds to wait. Limits are per account and depend on your plan. All of your keys share the same budget.

| Plan | Requests per minute | Uploads per minute |
|---|---|---|
| Researcher | 60 | 5 |
| Archivist | 120 | 10 |
| Professional | 300 | 20 |

## Uploads count twice

A `POST /records` upload counts against the request budget and the upload budget, and so do a GEDCOM upload (`POST /gedcom/imports`) and its confirm. Whichever runs out first returns a `429`. A bulk request counts as one request.

## When you are limited

You get `429 rate_limited` with a `Retry-After` header. It holds the number of seconds to wait.

```bash
curl -i https://kleiobase.com/api/v1/workspaces \
  -H "Authorization: Bearer kb_live_YOUR_KEY"
```

```text
HTTP/2 429
Retry-After: 12
```

Wait that long, then retry. For bulk work, spread requests out rather than bursting.

## Failed authentication

Repeated failed authentication from one IP address is limited per IP. This does not use your plan budget. A script with a bad key should stop on the first `401`.

## Other limits

These sit alongside the per-minute limits:

- Monthly credits for processing records. See [Uploads](/developers/docs/uploads).
- A cap on how many records can process at once.
- Your plan's person limit.

The public [OpenAPI document](/api/v1/openapi.json) needs no key and is rate limited per IP.

Canonical: https://kleiobase.com/developers/docs/rate-limits
