SMS · WhatsApp · 25 countries

One thread, every network.

Send SMS and WhatsApp messages across Africa with one API, from Buea.

A request to Fil and its reply
curl https://api.fil.example/v1/messages \  -d to=+2376XXXXXXXX \  -d body="Votre code Fil est 4821."{ "id": "msg_01", "status": "queued", "parts": 1 }→ sent→ delivered

Code

Three requests, five languages.

Each sample uses its language's own HTTP tooling, so there is nothing to install. Pick a language once and every sample follows.

Send an SMS

One request, with the number in international format. The reply says how many parts the message took.

curl https://api.fil.example/v1/messages \  -H "Authorization: Bearer fil_test_xxxxxxxxxxxx" \  -H "Content-Type: application/json" \  -d '{    "to": "+2376XXXXXXXX",    "channel": "sms",    "body": "Votre code Fil est 4821. Il expire dans 10 minutes."  }'

Test mode: nothing leaves this page.

Send a WhatsApp template

Outside the 24-hour window, WhatsApp only delivers approved templates. Name a fallback and Fil sends an SMS when WhatsApp can't deliver.

# Outside the 24-hour window, WhatsApp only delivers approved templates.curl https://api.fil.example/v1/messages \  -H "Authorization: Bearer fil_test_xxxxxxxxxxxx" \  -H "Content-Type: application/json" \  -d '{    "to": "+2376XXXXXXXX",    "channel": "whatsapp",    "template": { "name": "otp", "language": "fr", "variables": ["4821"] },    "fallback": "sms"  }'

Test mode: nothing leaves this page.

Receive delivery receipts

Fil posts a receipt to your webhook each time a message changes status: queued, sent, delivered, read or failed.

# Fil posts a receipt to your webhook each time a message changes status.# Try your handler locally with the receipt Fil would send:curl http://localhost:3000/webhooks/fil \  -H "Content-Type: application/json" \  -d '{    "id": "msg_01",    "status": "delivered",    "channel": "sms",    "to": "+2376XXXXXXXX",    "parts": 1  }'

Features

What a message needs, and nothing else.

  • One number format

    Every number in international format, as E.164 writes it: a plus, the country code, the number. Spaces are fine.

  • WhatsApp, then SMS

    Name a fallback and Fil sends an SMS when WhatsApp can't deliver, with one receipt for both.

  • Receipts by webhook

    Fil posts each change of status to your webhook: queued, sent, delivered, read or failed.

  • Safe to retry

    Send the same Idempotency-Key twice and the message goes once, so a timeout never doubles a code.

  • Test mode

    Messages sent with a fil_test_ key are never delivered, but get receipts like real ones.

  • Priced per part

    An SMS costs one price per part, and the counter below shows how many parts a message takes before you send it.

Coverage

25 countries, every major network.

One endpoint for all of them. Numbers go in international format; Fil finds the route.

  • West Africa

    • Benin +229
    • Burkina Faso +226
    • Côte d'Ivoire +225
    • Ghana +233
    • Mali +223
    • Nigeria +234
    • Senegal +221
    • Togo +228
  • Central Africa

    • Cameroon +237
    • Chad +235
    • Congo +242
    • DR Congo +243
    • Gabon +241
  • East Africa

    • Ethiopia +251
    • Kenya +254
    • Rwanda +250
    • Tanzania +255
    • Uganda +256
    • Zambia +260
  • Southern Africa

    • Botswana +267
    • Namibia +264
    • South Africa +27
  • North Africa

    • Egypt +20
    • Morocco +212
    • Tunisia +216

Fil's coverage is fictional. The dialling codes are real.

Pricing

Per message, by region.

Prices are fictional: Fil is a design study.

Price per message in US dollars, at up to 10,000 messages a month
Message West Central East Southern North
SMS, per part $0.0210$0.0340$0.0240$0.0190$0.0450
WhatsApp marketing $0.0310$0.0380$0.0290$0.0330$0.0420
WhatsApp utility $0.0080$0.0090$0.0070$0.0080$0.0110
WhatsApp authentication $0.0070$0.0080$0.0060$0.0070$0.0100
WhatsApp service $0.0040$0.0040$0.0030$0.0040$0.0050

Each WhatsApp business number gets 1,000 service messages a month free; the price above applies beyond them.

What will my SMS cost?

Type a message to see how many parts it takes, and what it costs at the volume above.

Encoding
GSM 7-bit
Length
51 / 160 characters
Parts
1 part
Cost
1 × $0.0340 = $0.0340

Changelog

What changed.

  1. New

    SMS fallback for WhatsApp templates: name "fallback": "sms" and Fil sends an SMS when WhatsApp can't deliver.

  2. Improved

    Delivery receipts say how many parts an SMS took.

  3. New

    Test keys: messages sent with a fil_test_ key are never delivered, but get receipts like real ones.

  4. Fixed

    Numbers written with spaces, such as +237 6XX XX XX XX, no longer fail validation.

  5. Improved

    WhatsApp prices are per message, as Meta charges since 1 July 2025.

FAQ

Questions developers ask.