Skip to Content

Reference, updated 6 November 2026

SMPP error codes and delivery receipt statuses

An SMPP command_status of 0x00000000 (ESME_ROK) means success. Any other value is an error code in the response to your request. Delivery receipts report what happened next, in a stat: field such as DELIVRD or UNDELIV.

Protocol
SMPP 3.4 (Issue 1.2)
Success
0x00000000 ESME_ROK
Receipt states
7 stat: values, from DELIVRD to REJECTD
Unecast SMSC
smpp://smsc.unecast.com:2775

The short answer

SMPP has two kinds of status. The command_status in each response tells you whether the SMSC accepted your request. 0x00000000 means yes; anything else is an error from the table below.

The delivery receipt comes later. It tells you whether the message reached the phone, with a final state such as DELIVRD, UNDELIV or EXPIRED.

An accepted submit_sm is not a delivered message. Always read the receipt as well.

Where codes appear

  • Response PDUs. Every response, such as bind_transceiver_resp or submit_sm_resp, carries a command_status in its header. Requests set it to NULL.
  • generic_nack. The SMSC sends this when a PDU has an invalid command_length or an unknown command_id. Its command_status gives the reason.
  • submit_multi_resp. Each failed destination carries its own error_status_code, using the same values.
  • Delivery receipts. A deliver_sm with esm_class bits 5 to 2 set to 0001 carries a receipt. Its state is in the message_state optional parameter and in the stat: text.

Codes are 4-byte integers. Some libraries log them in decimal, so 0x00000058 may show as 88. The filter below accepts both.

command_status codes

All error codes defined in SMPP 3.4, Table 5-2, with the spec's description and a practical fix.

Showing all 48 codes.

