Campaign calls API

Monitor and control the outbound voice calls a campaign places. Every campaign call is tracked as a first-class record with its lifecycle status, timestamps, and duration. Requires the campaigns.read / campaigns.write permission.

The campaign call object

{
  "id":               "uuid",
  "campaign_id":      "uuid",
  "call_sid":         "CA…",
  "to_number":        "+14165550199",
  "status":           "in_progress",
  "ended_reason":     null,
  "conversation_id":  "uuid",
  "started_at":       "2026-05-17T20:08:48Z",
  "answered_at":      "2026-05-17T20:08:49Z",
  "ended_at":         null,
  "duration_seconds": null
}

status walks the outbound queue's lifecycle: queued, claimed, dialing, initiated, ringing, in_progress, then a terminal state — completed, busy, failed, no_answer, canceled, or expired. ended_reason can be twilio (ended naturally), hangup (stopped by an operator), max_duration (cut off at the campaign cap), canceled, expired, blocked, or error. conversation_id links to the resulting transcript in the Conversations API.

List calls

GET /api/v1/rest/campaigns/:id/calls   ?active=1 &status=

Pass ?active=1 to return only calls in flight right now — the live monitoring view.

Get one call

GET /api/v1/rest/campaigns/:id/calls/:callId

Stop a call

POST /api/v1/rest/campaigns/:id/calls/:callId/hangup

Stops the call wherever it is: a still-queued call is canceled before it dials (ended_reason: "canceled"); a live call is hung up (ended_reason: "hangup"). The response reports which happened.