You’ll need an
agent_id (see the API Quickstart) and enough wallet balance for the number of rows in your CSV.Prerequisites
export BOLNA_API_KEY="bn-xxxx"andexport BOLNA_AGENT_ID="your-agent-id"- A CSV with a
contact_numbercolumn (required). Any other columns become{variable}values your prompt and welcome message can use.
The CSV
batch.csv
contact_number is mandatory; customer_name and appointment_day are example variables.
Create the batch
Upload the CSV with your Save the
agent_id as multipart/form-data.Response
batch_id.Schedule the batch
A created batch doesn’t call anyone until it’s scheduled. Pass
scheduled_at as an ISO 8601 timestamp with a numeric UTC offset (e.g. +00:00). Two API rules that aren’t obvious:- The time must be at least 2 minutes in the future, or you get a
400. - Use a numeric offset like
+00:00— theZsuffix is rejected with a500. - Bolna rounds the start up to the next 10-minute mark, so a
12:02request runs at12:10.
Response
Track progress
Poll the batch for its status, then list per-call executions once it’s running or done.Each execution in the list is a standard execution object —
status, transcript, total_cost, telephony_data, extracted_data, etc. — one per row in your CSV. The batch object tracks overall progress; status moves created → scheduled → running → completed.GET /batches/{batch_id}
GET /batches/{batch_id}/executions (bare array)
The execution’s
context_details.recipient_data echoes back the CSV columns for that row — confirming your {variables} reached the call. Per-call status starts at prepared before the call is placed, then becomes completed (or no-answer, busy, failed).Run the whole flow as one script
The dependency-freebolna_batch_test.py script does all of the above — builds a sample CSV (or takes your own), creates the batch, schedules it, polls, and prints per-call results:
Managing batches
| Action | Endpoint |
|---|---|
| Stop a running batch | POST /batches/{batch_id}/stop |
| Get one batch | GET /batches/{batch_id} |
| List a batch’s calls | GET /batches/{batch_id}/executions |
| List all batches for an agent | GET /batches/{agent_id}/all |
| Delete a batch | DELETE /batches/{batch_id} |
Next steps
Personalize each call
Use CSV columns as
{variables} in your prompt and welcome message.Receive results via webhook
Get each call’s payload pushed to you instead of polling.
Extract structured data
Auto-capture lead quality, outcomes, and more from every call.
Single calls
The outbound quickstart this builds on.

