+254 722 117 850 Support Login
Products Bulk SMS
Messaging · Live

One API call. A million Kenyans messaged before tea.

Send transactional and promotional SMS to Safaricom, Airtel, Telkom and Faiba subscribers from one endpoint. Branded sender IDs, automatic multi-part handling, delivery callbacks the moment a phone rings.

100 TPS per project All Kenyan carriers Delivery webhooks
GALAXION SMS · Today
Hi Wanjiru, your order #4821 has shipped. Track: galaxion.co.ke/t/482110:14
Out for delivery between 9–11am tomorrow. Driver Peter +254 712 345 678.14:02
Delivered. Asante for shopping with Galaxion — rate your delivery: galaxion.co.ke/r/482110:47
Delivery callback { "status": "success", "network": "safaricom", "messageId": "MSG-9X4K" }
Endpoint POST /api/v1/messaging
Channel SMS · all 4 telcos
Throughput 100 TPS sustained
Billing Per message part
How it works

Three steps from idea to inbox

Whether you're sending one delivery alert or 500,000 promo messages, the path is the same.

1

Pick your sender

Use your approved sender ID for branded messages, or post directly with a shortcode. Sozuri auto-routes by carrier so every recipient sees the right name.

2

POST the message

A single POST /v1/messaging with to, from, message, type and campaign. Numbers are normalised, multi-part splits are detected, throttling is automatic.

3

Watch it land

Each accepted message gets a messageId instantly. Delivery webhooks fire to your callback URL the moment Safaricom, Airtel, Telkom or Faiba confirm receipt.

What you get

Built for the way Kenyans actually message

Branded sender IDs

Transactional and promotional senders, registered with each Kenyan carrier. The right name shows on every handset, every time.

One call, many recipients

Pass an array or a CSV of numbers in a single request. Sozuri batches, paces and routes by carrier so your platform doesn't have to.

Multi-part handled for you

160 GSM-7 or 70 Unicode characters per part — Sozuri detects, splits and reassembles so emojis and long messages just work.

Delivery callbacks

Webhooks push status, network and messageId the second a phone rings. Idempotent, retry-safe.

Campaign-level reporting

Tag every send with a campaign name. The dashboard rolls up delivery, click-through and cost per blast in real time.

Scheduled & recurring sends

Drop a future timestamp on a request and Sozuri queues it. Pair with a campaign tag for recurring promo cadences and birthday alerts.

In the API

Your first SMS in five lines.

A single REST call. The same payload pattern works for SMS, WhatsApp, Premium and the rest of the platform — only the channel changes.

Full API reference →
bulk-sms.
# Send a transactional SMS
curl -X POST "https://api.sozuri.net/v1/messaging" \
  -H "Authorization: Bearer $SOZURI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project":  "Galaxion",
    "from":     "GALAXION",
    "to":       "+254712345678",
    "channel":  "sms",
    "type":     "transactional",
    "message":  "Your order #4821 has shipped. Track: galaxion.co.ke/t/4821",
    "campaign": "shipping-alerts"
  }'
// Send a transactional SMS
const res = await fetch("https://api.sozuri.net/v1/messaging", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SOZURI_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    project:  "Galaxion",
    from:     "GALAXION",
    to:       ["+254712345678", "+254723456789"],
    channel:  "sms",
    type:     "transactional",
    message:  "Your order #4821 has shipped.",
    campaign: "shipping-alerts"
  })
});
# Send a transactional SMS
import requests, os