SMPP 3.4 command_status error codes
CodeDecNameMeaning (spec)What to do
0x000000000ESME_ROKNo ErrorSuccess. Nothing to fix.
0x000000011ESME_RINVMSGLENMessage Length is invalidCheck that sm_length matches short_message. Keep short_message to 140 bytes, or split the text into parts.
0x000000022ESME_RINVCMDLENCommand Length is invalidThe PDU header length does not match the PDU. Check how your client encodes PDUs and log the raw bytes.
0x000000033ESME_RINVCMDIDInvalid Command IDThe SMSC does not know this command. Use SMPP 3.4 commands and check the version your library binds with.
0x000000044ESME_RINVBNDSTSIncorrect BIND Status for given commandThe command is not allowed in your bind state, such as submit_sm on a receiver bind. Bind as transceiver or transmitter to send.
0x000000055ESME_RALYBNDESME Already in Bound StateAlready bound: don't bind twice on one connection.
0x000000066ESME_RINVPRTFLGInvalid Priority FlagUse a priority_flag from 0 to 3. Values above 3 are reserved.
0x000000077ESME_RINVREGDLVFLGInvalid Registered Delivery FlagUse registered_delivery 1 for a receipt on success or failure, or 0 for no receipt.
0x000000088ESME_RSYSERRSystem ErrorA fault on the SMSC side. Retry later, waiting longer after each try. If it continues, contact your provider with the time and sequence_number.
0x0000000A10ESME_RINVSRCADRInvalid Source AddressSender ID not valid: use an active sender ID and the right TON and NPI.
0x0000000B11ESME_RINVDSTADRInvalid Dest AddrRecipient number not valid: use the country code followed by the number.
0x0000000C12ESME_RINVMSGIDMessage ID is invalidUse the exact message_id from submit_sm_resp in query_sm, cancel_sm or replace_sm.
0x0000000D13ESME_RBINDFAILBind FailedBind failed: check the connection limit and allowed IPs on your SMPP app.
0x0000000E14ESME_RINVPASWDInvalid PasswordWrong password. Use the password of your SMPP app.
0x0000000F15ESME_RINVSYSIDInvalid System IDWrong system ID. Use the system ID of your SMPP app.
0x0000001117ESME_RCANCELFAILCancel SM FailedOnly messages still pending delivery can be cancelled. Check the message_id and that the source address matches the original.
0x0000001319ESME_RREPLACEFAILReplace SM FailedOnly a message still pending delivery can be replaced. Check the message_id and that the source address matches the original.
0x0000001420ESME_RMSGQFULMessage Queue FullQueue full: pause and retry later.
0x0000001521ESME_RINVSERTYPInvalid Service TypeLeave service_type empty (NULL) for the default, unless your provider gave you a value.
0x0000003351ESME_RINVNUMDESTSInvalid number of destinationsIn submit_multi, set number_of_dests to the number of addresses you send. The maximum is 254.
0x0000003452ESME_RINVDLNAMEInvalid Distribution List nameThe SMSC does not know this list name. Send to phone numbers instead (dest_flag 1).
0x0000004064ESME_RINVDESTFLAGDestination flag is invalid (submit_multi)Set dest_flag to 1 for a phone number or 2 for a distribution list name.
0x0000004266ESME_RINVSUBREPInvalid 'submit with replace' request (i.e. submit_sm with replace_if_present_flag set)Set replace_if_present_flag to 0 unless your provider supports replace.
0x0000004367ESME_RINVESMCLASSInvalid esm_class field dataUse esm_class 0x00 for a single SMS, and 0x40 when short_message starts with a concatenation header.
0x0000004468ESME_RCNTSUBDLCannot Submit to Distribution ListSend to individual phone numbers instead.
0x0000004569ESME_RSUBMITFAILsubmit_sm or submit_multi failedSubmit failed: check the fields and your balance, then retry.
0x0000004872ESME_RINVSRCTONInvalid Source address TONUse source_addr_ton 5 for a name such as YOURBRAND, or 1 for a number.
0x0000004973ESME_RINVSRCNPIInvalid Source address NPIUse source_addr_npi 0 for a name, or 1 for a number.
0x0000005080ESME_RINVDSTTONInvalid Destination address TONUse dest_addr_ton 1 (international).
0x0000005181ESME_RINVDSTNPIInvalid Destination address NPIUse dest_addr_npi 1 (E.164).
0x0000005383ESME_RINVSYSTYPInvalid system_type fieldSet system_type in your bind to NULL, unless your provider gave you a value.
0x0000005484ESME_RINVREPFLAGInvalid replace_if_present flagUse 0 (don't replace) or 1 (replace). Values 2 to 255 are reserved.
0x0000005585ESME_RINVNUMMSGSInvalid number of messagesThe SMSC rejected a message count in your request. Check any count field you set.
0x0000005888ESME_RTHROTTLEDThrottling error (ESME has exceeded allowed message limits)Over your throughput: slow down and retry later.
0x0000006197ESME_RINVSCHEDInvalid Scheduled Delivery TimeSend schedule_delivery_time as NULL for immediate delivery, or in the 16-character format YYMMDDhhmmsstnnp.
0x0000006298ESME_RINVEXPIRYInvalid message validity period (Expiry time)Send validity_period as NULL for the SMSC default, or in the 16-character time format. The SMSC may cap how far ahead it can be.
0x0000006399ESME_RINVDFTMSGIDPredefined Message Invalid or Not FoundSet sm_default_msg_id to NULL (0) unless you send a message stored on the SMSC.
0x00000064100ESME_RX_T_APPNESME Receiver Temporary App Error CodeA receiving application reports a temporary error. Your system can return it in deliver_sm_resp when it cannot take a message for now.
0x00000065101ESME_RX_P_APPNESME Receiver Permanent App Error CodeA receiving application reports a permanent error. Do not resend the same message unchanged.
0x00000066102ESME_RX_R_APPNESME Receiver Reject Message Error CodeA receiving application rejected this message. Do not resend it unchanged.
0x00000067103ESME_RQUERYFAILquery_sm request failedCheck the message_id and that the source address matches the original message.
0x000000C0192ESME_RINVOPTPARSTREAMError in the optional part of the PDU Body.The optional parameters (TLVs) are malformed. Check the tag, length and value of each one your client adds.
0x000000C1193ESME_ROPTPARNOTALLWDOptional Parameter not allowedRemove optional parameters this PDU does not allow or the SMSC does not support.
0x000000C2194ESME_RINVPARLENInvalid Parameter Length.A field is too long or too short. Check sizes against the spec, such as at most 21 octets for destination_addr.
0x000000C3195ESME_RMISSINGOPTPARAMExpected Optional Parameter missingAdd the optional parameter the SMSC expects. Ask your provider which one.
0x000000C4196ESME_RINVOPTPARAMVALInvalid Optional Parameter ValueAn optional parameter has a value the SMSC does not accept. Check the value against the spec.
0x000000FE254ESME_RDELIVERYFAILUREDelivery Failure (used for data_sm_resp)Read delivery_failure_reason and network_error_code in the data_sm_resp. Used in transaction mode only.
0x000000FF255ESME_RUNKNOWNERRUnknown ErrorRetry later, waiting longer after each try. If it repeats, contact your provider with the time and the PDU.

Source: SMPP Protocol Specification v3.4, Issue 1.2 (SMPP Developers Forum), section 5.1.3, Table 5-2. Checked 6 November 2026.

Reserved and vendor ranges

SMPP 3.4 reserves the gaps between the codes above, and sets aside one range for each SMSC vendor's own errors.

Value or rangeSpec saysWhat to do
0x00000009ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000010ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000012ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000016 to 0x00000032ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000035 to 0x0000003FReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000041ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000046 to 0x00000047ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000052ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000056 to 0x00000057ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000059 to 0x00000060ReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000068 to 0x000000BFReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x000000C5 to 0x000000FDReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.
0x00000100 to 0x000003FFReserved for SMPP extensionLater versions use this range: SMPP 5.0 defines codes such as 0x00000104 (ESME_RINVDCS, invalid data coding). Check which SMPP version your provider speaks.
0x00000400 to 0x000004FFReserved for SMSC vendor specific errorsThe meaning depends on the SMSC. Ask your provider for their list.
0x00000500 to 0xFFFFFFFFReservedNot defined in SMPP 3.4. Log the full PDU and ask your provider what it means.

Source: SMPP Protocol Specification v3.4, Issue 1.2 (SMPP Developers Forum), section 5.1.3, Table 5-2. Checked 6 November 2026.

message_state values

The SMSC reports a message's state as a number in query_sm_resp, and in the message_state optional parameter of a delivery receipt. The receipt text uses a 7-letter short form.

ValueStatestat: textMeaning (spec)What it usually means for you
1ENROUTENot a final stateThe message is in enroute state.Still being delivered. Wait for the final state.
2DELIVEREDDELIVRDMessage is delivered to destinationDelivered to the phone. No action needed.
3EXPIREDEXPIREDMessage validity period has expired.Not delivered in time, for example because the phone stayed off. Resend only if the message still matters.
4DELETEDDELETEDMessage has been deleted.Deleted on the SMSC, so it will not be delivered.
5UNDELIVERABLEUNDELIVMessage is undeliverableThe network could not deliver it, for example to an unreachable number. Check the number before you resend.
6ACCEPTEDACCEPTDMessage is in accepted state (i.e. has been manually read on behalf of the subscriber by customer service)Read on the subscriber's behalf by customer service. Treat it as a final state.
7UNKNOWNUNKNOWNMessage is in invalid stateThe final state is not known. Do not count it as delivered.
8REJECTEDREJECTDMessage is in a rejected stateRefused before delivery. Check the sender ID, number and content before you resend.

Source: SMPP Protocol Specification v3.4, Issue 1.2 (SMPP Developers Forum), section 5.2.28, Table 5-6, and Appendix B, Table B-2. Checked 6 November 2026.

Delivery receipt format

Ask for a receipt by setting registered_delivery to 1 in submit_sm. Value 2 asks for a receipt only when delivery fails. The receipt arrives as a deliver_sm, and its text is in short_message.

SMPP 3.4 says the receipt format is SMSC vendor specific, and gives this typical example:

id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E Text: . . .
FieldSize in specWhat it holds
id10The message ID the SMSC gave the message when you submitted it.
sub3Number of messages originally submitted. Only relevant for distribution lists. Padded with leading zeros.
dlvrd3Number of messages delivered. Only relevant for distribution lists. Padded with leading zeros.
submit date10When the message was submitted, as YYMMDDhhmm.
done date10When the message reached its final state, as YYMMDDhhmm.
stat7The final state, such as DELIVRD. See message_state values.
err3Where appropriate, a network or SMSC error code. See The err: field.
text20The first 20 characters of the message.

Source: SMPP Protocol Specification v3.4, Issue 1.2 (SMPP Developers Forum), Appendix B, Table B-1. Checked 6 November 2026.

A receipt from Unecast looks like this, as shown in the SMS API reference:

id:MESSAGE_ID sub:001 dlvrd:001 submit date:2611051030 done date:2611051030 stat:DELIVRD err:000 text:Your OTP is 482913
  • Match receipts by ID. The receipted_message_id optional parameter holds the ID from your submit_sm_resp. Prefer it to parsing id: from the text.
  • Parse by key, not by position. The format is vendor specific, so field sizes and letter case can differ.
  • Always answer. Reply to every deliver_sm with a deliver_sm_resp, or the receipt may be sent again.

The err: field

SMPP 3.4 does not define the values of err:. The spec says it may hold a network specific error code or an SMSC error code, and that these errors are network or SMSC specific.

So the same err: number can mean different things on different routes. Read stat: first for the outcome, and use err: only with your provider's own list.

A receipt may also carry the network_error_code optional parameter. Its first byte names the network type (3 is GSM) and the next two bytes hold the network's error code.

Source: SMPP Protocol Specification v3.4, Issue 1.2 (SMPP Developers Forum), Appendix B, Table B-1, and section 5.3.2.31. Checked 6 November 2026.

Unecast SMPP

The Unecast SMSC speaks standard SMPP 3.4, so the codes and states on this page apply. Connect to smpp://smsc.unecast.com:2775 with the system ID and password of an SMPP app from the SMS portal.

  • Bind: bind_transceiver sends messages and receives receipts on one connection.
  • Receipts: set registered_delivery to 1.
  • Keep alive: send enquire_link about every 30 seconds when the link is idle.
  • Slow down when asked: on 0x00000058 or 0x00000014, pause and retry that message later.

Settings, submit_sm fields and a Python example are in the SMS API reference. For err: values you see on Unecast receipts, ask our engineers.

Frequently asked questions

What does SMPP error 0x00000058 mean?

0x00000058 is ESME_RTHROTTLED: you sent faster than the SMSC allows. Slow down, pause, and retry that message later. Libraries that print decimals show it as 88.

What is the difference between command_status and a delivery receipt?

command_status is in every response PDU, such as submit_sm_resp, and tells you whether the SMSC accepted your request. A delivery receipt arrives later as a deliver_sm and reports what happened to the message on the network, in its stat: field.

What does stat:UNDELIV mean in a delivery receipt?

UNDELIV is the short form of the UNDELIVERABLE message state (5): the message could not be delivered, for example to an unreachable number.

What do the err: codes in a delivery receipt mean?

SMPP 3.4 does not define them. The err: field may hold a network or SMSC error code, and these are network or SMSC specific. Ask your provider for their list.

Why am I not getting delivery receipts?

Set registered_delivery to 1 in submit_sm, bind as a transceiver or receiver, and answer every deliver_sm with a deliver_sm_resp. Receipts arrive as deliver_sm, which an SMSC only sends on a receiver or transceiver bind.

Which SMPP error codes should I retry?

Retry later on throttling (0x00000058), queue full (0x00000014) and system errors (0x00000008), waiting longer after each try. Do not retry bind, address or field errors until you fix the request.

Stuck on an SMPP error?

Send us the code, the PDU and the time. Our engineers can check your bind, fields and throughput on the Unecast SMSC.

Talk to us now+94 77 600 3273sales@unecast.comMonday to Friday, 9 AM to 6 PM