After every call ends, VoxCore runs post-call processing: auto-disposition rules, optional LLM analysis, optional QC checks, and a results webhook to VoxBridge. All four transports share the same post-call logic.
Auto dispositions
Calls that meet certain conditions skip LLM analysis and receive an automatic disposition.
Skip conditions
LLM analysis is skipped if any of these are true:
disconnected_by is error, timeout, voicemail, or RNR
- Call duration is less than 5 seconds
- Customer never spoke (
has_customer_message = false)
Default dispositions
| Condition | DISPOSITION | SUB_DISPOSITION | CALLING_REMARKS |
|---|
| RNR | RNR | RNR | Customer picked up but did not respond. |
| Voicemail | IVR | MAIN_MESSAGE | Voicemail or automated system detected. |
| Timeout | Not Connected | DSCN_PARTIAL | Call exceeded maximum duration. |
| Error | Failed | fallback | Call ended due to a system error. |
| No customer message | RNR | RNR | (uses RNR disposition) |
no_customer_message triggers when the customer never spoke, regardless of who disconnected or call duration. It only checks has_customer_message, not duration < 5.
Per-bot overrides
Set auto_dispositions in bot config to override defaults:
{
"auto_dispositions": {
"rnr": {
"DISPOSITION": "No Response",
"SUB_DISPOSITION": "SILENT",
"CALLING_REMARKS": "Customer was silent throughout."
},
"voicemail": {
"DISPOSITION": "Voicemail",
"SUB_DISPOSITION": "VM_DETECTED"
}
}
}
Keys: rnr, voicemail, timeout, error, no_customer_message. Only DISPOSITION is required — other fields fall back to hardcoded defaults.
LLM post-call analysis
When a call qualifies for analysis (none of the skip conditions are met), VoxCore sends the transcript to the LLM with the bot’s post_call_analysis_prompt.
The prompt defines what to extract and the expected JSON schema. The LLM response is stored as a raw dict in call results — VoxCore does not validate or transform the schema.
Configuration:
post_call_analysis_prompt — the prompt template (supports {transcript} and {timezone} placeholders)
max_tokens — 2048
QC analysis
If qc_prompt is set in bot config, a separate LLM call runs quality checks against the transcript. Same mechanics as post-call analysis — prompt defines schema, raw dict stored in results.
Results webhook
After processing completes, VoxCore sends the full call results to VoxBridge:
POST {webhook_url}
X-VoxCore-Secret: {secret}
Content-Type: application/json
The webhook_url comes from bot config. See CallResults schema for the full payload structure.
disconnected_by values
| Value | Meaning |
|---|
bot | Bot called end_call, spoke closure phrase, or dead air timeout |
customer | Customer hung up |
voicemail | Voicemail detected |
RNR | Customer picked up but stayed silent (dead air) |
outside_hours | Call rejected — bot outside active hours |
no_answer | SIP 408/480 — callee didn’t answer (outbound only) |
rejected | SIP 486/603 — callee rejected (outbound only) |
timeout | Max call duration exceeded |
error | Pipeline startup failure or unhandled exception |