How VoxCore works
VoxCore is a stateless pipeline worker. It doesn’t store bots, users, or call history. For each call:- It fetches bot configuration from a URL you provide (
VOXBRIDGE_CONFIG_URL) - It runs the voice pipeline (STT → LLM → TTS)
- It POSTs call results to the
webhook_urlfrom the config
- Config endpoint — VoxCore calls this to get bot config at call start
- Results webhook — VoxCore calls this to deliver call results at call end
1. Config endpoint (you implement)
VoxCore fetches bot configuration at the start of every call.Request (VoxCore → your system)
| Parameter | Source | Description |
|---|---|---|
bot_id | URL path from WebSocket route or dialout request | Which bot to load |
caller_id | Dialler handshake or SIP headers | Customer phone number |
stream_id | Dialler handshake | Unique call identifier from the dialler |
connected_event | URL-encoded JSON | Full handshake payload from dialler (CRM fields, call direction, etc.) |
X-VoxCore-Secret | .env on fleet server | Shared secret for authentication |
Response (your system → VoxCore)
Return200 with the full bot config JSON. See Bot config schema for the complete field reference.
Minimal example:
| Status | Meaning | VoxCore behavior |
|---|---|---|
200 | Config returned | Call proceeds |
404 | Bot not found | Call rejected, WebSocket closed |
503 | Outside active hours | Call rejected, WebSocket closed |
| Other | Error | Call rejected, WebSocket closed |
The
session_id you return must be unique per call. VoxCore uses it to correlate the results webhook back to this call. Generate a UUID.2. Results webhook (you implement)
VoxCore POSTs call results when a call ends. The URL comes fromwebhook_url in the config response.
Request (VoxCore → your system)
Payload
Field reference
- Core fields
- Analysis
- Metrics
| Field | Type | Description |
|---|---|---|
session_id | string | Session ID from config response |
stream_id | string | Dialler-assigned call identifier |
caller_id | string | Customer phone number |
call_duration_seconds | float | Total call length in seconds |
call_direction | string | "inbound" or "outbound" |
disconnected_by | string | Who ended the call (see table below) |
transcript | list | Conversation transcript |
recording_url | string | URL to call recording (WAV) |
recording_key | string | S3 key for generating signed URLs |
disconnected_by values
| Value | Meaning |
|---|---|
bot | Bot called end_call tool, closure phrase, or dead air timeout |
customer | Customer hung up |
voicemail | Voicemail detected |
RNR | Dead air — customer picked up but stayed silent |
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 |
Your response
Return200 to acknowledge. VoxCore does not retry on failure — if your webhook is down, the results are lost.
3. Dialout endpoint (on VoxCore)
Trigger outbound calls by POSTing to VoxCore’s dialout endpoint. This requires LiveKit SIP to be configured on the fleet server.Request (your system → VoxCore)
| Field | Type | Required | Description |
|---|---|---|---|
bot_id | string | Yes | Bot ID passed to config endpoint |
to_number | string | Yes | Customer phone number to dial |
from_number | string | No | Caller ID / DID. Uses default trunk number if omitted. |
connected_event | dict | No | CRM data available as {{call.field}} in prompts |
config_url | string | No | Override config endpoint URL. Falls back to VOXBRIDGE_CONFIG_URL env var. |
config_url lets a shared VoxCore fleet serve multiple orchestrators. Each orchestrator passes its own config URL so VoxCore fetches the right bot config.Response
| Status | Meaning |
|---|---|
200 | Call initiated (runs in background) |
403 | Invalid X-VoxCore-Secret |
503 | LiveKit not configured, or worker at capacity |