Hellio Messaging
Docs /SMPP

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.

  1. Open SMPP Access in your dashboard and generate credentials. You get a system_id and a password (shown once).
  2. 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.
  3. Point your ESME at the host and port below and bind.

Connection

SettingValue
Hostsmpp.helliomessaging.com
Port (TLS / SMPPS)8775
Port (plaintext)2775
ProtocolSMPP v3.4
Bind typestransmitter, receiver, transceiver
Authyour 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.

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

Was this page helpful? Thanks for the feedback! Still stuck? Talk to our team