Skip to content

Status & Support

Almost every reported failure is one of five things, and each has a distinguishable signature:

SymptomLikely causeWhere to look
401 unauthorized on a call that worked yesterdayKey rotated, disabled, or the header is missing on one code pathAuthentication
402 insufficient_balanceBalance below the reservation for this submissionAccount & balance
A single request returns 200 but nothing was chargedThe whole combo failed; HTTP status is not the outcomeBilling & refunds
The same request succeeds and fails in alternationRate limiting, or an Idempotency-Key being reused across different payloadsRate limits, Idempotency
A bulk task sits in processing and last_progress_at stops movingA genuinely stuck task, not a slow oneTask status

The last_progress_at case is worth stating plainly: elapsed time is not the failure signal, a stalled timestamp is. A 500,000-row task can legitimately run for a long while. A task whose last_progress_at has not moved is a task to escalate.

Every field below is returned by the API, which means including them costs you nothing and saves a round trip:

IncludeWhere it comes from
request_idEvery realtime response, including failures that returned a body
task_idEvery bulk submission and every task-status response
api_key_idGET /v1/api-key — identifies the key without exposing it
The exact HTTP status and response bodyYour own logs; the code field in particular
A UTC timestamp with secondsYour own logs
The request you sent, with the key redactedYour own code

Never paste an API key into a support request. api_key_id identifies the key, and the key itself grants access to your balance.

Account-level notices — planned maintenance, degraded capacity — appear in the Console, which is also where balance and records live. The API surfaces the same conditions to your integration directly, as error codes rather than as prose:

CodeWhat it means for a running integration
detection_capacity_unavailableNo capacity right now. Back off and retry; nothing was charged.
realtime_route_unavailableNo realtime route available. Back off and retry.
realtime_rate_limiter_unavailableThe limiter itself is down, so admission cannot be decided. Retry later.
realtime_fact_cache_unavailableA realtime dependency is down. Retry later.

These are 503s and they are all in the “wait, then retry” group — see Error codes for the full grouping, including which failures are safe to retry with the same Idempotency-Key.

Two operational facts are verifiable from outside and are worth knowing before you file an incident:

  • The API is served behind Cloudflare, so the network path and TLS termination are operated by Cloudflare rather than on a single origin host.
  • Every response carries X-RateLimit-Remaining, so a client that logs response headers can distinguish “throttled by my own limit” from “the service is down” without asking anyone. The general and detection groups also carry X-RateLimit-Limit on every response; realtime does not, because it spends a token bucket rather than a fixed per-minute ceiling.
  • Error codes — the retry groups, which is the fastest triage table
  • Security — key handling, rotating a key, and what never to send