SMS Pricing
SMS is priced per message segment delivered, with rates set per destination country to reflect real carrier costs. You are never billed for messages that fail or are rejected by a carrier. All prices below are list prices in USD; volume discounts from the Pricing Overview apply on top automatically.
Per-Country Rate Cardβ
| Country | Code | Price / Segment (USD) | Notes |
|---|---|---|---|
| π³π¬ Nigeria | NG | $0.0098 | Transactional and promotional same rate |
| π°πͺ Kenya | KE | $0.0120 | Premium route available |
| πΏπ¦ South Africa | ZA | $0.0140 | β |
| πͺπΉ Ethiopia | ET | $0.0080 | Lowest-cost route on AfriRoute |
| π¬π Ghana | GH | $0.0110 | β |
| πΉπΏ Tanzania | TZ | $0.0105 | β |
| πΊπ¬ Uganda | UG | $0.0100 | β |
| π·πΌ Rwanda | RW | $0.0095 | β |
For countries not listed, see the full coverage list or request a quote from [email protected].
How Segments Are Countedβ
A single SMS holds 160 GSM-7 characters. Longer messages are split into segments and billed per segment. Using any non-GSM character (most emoji, Amharic, Arabic, accented letters) switches the entire message to Unicode (UCS-2), which holds only 70 characters per segment.
| Encoding | 1 segment | 2 segments | 3 segments |
|---|---|---|---|
| GSM-7 | 160 chars | 306 chars | 459 chars |
| Unicode | 70 chars | 134 chars | 201 chars |
Keep transactional messages under 160 GSM-7 characters to stay at one segment. A single stray emoji can triple your per-message cost by forcing Unicode.
Cost Calculationβ
def sms_cost(message: str, rate_per_segment: float, recipients: int = 1) -> float:
unicode_needed = any(ord(c) > 127 for c in message)
per_segment = 70 if unicode_needed else 160
multi_segment = 67 if unicode_needed else 153 # concatenation headers
n = len(message)
if n <= per_segment:
segments = 1
else:
segments = -(-n // multi_segment) # ceil division
return round(segments * rate_per_segment * recipients, 4)
# 200-char GSM-7 message to 5,000 Kenyan numbers
print(sms_cost("A" * 200, 0.0120, 5000)) # 144.0 (2 segments each)
Worked Examplesβ
| Scenario | Calculation | Cost (USD) |
|---|---|---|
| 1 OTP to Nigeria (1 seg) | 1 Γ $0.0098 | $0.0098 |
| 10,000 promo SMS to Kenya (1 seg) | 10,000 Γ $0.0120 | $120.00 |
| 10,000 promo SMS to Kenya (Growth tier β8%) | $120.00 Γ 0.92 | $110.40 |
| 5,000 two-segment alerts to Ethiopia | 5,000 Γ 2 Γ $0.0080 | $80.00 |
| 1,000 Unicode (Amharic) 90-char to Ethiopia | 1,000 Γ 2 Γ $0.0080 | $16.00 |
Inbound SMSβ
Replies to a dedicated long code or shortcode (for two-way support and opt-in keywords) are billed separately:
| Type | Price / inbound message (USD) |
|---|---|
| Long code | $0.0050 |
| Shared shortcode | $0.0080 |
| Dedicated shortcode | $0.0080 + monthly rental |
Checking Cost Programmaticallyβ
Every send response includes the billed segment count and cost:
{
"status": "success",
"message_id": "msg_7K8L9M0N",
"to": "+254712345678",
"segments": 2,
"cost": 0.024,
"currency": "USD"
}
Relatedβ
Need a custom rate for high volume? [email protected]
Last Updated: May 2026