Rate limits

Per-key limits on the money-moving endpoints.

To protect against runaway loops, the action endpoints are rate limited per API key. Plain reads and CRUD are not.

What’s limited

The limiter applies only to the endpoints that place calls or enqueue work:

  • POST /v1/calls
  • POST /v1/campaigns/:id/contacts
  • POST /v1/campaigns/:id/run

Default: 60 requests per minute per key, in a 60-second fixed window. Every other endpoint (listing, fetching, creating/updating agents, contacts, campaigns) is not rate limited.

When you hit the limit

HTTP/1.1 429 Too Many Requests
Retry-After: 12

{ "error": "rate limit exceeded - retry in 12s" }

Back off for the number of seconds in the Retry-After header, then retry.

Concurrency caps (also 429)

Separately, placing a call can return 429 when a concurrent-call cap is reached - either your workspace’s cap or the platform’s:

{ "error": "concurrent-call limit reached for this workspace - retry shortly" }

These aren’t the fixed-window limiter; they mean too many calls are in flight right now. Retry shortly, or pace your POST /v1/calls calls.

Best practices

  • Batch contacts into a single POST /v1/campaigns/:id/contacts (up to 50,000 rows) instead of many small calls - it replaces the whole list in one request.
  • Prefer campaigns over a tight loop of POST /v1/calls for volume - the dialer paces itself and respects your compliance window.
  • Respect Retry-After; don’t hammer on 429.

Next: Scopes →