SMPP error codes are the command_status values a supplier returns in responses such as submit_sm_resp. 0x00000000 (ESME_ROK) means accepted; anything else is an error, for example 0x0B invalid destination address, 0x14 queue full or 0x58 throttled. Some errors are temporary and worth retrying, others are permanent and should not be retried.
Where the codes appear
Every SMPP response PDU carries a command_status field. When you send submit_sm, the supplier answers with submit_sm_resp: status 0 plus a message ID means the message was accepted for delivery, a non-zero status means it was rejected at submission. These codes are different from the err field in delivery reports, which comes later and describes what happened on the network. For those, see SMS delivery report statuses.
Most common codes (SMPP 3.4)
| Code | Name | Meaning | Retry? |
|---|---|---|---|
| 0x00 | ESME_ROK | No error | No need |
| 0x01 | ESME_RINVMSGLEN | Invalid message length | No, fix the message |
| 0x02 | ESME_RINVCMDLEN | Invalid command length | No, fix the client |
| 0x04 | ESME_RINVBNDSTS | Incorrect bind status for this command (for example submitting on a receiver bind) | No, fix the bind |
| 0x05 | ESME_RALYBND | Already bound | No |
| 0x08 | ESME_RSYSERR | System error at the supplier | Yes, later |
| 0x0A | ESME_RINVSRCADR | Invalid source address (sender ID) | No |
| 0x0B | ESME_RINVDSTADR | Invalid destination address | No |
| 0x0D | ESME_RBINDFAIL | Bind failed | After checking credentials and limits |
| 0x0E | ESME_RINVPASWD | Invalid password | No |
| 0x0F | ESME_RINVSYSID | Invalid system ID | No |
| 0x14 | ESME_RMSGQFUL | Message queue full | Yes, with back-off |
| 0x45 | ESME_RSUBMITFAIL | submit_sm failed (generic) | Depends, ask the supplier |
| 0x48 / 0x49 | ESME_RINVSRCTON / NPI | Invalid source TON or NPI | No, fix the address settings |
| 0x50 / 0x51 | ESME_RINVDSTTON / NPI | Invalid destination TON or NPI | No, fix the address settings |
| 0x58 | ESME_RTHROTTLED | Throttling error, too many messages per second | Yes, slow down |
| 0x61 | ESME_RINVSCHED | Invalid scheduled delivery time | No |
| 0x62 | ESME_RINVEXPIRY | Invalid validity period | No |
| 0x64 | ESME_RX_T_APPN | Temporary error from the receiving application | Yes |
| 0x65 | ESME_RX_P_APPN | Permanent error from the receiving application | No |
| 0x66 | ESME_RX_R_APPN | Message rejected by the receiving application | No |
| 0xFF | ESME_RUNKNOWNERR | Unknown error | Investigate |
Codes 0x0400 to 0x04FF are reserved for vendor-specific errors. Many suppliers use them for business rules such as "no credit", "destination not allowed", "sender ID not registered" or "content blocked". Ask every supplier for its own table.
Typical causes and fixes
- Invalid destination (0x0B): number not in international format, a leading zero or plus sign where the supplier does not expect it, or a country not enabled on your account. Send numbers as E.164 digits and check the TON/NPI settings (usually TON 1, NPI 1 for international numbers).
- Invalid source (0x0A): alphanumeric sender longer than 11 characters, wrong TON for an alphanumeric sender (usually TON 5), or a sender ID not allowed or not registered on that route. See SMS sender ID types.
- Invalid message length (0x01): text too long for one PDU, often a long message sent without proper splitting. See long concatenated SMS.
- Throttled (0x58) and queue full (0x14): you are above your TPS or the supplier is congested. See SMPP binds and TPS.
- Bind failures (0x0D, 0x0E, 0x0F): wrong credentials, IP not whitelisted, or more binds than allowed.
Building a retry policy
- Classify each code, including vendor codes, as temporary or permanent.
- Retry temporary errors with increasing delays (for example 1, 5, 30 seconds), and stop after a few attempts.
- For OTP, failing over to a second route is usually better than waiting. See OTP SMS best practices.
- Never retry permanent errors in a loop: it wastes throughput and can get your account flagged.
- Log the code per destination and per supplier so you can spot new rejections fast.
Getting help with a route
A sudden rise in one error code often means a configuration or rule change on the supplier side. When VoIPMatcher manages your A2P SMS routes, we deal with the supplier for you. Request an SMPP route.
Frequently asked questions
What is SMPP error code 69?
Error 69 is 0x45 in hexadecimal, ESME_RSUBMITFAIL: the submit_sm failed for a reason the code itself does not specify. Some platforms use it for business rules such as missing credit or a destination not enabled. Whether to retry depends on the cause, so ask the supplier what triggers it on their side.
What is SMPP error code 88?
Error 88 is 0x58 in hexadecimal, ESME_RTHROTTLED: you are sending more messages per second than your account or bind allows. It is temporary. Slow down and retry with increasing delays rather than at once, and check whether the TPS limit applies per bind or to the whole account.
What is SMPP error code 11?
Error 11 is 0x0B, ESME_RINVDSTADR: invalid destination address. The number is usually in the wrong format, with a leading zero or plus sign the supplier does not expect, or the country is not enabled on your account. Send numbers as international E.164 digits with TON 1 and NPI 1, and do not retry unchanged.
What is SMPP error code 13?
Error 13 is 0x0D, ESME_RBINDFAIL: the bind request was refused. Common causes are wrong credentials, an IP address not whitelisted by the supplier or more simultaneous binds than allowed. Check the system_id, password and source IP, close old sessions and confirm the bind limit before trying again.
What is SMPP error code 255?
Error 255 is 0xFF, ESME_RUNKNOWNERR: an unknown error. The supplier's platform could not map the failure to a standard code. Do not retry in a loop. Log the destination, sender ID and time, and send examples to the supplier, who can check its own logs and upstream connection.
Need a route?
Send the destination, route type and target rate. We reply with what we can deliver.