Using the API
Rate limits
Requests per minute by plan and kind of request, and how to back off.
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, extract into a table, their streaming versions, and suggest schema.
- Bulk row writes: bulk create, update and delete rows.
- Downloads: batch downloads, table export and a row's source file.
- Standard: everything else.
When you hit a limitLink to section
The request fails with 429 and error_key: "too_many_requests". Wait and retry with
exponential backoff and jitter:
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)) }}Tip
Many writes at once? One bulk request 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 (opens in a new tab).