Every Tanzanian network
Reach Vodacom, Airtel, Yas, Halotel and TTCL subscribers from a single sender name.
Bulk SMS for Tanzanian businesses
Send OTPs, alerts and campaigns to Vodacom, Airtel, Yas, Halotel and TTCL subscribers from one dashboard, a REST API or SMPP. Pay in TZS with VAT included, and keep your credits for as long as you like.
Illustration: text messages arriving on a phone, each followed by a delivery receipt.
Reaches subscribers on
Pricing
One price list, VAT included. The more you buy at once, the less each SMS costs — from TZS 16 down to TZS 8 per SMS.
Try it
Type your mobile number and we will text you a sample message right now, from a real sender ID, over the same network your customers' messages travel.
We use your number only to send this one message and do not keep it. The number of test messages is limited.
Why LundoSMS
From a first reminder to a million-message campaign — one platform, no surprises.
Reach Vodacom, Airtel, Yas, Halotel and TTCL subscribers from a single sender name.
See queued, sent to network, delivered or failed for every recipient — and export the report.
Register an alphanumeric sender ID so customers see your name instead of a random number.
A live segment meter and phone preview show how many SMS credits a message will use.
Integrate with one HTTPS call and signed webhooks, or bind your own SMPP client over TLS.
VAT included, volume discounts built in, and SMS credits that never expire.
Import contacts from CSV or Excel, merge names into messages and send at the right hour.
Give colleagues the access they need. Every sensitive action is recorded.
How it works
Everything happens online. The only human steps are the ones that keep the network clean: sender ID review and manual deposit checks.
Register, verify your email and phone, and tell us about your business.
Choose the name customers will see, then pay by mobile money, bank deposit or Lipa Namba.
Use the web composer, the REST API or SMPP, and watch delivery receipts arrive.
For developers
Send your first message with a single request. Idempotency keys, signed webhooks and per-message delivery status are part of the API from day one.
POST /v1/messages
curl -X POST 'https://api.lundosms.co.tz/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Idempotency-Key: order-1001' \
-H 'Content-Type: application/json' \
-d '{
"sender_id": "YOURBRAND",
"recipients": ["255712345678"],
"message": "Your order has been confirmed.",
"client_reference": "ORDER-1001",
"type": "transactional"
}'const response = await fetch('https://api.lundosms.co.tz/v1/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LUNDOSMS_API_KEY}`,
'Idempotency-Key': 'order-1001',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: 'YOURBRAND',
recipients: ['255712345678'],
message: 'Your order has been confirmed.',
client_reference: 'ORDER-1001',
type: 'transactional'
})
});
const result = await response.json();
console.log(result.data.batch_id, result.data.status);<?php
$ch = curl_init('https://api.lundosms.co.tz/v1/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('LUNDOSMS_API_KEY'),
'Idempotency-Key: order-1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'sender_id' => 'YOURBRAND',
'recipients' => ['255712345678'],
'message' => 'Your order has been confirmed.',
'client_reference' => 'ORDER-1001',
'type' => 'transactional',
]),
]);
$result = json_decode(curl_exec($ch), true);
echo $result['data']['batch_id'];import os
import requests
response = requests.post(
"https://api.lundosms.co.tz/v1/messages",
headers={
"Authorization": f"Bearer {os.environ['LUNDOSMS_API_KEY']}",
"Idempotency-Key": "order-1001",
},
json={
"sender_id": "YOURBRAND",
"recipients": ["255712345678"],
"message": "Your order has been confirmed.",
"client_reference": "ORDER-1001",
"type": "transactional",
},
timeout=10,
)
print(response.json()["data"]["batch_id"])package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"sender_id": "YOURBRAND",
"recipients": []string{"255712345678"},
"message": "Your order has been confirmed.",
"client_reference": "ORDER-1001",
"type": "transactional",
})
req, _ := http.NewRequest("POST", "https://api.lundosms.co.tz/v1/messages", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("LUNDOSMS_API_KEY"))
req.Header.Set("Idempotency-Key", "order-1001")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
fmt.Println(res.Status)
}Use cases
One-time codes for sign-in, payments and sign-ups, on a priority lane.
Learn moreOrder, payment and delivery updates the moment they happen.
Learn moreOffers, reminders and announcements to thousands of customers at once.
Learn moreFee reminders, appointment alerts and public notices for schools, clinics and more.
Learn moreBulk SMS lets you send the same message — or personalised versions of it — to many people at once. With LundoSMS you can upload a list of numbers, write one message and send it to thousands of customers on every Tanzanian network, then see which messages were delivered.
A sender ID is the name customers see instead of a phone number, for example YOURBRAND (up to 11 letters and digits). You request it from your dashboard with a short description and supporting documents. Our team reviews it and, where the networks require it, submits it for approval. You can send as soon as it is approved.
You buy SMS credits in Tanzanian shillings, and the price per SMS falls as the size of a single purchase grows. All prices include VAT. The current price list and a calculator are on the pricing page.
No. SMS credits never expire. Buy what you need now and use it whenever you like.
Every message has its own status: queued, sent to network, delivered, or failed. "Sent to network" means the operator accepted the message; "delivered" means the handset confirmed it. You can see statuses in the dashboard, export them, or receive them by webhook or SMPP. A phone that is switched off or out of coverage may receive a message late or never — no provider can guarantee delivery when the operator does not confirm it.
Yes. The REST API accepts a single HTTPS request with an API key, supports idempotency keys so a retry never sends twice, and reports status changes by signed webhook. Test keys let you try everything without sending real messages.
Create your account, register your sender name and send your first message today. Buy the SMS credits you need — they never expire.
Prepaid credits only. Prices in TZS, VAT included.