Docs API Rate limits & errors
API · 03 of 03

Rate limits & errors.

Per-tier rate limits, retry behavior, and the complete error code catalog. Designed so you can build a robust client without trial-and-error.

Time: 5 min·Updated: 2026-05-25·Audience: developers

TL;DR

Rate limits: Pro = 60 req/min, Company = 600 req/min, burst allowance 2× sustained. Limits per workspace, not per key. Errors: standard HTTP codes + error envelope with type, code, message, request_id. 429 responses include Retry-After header. Retry with exponential backoff for 5xx; don't retry 4xx (except 429).

01Rate limits per tier

TierSustained req/minBurst (10s window)Notes
Free— (no API access)API requires Pro+
Pro60120Per workspace, all keys combined
Company6001,200Per workspace, all keys combined
EnterpriseCustomCustomNegotiated per contract

Limits are per workspace. If you have 3 API keys for the same workspace, they share the budget.

02Rate-limit headers

Every response includes:

X-RateLimit-Limit: 60 X-RateLimit-Remaining: 47 X-RateLimit-Reset: 1716647400 X-Request-Id: req_xxxxxxxxxxxx

X-RateLimit-Reset is a Unix timestamp for when the rate window resets. Use it to back off cleanly when you see X-RateLimit-Remaining: 0.

03Retry guidance

StatusShould you retry?How
2xxSuccess
400 Bad RequestNoFix the request
401 UnauthorizedNoBad API key — check Settings → API
403 ForbiddenNoPlan tier doesn't include this endpoint
404 Not FoundNoResource doesn't exist
409 ConflictNoResource state prevents the operation
429 Too Many RequestsYes, respect Retry-AfterHonor the header
500 Internal Server ErrorYes, exponential backoff1s, 2s, 4s, 8s, 16s, then give up
503 Service UnavailableYes, exponential backoffSame as 500

04Error code catalog

The error.code field in the response envelope. Stable strings — safe to programmatically branch on.

CodeHTTPMeaning
missing_field400Required field absent. field in envelope tells you which.
invalid_field400Field value doesn't match expected type/format.
invalid_api_key401API key is missing, malformed, or revoked.
plan_required403Endpoint requires higher plan tier.
not_found404Resource doesn't exist or you don't have access.
conflict_state409Resource exists in a state that prevents the operation.
rate_limited429Too many requests. Respect Retry-After.
quota_exceeded429Monthly quota exceeded (e.g., brief generation cap).
internal_error500Our problem. Retry.
service_unavailable503Brief outage. Retry.
upstream_timeout504Underlying data source timed out (e.g., during enrichment). Retry.

05Debugging with request_id

Every API response includes X-Request-Id. When something goes wrong, include this in your support ticket — it lets us trace the request through our systems in seconds.

Format: req_ + 12 alphanumeric characters. Example: req_4f2a9c3b1d8e.

The request_id is also in the error envelope (error.request_id), so you can log it from the error body even if you don't capture headers.

06Common mistakes

Retrying 4xx errors
4xx means you sent something wrong. Retrying without fixing it just wastes rate budget. Only retry 429 (rate limit) and 5xx (server).
Ignoring Retry-After on 429
If you retry before Retry-After, you'll just get another 429 and waste a request. Honor the header.
Not logging request_id
When you file a support ticket without it, we have to ask. With it, we can diagnose in minutes.
Was this page helpful?