Integration
SMPP
Bind directly to smpp.unicom360.com over SMPP 3.4 for high-volume SMS: connection settings, credentials, what submit_sm must contain and how errors come back.
Connection
| Setting | Value |
|---|---|
| Host | smpp.unicom360.com |
| Port | 2775 |
| Protocol | SMPP 3.4 |
| Bind type | transceiver |
| system_type | (leave blank) |
| Transport | plain TCP, no TLS |
Host
- Value
- smpp.unicom360.com
Port
- Value
- 2775
Protocol
- Value
- SMPP 3.4
Bind type
- Value
- transceiver
system_type
- Value
- (leave blank)
Transport
- Value
- plain TCP, no TLS
The same settings are shown on the SMPP tab of Developer in the portal, with copy buttons. Bind as a transceiver; transmitter and receiver binds are also accepted.
The bind is not encrypted
SMPP here is plain TCP. Your system ID, password and message text cross the network in the clear, so connect from a fixed IP address and ask for the port to be firewalled to it, or route the bind through a VPN. If that does not suit your setup, use the HTTPS API instead.
Credentials
SMPP credentials are separate from API keys. Create one on the SMPP tab of the Developer page: you choose a system ID (letters only, up to 10) and the portal issues the password, which you can reveal, copy and regenerate there. The tab appears once your account has the SMS channel. Each credential binds for the whole account, so the sender IDs and SMS bundle it uses are the account's.
Binding
Open a TCP connection to the host and port and send bind_transceiver with your system ID and password and an empty system_type. A successful bind answers bind_transceiver_resp with status ESME_ROK. A refused bind answers ESME_RBINDFAIL, whether the system ID is unknown, the password is wrong, or the credential or account is disabled. A connection that does not bind within the session timeout is closed. enquire_link keep-alives are answered, and unbind closes the session cleanly.
Sending
Send one submit_sm per recipient. Each one goes through the same checks as a JSON API request, so the same rules apply:
source_addrmust be a sender ID registered on your account for SMS and approved, exactly asfromon the API.destination_addris the recipient in international format,260971234567.short_messagemust be GSM 7-bit text; Unicode (UCS-2) is refused. It is billed per 160 characters from your SMS bundle.
submit_sm_resp carries the message ID the gateway assigned, the same ID the JSON API returns and the portal shows, so a message sent over SMPP can be found in the same reports.
Responses and errors
| command_status | Meaning |
|---|---|
| 0x00000000 ESME_ROK | Accepted. The message_id in submit_sm_resp is the same ID the JSON API would return. |
| 0x0000000D ESME_RBINDFAIL | Bind refused (unknown system_id, wrong password, disabled credential or account), or submit_sm sent before binding. |
| 0x00000008 ESME_RSYSERR | The gateway refused the message: sender ID not registered, empty bundle, or the text failed validation. |
| 0x00000045 ESME_RSUBMITFAIL | The SMPP service could not reach the gateway. Retry. |
0x00000000 ESME_ROK
- Meaning
- Accepted. The message_id in submit_sm_resp is the same ID the JSON API would return.
0x0000000D ESME_RBINDFAIL
- Meaning
- Bind refused (unknown system_id, wrong password, disabled credential or account), or submit_sm sent before binding.
0x00000008 ESME_RSYSERR
- Meaning
- The gateway refused the message: sender ID not registered, empty bundle, or the text failed validation.
0x00000045 ESME_RSUBMITFAIL
- Meaning
- The SMPP service could not reach the gateway. Retry.
On ESME_RSYSERR the reason is the gateway's own message, the same text the JSON endpoint would return (for example Invalid From Sender ID or INSUFFICIENT_BUNDLE); it is logged on our side and the SMPP status is all your client sees. Check the sender ID and bundle in the portal when a bind that used to send starts getting this status.
Delivery status
Delivery receipts (deliver_sm) are not sent over the bind, and there are no inbound messages on it. The status of every message sent over SMPP is in the portal's reports. If your system needs delivery status pushed to it, send over the JSON API with a callback_url instead; see Delivery webhooks.