Skip to main content

Errors and rate limits

The APIs use conventional HTTP status codes. Error bodies are JSON; the shape varies by endpoint but always includes a human-readable message.

Status codes​

CodeMeaning
400The request body or parameters failed validation. The message says which field.
401No credential, an expired JWT, or an API key sent in the wrong header.
403Valid credential, but it lacks permission. Most often a tenant key used on another tenant's resources.
404The resource does not exist, or is outside your tenant's scope.
409The request conflicts with current state, for example activating a conversation version that no longer exists.
429Rate limited. Retry after a pause.
500Something failed on our side. Retry with backoff; contact support if it persists.

Common 401 causes​

  • The API key was sent as Authorization: Bearer .... Use the X-Api-Key header instead.
  • The JWT expired. Refresh it via POST /auth/refresh on the Auth API.
  • The key was revoked.

Rate limits​

Most endpoints are not rate limited. The exceptions protect paid upstream services and abuse-prone surfaces:

  • Text-to-speech synthesis (POST /api/tts/...) is limited per tenant.
  • A handful of anonymous endpoints have per-IP limits.

A 429 response means you crossed one of these. Limits are windowed, so waiting briefly and retrying is the right client behavior. If your integration legitimately needs a higher TTS budget, contact support.