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.

Endpoint Method Purpose Permission
/sms/send POST Send to 1–100 recipients sms.send
/sms/send-individual POST Personalized bulk, 1–1000 recipient-specific messages sms.send
/integrations/sms/send POST Strict single-message CRM webhook (managed activation) sms.send
/sms/status/:message_id GET Delivery status of one message sms.read
/sms/messages GET Paginated message history sms.read
/sms/messages/unified GET API + campaign traffic in one view sms.read
/sms/messages/unified/export GET Streaming CSV export sms.read
/sms/stats GET Aggregate statistics sms.read
/sms/stats/daily GET Day-by-day breakdown sms.read
/sms/stats/by-country GET Per-country breakdown sms.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. Format support depends on your account, route and destination country; alphanumeric senders commonly follow 3–11 character rules — see sender IDs.
  • Batch retries are idempotent where documented. /sms/send-individual requires Idempotency-Key; reuse the same key when retrying a logical batch.
  • CRM retries use the strict endpoint. /integrations/sms/send accepts one message and requires Idempotency-Key; ask your account manager to enable it.
  • Balance and pricing are monitoring signals. The current send endpoints accept valid traffic fail-open when local balance or pricing data is missing; a provisional local cost can be 0. Monitor balance, then use the delivery report for the final status and cost.