Quickstart

From nothing to a delivered message. Five minutes, and the number it sends from is your own.

1. Get a key

Start a 7 day trial. You get a live key immediately, and can make a test key on the API keys screen.

sk_live_...Sends to real WhatsApp numbers.
sk_test_...Validates every request, stores every message and fires real webhooks, and delivers nothing to WhatsApp.

Each is shown once when it is created. If you lose it, an owner can read it back in the console by re-entering their password - it is rate limited and written into the account's audit log. Some older keys are stored only as a hash and cannot be shown at all; the console marks which, and those are replaced.

2. Link your number

Add your WhatsApp number in the console under Numbers, then link it: scan a QR code from the phone, or type an eight character pairing code into it. The console shows the socket state live, so you know it worked rather than hoping. See Numbers.

Everything below sends from that number, with either key. Swapping sk_live_ for sk_test_ is the whole difference between rehearsing and sending, so what you rehearse is exactly what will happen.

3. Send your first message

curl -X POST https://njiwa.upeo.ai/v1/messages?wait=true \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"to": "254712345678", "text": "Hello from Njiwa"}'

?wait=true blocks for up to 15 seconds and returns the real outcome, so you see a result in your terminal without setting up a webhook first.

{
  "id": "msg_01JC8X4K2NQ7RB",
  "status": "sent",
  "to": "254712345678",
  "from": "254720123456",
  "type": "text",
  "created_at": "2026-08-31T09:14:22Z"
}

4. Send a PDF

curl -X POST https://njiwa.upeo.ai/v1/messages \
  -H "Authorization: Bearer sk_live_..." \
  -F to=254712345678 \
  -F document=@invoice.pdf \
  -F caption="Your invoice"

5. Receive replies

Point a webhook at your app under Webhooks, then see Receiving for the signature check.

Phone number formats. Njiwa accepts 254712345678, +254 712 345 678, 0712345678 and a raw JID. A local number is resolved using the sending number's own country code.