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

ConditionDISPOSITIONSUB_DISPOSITIONCALLING_REMARKS
RNRRNRRNRCustomer picked up but did not respond.
VoicemailIVRMAIN_MESSAGEVoicemail or automated system detected.
TimeoutNot ConnectedDSCN_PARTIALCall exceeded maximum duration.
ErrorFailedfallbackCall ended due to a system error.
No customer messageRNRRNR(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

ValueMeaning
botBot called end_call, spoke closure phrase, or dead air timeout
customerCustomer hung up
voicemailVoicemail detected
RNRCustomer picked up but stayed silent (dead air)
outside_hoursCall rejected — bot outside active hours
no_answerSIP 408/480 — callee didn’t answer (outbound only)
rejectedSIP 486/603 — callee rejected (outbound only)
timeoutMax call duration exceeded
errorPipeline startup failure or unhandled exception