The provider cannot reach /answer
The most common failure, and the one VoicEra cannot see — nothing reaches your logs.
Agents that used to work stopped answering
Almost always becauseVOICE_SERVER_BASE_URL changed after the agents were created.
The answer URL is baked into the provider application at agent-create time, so an existing agent keeps pointing at the old address. There is no error in VoicEra because nothing arrives.
Fix per agent:
400 from /answer
You called it on a websocket agent. /answer serves telephony agents only — a websocket agent has no provider application and no Stream XML to return.
agent_category cannot be changed to telephony without provisioning; PATCH it and the API creates the application, or create a new agent.
The Stream URL is wrong
/answer succeeds but no audio
The provider got valid XML and then failed to open the WebSocket. Nearly always the proxy.
101 Switching Protocols is correct. Anything else means your proxy is not upgrading — you need proxy_http_version 1.1 plus the Upgrade and Connection headers.
Also check the read timeout: nginx defaults to 60 seconds, which silently kills any call longer than a minute mid-conversation.
Creating a telephony agent fails
Number attach and detach
Attach fails with a duplicate key error
Phone numbers are unique globally, not per organisation — the index has noorg_id component. If another organisation in this deployment already holds the number, the attach fails rather than returning a clear conflict.
The number is in inventory but calls do not route
Attaching withoutagent_id only imports the number; it does not link it to an agent or to the provider application. Re-attach with the agent:
Detach leaves the number in inventory
Intended.DELETE /phone-numbers/detach unlinks from the agent and the provider application but keeps the inventory row.
Recording never arrives
Recordings are fetched from the provider after the call, so there is a delay — and providers differ.
Plivo exposes
list_recordings_for_call; Vobiz does not, so retrieval paths differ per provider.
Provider call SID mismatch
VoicEra reconciles its call log with the provider’s id viaPATCH /calls/by-provider-sid/{provider_call_sid}. If a provider webhook arrives with an unknown SID, either the call was not registered or the SID differs from the one stored at dial time.
Inbound registration is idempotent — the same SID twice returns the existing record rather than duplicating.
call_response: "answered" is terminal, and end_time_utc is write-once. Later patches to status or response are dropped deliberately, so a late hangup webhook cannot rewrite a completed call. If a call looks “stuck” at answered, this is why.