# SMPP bind operations and session states

> 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.

- Canonical URL: https://www.broadnet.me/reference/smpp-bind-operations
- Language: en
- Last updated: 2026-07-18
- Publisher: BroadNet (https://www.broadnet.me)

How an SMPP session authenticates: bind_transmitter, bind_receiver and bind_transceiver, the system_id/password/system_type fields, interface_version, session states and unbind.

## 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.

*Bind operations*

| 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.

*bind_transmitter/receiver/transceiver body*

| 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.

*Successful transceiver bind exchange*

```text
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).

*SMPP session states*

| 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 questions

### 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.

## Sources

- [SMPP v3.4 specification — §4.1 bind operations](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [SMPP v5.0 specification](https://smpp.org/SMPP_v5.pdf)

## Related

- [SMPP submit_sm reference](https://www.broadnet.me/reference/smpp-submit-sm)
- [SMPP enquire_link & throttling](https://www.broadnet.me/reference/smpp-enquire-link-throttling)
- [SMPP integration checklist (guide)](https://www.broadnet.me/guides/smpp-integration-checklist)
- [SMSC gateway (operators)](https://www.broadnet.me/operators/smsc-gateway)
- [SMPP command_status error codes](https://www.broadnet.me/reference/smpp-command-status-errors)
