---
title: Rate limits
description: Requests per minute by plan and kind of request, and how to back off.
url: https://anyrow.ai/docs/rate-limits
canonical_url: https://anyrow.ai/docs/rate-limits
last_updated: '2026-10-11'
---

# Rate limits

API keys share limits per **organization**: every key of every project in it draws from the
same pools. Each pool counts requests per minute.

| Kind of request | Free | Pro | Scale | Enterprise |
| :-- | --: | --: | --: | --: |
| Standard: tables, columns, rows, batches, webhooks | 60 | 300 | 1,200 | 1,200 |
| AI: extraction and schema suggestions | 10 | 30 | 100 | 200 |
| Bulk row writes | 10 | 30 | 60 | 120 |
| Downloads and exports | 10 | 30 | 60 | 120 |

Which pool an endpoint draws from:

- **AI**: [extract](/docs/api/extract), [extract into a table](/docs/api/extract/table-once), their
  streaming versions, and [suggest schema](/docs/api/schema).
- **Bulk row writes**: [bulk create, update and delete rows](/docs/api/rows/bulk).
- **Downloads**: [batch downloads](/docs/api/batches/download-csv),
  [table export](/docs/api/export/export) and [a row's source file](/docs/api/rows/source).
- **Standard**: everything else.

## When you hit a limit

The request fails with `429` and `error_key: "too_many_requests"`. Wait and retry with
exponential backoff and jitter:

```ts title="Node.js"
async function withRetry<T>(call: () => Promise<{ data: T | null; status: number }>): Promise<T | null> {
  for (let attempt = 0; ; attempt++) {
    const result = await call()
    if (result.status !== 429 || attempt === 5) return result.data
    const delay = Math.min(30_000, 500 * 2 ** attempt) * (0.5 + Math.random())
    await new Promise((resolve) => setTimeout(resolve, delay))
  }
}
```

```python title="Python"
import random, time

def with_retry(call):
    for attempt in range(6):
        response = call()
        if response.status_code != 429:
            return response
        time.sleep(min(30, 0.5 * 2**attempt) * (0.5 + random.random()))
    return response
```

> [!TIP]
> Many writes at once? One [bulk request](/docs/api/rows/bulk) counts once against its pool,
> however many rows it carries.

Plans also cap totals per month (API requests, extraction credits, exported rows) and sizes
(files per batch, file size, rows per table). Going past one returns `402` with the limit in
`vars`; see [Pricing](https://anyrow.ai/pricing).
