Skip to main content
The Voice API places calls synchronously with no per-account concurrency cap, so you can fan calls out concurrently across every number you’ve provisioned. This guide shows how to place a call and run a safe concurrency test so you can confirm capacity for your own volume.

Before you start

1

Get a production API key with the calls:write scope

Issued from your dashboard. (Demo keys are capped at 120 req/min and restricted to an allowlist of destinations; production keys allow 600 req/min and any destination.)
2

Have at least one active phone number

Calls originate from a number on your account.
3

Use destinations you own or control

For a load test, dial numbers you control, never real third parties.
All requests go to https://api.revdesk.com. Rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) are returned on every response.

Place a call

The call is accepted immediately (202) and progresses asynchronously. Check its status anytime:

Run a concurrency test

The pattern: fire N calls at once, hold a concurrency cap, and record success rate + latency as you ramp. Below is a self-contained Node script with no dependencies beyond fetch.
Each call places a real call and consumes minutes/credits. Keep record off and waves modest while testing, and dial only numbers you control.

Concurrency & capacity

Capacity is measured in concurrent channels: one channel carries one in-progress call leg. Your account has a provisioned concurrent-channel limit, sized to your expected peak. When you exceed it, additional calls are rejected: the placement fails, calls don’t queue. It’s a provisioned setting, not a hard platform limit; tell us your peak and we raise it ahead of launch. How many concurrent calls that allows depends on the path, since a channel is per leg: For maximum concurrency, use a path where only the destination is on the phone network (the agent or rep joins over WebRTC). That’s 1 channel per call. The dial bridge rings two phones, so it uses 2. Two independent limits to keep distinct:
  • Request rate. 600 requests/minute per key. Exceeding it returns 429 with X-RateLimit-* headers.
  • Concurrent channels. Your provisioned limit. Exceeding it fails the call placement with a channel-limit error; it is not a 429.

What to measure

Results

A call is accepted (202) and dispatched asynchronously; subscribe to webhooks or poll GET /v1/calls/{id} for live status. The ceiling is your provisioned concurrent-channel limit, at which further placements return a channel-limit error. We size that limit to your peak before go-live. Fill the table for your account and path: Planning for high volume? Tell us your peak expected concurrency and we’ll provision capacity ahead of your launch.