Outbound calling campaigns — create, start, pause, and stop.
Variable Coverage For An Agent + Call List Pair
For each {{contact_variable}} referenced in the agent's prompt, report the fill rate across the call list's active contacts. Used pre-creation by the wizard so the user sees coverage before saving the campaign. Mirrors the math the /start endpoint uses to refuse launches with 0% coverage on any required var.
query Parameters
agent_idAgent whose prompt to inspect.
call_list_idCall list to scan for var coverage.
Variable Coverage For An Agent + Call List Pair › Responses
Successful Response
required_variablestotal_contactsblocking_zero_pctList Campaigns
List outbound campaigns for your organization.
query Parameters
skipNumber of records to skip for pagination. Defaults to 0.
limitMaximum number of records to return. Defaults to 50. Max 100.
statusFilter by campaign status (draft, scheduled, active, paused, stopped, completed, cancelled, error).
qCase-insensitive substring match on campaign name.
List Campaigns › Responses
Successful Response
Pagination metadata in API responses.
Create Campaign
Create a new outbound calling campaign.
Create Campaign › Request Body
nameCampaign name
agent_idAgent ID to use for making calls
phone_number_idPhone number ID for caller ID
Call list ID for contacts to call
Campaign description
URL to POST when campaign completes or stops. Receives JSON payload with campaign stats.
Call scheduling configuration
Campaign configuration
Create Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Get Campaign
Retrieve a specific campaign by ID.
path Parameters
campaign_idThe unique identifier of the campaign.
Get Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Update Campaign
Update a campaign's configuration.
path Parameters
campaign_idThe unique identifier of the campaign.
Update Campaign › Request Body
Campaign name
Campaign description
URL to POST on campaign completion/stop
Agent ID for the campaign
Phone number ID for caller ID
Call list ID for contacts to call
Call scheduling configuration
Campaign configuration
Update Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Start Campaign
Start an outbound campaign to begin making calls.
path Parameters
campaign_idThe unique identifier of the campaign.
Start Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Pause Campaign
Pause a running campaign. Can be resumed later.
path Parameters
campaign_idThe unique identifier of the campaign.
Pause Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Stop Campaign
Soft halt — cancels queued calls. Restartable via /start, which creates fresh attempts for any contact whose attempts are all in terminal-non-success states. Use /cancel for a terminal kill switch.
path Parameters
campaign_idThe unique identifier of the campaign.
Stop Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Resume Campaign
Resume a paused campaign (paused → active). Requeues the VoiceSessions that pause cancelled.
path Parameters
campaign_idThe unique identifier of the campaign.
Resume Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Cancel Campaign
Terminally cancel a campaign. Cannot be reversed — to reuse the config, duplicate the campaign first.
path Parameters
campaign_idThe unique identifier of the campaign.
Cancel Campaign › Responses
Successful Response
nameCampaign name
idorganization_idagent_idphone_number_idstatuscreated_atupdated_atCampaign description
Call scheduling configuration
Campaign configuration
Retry Failed Attempts
Re-queue failed / no_answer / voicemail / busy attempts. Creates new CampaignAttempt rows with attempt_number = max+1 and fresh queued VoiceSessions, then enqueues dispatch.
path Parameters
campaign_idThe unique identifier of the campaign.
Retry Failed Attempts › Request Body
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object | |
| type = null |
Restrict retry to these contacts (default: all matched)
Only retry attempts in these outcomes. Default: failed, no_answer, voicemail, busy.
Retry Failed Attempts › Responses
Successful Response
requeuedNumber of new attempts created
contactsContact IDs that were retried
List Campaign Attempts
Paginated list of per-contact dial attempts with optional outcome filter. Sources from the campaign_attempts table (Phase 1).
path Parameters
campaign_idThe unique identifier of the campaign.
query Parameters
outcomeFilter by outcome (e.g. 'failed', 'completed', 'pending').
skiplimitList Campaign Attempts › Responses
Successful Response
Pagination metadata in API responses.
Test Status Webhook
Fires a synthetic campaign.test payload at the campaign's configured status_webhook URL so operators can verify their receiver before going live. Distinct event type from real lifecycle webhooks; receivers should ignore this event.
path Parameters
campaign_idThe unique identifier of the campaign.
Test Status Webhook › Responses
Successful Response
successTrue if the receiver responded 2xx.
latency_msRound-trip time in milliseconds.
HTTP status code from the receiver.
Truncated response body (first 500 chars).
Set when the request failed before getting a response.
List Campaign Calls
List outbound call records generated by campaigns. Filter by campaign_id to get calls for a specific campaign. For one-off dialer calls use GET /v1/voice-sessions?channel=phone&direction=outbound.
query Parameters
organization_id(Legacy) Organization id. Ignored; org is derived from auth context.
campaign_idFilter by campaign id
statusFilter by call status
phone_numberFilter by destination phone number
skipNumber of records to skip
limitMaximum number of records to return
List Campaign Calls › Responses
Successful Response
Get Campaign Call
Retrieve a specific campaign outbound call record by id.
path Parameters
call_idThe unique identifier of the outbound call.
Get Campaign Call › Responses
Successful Response
idchannelstatuscreated_atupdated_atanalysis_statusretry_countduration_secondsconversation_turn_countsentiment_trendtopics_discussedkeywords_extractedtopicsaction_itemsList Call Lists
List call lists for your organization.
query Parameters
skipNumber of records to skip for pagination. Defaults to 0.
limitMaximum number of records to return. Defaults to 50. Max 100.
List Call Lists › Responses
Successful Response
Pagination metadata in API responses.
Create Call List
Create a new call list.
Create Call List › Request Body
nameCall list name
Call list description
Create Call List › Responses
Successful Response
nameCall list name
idorganization_idcreated_atupdated_atCall list description
total_contactsactive_contactsis_activeGet Call List
Retrieve a specific call list by ID.
path Parameters
call_list_idThe unique identifier of the call list.
Get Call List › Responses
Successful Response
nameCall list name
idorganization_idcreated_atupdated_atCall list description
total_contactsactive_contactsis_activeUpdate Call List
Update a call list's properties.
path Parameters
call_list_idThe unique identifier of the call list.
Update Call List › Request Body
Call list name
Call list description
Additional list metadata
List active status
Update Call List › Responses
Successful Response
nameCall list name
idorganization_idcreated_atupdated_atCall list description
total_contactsactive_contactsis_activeGet Contact Import Progress
Poll endpoint for the async contact-import path. The FE hits this every ~2s while a job is running. Snapshot lives in Redis for 1h after completion.
path Parameters
job_idJob id returned from POST /contacts/import.
Get Contact Import Progress › Responses
Successful Response
statusqueued | running | completed | failed
totalprocessedimportedskippeddnc_blockedList Contacts
List contacts in a call list.
path Parameters
call_list_idThe unique identifier of the call list.
query Parameters
skipNumber of records to skip for pagination. Defaults to 0.
limitMaximum number of records to return. Defaults to 50. Max 100.
List Contacts › Responses
Successful Response
Add Contact
Add a contact to a call list.
path Parameters
call_list_idThe unique identifier of the call list.
Add Contact › Request Body
phone_numberContact phone number
Arbitrary key/value map. Every key becomes a {{key}} variable available to the agent prompt at call time. Reserved keys phone_number and status are rejected (they would override the contact's real columns).
Add Contact › Responses
Successful Response
phone_numberContact phone number
idcall_list_idcreated_atArbitrary key/value map. Every key becomes a {{key}} variable available to the agent prompt at call time. Reserved keys phone_number and status are rejected (they would override the contact's real columns).
statusis_activeUpdate Contact
Update a contact's information.
path Parameters
call_list_idThe unique identifier of the call list.
contact_idThe unique identifier of the contact.
Update Contact › Request Body
Contact phone number
Replace the contact's variable map. Pass {} to clear; omit to leave unchanged. Reserved keys phone_number and status are rejected.
Contact status: active, dnc, invalid, opted_out, or called (legacy)
Contact active status
Update Contact › Responses
Successful Response
phone_numberContact phone number
idcall_list_idcreated_atArbitrary key/value map. Every key becomes a {{key}} variable available to the agent prompt at call time. Reserved keys phone_number and status are rejected (they would override the contact's real columns).
statusis_activePreview Contact Import
Step 1 of the two-step CSV import. Parses the uploaded file, detects encoding + delimiter, and returns a suggested header → canonical-field mapping plus a sample of rows. The opaque preview_token in the response is required for POST /import.
path Parameters
call_list_idThe unique identifier of the call list.
Preview Contact Import › Request Body
fileCSV file with contact data (max 25MB).
Preview Contact Import › Responses
Successful Response
preview_tokenOpaque token to pass to /import. TTL ~10 minutes.
detected_headerstotal_rowsencodingdelimiterraw_header → canonical_field mapping derived from header aliases.
First 10 rows with raw cell values.
First 10 invalid rows with reasons.
Commit Contact Import
Step 2 of the two-step CSV import. Files >= 1000 rows are processed in the background via ARQ; smaller files run inline and return the final result.
path Parameters
call_list_idThe unique identifier of the call list.
Commit Contact Import › Request Body
preview_tokenrun_asyncForce the background path. Auto-on for files >1000 rows; the FE may also opt in to background mode for smaller files to keep the UI responsive.
Commit Contact Import › Responses
Successful Response
statusqueued | completed | failed
Set when run_async is true; poll for progress.
imported_countskipped_countdnc_blocked_countBulk-paste Contacts
Manual bulk add for the FE bulk-paste tab. Up to 500 rows per call. Phone numbers are normalized to E.164 server-side; rows that fail to parse are returned in the errors array but the rest of the batch still imports.
path Parameters
call_list_idThe unique identifier of the call list.
Bulk-paste Contacts › Request Body
Bulk-paste Contacts › Responses
Successful Response
imported_countskipped_countdnc_blocked_count