API errors

4xx/5xx responses, rate limits, idempotency and troubleshooting.

Errors

HTTPCodeMeaningAction
400validation_errorThe payload is valid JSON but does not follow the expected contract.Fix the invalid fields. Reuse the same Idempotency-Key only if the mutation was not accepted.
401unauthorizedThe API key is missing, revoked, suspended or invalid.Generate or reactivate a valid API key from the dashboard before retrying.
403api_key_scope_requiredThe API key is valid but does not have the scope this endpoint requires.Use a key with the required scope or generate a better-suited profile from the dashboard.
409idempotency_conflictThe same Idempotency-Key was already used with a different payload.Create a new idempotency key for this new mutation.
409api_key_active_limit_reachedThe organization already has five active API keys.Revoke an old key before creating a new one.
429rate_limit_exceededThe allowed rate for this endpoint, organization and API key was exceeded in the current window.Read Retry-After and the X-RateLimit-* headers before retrying.
500internal_errorAn unexpected error stopped processing before a stable response.Keep the x-request-id. Replaying with the same Idempotency-Key returns the same response: check the message status before any new send.

Headers

HeaderRole
x-request-idCorrelation for support, logs and client-side tracing.
X-RateLimit-LimitMaximum capacity of the current window for the called endpoint’s bucket.
X-RateLimit-RemainingNumber of requests left before 429.
X-RateLimit-ResetISO date when the window resets.
Retry-AfterPresent on 429 to give the recommended wait time.

429 response

http
HTTP/1.1 429 Too Many Requests
x-request-id: req_01HSQ3D6ZMBJH3J6BQ4X9G4P5R
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-06-18T15:31:00.000Z
Retry-After: 24
content-type: application/json

{
  "success": false,
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded for this API key.",
    "details": {
      "bucket": "minute",
      "retryAfterSeconds": 24
    }
  }
}

Troubleshooting

  • Store the x-request-id for every critical business mutation.
  • Treat 409 idempotency_conflict as an integration error.
  • On 429, use Retry-After and avoid instant loops.
  • On 500, only retry mutations protected by an Idempotency-Key.
  • Show business errors with the code and the request ID.