SMPP 3.4
Best for existing SMPP platforms and high-throughput senders. Uses persistent TCP bind, system ID/password authentication, submit_sm sending, and real-time deliver_sm reports.
Integrate through SMPP 3.4 or HTTP REST. Both protocols use the same routing, billing, and delivery-report pipeline, so your team can choose the stack that fits your traffic model.
xSignal supports SMPP for persistent high-throughput connections and HTTP REST for simpler backend integrations. Both deliver through the same routing, billing, and delivery-report pipeline.
Best for existing SMPP platforms and high-throughput senders. Uses persistent TCP bind, system ID/password authentication, submit_sm sending, and real-time deliver_sm reports.
Best for web and app backends. Uses stateless HTTPS requests, X-API-Key / X-API-Secret authentication, and send or bulk-send endpoints.
| Area | SMPP | HTTP |
|---|---|---|
| Connection | Persistent TCP bind, SMPP 3.4 | Stateless HTTPS requests |
| Authentication | system_id + password | X-API-Key + X-API-Secret |
| Sending | submit_sm PDU | POST /api/http/send or /api/http/send/bulk |
| Delivery reports | deliver_sm pushed over bound session | Central delivery-report / webhook pipeline |
| Message type | Plain GSM text | Plain GSM text |
Credentials are provisioned by xSignal. You do not self-register API credentials.
Keys can be retrieved through the client portal. Keep all API secrets and SMPP passwords server-side only.
| Parameter | Value |
|---|---|
| Protocol | SMPP v3.4 |
| Host / Port | Provided by your account manager. Default service port: 2775 |
| Bind types | bind_transceiver, bind_transmitter, bind_receiver |
| Enquire-link interval | 30 seconds recommended |
| Response timeout | 30 seconds |
Send bind_transceiver, bind_transmitter, or bind_receiver with your system_id and password. bind_transceiver is recommended because it lets you submit and receive delivery reports on the same session.
Successful binds return ESME_ROK. Failed binds may return ESME_RBINDFAIL for bad IP or credentials, or ESME_RALYBND if already bound.
Once bound, send a submit_sm PDU with source_addr, destination_addr, short_message, and data_coding. Use registered_delivery = 1 when you want a delivery receipt pushed back to your session.
Insufficient wallet balance returns ESME_RSUBMITFAIL. Exceeding TPS returns ESME_RTHROTTLED, so slow down and retry.
If registered_delivery = 1 and your session is still bound when final carrier status returns, xSignal sends deliver_sm to you. Respond with deliver_sm_resp to acknowledge.
Send enquire_link every 30 seconds. Send unbind to close gracefully. If no valid PDU is received within the response timeout, the server may drop the connection.
| Code | Name | Meaning |
|---|---|---|
| 0x00000000 | ESME_ROK | Success |
| 0x00000004 | ESME_RINVBNDSTS | PDU sent before binding |
| 0x00000005 | ESME_RALYBND | Already bound on this connection |
| 0x0000000D | ESME_RBINDFAIL | Bind failed: bad IP or credentials |
| 0x0000000E | ESME_RINVPASWD | Invalid password |
| 0x0000000F | ESME_RINVSYSID | Invalid system ID |
| 0x00000014 | ESME_RMSGQFUL | Message queue full |
| 0x00000058 | ESME_RTHROTTLED | Rate limit exceeded |
| - | ESME_RSUBMITFAIL | Submission failed, for example insufficient balance |
All HTTP send requests go to your assigned xSignal host.
POST https://<your-assigned-host>/api/http/send
POST https://<your-assigned-host>/api/http/send/bulkEvery request must include X-API-Key and X-API-Secret headers. Invalid or inactive credentials return 401 Unauthorized.
POST /api/http/send sends the same sender and text to every address in receivers. One message record is created per receiver.
{
"sender": "ABCDE",
"receivers": ["2348012345678", "2348098765432"],
"text": "Your OTP is 482913. It expires in 5 minutes.",
"sms_type": "TRANSACTIONAL"
}| Field | Required | Notes |
|---|---|---|
| sender | Yes | Sender ID or shortcode |
| receivers | Yes | MSISDNs in international format, no + |
| text | Yes | Plain GSM text |
| sms_type | Conditional | PROMOTIONAL or TRANSACTIONAL. Omit only if credential has BOTH route configured. |
{
"sent": 2,
"messages": [
{
"our_message_id": "hx_4f3a2b1c9d8e7f6a",
"provider_message_id": "MC-998877",
"receiver": "2348012345678",
"status": "SENT",
"provider_status": "PENDING",
"error_code": null,
"error_message": null
}
]
}POST /api/http/send/bulk lets each item have its own sender, receiver, text, and sms_type. The response preserves request order.
{
"messages": [
{"sender": "ABCDEF", "receiver": "2348012345678", "text": "Your OTP is 482913.", "sms_type": "TRANSACTIONAL"},
{"sender": "ABCDEF", "receiver": "2348098765432", "text": "50% off today only!", "sms_type": "PROMOTIONAL"}
]
}| Status | Meaning |
|---|---|
| SENT | Accepted by upstream provider, awaiting final delivery confirmation |
| DELIVERED | Confirmed delivered to handset |
| FAILED | Rejected by provider or failed to send |
Every HTTP credential has one or more active routes tied to sms_type: PROMOTIONAL or TRANSACTIONAL.
| HTTP Status | Meaning |
|---|---|
| 401 | Invalid X-API-Key or X-API-Secret |
| 404 | No active route for this credential / sms_type combination |
| 400 | Invalid sms_type value |
| 502 | Upstream provider call failed |
HTTP API keys are retrievable through the client portal, gated behind your session login and a separate numeric passcode. This protects your keys even if a session token leaks.
https://cl.xsignalling.xyz/apiKeep your keys secret. They are returned as plain text on request and should be treated like database passwords.
Regardless of protocol, delivery status updates are tracked centrally. For SMPP, delivery reports can also be pushed live through deliver_sm.
GET /api/portal/webhooksThis uses the same X-Client-ID / X-Token authentication as the rest of the portal.
Contact your xSignal account manager for credential provisioning, sender ID registration, or integration issues.