Troubleshooting · SIP Codes
SIP 500 Server Internal Error
A 500 means a server in the path received a request it should have been able to handle and failed internally — a crash, an exception, a database it couldn't reach, a configuration that points at nothing. It is the least specific of the server-error codes and the most honest: something over there is broken, and the breakage is not your request's fault in any way you can edit.
Your job with a 500 is evidence and escalation, plus ruling out the one local pattern that manufactures 500s upstream: sending something malformed that their stack handles badly.
What generates 500s in the real world
- Server software faults: unhandled call scenarios (an unusual header, a transfer pattern, a codec combination) crash a request handler while ordinary calls sail through — hence 500s that stalk one call type.
- Backend dependencies down: the SIP front-end is up but its database, routing service or billing/authorization backend is not; front-ends answer 500 to requests they cannot process.
- Configuration faults on their side: a route, trunk group or customer profile pointing at a decommissioned element after a platform change.
- Overload shedding: some platforms return 500 (imprecisely; 503 is the correct overload code) when internal queues saturate — correlate with peak times.
- Your malformed request: rare but real — a broken header from a misbehaving endpoint or ALG-mangled message that their parser rejects as an internal error. If 500s follow one site/endpoint, this deserves one test.
Retry-After and the client's duty
A 500 (or 503) may carry a Retry-After header — the server stating when to try again. Well-behaved systems honor it; retry storms against a struggling server deepen the incident. On the human side, the equivalent discipline is escalation with artifacts: the exact timestamps, Call-IDs, the request type that failed, and whether the failure is total or scenario-specific. 'All calls fail with 500 since 14:02, Call-IDs attached' is a page-one ticket; 'phones are down' is not. Also verify scope from your side: if only one trunk or one destination class 500s, say so — platform incidents are often partial in exactly those shapes.
Your side of a 500
- Scope it immediately: all calls or some? One trunk/destination/pattern or everything? Record the boundary precisely — it is the most useful sentence in your ticket.
- Rule out your malformed-request pattern: reproduce from a different endpoint/site. If the 500 follows one device or one site only, capture its request and compare headers against a healthy peer (ALG damage is a suspect).
- Check the provider's status channels, then open the ticket with Call-IDs, timestamps (with timezone), the failing scenario and the scope boundary.
- Honor Retry-After if present; if you control retry behavior (trunk failover), route around the failing element if a healthy alternate path exists.
- Track the incident to a provider explanation; unexplained 500 clusters that 'resolved themselves' should still get an incident reference for the next occurrence.
- After resolution, retest the exact scenarios that failed (transfers, specific destinations) — scenario-specific 500s survive general 'all fixed' announcements.
Frequently asked questions
- Is a 500 ever my fault?
- Directly, almost never — it is defined as the server's internal failure. Indirectly, a malformed request from your side can trigger an unhandled path in their code. The swap test (different endpoint/site) settles it in minutes.
- 500 vs 503 — should I care about the difference?
- For escalation, mildly: 503 asserts service unavailability (overload/maintenance — retry later, expect capacity work); 500 asserts internal error (a defect — expect a fix). Providers blur them in practice; your ticket should quote the code you actually received.
- Calls fail with 500 only when we transfer them.
- That is a scenario-specific server fault par excellence — transfers exercise REFER/replaces logic that basic calls never touch. Reproduce it, capture it, and make the ticket about transfers specifically; it will route to a different (better) queue than 'calls failing'.