← Back to Dashboard

Rate Limits & Errors

Error codes, rate limits, and retry strategies.

Rate Limits

10 requests/second per API key on all endpoints.

The tabular parse endpoint (POST /tabular/parse) has an additional limit of 5 requests/minute.

429 Too Many RequestsWait briefly and retry with exponential backoff: 1s, 2s, 4s, 8s, etc.

Error Format

{{
  "detail": {{
    "code": "unknown_form",
    "message": "Unknown form: irs_w99_2024",
    "status": 400
  }}
}}

Error Reference

Client Errors (4xx)

StatusCodeDescriptionAction
400unknown_formForm ID doesn't existCheck GET /forms
400invalid_formatBad output formatUse: json, csv, pdf_typed
400invalid_schemaMalformed column schemaCheck column types
400parse_failedNL prompt not parseableRephrase with clearer names
401Key missing, invalid, or revokedCheck Authorization header
403Missing required scopeCreate key with needed scope
404Resource not foundCheck ID; you can only access your own resources
409job_not_completedDownload before job finishesPoll until completed
410Tabular data expired (>48h)Re-run the job
429Rate limit exceededWait and retry with backoff

Server Errors (5xx)

StatusDescriptionAction
500Internal server errorRetry after a brief delay
502Backend unavailableService is temporarily down; retry

Retry Strategy

import time, httpx

def request_with_retry(method, url, **kwargs):
    for attempt in range(5):
        resp = httpx.request(method, url, **kwargs)
        if resp.status_code != 429:
            return resp
        wait = min(2 ** attempt, 30)
        time.sleep(wait)
    return resp
TipDon't retry 4xx errors (except 429) — they indicate a problem with your request.