Troubleshooting: SIP trunk down or calls failing
A trunk that cannot register, or one that keeps completing fewer calls than you expect, shows up in three places: the SIP settings table in the dashboard, the registration diagnostic stored on the trunk itself, and the route-quality view. This page works through the checks in order, then covers what the platform does on its own when a trunk stops answering. Every API response below rides the standard envelope —data carries the
payload, and meta.request_id is the correlation ID support asks for when
you open a ticket:
Check the trunk’s registration status
Each trunk carries a cached registration verdict —registered,
unregistered, or unknown — with the ISO timestamp of the last check. The
cached verdict feeds the dispatch gate: a trunk whose registration check
stays stale or failing stops being offered new calls.
Confirm the current state either way:
- Dashboard: open Settings → SIP trunks; the table marks unregistered trunks and shows the last recorded registration error inline per row.
- API:
lastRegisteredAt keeps the timestamp of the last successful register
even while a trunk is currently failing, so compare it against
lastRegistrationCheckAt — the streak fields (registrationFailureCount,
registrationFailingSince) tell you how long the current failing run has
been going.
A wrong ID from another tenant is indistinguishable from one wrong in your
own — ownership is never leaked across tenants — and reads 404:
Rank every trunk, needs-attention first
counts block totals by severity for a dashboard-style
triage:
down (unregistered) → degraded (failing streak
without a down verdict) → active → unknown (no probe data yet); within
the same severity the longest failing streak sorts first.
Read the recorded registration error on the trunk first — most
unregistered rows are one of four causes: DNS failing to resolve the
host, a firewall blocking the SIP port, a digest username/password
mismatch, or codec/TLS mismatch on the REGISTER handshake.
Force a fresh registration probe
The platform re-checks each enabled trunk on a cadence of about five minutes, running a real SIP REGISTER with the trunk’s stored credentials and persisting the verdict back onto the trunk row. To force a fresh check after you change something, run the trunk’s own test from the dashboard (“Test trunk”) or:reachable with the REGISTER round-trip latency,
and the step checklist confirms the whole pipeline ran:
unreachable and names the step that
broke — DNS resolution, credentials, probe provisioning, the SIP gateway,
or the REGISTER itself — with failed on the breaking step and skipped
after it (on a timeout the hanging step reads pending):
error string
here is the same text the dashboard row and the trunk detail’s
lastRegistrationError field carry afterward.
Common causes and how to fix them
What happens when a trunk fails
A failed trunk does not take its calls down with it.- When the primary trunk’s cached registration status is anything other
than
registered, the dispatch path walks the trunk’s failover chain — the backup trunk(s) you designate in the dashboard’s trunk settings — picking the first healthy candidate. The chain is guarded against loops and hops are bounded, so a miswired chain cannot recurse on itself. - When no usable failover exists — or none is configured — outbound calls still terminate: they land on the Devotel wholesale softswitch, the platform’s default outbound path, exactly as they would with no trunk configured at all.
- Across your outbound trunk pool, keep capacity and quality spread: each trunk’s route-quality view scores its answer ratio (ACR) and capacity utilization and flags a saturated cap as blocked rather than failed, so you can tell “carrier is dropping the route” apart from “the trunk is full.”
acr is the answer-completion ratio, sdr the
successful-delivery ratio with capacity-blocked attempts removed from the
denominator, and qualityBand / capacityBand the verdicts the dashboard
tiles color from:
capacityBand: blocked
means the per-trunk concurrency guard IS dropping dispatches — raise
capacityCap or spread traffic; qualityBand: bad with a low sdr means
the carrier route is dropping calls independent of the cap. A trunk with
no cap configured reads capacityBand: unconfigured, and one with no
traffic in the window reads qualityBand: unknown — an empty window, not
a healthy route.
The window accepts 24h or 7d. Use the ranking to spot the trunk that
should be taken out of rotation while you fix it.
Inbound trunk signals: the auth ledger
For incoming trunks — where your carrier originates calls toward the platform — each failed digest or allowlist attempt is recorded against the trunk for seven days. That is the first place to check when inbound calls stop arriving but the trunk row looks healthy: a burst of source IPs you have not allowlisted, a digest realm that never matches because the password rotated, or anip_allowlist-only trunk queried from a carrier
SBC whose egress IP changed.
Read the ledger via the trunk detail surface in the dashboard, or:
window accepts 24h, 7d, 1h, or a raw millisecond integer (clamped
at the 7-day ledger retention). The ledger only exists on incoming trunks
— ask for it on an outgoing trunk and the request fails 422:
When to escalate
If you worked through the list, the trunk still showsunregistered, and
the recorded error text has stopped matching anything on this page, open a
support ticket with the trunk ID (trunk_…), the recorded registration
error string from the row, and the timestamp of the last successful
registration if the trunk previously registered.
For calls that register and connect but sound wrong — one-way audio, dead
air, choppy audio, or long post-dial delay — see
Troubleshooting: voice call quality.