At the start of every call, VoxCore fetches the bot configuration from VoxBridge. The config defines the system prompt, service providers, voice settings, tools, and post-call behavior.

Config fetch

GET {VOXBRIDGE_CONFIG_URL}/{bot_id}?caller_id={caller}&stream_id={call_id}
X-VoxCore-Secret: {secret}
VoxBridge returns 200 with the config JSON, 503 if the bot is outside active hours, or 404 if the bot doesn’t exist.

Schema reference

Top-level fields

FieldTypeDefaultDescription
session_idstring(required)Unique session identifier
webhook_urlstring(required)URL for results webhook
system_promptstring(required)LLM system prompt
opening_messagestring(required)First message bot speaks
timezonestring"Asia/Kolkata"Timezone for timestamps
min_words_interruptionint3Min words before customer can interrupt bot
max_call_duration_secondsint600Max call length before auto-hangup
voicemail_messagestring""Message to speak when voicemail is detected
pre_transfer_messagestring""Message to speak before call transfer
toolslist[object][]OpenAI-format tool definitions
transfer_numbersdict{}Map of name → phone number for transfers
post_call_analysis_promptstringnullPrompt for post-call LLM analysis
qc_promptstringnullPrompt for QC analysis
auto_dispositionsdictnullPer-bot disposition overrides

STT config (stt)

FieldTypeDefaultDescription
providerstring(required)"deepgram" or "soniox"
api_keystring""Provider API key
modelstring"stt-rt-v4"Model identifier
languagestring"en"Language code
extradict{}Provider-specific: endpointing, smart_format, punctuate, language_hints

LLM config (llm)

FieldTypeDefaultDescription
providerstring(required)"openai", "google", or "google_vertex"
api_keystring""Provider API key
modelstring(required)Model identifier (e.g., "gemini-2.5-flash")
temperaturefloat0.7Sampling temperature
max_tokensint256Max output tokens per turn
extradict{}Provider-specific: top_p, top_k, frequency_penalty, presence_penalty, project_id (Vertex), location (Vertex)
Google Vertex AI requires project_id in llm.extra. Calls fail at startup without it. location defaults to us-east4 if omitted.

TTS config (tts)

FieldTypeDefaultDescription
providerstring(required)"elevenlabs", "sarvam", or "tarang"
api_keystring""Provider API key
voice_idstring(required)Voice identifier
modelstringnullModel identifier (e.g., "eleven_flash_v2_5")
languagestring"en"Language code
extradict{}Provider-specific: speed, stability, similarity_boost, pitch, loudness, pace

VAD config (vad)

FieldTypeDefaultDescription
confidencefloat0.8VAD confidence threshold
start_secsfloat0.3Seconds of speech to trigger start
stop_secsfloat0.6Seconds of silence to trigger stop
min_volumefloat0.6Minimum volume threshold

Re-engagement config (re_engagement)

FieldTypeDefaultDescription
messageslist[string](required)Prompts to speak when customer is silent
gap_secondsint | list[int]5Seconds before re-engagement. List = [first, subsequent].
max_retriesint2Max re-engagement attempts before RNR hangup

MinIO config (minio)

FieldTypeDefaultDescription
endpointstring"localhost:9000"S3-compatible endpoint
access_keystring"minioadmin"Access key
secret_keystring"minioadmin"Secret key
bucketstring"recordings"Bucket name
secureboolfalseUse HTTPS
When minio is null in config, the worker falls back to environment variable MinIO settings. Set it explicitly in bot config to use a different storage destination per bot.