Get started

Rate limits

Request limits per minute, the throttles on logins and codes, and concurrency.

Request limits

Authenticated requests are counted per minute. The count is shared by all keys of a workspace, and by all workspaces of an organisation when sub-accounts are used.

RoutesDefault limit
POST /call, /v2/agent/{agent_id}, /v2/agent/{agent_id}/executions500 a minute, counted per route
Everything else1,000 a minute, counted together

Over the limit, the answer is:

json
{"error": 429, "message": "Too many requests. Back off and retry with exponential backoff."}

The window is the calendar minute, so waiting until the next minute is enough. The response does not carry a Retry-After header or remaining-quota headers.

Note: These numbers are the defaults in the code. The operator of a deployment can change both.

Throttles on sensitive actions

These are separate from the request limits and have their own messages.

ActionLimit
Failed logins10 per 15 minutes, per email and per client address
Wrong two-factor codes5, then the second step is locked for 15 minutes
Password-reset emails3 an hour per address; 20 requests an hour per client address
Verification-email resends3 an hour
Setup-assistant messages20 an hour per workspace
Browser voice testsOne at a time per workspace

Team invitations, website lead forms and callback requests are throttled too; their limits are on the reference pages.

Calls per number

The compliance settings can cap how many calls one phone number receives per day. A call over the cap is refused with 429 and a message that starts with Call not placed:. See Compliance toolkit.

Concurrency

How many calls run at once is not a rate limit; it is admission control.

  • Each workspace has a concurrency limit, set by its plan. Calls beyond it wait in the queue; they are not refused.
  • The voice engine has its own capacity (MAX_CALLS), sized by the operator to what the model servers can carry. When the platform knows the engine is full, calls wait.

Limitation: A call that reaches the engine while it is full is refused without a spoken message. The operator should configure a busy announcement at the telephony provider.

Staying under the limits

  • Use a batch for a list of calls instead of a loop of POST /call.
  • Let webhooks tell you when an execution changes, rather than polling.
  • Back off exponentially on 429, with jitter.