A bind authenticates and opens an SMPP session. bind_transmitter allows sending only, bind_receiver receiving only, and bind_transceiver both on one connection. The ESME supplies system_id, password and system_type; the SMSC replies with a bind_resp. A successful bind moves the session into a bound state until unbind or disconnect.
bind_transceiverOpen and authenticate the sessionbind_transceiver_respSession acceptedsubmit_smSend a messagesubmit_sm_respAccepted, message ID returneddeliver_smDelivery receipt or inbound messagedeliver_sm_respAcknowledgedenquire_linkKeepalive while idle
The three bind types
The bind type fixes the traffic direction for the session. Choose transmitter for outbound-only (MT submit), receiver for inbound-only (MO and delivery receipts), or transceiver to carry both directions over a single connection — the usual choice on v3.4, as it halves the number of connections you maintain.
| Operation | command_id | Session can |
|---|---|---|
| bind_transmitter | 0x00000002 | Submit messages (MT) only |
| bind_receiver | 0x00000001 | Receive messages / receipts (MO + DLR) only |
| bind_transceiver | 0x00000009 | Both submit and receive on one connection |
Bind request fields
The bind body carries the credentials and the ESME's declared capabilities. system_id and password authenticate the account; system_type optionally categorises the ESME; interface_version declares the SMPP version; addr_ton, addr_npi and address_range let the SMSC route mobile-originated traffic to this bind. A mismatched address_range silently blocks MO/DLR routing on a receiver or transceiver bind — a common integration bug.
| Field | Type | Max | Notes |
|---|---|---|---|
| system_id | C-Octet String | 16 | Account/login identifier |
| password | C-Octet String | 9 | Account password |
| system_type | C-Octet String | 13 | Optional ESME category (often empty) |
| interface_version | Integer | 1 | 0x34 = v3.4, 0x50 = v5.0 |
| addr_ton | Integer | 1 | Type of number for routing MO to this ESME |
| addr_npi | Integer | 1 | Numbering plan indicator |
| address_range | C-Octet String | 41 | Address/regex the SMSC routes to this bind |
Bind response
The SMSC replies with the matching bind_resp (for example bind_transceiver_resp, 0x80000009). command_status is ESME_ROK on success or an error such as ESME_RINVPASWD (invalid password), ESME_RINVSYSID (invalid system ID) or ESME_RBINDFAIL. The body returns the SMSC's system_id and, on v3.4+, an optional sc_interface_version TLV telling the ESME which version the SMSC actually supports.
ESME → SMSC bind_transceiver seq=1 system_id=acme password=****
SMSC → ESME bind_transceiver_resp seq=1 status=ESME_ROK system_id=smsc01
(session now BOUND_TRX — submit_sm and deliver_sm may flow)Session states
An SMPP session is a small state machine. It starts OPEN after the TCP connection, moves to a BOUND state on a successful bind, and returns to UNBOUND then CLOSED on unbind or disconnect. Sending an operation that is illegal for the current state returns ESME_RINVBNDSTS (incorrect bind status). Binding twice on one connection returns ESME_RALYBND (already bound).
| State | Meaning |
|---|---|
| OPEN | TCP connected, not yet bound |
| BOUND_TX | Bound as transmitter — may submit |
| BOUND_RX | Bound as receiver — may receive |
| BOUND_TRX | Bound as transceiver — may submit and receive |
| UNBOUND | Unbind issued, awaiting close |
| CLOSED | Connection torn down |
Unbind and outbind
unbind (0x00000006) requests a graceful session close; the peer replies unbind_resp and both sides close the TCP connection. outbind (0x0000000B) is the reverse-direction case: the SMSC asks a listening ESME to initiate a receiver bind, used where the SMSC needs to deliver MO traffic to an ESME that normally waits for connections.
Frequently asked
Should I use transmitter/receiver pairs or a transceiver?
Prefer a transceiver where the provider allows it — one connection carries both submit and receive, halving connection count and simplifying correlation of delivery receipts. Use separate transmitter and receiver binds only when the provider requires directional separation.
What is system_type for?
system_type optionally identifies the category of ESME (for example a specific application class). Many providers leave it empty. Set it only to the exact value the provider provisions, since some route on it.
Why is my receiver bind not getting delivery receipts?
The most common cause is an address_range / addr_ton / addr_npi mismatch: the SMSC routes MO and DLR traffic to the bind whose address_range matches, so a wrong value silently withholds them. Confirm the exact provisioned values with the provider.
What does ESME_RALYBND mean?
ESME_RALYBND (0x00000005) means the ESME is already in a bound state and tried to bind again on the same session. Bind exactly once per connection; if you saw a failed bind, open a fresh connection rather than re-binding the old one.
How many concurrent binds can I open?
That is a commercial limit set by your provider, not the protocol. Opening more binds than provisioned is a frequent cause of throttling or account suspension — agree the bind count and per-bind TPS in writing before you scale.
Source specifications
The published standards this page is grounded in. Opens in a new tab.