A campaign calls a list of contacts with one agent, within calling hours and a concurrency limit (max_concurrency, up to 100 calls at once, and never more than your workspace's limit on calls at once), and retries people it could not reach.
curl https://evasay.com/api/v1/voice/campaigns \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Appointment reminders",
"agent_id": "AGENT_ID",
"phone_number_id": "PHONE_NUMBER_ID",
"timezone": "America/New_York",
"window_start": "09:00",
"window_end": "18:00",
"max_concurrency": 2,
"max_attempts": 2,
"retry_delay_min": 60,
"consent_confirmed": true,
"contacts": [
{ "phone": "+14155550100", "name": "Alex", "appointment": "Tuesday 3 pm" }
]
}'
Contacts may also be CSV text with the phone number in the first column. consent_confirmed: true is required: with it you confirm that everyone on the list agreed to be called, including by an AI voice, and EvaSay keeps that confirmation with the campaign (consent_confirmed_at). The campaign is created as a draft; start it with POST /api/v1/voice/campaigns/{id}/start, and use pause or cancel the same way. The agent must be published before a campaign starts.