Calls
List past calls, check one, cancel one.
List
GET
/api/v1/callsAll phone conversations in the org, newest first.
agentIduuidstatusstringExact match.
completed, failed, no-answer, busy, scheduled, …directioninbound | outboundphoneNumberstringMatches either side of the call.
startDateISO dateendDateISO datelimitintdefault 50
offsetintdefault 0
sortBycreatedAt | scheduledAtdefault createdAt
sortOrderasc | descdefault desc
{
"data": {
"calls": [
{
"id": "…",
"status": "completed",
"direction": "outbound",
"scheduledAt": "…",
"duration": 42,
"outcome": "resolved",
"twilioCallSid": "CA…",
"agent": { "id": "…", "name": "Collections" },
"contact": { "phone": "+358…", "name": "…", "email": "…" },
"phoneNumber": "+358…",
"createdAt": "…"
}
],
"pagination": { "total": 137, "limit": 50, "offset": 0, "hasMore": true }
},
"meta": { "timestamp": "…" }
}Two id spaces
Ids from this list are conversation ids. The detail endpoint below reads call log ids, which come from POST /v1/calls/outbound. Don't feed a list id into the detail endpoint, it 404s. Use webhooks for per-call results instead.
Get one
GET
/api/v1/calls/{callId}For calls placed via outbound. Shows dial progress while the call is live.
{
"data": {
"id": "V1StGXR8_Z5jdHi6B-myT",
"status": "active",
"direction": "outbound",
"phoneNumber": "+358…",
"duration": null,
"startedAt": "…",
"endedAt": null,
"failureReason": null,
"agent": { "id": "…", "name": "…", "type": "voice" },
"summary": null,
"transcript": null,
"metadata": { "caller_id": "+358…" },
"liveRoomStatus": { "roomExists": true, "numParticipants": 2 },
"createdAt": "…",
"updatedAt": "…"
},
"meta": { "timestamp": "…" }
}Status walks queued → initiated → connecting → ringing → active → completed | failed | cancelled.
Cancel
DELETE
/api/v1/calls/{callId}Only while initiated, connecting, ringing or active. Hangs up if connected. 400 otherwise with Cannot cancel call with status: completed.
{ "data": { "id": "…", "status": "cancelled" }, "meta": { "message": "Call cancelled successfully", "timestamp": "…" } }