Skip to main content
Telephony failures fall into three buckets: the provider cannot reach you, it reaches you and gets something wrong back, or the call connects but the surrounding bookkeeping fails.

The provider cannot reach /answer

The most common failure, and the one VoicEra cannot see — nothing reaches your logs.
Empty means the request never arrived. Work through:

Agents that used to work stopped answering

Almost always because VOICE_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:
A PATCH re-provisions the application against the current value. Otherwise delete and recreate the agent. See Public voice URLs.

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 no org_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 without agent_id only imports the number; it does not link it to an agent or to the provider application. Re-attach with the agent:
Confirm:

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 via PATCH /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.