Free tool · Messaging
SMPP error code and PDU decoder
Paste a command_status, the stat and err fields of a delivery report, or a hex PDU, and see what it means and what to check next.
Stays in your browser; nothing is uploaded.
How this works and its limits
Runs in your browser: what you enter stays on your device and is never uploaded.
The decoder reads PDUs according to the SMPP v3.4 and v5.0 layouts: header, command, sequence number, mandatory fields and optional TLVs. Standard command_status values are explained in plain words.
Delivery-report err codes are not standardized: each SMSC uses its own. Where we show a meaning for an err code it is a generic, anonymised mapping, marked as varying by SMSC.
Data sources and licences
Operator names, brands and codes shown here are public reference data compiled from national regulators and other public sources. Their appearance does not indicate any partnership, endorsement, agreement or connectivity between unicomam.com and the named operators. All trademarks belong to their owners. Data is provided “as is” with no warranty; verify against the official source before relying on it for routing, billing or compliance decisions.
Regulatory information is for reference only and is not legal advice; check the regulator link and the “last verified” date.
Decodes PDUs per the SMPP v3.4 / v5.0 protocol specifications (opens in a new tab) (SMPP Developers Forum / SMS Forum). DLR “err” codes are SMSC-specific; mappings shown are generic and anonymised.
How to read SMPP errors and delivery reports
SMPP reports problems in two places. The command_status in the response to a request says whether the request was accepted at all; a delivery report, sent later as a deliver_sm, says what happened to the message on its way to the handset. Read the command_status first: a rejection there is about the request itself, and only accepted messages produce delivery reports.
A command_status of zero means the request was accepted. The other standard values point at a cause: the bind (a wrong system_id or password, or a command the bind type does not allow), the addresses (an invalid destination, or a TON or NPI the route does not accept), the message itself (its length, data_coding or esm_class) or throughput, when the connection sends faster than agreed. SMPP v5.0 adds values for service types and cell broadcast, and leaves a range to SMSC vendors, whose meaning varies from one platform to another.
A delivery report carries a stat value such as DELIVRD, UNDELIV, EXPIRED or REJECTD, and an err code that gives the reason. The stat values are common to most platforms. The err codes are not standardized: each SMSC keeps its own list, although many pass on the cause reported by the mobile network, so the same number can mean different things on different routes. Treat a generic reading as a starting point and ask the route provider for its code list.
When a raw PDU is all you have, the header tells you the command, its status and the sequence number that pairs a request with its response. The mandatory fields follow in a fixed order for each command, and the optional parameters, or TLVs, come last, each with a tag, a length and a value. A command_length that does not match, or a field that ends early, usually means the client built the PDU incorrectly.
Most A2P connections use SMPP v3.4; v5.0 adds commands and parameters that fewer platforms support. The decoder covers both, runs in your browser and never sends what you paste anywhere.