# API Rate Limits — Per-Account Throttling & Headers

> v1 rate limits apply per account, not per IP address, and every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers so you can self-throttle before you hit a 429.

Rate limits are enforced per authenticated account, keyed off your API key — not per IP address. That means the same client hitting the API from multiple machines/IPs still shares one limit, and different customers sharing an outbound IP (behind a corporate proxy, for example) don't affect each other.

## Limits by endpoint category

| Category | Limit | Endpoints |
| --- | --- | --- |
| Upload / processing | 30 per minute | POST /documents , POST /batches/{batch_name}/process , POST /documents/{document_id}/bbox , PUT /batches/{batch_name}/webhook |
| Status polling / results | 120 per minute | GET /documents/{document_id} , GET /batches , GET /batches/{batch_name} , GET /batches/{batch_name}/results , GET /documents/{document_id}/bbox , GET /documents/{document_id}/image , GET /account , GET /account/usage , template/field endpoints |
| Export | 10 per minute, 60 per hour | GET /batches/{batch_name}/export |

These are the current defaults and may be adjusted over time; the response headers described below always reflect whatever is actually in effect for the endpoint you called, so build against the headers rather than hardcoding these numbers.

## Response headers

Every rate-limited response — successful or not — carries three headers describing where you stand:

| Header | Meaning |
| --- | --- |
| X-RateLimit-Limit | The total number of requests allowed in the current window. |
| X-RateLimit-Remaining | Requests left in the current window. |
| X-RateLimit-Reset | When the current window resets. |

Check `X-RateLimit-Remaining` proactively in a polling loop and back off before you hit zero, rather than waiting to react to a 429.

## When you exceed a limit

Exceeding a limit returns HTTP 429 with the standard v1 error shape:

```json
{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Slow down and retry after the window resets.",
    "doc_url": "https://imagetotable.ai/developers/guides/errors#rate_limit_exceeded"
  }
}
```

If you're polling for batch status, prefer registering a [webhook](/developers/guides/webhooks) over a tight polling loop — it eliminates the risk of tripping the status-polling limit entirely for that use case.

---

Source: https://imagetotable.ai/developers/guides/rate-limits
