SMPP access
Bind your own SMPP client (ESME) directly to Hellio and submit SMS over a persistent socket instead of HTTP. Traffic bills the same wallet, uses the same sender-ID approval, and routes over the same gateways as the REST API. Every Hellio account can use SMPP; you just generate credentials and allowlist the IPs you will bind from.
Get connected
Self-serve, from your dashboard.
- Open SMPP Access in your dashboard and generate credentials. You get a
system_idand a password (shown once). - Add the public IP(s) you will bind from to the allowlist. Binding is refused from any IP that is not listed, so an empty allowlist means no one can connect.
- Point your ESME at the host and port below and bind.
Connection
| Setting | Value |
|---|---|
| Host | smpp.helliomessaging.com |
| Port (TLS / SMPPS) | 8775 |
| Port (plaintext) | 2775 |
| Protocol | SMPP v3.4 |
| Bind types | transmitter, receiver, transceiver |
| Auth | your system_id + password, from an allowlisted IP |
Use TLS (8775) in production. Keep the bind open and answer enquire_link; Hellio pings idle binds and expects a reply. Reconnect with backoff if the socket drops.
Sending
submit_sm, the same message model as the API.
Submit with an approved sender ID as the source address (an unapproved sender is rejected; leave it empty to use your account default). Message text is GSM 03.38 by default, or UCS-2 (data_coding 0x08) for unicode. Long messages are supported via standard concatenation (UDH or the SAR TLVs); Hellio reassembles them and bills per segment exactly like the HTTP API.
The message_id in submit_sm_resp is the same id you see in your delivery log and in GET /v1/sms/{id}, and it is the id echoed back in the delivery receipt. One id, everywhere, no translation table.
Delivery receipts
deliver_sm, if you asked for one.
Set registered_delivery on your submit and Hellio pushes a deliver_sm receipt to your receiver or transceiver bind once the network resolves the message. The receipt carries id:<your message id> ... stat:DELIVRD err:000 plus the receipted_message_id and message_state TLVs. If no receiver bind is up when the receipt is ready, Hellio queues it and delivers it when you next bind (within a bounded window). Receipts that still cannot be delivered fall back to your registered HTTP webhook.
Throttling and windowing
Each account has a per-second submit rate and a window (max unacknowledged submit_sm in flight). Exceed the rate and you get ESME_RTHROTTLED; exceed the window and you get ESME_RMSGQFUL. Both are back-pressure signals, slow down and retry, do not treat them as permanent failures. Run your own window and the client will self-clock.
Status and error codes
command_status values you may see in a response.
Standard SMPP v3.4 / v5 codes plus the vendor-specific codes Hellio uses. The one to watch is 0x401, insufficient credit: top up your wallet.
| Hex | Mnemonic | Meaning |
|---|---|---|
| 0x00 | ESME_ROK | No error. |
| 0x01 | ESME_RINVMSGLEN | Message length is invalid. |
| 0x02 | ESME_RINVCMDLEN | Command length is invalid. |
| 0x03 | ESME_RINVCMDID | Invalid command ID. |
| 0x04 | ESME_RINVBNDSTS | Incorrect bind status for the given command. |
| 0x05 | ESME_RALYBND | ESME is already in a bound state. |
| 0x06 | ESME_RINVPRTFLG | Invalid priority flag. |
| 0x07 | ESME_RINVREGDLVFLG | Invalid registered-delivery flag. |
| 0x08 | ESME_RSYSERR | SMSC system error. |
| 0x0A | ESME_RINVSRCADR | Invalid source address (sender ID). |
| 0x0B | ESME_RINVDSTADR | Invalid destination address (recipient number). |
| 0x0C | ESME_RINVMSGID | Message ID is invalid. |
| 0x0D | ESME_RBINDFAIL | Bind failed. Usually the source IP is not whitelisted or the account is not enabled for binding. |
| 0x0E | ESME_RINVPASWD | Invalid password. |
| 0x0F | ESME_RINVSYSID | Invalid system ID. |
| 0x11 | ESME_RCANCELFAIL | Cancel SM failed. |
| 0x13 | ESME_RREPLACEFAIL | Replace SM failed. |
| 0x14 | ESME_RMSGQFUL | SMSC message queue is full; retry shortly. |
| 0x15 | ESME_RINVSERTYP | Invalid service type. |
| 0x33 | ESME_RINVNUMDESTS | Invalid number of destinations. |
| 0x34 | ESME_RINVDLNAME | Invalid distribution-list name. |
| 0x40 | ESME_RINVDESTFLAG | Destination flag is invalid (submit_multi). |
| 0x42 | ESME_RINVSUBREP | Submit-with-replace requested where it is unsupported or inappropriate. |
| 0x43 | ESME_RINVESMCLASS | Invalid esm_class field data. |
| 0x44 | ESME_RCNTSUBDL | Cannot submit to distribution list. |
| 0x45 | ESME_RSUBMITFAIL | submit_sm / data_sm / submit_multi failed (generic failure). |
| 0x48 | ESME_RINVSRCTON | Invalid source address TON. |
| 0x49 | ESME_RINVSRCNPI | Invalid source address NPI. |
| 0x50 | ESME_RINVDSTTON | Invalid destination address TON. |
| 0x51 | ESME_RINVDSTNPI | Invalid destination address NPI. |
| 0x53 | ESME_RINVSYSTYP | Invalid system_type field. |
| 0x54 | ESME_RINVREPFLAG | Invalid replace_if_present flag. |
| 0x55 | ESME_RINVNUMMSGS | Invalid number of messages. |
| 0x58 | ESME_RTHROTTLED | Throttling error: sending faster than the account allows. Lower the throughput / throttle_rpm. |
| 0x61 | ESME_RINVSCHED | Invalid scheduled-delivery time. |
| 0x62 | ESME_RINVEXPIRY | Invalid validity period (expiry time). |
| 0x63 | ESME_RINVDFTMSGID | Predefined message ID is invalid or not found. |
| 0x64 | ESME_RX_T_APPN | ESME receiver temporary app error; retryable. |
| 0x65 | ESME_RX_P_APPN | ESME receiver permanent app error. |
| 0x66 | ESME_RX_R_APPN | ESME receiver rejected the message. |
| 0x67 | ESME_RQUERYFAIL | query_sm request failed. |
| 0xC0 | ESME_RINVTLVSTREAM | Error in the optional (TLV) part of the PDU body. |
| 0xC1 | ESME_RTLVNOTALLWD | TLV not allowed. |
| 0xC2 | ESME_RINVTLVLEN | Invalid TLV (parameter) length. |
| 0xC3 | ESME_RMISSINGTLV | Expected TLV missing. |
| 0xC4 | ESME_RINVTLVVAL | Invalid TLV value. |
| 0xFE | ESME_RDELIVERYFAILURE | Transaction delivery failure. |
| 0xFF | ESME_RUNKNOWNERR | Unknown SMSC error. |
| 0x100 | ESME_RSERTYPUNAUTH | ESME not authorised to use the specified service_type. |
| 0x101 | ESME_RPROHIBITED | ESME prohibited from using the specified operation. |
| 0x102 | ESME_RSERTYPUNAVAIL | Specified service_type is unavailable. |
| 0x103 | ESME_RSERTYPDENIED | Specified service_type is denied. |
| 0x104 | ESME_RINVDCS | Invalid data coding scheme. |
| 0x105 | ESME_RINVSRCADDRSUBUNIT | Source address subunit is invalid. |
| 0x106 | ESME_RINVDSTADDRSUBUNIT | Destination address subunit is invalid. |
| 0x107 | ESME_RINVBCASTFREQINT | Broadcast frequency interval is invalid. |
| 0x108 | ESME_RINVBCASTALIAS_NAME | Broadcast alias name is invalid. |
| 0x109 | ESME_RINVBCASTAREAFMT | Broadcast area format is invalid. |
| 0x10A | ESME_RINVNUMBCAST_AREAS | Number of broadcast areas is invalid. |
| 0x10B | ESME_RINVBCASTCNTTYPE | Broadcast content type is invalid. |
| 0x10C | ESME_RINVBCASTMSGCLASS | Broadcast message class is invalid. |
| 0x10D | ESME_RBCASTFAIL | broadcast_sm operation failed. |
| 0x10E | ESME_RBCASTQUERYFAIL | query_broadcast_sm operation failed. |
| 0x10F | ESME_RBCASTCANCELFAIL | cancel_broadcast_sm operation failed. |
| 0x110 | ESME_RINVBCAST_REP | Number of repeated broadcasts is invalid. |
| 0x111 | ESME_RINVBCASTSRVGRP | Broadcast service group is invalid. |
| 0x112 | ESME_RINVBCASTCHANIND | Broadcast channel indicator is invalid. |
| 0x401 | NALO_RCREDIT | SMPP account out of credit (vendor status 0x401). Nalo bills SMPP separately from HTTP; top up the SMPP balance. |
Prefer HTTP?
SMPP is for high-volume, persistent-connection senders. If you just want to fire messages from an app, use the SDKs or the REST API. Both bill the same wallet and route the same way as SMPP.
