A call batch dials a list of people with one agent from one of your numbers, on a schedule, with retries and a circuit breaker. It is also how you schedule a single call for later: a one-row batch. Every call is placed exactly as a single outbound call, hosted in the from-number’s region.
  • Voicemail is answered and billed unless the agent has voicemail_detection on. With it on, the call ends as voicemail, the recipient is retried like a missed call, and counts.voicemail counts them. Without it, voicemail counts as reached and is never retried.
  • Every call runs the agent’s current published version. A republish mid-campaign changes every later call. A publish the batch could not dial with (a non-voice channel, or a new required variable its vars do not supply) is refused until the batch is cancelled or over.

Create a batch

Validation is all-or-nothing and reports every bad row at once: an unparseable number, a number repeated in the payload, a reserved userdata key. to is normalized against the from-number’s country, as on a single call. Each recipient’s userdata is a flat map of strings that becomes that call’s session state ({{userdata.first_name}}). An empty value is dropped, so the placeholder resolves to nothing. There are no per-recipient overrides of the agent, number or schedule; a different agent means a different batch. Batch-level vars is one bag copied onto every call; it is fixed at create.

Fields

agent_version, agent_override, an inline agent or agent_team are also accepted; see Pinning a version. A window may cross midnight; days then names the evening it starts on: 21:00–06:00 with days: [5] runs Friday 21:00 to Saturday 06:00.

Daily cap and ramps

dial_daily_cap is {"kind": "fixed", "limit": 200} or a ramp, used to warm up a caller ID:
That places 10 calls a day, then 11, 12 … up to 50. start ≥ 1, end > start, step ≥ 1, interval_days 1–30. A ramp advances only on days the batch actually dialled (not on closed windows, weekends or pauses), keeps its progress when edited unless start changes, and is per batch.

Retries

Whether a recipient is retried depends on how the last attempt ended (last_close_reason on the recipient row). A dial that could not be placed still spends an attempt.

Circuit breaker and credit

A batch stops itself after ten consecutive setup-style failures: carrier faults, configuration problems, platform faults, unmapped endings, and pass-level failures such as an unpublished agent, a deleted number or an account that is no longer ready. Any successful call resets the count. Busy and unanswered calls never count. On trip the batch becomes failed, failure_reason holds the last error, and unattempted recipients read as canceled. Running out of credit stops dialling without failing the batch. It stays running, spends no attempts, and failure_reason says the workspace is out of credits. It resumes on its own after a top-up.
A batch runs as its creator. Every pass re-authorizes as the user who created it. If they leave the workspace or drop below the editor role, each pass fails as a configuration problem and the breaker stops the batch. Re-create their campaigns under another account before they leave.

Pause, resume, cancel, edit, delete

A disallowed transition is a 409 naming the current status.

Add or remove recipients

POST /v1/calls/batches/{batch_id}/recipients appends up to 10,000 rows to any batch that is not canceled or failed; a completed batch goes back to running. Numbers the batch already holds, or repeated in the upload, are skipped and reported in skipped (row_number is the 1-based position in your request). The response is {added, skipped, total_recipients}.
POST .../recipients/delete with recipient_ids removes rows that were never dialled; any other row comes back in rejected.

Watching a batch

GET /v1/calls/batches/{batch_id}:

Statuses

Pinning a version

Creating a batch with agent_version, agent_override, an inline agent or an agent_team freezes that cast at create, so a republish does not reach it. PATCHing agent_id clears the frozen cast and returns the batch to the current published version. The frozen plan is stored on every call, so attach FAQs by faq_id rather than inline. See per-call configuration.

Next

Outbound lead qualification

A campaign end to end, from CSV to results.

Call analysis

Summaries, outcomes and structured fields across a batch.