API GuidesWhatsApp Business API
Get Started
Prepare WhatsApp in the Portal, authenticate, and make the first WABA Developer API request.
Prerequisites
- Notify Africa account with active WhatsApp access.
- Meta business account eligible for WhatsApp Business.
- WhatsApp Business Account and phone number connected in the Notify Africa Portal.
- Connection marked ready in the Portal.
- API key authorized for WABA.
- Server environment that can protect the API key.
- HTTPS callback URL for webhook events.
Complete Portal Setup
Before calling the Developer API:
- Open WhatsApp setup in the Notify Africa Portal.
- Complete Meta Embedded Signup.
- Select the business, WhatsApp Business Account, and phone number.
- Resolve every readiness blocker shown in the Portal.
- Create an API key with WABA access enabled.
- Copy the key when shown and store it in a secret manager.
Do not call Portal account-management operations from your integration. The Developer API uses the connection selected for the account that owns the API key.
Configure Environment
export NOTIFY_API_BASE_URL="https://api.notify.africa"
export NOTIFY_WABA_API_KEY="ntfy_your_api_key"Use the base URL assigned to your environment when it differs from the production example.
Required Headers
Authorization: Bearer ntfy_your_api_key
Content-Type: application/jsonContent-Type is required for requests with a JSON body.
First Request
List the account's WhatsApp templates:
curl --request GET \
"$NOTIFY_API_BASE_URL/v1/waba-api/templates?channel=whatsapp¤tPage=1&pageSize=10" \
--header "Authorization: Bearer $NOTIFY_WABA_API_KEY"Example response:
{
"status": 200,
"message": "Success",
"timestamp": "2026-09-09T10:00:00.000Z",
"path": "/v1/waba-api/templates?channel=whatsapp¤tPage=1&pageSize=10",
"data": [],
"pagination": {
"total": 0,
"currentPage": 1,
"totalPages": 0,
"pageSize": 10
}
}First-Message Requirements
Choose one send path:
| Send type | Requirement |
|---|---|
| Template | Template exists for the connected WABA and Meta reports it as approved |
| Text | Recipient has an open conversation with qualifying inbound activity during the preceding 24 hours |
Template sends are the correct first-contact path.
First Template Send
curl --request POST \
"$NOTIFY_API_BASE_URL/v1/waba-api/messages/template" \
--header "Authorization: Bearer $NOTIFY_WABA_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"to": "255700000001",
"template_name": "order_update",
"language": "en",
"template_parameters": {
"body": {
"1": "Jane",
"2": "ORD-1001"
}
},
"idempotency_key": "order-1001-update"
}'Example accepted response:
{
"status": 200,
"message": "Success",
"timestamp": "2026-09-09T10:01:00.000Z",
"path": "/v1/waba-api/messages/template",
"data": {
"results": [
{
"to": "255700000001",
"success": true,
"messageId": "d9b54c80-8a63-4f8b-83c8-71f2439f5429",
"status": "processing",
"error": null
}
]
}
}success: true means Notify Africa queued the recipient result. It does not mean Meta accepted or delivered the message. A provider wamid can be absent at this stage.
Observe Delivery
- Configure a developer webhook in the Portal.
- Subscribe to
message.status.updated. - Verify every callback signature using the raw request body.
- Match
data.messageIdordata.wamidto the send result. - Deduplicate callbacks by
eventId.
Checklist
- Portal shows the connection as ready.
- API key starts with
ntfy_and has WABA access. - Requests use Bearer authentication.
- Template is approved before sending.
- Recipient values use one consistent international format.
- Webhook secret is stored separately from the API key.
- Send responses are treated as asynchronous acceptance.
