Telephony
Connected providers
All four routes are admin only.
List providers
GET /api/integrations/telephony
{
"providers": [
{ "provider": "plivo", "is_connected": false, "implemented": true, "connected_at": null },
{ "provider": "exotel", "is_connected": false, "implemented": true, "connected_at": null },
{ "provider": "twilio", "is_connected": false, "implemented": false, "connected_at": null }
]
}
Every supported provider is listed whether or not it is connected, so a UI can
render the full set. implemented reports whether this build supports the
provider.
Get one provider
GET /api/integrations/telephony/{provider}
Connect a provider
PUT /api/integrations/telephony/{provider}
{
"auth_id": "MAXXXXXXXXXXXXXXXXXX",
"auth_token": "your-provider-token",
"phone_number": "+915550010000"
}
Disconnect
DELETE /api/integrations/telephony/{provider}
Credentials are encrypted at rest
nextneural_assist encrypts stored provider credentials with SETTINGS_ENCRYPTION_KEY
before writing them. Two consequences worth planning for:
- The key is required to connect a provider, and to read credentials back when placing a call.
- Rotating or losing the key makes existing credentials undecryptable. There is no recovery path — reconnect each provider with fresh credentials.
Secrets are never returned by the API, only whether a provider is connected.
Model routing
GET /api/settings/model-routing — any member
PATCH /api/settings/model-routing — superadmin only
{
"stt_model": "sarvam",
"diarization": { "enabled": false, "url": null },
"embedding": { "enabled": false, "url": null },
"vllm": { "enabled": false, "url": null }
}
stt_model accepts gpu or sarvam. Each stage is { "enabled": bool, "url": string|null } — note the key is url, not vllm_endpoint.
| Field | Purpose |
|---|---|
stt_model | Speech recognition model |
diarization | Separating who spoke when |
embedding | Vectors for knowledge base search |
vllm | Self-hosted inference endpoint |
nextneural_intelnextneural_intel uses diarization_url, translation, and custom_analysis, with
each stage shaped {enabled, provider, vllm_endpoint}. nextneural_assist uses
diarization, embedding, and vllm, each shaped {enabled, url}. Only
stt_model is common to both.
Superadmin-gated for the same reason as everywhere else: a misrouted model breaks every organization on the deployment, not just the one that changed it.
Exotel sample rate
EXOTEL_SAMPLE_RATE must match the rate in the stream URL Exotel is given.
They disagree silently — audio plays at the wrong speed and transcription
returns nonsense, rather than failing outright.