Guides

Post-call data

Read a call's transcript, summary, extracted answers, cost breakdown, recording and raw logs.

Every call is an execution. When the line drops, the platform finishes the transcript, prices the call, writes a summary if asked, and runs your extraction questions. The result is final when the status is completed.

In the dashboard: Monitor → Call History. Opening a call shows tabs for Overview, Transcript, Cost, Extracted data, Webhooks and Logs.

Read an execution

bash
curl https://api.sevennadi.si/executions/b8f0c9a2-3e5d-4c1b-9f7a-2d6e8c4b1a90 \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"
json
{
  "id": "b8f0c9a2-3e5d-4c1b-9f7a-2d6e8c4b1a90",
  "agent_id": "3c90c3cc-0d44-4b50-8822-8dd25736052a",
  "status": "completed",
  "conversation_duration": 42.0,
  "total_cost": 3.2,
  "answered_by_voice_mail": false,
  "transcript": "assistant: Hi Asha, this is Example Bank calling.\nuser: Okay, tell me more.\nassistant: ...",
  "cost_breakdown": {"llm": 0.2, "network": 0.7, "platform": 1.4, "synthesizer": 0.6, "transcriber": 0.3},
  "telephony_data": {
    "duration": "42", "to_number": "+919876500123", "from_number": "+918012345678",
    "provider": "twilio", "call_type": "outbound", "provider_call_id": "MOCK0f3a...",
    "hangup_by": "Caller", "hangup_reason": "Normal Hangup",
    "recording_url": "https://api.sevennadi.si/recordings/b8f0c9a2-3e5d-4c1b-9f7a-2d6e8c4b1a90.wav?sig=..."
  },
  "transfer_call_data": {},
  "summary": "The customer confirmed the renewal date and asked for a reminder by SMS.",
  "extracted_data": {"General": {"Call Outcome": {"objective": "interested", "subjective": "Asked about pricing."}}},
  "tool_call_logs": [],
  "context_details": {"bypass_call_guardrails": false},
  "user_number": "+919876500123",
  "agent_number": "+918012345678",
  "created_at": "2026-10-13T09:30:00.000000Z",
  "updated_at": "2026-10-13T09:31:05.000000Z"
}

Fields with no value are left out. The amounts above are illustrative, not prices.

To list an agent's calls use GET /v2/agent/{agent_id}/executions. from and to are required; filters are status, call_type, provider, answered_by_voice_mail and batch_id; page_size is 1 to 50. See Executions.

Transcript

transcript is plain text, one role: text line per turn, with roles assistant and user. It grows while the call is live, so you can poll it during a call.

If the agent has PII redaction on, sensitive values are masked before they are stored. See Compliance.

Summary

Set call_summary_enabled: true in the agent config to get a two or three sentence summary in the call's language. It is also copied to extracted_data.General["Call Summary"].subjective.

The model used is, in order: your account's OpenAI-compatible key, the platform's own LLM if the operator configured one, or a rule-based fallback that states the number of turns and quotes the caller's first lines. If the model fails, the fallback is stored.

Extraction

Extraction answers questions about the call. Each question is a disposition; dispositions are grouped into extraction categories, and each category is one pass over the transcript.

bash
curl -X POST https://api.sevennadi.si/dispositions/ \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "3c90c3cc-0d44-4b50-8822-8dd25736052a",
    "name": "Call Outcome",
    "question": "How did the customer respond to the offer?",
    "category": "Lead Quality",
    "is_objective": true,
    "objective_options": [
      {"value": "interested", "condition": "The customer wants to proceed or asks for details"},
      {"value": "not_interested", "condition": "The customer declines"}
    ],
    "is_subjective": true,
    "subjective_type": "text"
  }'
  • is_objective picks one of objective_options. Each option needs a value and a condition.
  • is_subjective returns free text, typed by subjective_type: text, timestamp, numeric, boolean, email or regex (which needs subjective_type_config.pattern).
  • At least one of the two must be true.
  • category names the group; without it the disposition goes into General. A new name creates the category.

The result is nested by category, then by disposition name:

json
{"Lead Quality": {"Call Outcome": {"objective": "interested", "subjective": "Asked about pricing."}}}

Try your questions on any transcript without placing a call:

bash
curl -X POST https://api.sevennadi.si/v2/agent/3c90c3cc-0d44-4b50-8822-8dd25736052a/dispositions/test \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
  -H "Content-Type: application/json" \
  -d '{"transcript": "assistant: Would you like the plan?\nuser: Yes, I am interested, what is the pricing?"}'

It returns {"extracted_data": {...}}. The transcript may be up to 50,000 characters.

Like the summary, extraction uses your OpenAI-compatible key, else the platform's own LLM, else rules (word overlap with the options, typed parsing for free text). The rules are a stand-in for development, not a substitute for a model. See Dispositions.

For graph agents, node_extracted_data holds values collected during the call itself and node_path the nodes visited. Those are usually more reliable than post-call extraction for values the flow asked for explicitly.

Cost

total_cost and every entry of cost_breakdown are in minor units of the billing currency (hundredths). The keys are platform, network (telephony), transcriber, llm and synthesizer, and they add up to total_cost. Before completed, total_cost is 0. How rates are set is in Billing.

Recording

telephony_data.recording_url appears when there is a recording.

Call typeRecording
mock engineA real, playable WAV with one tone per turn. Not speech
own engineA mono 8 kHz WAV of both sides, recorded by the engine and uploaded to the platform
Provider recordingIf the telephony provider reports its own recording URL, that is used

Recordings the platform hosts are served at /recordings/{execution_id}.wav?sig=.... The signature is tied to that one execution; a wrong or missing one is 403 Invalid or missing signature. No API key is needed to fetch it, so treat the URL as a secret.

While a caller types a sensitive keypad entry, the recording is silent for both sides.

Raw logs

bash
curl https://api.sevennadi.si/executions/b8f0c9a2-3e5d-4c1b-9f7a-2d6e8c4b1a90/log \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"
json
{"status": "success", "data": [
  {"created_at": "2026-10-13T09:30:01.120000Z", "type": "request", "component": "telephony", "provider": "twilio", "data": "dial +919876500123"},
  {"created_at": "2026-10-13T09:30:06.480000Z", "type": "response", "component": "transcriber", "provider": "deepgram", "data": "Okay, tell me more."}
]}

Components you will see include telephony, transcriber, llm, synthesizer, function_call, routing, knowledgebase, pre_call_webhook and voicemail_detection. Credentials in tool requests are masked.

Limitations

  • Signed recording URLs do not expire. The operator can set a retention period after which hosted recordings are deleted; by default they are kept.
  • Recordings and transcripts are not encrypted at rest by the platform.
  • PII redaction covers text. Spoken numbers remain audible in recordings; only keypad entries are silenced.
  • Post-call extraction by a model can be wrong. In one recorded demo run it turned a spoken date into a full date with the wrong month.
  • The mock engine's transcripts are not passed through PII redaction.