API docs
Calls
A call is one phone conversation (inbound or outbound). All endpoints are workspace-scoped and require read access. Pagination everywhere: ?limit= (default 25, max 100) and ?starting_after=<id>; responses are {"data":[…],"has_more":bool} ordered newest first.
List calls — GET /v1/calls
Filters: status, direction (inbound|outbound), agent_id, contact_id, external_ref, created_after, created_before (ISO 8601).
curl -H "Authorization: Bearer $VCA_API_KEY" \
"https://api.voicecallingai.com/v1/calls?direction=outbound&limit=2"
Returns light call objects: id, direction, from, to, status, agent_id, contact_id, outcome, talk_seconds, created_at, external_ref.
Get a call — GET /v1/calls/{id}
The full object (real example, numbers masked):
{
"call_id": "b4222a3f-b422-4b09-b5a7-f721287dbc4c",
"direction": "inbound",
"from": "+91XXXXX22338",
"to": "+912264230136",
"agent_id": "c071a030-8601-4e73-bfb2-872d49b42f38",
"contact_id": "6fec7323-9c4e-4d2a-8c11-2f1b6f3f2a10",
"campaign_id": null,
"status": "completed",
"hangup_cause": "normal_clearing",
"timings": {
"queued_at": "2026-06-04T14:01:00Z", "dialed_at": "2026-06-04T14:01:01Z",
"answered_at": "2026-06-04T14:01:01Z", "ended_at": "2026-06-04T14:02:40Z",
"ring_seconds": 0, "talk_seconds": 99, "total_seconds": 100
},
"credits_charged": null,
"outcome": "demo_booked",
"disposition": null,
"summary": {
"outcome": "demo_booked",
"confidence": 0.9,
"next_action": "Send a reminder for the demo scheduled for tomorrow at 5 PM.",
"business_type": "jewelry",
"customer_name": "Harsh",
"key_interests": ["WhatsApp marketing tool", "free trial"],
"key_objections": [],
"scheduled_for": "2026-06-05T17:00:00+05:30"
},
"external_ref": null
}
Notes: credits_charged, outcome, disposition, summary are null until/unless applicable. recording_url and transcript keys appear only when available (coming soon). The same object is the data of the call.completed webhook.
Transcript / recording — GET /v1/calls/{id}/transcript · GET /v1/calls/{id}/recording
Coming soon — currently 404 transcript_not_available / 404 recording_not_available. The recording endpoint will return {"url": "<signed URL>", "expires_in": 3600}.