kenari.dev

The WhatsApp Cloud API, without the Meta paperwork.

Connect a WhatsApp number, create an API key, and send messages, templates and interactive replies over the exact Cloud API you already know.

7-day trial on every plan · Meta bills conversations directly

1curl -X POST https://api.staging.kenari.dev/v23.0/$PHONE_NUMBER_ID/messages \
2 -H "Authorization: Bearer $KENARI_API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "messaging_product": "whatsapp",
6 "to": "6281234567890",
7 "type": "text",
8 "text": { "body": "Halo dari kenari" }
9 }'
200 OK142 ms
{
  "messaging_product": "whatsapp",
  "contacts": [{ "input": "6281234567890", "wa_id": "6281234567890" }],
  "messages": [{ "id": "wamid.HBgNNjI4MTIzNDU2Nzg5MBUCABEYEjk4" }]
}

Your code talks to Kenari. Kenari talks to WhatsApp.

How delivery works →
WhatsApp
Your customer’s phone
K
Kenari
Keys, token vault, webhooks
Your app
Any stack, one REST call

First message in five minutes.

Full quickstart guide →

Connect a number

Onboard through Meta's Embedded Signup or bring your existing WhatsApp Business account. Your Meta token is sealed at rest with AES-256-GCM.

Embedded Signup · or bring your WABA

Create an API key

One key authenticates every request. Your Meta token never leaves our vault and never touches your code.

Authorization: Bearer kn_live_…

Send

Text, templates, media, interactive buttons: one POST to api.kenari.dev, with the same payload as Meta's Cloud API.

POST /v23.0/{id}/messages

Why not call Meta directly?

You can, once you have the access. Getting it is the hard part.

Start 7-day trial →

On your own

  • Become a Meta Tech Provider
  • Pass App Review for messaging and management
  • Wait for Advanced access before real traffic
  • Build token storage, webhook verification and retries
  • Handle coexistence numbers separately

With kenari

  • Connect a number. That's the onboarding.
  • Tech Provider and App Review: done on our side
  • Coexistence supported out of the box
  • Token vault, signed webhooks and retries built in
  • First message in minutes

Keep the WhatsApp Business app. Add the API on the same number.

No cutover

Your team keeps replying from the WhatsApp Business app while your code sends through the API on the same number.

History synced once

On connect, WhatsApp shares contacts and up to 180 days of chats. We pass them straight to your webhook and store none of it.

The 24-hour window, handled

The sync can run only once, within 24 hours. We ask for your endpoint before the clock starts.

Everything the WhatsApp Business Platform does. Less of the paperwork.

Byte-for-byte forwarding

Request bodies pass through untouched. No re-serialising, no reordered keys.

Templates & interactive

Create and send templates, buttons, lists, media: every Cloud API message type.

Many numbers, one account

Connect several WhatsApp numbers per account, each isolated, with per-plan quotas.

Webhooks, delivered

Verified, fanned out to your endpoints, retried on failure, and signed with Standard Webhooks.

Tokens sealed at rest

Meta tokens are encrypted and bound to their row. API keys are HMAC-verified, never stored in the clear.

Access logs

Every call recorded with status and Meta's latency, so you can tell your latency from theirs.

Meta’s Cloud API, unchanged.

Requests are forwarded byte for byte, so Meta’s reference is ours. Swap the base URL and the token; keep everything else.

Meta’s API reference →
POST/v23.0/{phone-number-id}/messages

Send text, media, a template or an interactive message. The body is Meta's, forwarded as is.

PARAMETERS
messaging_productstring · required
Always "whatsapp".
tostring · required
Recipient phone number with country code, e.g. 6281234567890.
typestring · required
text, template, image, document, interactive, …
text / template / …object · required
The body for that type, named after it.
RESPONSE
{
  "messaging_product": "whatsapp",
  "contacts": [{ "input": "6281234567890", "wa_id": "6281234567890" }],
  "messages": [{ "id": "wamid.HBgNNjI4MTIzNDU2Nzg5MBUCABEYEjk4" }]
}

Meta’s webhooks, verified and delivered to you.

We check Meta’s signature, fan each event out to your endpoints, re-sign it with Standard Webhooks and retry when your server is down. Inbound messages and every status change, in Meta’s own shape.

POST https://api.acme.id/hooks/kenari
  • 14:02:11messages200
  • 14:02:14statuses.sent200
  • 14:02:17statuses.delivered200
  • 14:02:20statuses.read200
  • 14:02:23statuses.failed200

One flat price per month. Priced in rupiah.

Every plan starts with a 7-day trial. Meta bills conversations directly; we add no markup.

Starter

Rp 49rb/ month
  • 1 WhatsApp number
  • Send & receive messages
  • Templates & interactive
  • Full Meta throughput
  • Webhooks & 7-day logs
  • Coexistence support
Start 7-day trial

Basic

Rp 79rb/ month
  • 2 WhatsApp numbers
  • Send & receive messages
  • Templates & interactive
  • Full Meta throughput
  • Webhooks & 7-day logs
  • Coexistence support
Start 7-day trial

Pro

POPULAR
Rp 129rb/ month
  • 5 WhatsApp numbers
  • Send & receive messages
  • Templates & interactive
  • Full Meta throughput
  • Webhooks & 7-day logs
  • Coexistence support
Start 7-day trial

Questions, answered.

What is kenari.dev?

Infrastructure for the WhatsApp Cloud API. You call a REST API from your own code; we handle Meta access, token storage, webhooks and pacing.

Is this an inbox, broadcast or CRM tool?

No. kenari is an API for developers. Build your inbox or CRM on top of it.

What can I send?

Anything the Cloud API supports: text, media, templates, interactive buttons and lists, reactions, read receipts.

Do I need my own WhatsApp Business account?

You can create one during Embedded Signup or connect an existing one, including a coexistence number used in the WhatsApp Business app.

How am I billed?

A flat monthly fee per plan. Meta bills you directly for conversations, and we never mark that up.

How do I authenticate?

Send your kenari API key as a bearer token. Never send your Meta token; we supply it.

Do you store my messages?

No. Message bodies and synced chat history pass through to you. We keep your Meta token, encrypted, and 7 days of access logs with status and latency.

Which Graph API versions work?

The version sits in the path, as it does with Meta: /v23.0/…. Call the version you'd call on Meta, and upgrade by changing the path.

Send your first WhatsApp message today.

Try any plan for 7 days. Connect a number and you’re live in minutes.