Skip to content

The SMS API covers the full lifecycle of a message: send → track → analyze. It is the first channel of the 23 Telecom messaging platform — additional channels (Viber and more) will appear here alongside SMS, sharing the same authentication, webhooks and account layer.

EndpointMethodPurposePermission
/sms/sendPOSTSend to 1–100 recipientssms.send
/sms/status/:message_idGETDelivery status of one messagesms.read
/sms/messagesGETPaginated message historysms.read
/sms/messages/unifiedGETAPI + campaign traffic in one viewsms.read
/sms/messages/unified/exportGETStreaming CSV exportsms.read
/sms/statsGETAggregate statisticssms.read
/sms/stats/dailyGETDay-by-day breakdownsms.read
/sms/stats/by-countryGETPer-country breakdownsms.read
your server ──POST /sms/send──▶ 23 Telecom ──▶ carrier ──▶ handset
▲ │
└──── webhook (DLR) ◀──────────┘
  1. You send a message; the API responds immediately with a message_id per recipient and a cost/encoding summary.
  2. The carrier returns a delivery report (DLR) — typically within seconds.
  3. You receive the final status by webhook (recommended) or by polling message status.
  • E.164 numbers. Always send phone numbers as +<country><number>, e.g. +447911123456.
  • Encoding affects cost. One emoji switches the whole message from GSM-7 (160 chars/segment) to UCS-2 (70 chars/segment) — see encoding & segments.
  • Sender IDs are regulated. 3–11 alphanumeric characters, must not start with a digit; some countries restrict them — see sender IDs.
  • Batch sends are atomic. A multi-recipient request either fully queues or fails as a whole (500 DB_ERROR) — safe to retry, no partial sends.
  • Balance is checked before sending. Requests that would exceed your balance return 402 INSUFFICIENT_BALANCE with cost details — see balance.