Agents
Analytics tab
The Analytics tab turns on post-call analysis: a short summary of each call and structured fields pulled from its transcript, saved on the call and sent in the call.completed webhook.
Fields
All fields live under analytics in the agent object.
| Field | Type | Default | What it does |
|---|---|---|---|
summarize | boolean | false | Writes a two-to-four sentence summary in English: who called, what they wanted and how it ended. Saved in the call’s summary. |
extraction_prompt | string | "" | Plain-language description of the fields to pull out of the transcript. The result is saved as a JSON object in the call’s extracted. Leave empty to skip. |
{
"analytics": {
"summarize": true,
"extraction_prompt": "name: the caller's full name\nappointment_date: the date they booked, as YYYY-MM-DD\ninterested: true if they want a callback, false if not"
}
}
When it runs
Analytics runs once, right after the call ends and is saved:
- the call ends, is charged and gets its final status (
call.endedis sent); - the summary and the extraction run, one after the other;
- the results are saved on the call;
call.completedis sent with the full call record, includingsummaryandextracted.
So if you wait for call.completed, the results are already in it. If you poll GET /api/v1/calls/{id}, summary and extracted may still be empty for a few seconds after the status turns final.
Analytics is skipped when the transcript has no caller or agent turns. It uses the agent’s llm.model with temperature 0. Its tokens are not counted in the call’s usage.
Writing an extraction prompt
List one field per line: the name you want in the JSON, and what it means. Say the format you want for dates, numbers and yes/no answers.
name: the caller's full name
appointment_date: the date they booked, as YYYY-MM-DD
appointment_time: the time they booked, as HH:MM in 24-hour time
interested: true if they want a callback, false if not
reason: why they called, in a few words
Voxa asks the LLM for a flat JSON object and to use null for anything the call did not cover. A result for the prompt above:
{
"name": "Rohan Mehta",
"appointment_date": "2026-10-02",
"appointment_time": "12:00",
"interested": true,
"reason": "follow-up visit"
}
If the LLM returns something other than an object (for example a list), it is wrapped as {"value": ...}. If the extraction fails, extracted stays {} and the call is otherwise unaffected.
Reading the results
From the API:
curl https://voxa.abhinavyadav.in/api/v1/calls/$CALL_ID -H "X-API-Key: $VOXA_API_KEY"
{
"id": "00b1d622a8f04f4f8f3a3c2d9e5b7a11",
"status": "completed",
"summary": "Rohan Mehta called City Clinic to book a follow-up visit. He booked 2 October at 12:00 with Dr. Kulkarni. The agent confirmed the booking and ended the call.",
"extracted": {"name": "Rohan Mehta", "appointment_date": "2026-10-02", "appointment_time": "12:00", "interested": true, "reason": "follow-up visit"},
"...": "..."
}
From a webhook: data.call.summary and data.call.extracted in the call.completed event. See Webhook events.