Guide

Rate Limits

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

CategoryLimitEndpoints
Upload / processing30 per minutePOST /documents, POST /batches/{batch_name}/process, POST /documents/{document_id}/bbox, PUT /batches/{batch_name}/webhook
Status polling / results120 per minuteGET /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
Export10 per minute, 60 per hourGET /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:

HeaderMeaning
X-RateLimit-LimitThe total number of requests allowed in the current window.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetWhen 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:

{
  "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 over a tight polling loop — it eliminates the risk of tripping the status-polling limit entirely for that use case.

📮 contact email: [email protected]