res = requests.post(
    "https://api.sozuri.net/v1/messaging",
    headers={"Authorization": f"Bearer {os.environ['SOZURI_API_KEY']}"},
    json={
        "project":  "Galaxion",
        "from":     "GALAXION",
        "to":       "+254712345678",
        "channel":  "sms",
        "type":     "transactional",
        "message":  "Your order #4821 has shipped.",
        "campaign": "shipping-alerts",
    },
)
// Send a transactional SMS (Guzzle)
$client = new \GuzzleHttp\Client();
$client->post("https://api.sozuri.net/v1/messaging", [
    "headers" => ["Authorization" => "Bearer " . getenv("SOZURI_API_KEY")],
    "json" => [
        "project"  => "Galaxion",
        "from"     => "GALAXION",
        "to"       => "+254712345678",
        "channel"  => "sms",
        "type"     => "transactional",
        "message"  => "Your order #4821 has shipped.",
        "campaign" => "shipping-alerts",
    ],
]);
Rate-limit guide 100 TPS per project sustained, 400 TPS platform-wide. For campaigns over 10,000 messages, divide by 100 to estimate seconds of pacing — or just let Sozuri's queue do it for you.
In the wild

Two SMS your customers will actually read

Transactional

Order alerts that arrive before the doorbell.

The single highest-converting SMS a retailer can send is the shipping update. Sozuri delivers it sub-three-seconds across every Kenyan carrier — with a delivery callback so your CRM updates itself.

  • Branded sender ID (GALAXION, not a random shortcode)
  • Personalisation tokens from your CRM
  • Click tracking on your shortlinks
  • Auto-retry on temporary carrier failure
Send your first alert →
GALAXION Order · #4821
Order confirmed. KSh 2,400 received. Dispatch within 1 hr from Eastleigh hub.09:12
Out for delivery. Driver Peter, +254 712 345 678. ETA 10:30am.10:14
Delivered. Rate your driver: galaxion.co.ke/r/482110:47
Promotional

Campaigns that fit in 160 characters.

Upload a CSV of segmented customers, tag the campaign, schedule a send. The dashboard shows delivery, opt-out and conversion rates rolling in within minutes — per network, per cohort.

  • CSV or API recipient lists, up to 500K per campaign
  • Per-carrier rate tiers from KSh 0.38 to 1.00 per SMS
  • Opt-out keyword handling (STOP) baked in
  • Real-time per-campaign analytics
See pricing tiers →
JAMII GROCERS Campaign · Saturday Saver
Saturday only — 20% off groceries above KSh 2,000 with code TANO. Show at till. T&Cs jamii.co.ke/t09:14
Live · 47 min in Delivered 487,212 · Codes redeemed 4,802 · Opt-outs 86

Pay-as-you-go. Cheaper as you scale.

From KSh 0.78 per Safaricom SMS down to KSh 0.38 at volume. No commitments. Sender ID setup is a one-time KSh 8,000 + VAT per network.

Common questions

Answers from the docs — not marketing

How long does a sender ID take to get approved?

Sender ID approval is per-carrier and is handled by Safaricom, Airtel and Telkom directly. The Sozuri team submits on your behalf with KYC documents; expect 5–10 business days per network. Once approved, the sender is available across all your projects.

What counts as a "message part" for billing?

A standard GSM-7 SMS is up to 160 characters per part. Adding emoji or non-Latin characters switches the encoding to Unicode (UCS-2), which caps a part at 70 characters. Multi-part messages are billed per part. Sozuri detects and reports parts on the synchronous response so there are no surprises.

How big can a single batch be?

There's no hard upper limit on the to array, but the platform paces sends at 100 TPS per project (400 TPS aggregate). For a 500,000-message campaign, that's roughly 80 minutes end-to-end. Schedule overnight if you want everything delivered before morning.

What happens to messages a carrier can't deliver?

Sozuri retries transient failures (busy network, temporary off-net) automatically. Permanent failures — invalid number, blacklist, DND — come back on the delivery webhook with a non-success status and a descriptive code, so your platform can mark the record without polling.

SMS · SENT +254 712 +254 723 +254 720, +254 745…
Your move

Send your first 100 SMS on us.

Free signup credits cover your first 100 messages — enough to wire the API end-to-end before billing kicks in. No card. No call.

Chat on WhatsApp
Your first SMS in the time it takes to brew coffee. Start building in minutes