A SIP response code is a three-digit number a server returns to say what happened to a request. The first digit is the class and carries most of the meaning: 1xx means work is in progress, 2xx means success, 3xx redirects, 4xx means this request failed at this destination, 5xx means this server failed, and 6xx means the answer is no everywhere. The remaining two digits identify the specific condition. All codes are recorded in the IANA Session Initiation Protocol (SIP) Parameters registry, which notes that every code is defined by RFC 3261 unless a later specification is cited against it.
Reading them well is mostly a matter of not over-reading them. A code tells you what one element decided about one request. It does not tell you who generated it, why the element behind it made that choice, or whether the same request would fail on another route.
Quick facts
| Question | Short answer |
|---|---|
| Where is the authoritative list? | The IANA SIP Parameters registry, Response Codes subregistry |
| How many classes? | Six: 1xx, 2xx, 3xx, 4xx, 5xx, 6xx |
| Which are final? | Everything except 1xx |
| Which class answers a call? | 2xx only |
| Which class stops a forking proxy? | 6xx |
| Do codes carry PSTN causes? | Not directly. Q.850 causes travel in a Reason header, and gateways translate between the two |
| Are all codes in common use? | No. A working carrier deployment sees perhaps fifteen of them regularly |
| Does the reason phrase matter? | No. The number drives behaviour, the text is for humans |
The six classes, and what each one obliges the network to do
The class is not a severity label. It is an instruction about what to do next, and getting that instruction right is the whole reason codes are grouped this way. Learn the six behaviours before you look up any individual number.
1xx Provisional. The request arrived and processing continues. Provisional responses do not end the transaction and are not acknowledged. Their practical job is visible in gateway behaviour: RFC 3398 notes that a 100 triggers no telephone-network signalling at all and exists only to stop the sender retransmitting the INVITE.
2xx Success. The request succeeded. For INVITE this means the call has been answered, and the caller acknowledges with ACK.
3xx Redirection. The target moved. The response carries one or more Contact addresses and the caller is expected to try them.
4xx Request failure. This destination will not accept this request as it stands. Some 4xx codes are genuinely about the request, such as a missing credential or an unsupported body. Others describe the state of the called user.
5xx Server failure. This server could not process a request that may be perfectly valid. This is the class that failover logic should react to, because another server may succeed with the identical request.
6xx Global failure. The answer is no for this user, not merely for this address. The consequence is behavioural, not rhetorical: as RFC 8688 restates for the 608 code, a proxy receiving a 6xx should cancel pending transactions and must not create new branches.
Where responses appear in a call
An INVITE can collect any number of provisional responses, but exactly one final response, and every final response is acknowledged with ACK. That is worth stating plainly because it explains a code that confuses people constantly: when a caller gives up before answer, the CANCEL gets its own 200, and the original INVITE still needs one final response and one only.
That final response is 487 Request Terminated. RFC 3398 shows the same sequence at a gateway: on CANCEL, a 200 confirms the CANCEL, a 487 completes the INVITE transaction, and a release message goes to the telephone side with cause 16, normal clearing.
1xx Provisional
| Code | Name | Defined in | What it means in practice |
|---|---|---|---|
| 100 | Trying | RFC 3261 | Received, working on it. Stops retransmission. Generated hop by hop, so it says nothing about the far end |
| 180 | Ringing | RFC 3261 | The called endpoint is alerting. If no early media arrives, the caller generates ringback locally |
| 181 | Call Is Being Forwarded | RFC 3261 | The request is being diverted |
| 182 | Queued | RFC 3261 | Held rather than rejected, for example in a queue |
| 183 | Session Progress | RFC 3261 | Progress information, usually with SDP so that in-band tones or announcements can be heard before answer |
| 199 | Early Dialog Terminated | RFC 6228 | One early dialog has ended while others may continue. Support is signalled with the 199 option tag |
The 180 and 183 distinction matters for billing and for user experience. A gateway sends 180 when the telephone network reports the subscriber is free, and 183 when it needs a media path for an announcement or tone. Treating 183 as ringing produces silent calls; treating it as answer produces charged calls that were never answered.
2xx Success
| Code | Name | Defined in | Notes |
|---|---|---|---|
| 200 | OK | RFC 3261 | Request succeeded. For INVITE, the call is answered |
| 202 | Accepted | RFC 6665 | Marked deprecated in the registry |
| 204 | No Notification | RFC 5839 | Request succeeded and no notification will follow |
3xx Redirection
| Code | Name | Defined in | Notes |
|---|---|---|---|
| 300 | Multiple Choices | RFC 3261 | Several possible targets are offered |
| 301 | Moved Permanently | RFC 3261 | Update stored routing. Gateways use it for a changed number where the new number is supplied |
| 302 | Moved Temporarily | RFC 3261 | The common redirect, often used for forwarding |
| 305 | Use Proxy | RFC 3261 | Reach the target through the indicated proxy |
| 380 | Alternative Service | RFC 3261 | The call failed, but another service may work |
Redirects deserve care in wholesale voice. Following a 3xx sends a new request to an address chosen by someone else, which has cost and fraud implications. Most carrier-facing platforms restrict this by policy rather than following redirects blindly.
4xx Request failure
| Code | Name | Defined in | When you see it |
|---|---|---|---|
| 400 | Bad Request | RFC 3261 | Malformed request. Usually a header or SDP problem |
| 401 | Unauthorized | RFC 3261 | Authentication demanded by a user agent server |
| 402 | Payment Required | RFC 3261 | Reserved. Occasionally repurposed for balance conditions |
| 403 | Forbidden | RFC 3261 | Understood and refused. The catch-all for policy rejection |
| 404 | Not Found | RFC 3261 | The number or user does not exist in this domain |
| 405 | Method Not Allowed | RFC 3261 | Method understood but not permitted for this target |
| 406 | Not Acceptable | RFC 3261 | Cannot produce a response acceptable to the request |
| 407 | Proxy Authentication Required | RFC 3261 | Same as 401, but demanded by a proxy |
| 408 | Request Timeout | RFC 3261 | No timely response from the far end |
| 410 | Gone | RFC 3261 | The address existed and is no longer valid |
| 412 | Conditional Request Failed | RFC 3903 | A conditional PUBLISH failed |
| 413 | Request Entity Too Large | RFC 3261 | Body too large to process |
| 414 | Request-URI Too Long | RFC 3261 | Request URI exceeds what the server accepts |
| 415 | Unsupported Media Type | RFC 3261 | Body format not supported |
| 416 | Unsupported URI Scheme | RFC 3261 | Scheme in the Request URI not supported |
| 417 | Unknown Resource-Priority | RFC 4412 | Priority namespace not recognised |
| 420 | Bad Extension | RFC 3261 | A required extension is not understood |
| 421 | Extension Required | RFC 3261 | The server needs an extension the caller did not offer |
| 422 | Session Interval Too Small | RFC 4028 | Session timer interval below the minimum |
| 423 | Interval Too Brief | RFC 3261 | Registration or subscription expiry too short |
| 424 | Bad Location Information | RFC 6442 | Location information could not be processed |
| 425 | Bad Alert Message | RFC 8876 | Alert message body rejected |
| 428 | Use Identity Header | RFC 8224 | An Identity header is required. STIR territory |
| 429 | Provide Referrer Identity | RFC 3892 | Referred-By information required |
| 430 | Flow Failed | RFC 5626 | The flow to the registered device failed |
| 433 | Anonymity Disallowed | RFC 5079 | Anonymous calls are refused here |
| 436 | Bad Identity Info | RFC 8224 | The Identity information could not be dereferenced |
| 437 | Unsupported Credential | RFC 8224 | The credential used cannot be validated |
| 438 | Invalid Identity Header | RFC 8224 | The identity signature did not validate |
| 439 | First Hop Lacks Outbound Support | RFC 5626 | The first hop does not support outbound |
| 440 | Max-Breadth Exceeded | RFC 5393 | Parallel forking limit exceeded |
| 469 | Bad Info Package | RFC 6086 | INFO package not acceptable |
| 470 | Consent Needed | RFC 5360 | Consent required before the request can be relayed |
| 480 | Temporarily Unavailable | RFC 3261 | The user exists but is not available now |
| 481 | Call/Transaction Does Not Exist | RFC 3261 | State mismatch. The other side has no record of this dialog |
| 482 | Loop Detected | RFC 3261 | Routing loop |
| 483 | Too Many Hops | RFC 3261 | Max-Forwards exhausted |
| 484 | Address Incomplete | RFC 3261 | Not enough digits |
| 485 | Ambiguous | RFC 3261 | The address matched more than one target |
| 486 | Busy Here | RFC 3261 | Busy at this endpoint. Other endpoints might still answer |
| 487 | Request Terminated | RFC 3261 | The pending INVITE ended, normally after CANCEL |
| 488 | Not Acceptable Here | RFC 3261 | Media negotiation failed at this destination |
| 489 | Bad Event | RFC 6665 | Event package not supported |
| 491 | Request Pending | RFC 3261 | Two re-INVITEs crossed. One side backs off and retries |
| 493 | Undecipherable | RFC 3261 | Encrypted body could not be decrypted |
| 494 | Security Agreement Required | RFC 3329 | Security agreement mechanism required |
5xx Server failure
| Code | Name | Defined in | When you see it |
|---|---|---|---|
| 500 | Server Internal Error | RFC 3261 | The element failed on its own account |
| 501 | Not Implemented | RFC 3261 | The method is not supported at all |
| 502 | Bad Gateway | RFC 3261 | An element received an invalid response from the next hop |
| 503 | Service Unavailable | RFC 3261 | Temporarily unable to handle the request. The failover code |
| 504 | Server Time-out | RFC 3261 | No timely response from another server that was consulted |
| 505 | Version Not Supported | RFC 3261 | SIP version refused |
| 513 | Message Too Large | RFC 3261 | Message length beyond capability |
| 555 | Push Notification Service Not Supported | RFC 8599 | The requested push notification service is not supported |
| 580 | Precondition Failure | RFC 3312 | Preconditions on the session could not be met |
6xx Global failure
| Code | Name | Defined in | Meaning |
|---|---|---|---|
| 600 | Busy Everywhere | RFC 3261 | Busy on all known endpoints |
| 603 | Decline | RFC 3261 | Declined, without any claim about other endpoints |
| 604 | Does Not Exist Anywhere | RFC 3261 | This user exists nowhere |
| 606 | Not Acceptable | RFC 3261 | The session as described is unacceptable to the user |
| 607 | Unwanted | RFC 8197 | The called party marked the call as unwanted |
| 608 | Rejected | RFC 8688 | An intermediary rejected the call attempt |
The 607 and 608 pair is worth understanding properly, because it is the only part of the code space designed around call blocking. RFC 8688 defines 608 for the case where an intermediary such as an analytics engine rejects the call, and draws an explicit contrast with 607, where a human at the called endpoint indicated the call was unwanted. The specification notes that in some jurisdictions this distinction matters, since a machine’s statistical judgement should not be recorded downstream as a person’s decision.
RFC 8688 also builds in a redress path. A 608 from a conforming intermediary carries a Call-Info header with the purpose parameter set to jwscard, pointing to a signed jCard that tells the blocked caller how to contact whoever blocked them. The signature is not decoration: the specification requires it so that a spoofed 608 cannot send callers to an address of an attacker’s choosing.
One more detail in that document is directly useful to anyone running legitimate outbound campaigns. It records that some call-blocking services return 604 Does Not Exist Anywhere as a blocking strategy, warns that other network elements may read that literally as the user not existing, and observes that in many jurisdictions such false signalling is illegal. If your outbound reporting counts 604 as invalid numbers, some of those numbers are fine and you are quietly discarding them.
The codes that get confused
| Pair | Difference that matters |
|---|---|
| 480 vs 486 | 480 means the user exists but is not available now. 486 means busy at this endpoint, and another endpoint may still answer |
| 486 vs 600 | 486 is local to one endpoint. 600 claims busy everywhere and stops other branches |
| 403 vs 603 | 403 is a refusal by a network element. 603 is a decline attributed to the user. RFC 3398 reflects this: an ISUP call rejected with the cause location set to the user can be given the 6xx form instead of the 4xx form |
| 404 vs 604 | 404 is not found in this domain. 604 asserts the user exists nowhere, which is a much stronger claim and is sometimes abused |
| 408 vs 480 | 408 is silence from the far end. 480 is an explicit statement of unavailability |
| 401 vs 407 | 401 comes from a user agent server, 407 from a proxy. Different challenge headers, same idea |
| 484 vs 404 | 484 means not enough digits, typically overlap dialling. 404 means the digits were complete and matched nothing |
| 488 vs 606 | 488 is media negotiation failure at this destination. 606 rejects the session everywhere. Both may carry a Warning header explaining which media parameter failed |
| 500 vs 503 | 500 is a fault. 503 asserts a temporary condition and is the code that alternate routing should act on |
| 502 vs 504 | 502 means the next hop returned something invalid. 504 means it returned nothing in time |
SIP codes and Q.850 causes
Most calls that matter commercially cross between SIP and the telephone network at least once, and at that boundary a gateway translates between SIP response codes and Q.850 cause values. RFC 3398 specifies the recommended mapping in both directions.
Coming from the telephone network, the recommended translations include:
| Q.850 cause | SIP response |
|---|---|
| 1 unallocated number | 404 Not Found |
| 2 no route to network, 3 no route to destination | 404 Not Found |
| 17 user busy | 486 Busy Here |
| 18 no user responding | 408 Request Timeout |
| 19 no answer from the user | 480 Temporarily Unavailable |
| 20 subscriber absent | 480 Temporarily Unavailable |
| 21 call rejected | 403 Forbidden, or the 6xx form when the cause location is the user |
| 22 number changed | 410 Gone, or 301 Moved Permanently when a diagnostic supplies the new number |
| 27 destination out of order | 502 Bad Gateway |
| 28 address incomplete | 484 Address Incomplete |
| 34, 38, 41, 42, 47 congestion and temporary failures | 503 Service Unavailable |
| 65, 70 bearer capability problems | 488 Not Acceptable Here |
| 102 recovery on timer expiry | 504 Server Time-out |
| 111 protocol error, 127 interworking | 500 Server Internal Error |
Going the other way:
| SIP response | Q.850 cause |
|---|---|
| 404 Not Found, 485 Ambiguous | 1 unallocated number |
| 486 Busy Here | 17 user busy |
| 480 Temporarily Unavailable | 18 no user responding |
| 408 Request Timeout | 102 recovery on timer expiry |
| 401, 402, 403, 407 | 21 call rejected |
| 410 Gone | 22 number changed |
| 482, 483 | 25 exchange routing error |
| 500, 503, 400, 481 | 41 temporary failure |
| 502 Bad Gateway | 38 network out of order |
| 603 Decline | 21 call rejected |
| 604 Does Not Exist Anywhere | 1 unallocated number |
Four details in that specification save a lot of argument later.
The tables are not symmetric. Cause 19 maps to 480, and 480 maps back to cause 18. A call that crosses two gateways can therefore arrive with a different cause than it left with. Reporting built only on the final value will disagree between hops, and neither side is wrong.
Defaults absorb everything unmapped. An unlisted cause becomes 500, and an unlisted SIP code becomes cause 31, normal unspecified. A large bucket of cause 31 in a report usually means codes are being flattened somewhere, not that many calls ended normally but unspecified.
Some causes have no SIP equivalent at all. RFC 3398 gives cause 44, requested circuit or channel not available, as the example: the correct behaviour is for the originating switch to try another circuit, not to fail the call, so nothing is sent to the SIP side.
Cause location changes the answer. The same rejection can surface as 403 or 603 depending on whether the network or the user is recorded as the origin.
Cause values can also travel alongside the SIP code rather than being replaced by it. The IANA registry lists Q.850 as a registered Reason protocol, with the cause value carried in decimal, which is how a gateway can send 503 while still telling you the underlying cause was congestion.
One curiosity for anyone reading the specification closely: the SIP to cause table lists 504 twice, once for Server Time-out mapping to cause 102, and once against the Version Not Supported label, which is code 505.
Reading a code in a multi-hop call
A response code arrives without a return address. In a call that passes through a session border controller and two carriers, the code you see was generated by whichever element decided to stop, and that is often not the destination network.
Three habits make diagnosis faster.
Check who generated it before deciding what it means. The Via headers show the path the response travelled. A 503 from your first hop and a 503 relayed from four hops away call for entirely different responses.
Read Reason and Warning headers, not just the code. A Q.850 Reason value tells you what the telephone side actually said. A Warning header on a 488 or 606 tells you which media parameter was unacceptable, which is exactly what the code omits.
Correlate with the media path. A clean 200 followed by silence is not a signalling problem. Codes describe signalling decisions and say nothing about whether audio flowed.
Practical triage
| What you observe | Most likely area | First thing to check |
|---|---|---|
| 403 on a subset of destinations | Policy or permissions | Destination permissions, caller ID authorisation, credit or prefix rules |
| 404 on numbers you believe are valid | Number formatting or routing | E.164 formatting, dialling prefixes, whether the range is reachable on that route |
| 488 at answer time | Media negotiation | Codec offer, SDP direction, transcoding and encryption settings |
| Rising 503 in a time window | Capacity or congestion | Channel limits, upstream congestion, Retry-After hints, alternate routes |
| 408 with no far-end response | Reachability | Firewall and NAT behaviour, transport, whether requests reach the far end at all |
| Frequent 487 | Caller behaviour | Ring timers, abandonment rules on the origination side. These are cancelled calls, not network failures |
| 481 mid-call | Dialog state mismatch | Re-INVITE and record-route handling, whether an element lost dialog state |
| 607 or 608 | Call blocking | Caller identity treatment, complaint history, redress contact in the Call-Info jCard |
Where didlogic fits
Response codes are the shared vocabulary between a customer platform and the carriers behind it, and they are where support conversations in wholesale voice usually start. didlogic provides the SIP trunking and international voice termination layer that sits between a platform and the destination networks, so the codes a customer receives are a mixture of decisions made locally, decisions made in transit, and causes translated from telephone networks at the far end.
That mixture is the reason a code alone rarely settles a question. Useful diagnosis pairs the code with the direction, the destination, the route and the timestamp, which is the same information a carrier needs in order to look at the other side of the same call. For outbound programmes running at volume, such as dialler traffic, tracking the distribution of codes per destination over time is more informative than any single failed call, because it separates a genuine routing fault from normal rejection behaviour on a given network.
FAQs
Are SIP response codes the same as HTTP status codes?
They share the class structure and several numbers, but they are separate registries with separate meanings. SIP adds a sixth class, 6xx, that HTTP does not have, and codes such as 486 or 480 exist only in SIP.
Which SIP codes mean the call was answered?
Only 2xx. A 183 with media can sound like a connected call, but the call is not answered until a 2xx arrives and is acknowledged.
Why do I get 480 from one carrier and 486 from another for the same number?
Because each is translating a telephone-network cause using its own rules, and because different networks release calls with different causes for similar situations. The RFC 3398 mappings are recommendations, not obligations.
What does 487 mean if nobody cancelled the call?
Something upstream cancelled it. A caller hanging up, an origination-side ring timer, or a forking proxy abandoning one branch will all produce a 487 on the branch that was terminated.
Is 503 always congestion?
No. It signals a temporary inability to handle the request, which covers congestion, maintenance and some policy conditions. Check whether a Retry-After or a Q.850 Reason value accompanies it.
Can I add my own response codes?
Not usefully. The Response Codes subregistry requires an RFC, and receiving elements will treat any unrecognised code according to its class digit.
Which codes should trigger failover to another route?
5xx conditions are the natural candidates because the request may succeed elsewhere. 6xx explicitly should not, since the answer is meant to apply to the user everywhere. Treatment of 4xx depends on the code: 403 and 404 usually indicate that retrying the same request will fail again.
