API authentication
Authenticate server requests with a scoped, number-bound API key.
Reviewed
Create a key in Settings > Developer > API keys. Every key requires a WhatsApp number and at least one supported scope. Read scopes work with either inbound handler and can expose retained history after disconnection, subject to workspace, number, contact and data-retention lifecycle checks. Autonomous messages:send still requires a connected number using Developer API handling. Workspace resource mutations retain their existing write gates.
Choose the supported scopes
A scope is a permission on the key. Select only the operations your integration needs from the table below.
| Scope | Operations |
|---|---|
messages:send | Send a message. |
messages:read | Read messages and conversations for the bound number. |
media:read | Download a permitted attachment for the bound number. |
workspace:contacts:read | Read shared workspace contacts and existing labels. |
workspace:contacts:write | Upsert/update shared contacts and apply/remove existing labels. |
workspace:segments:read | Read shared static segments and membership. |
workspace:segments:write | Create static segments and add/remove members. |
templates:read | Read cached templates for the bound number’s WABA. |
campaigns:read | Read campaign summaries and recipient outcomes for the bound number. |
reports:read | Read this key’s API activity and its number’s webhook health. |
webhooks:read | Read webhook settings and health for the bound number. |
webhooks:manage | Save, rotate, test, enable or disable that number’s webhook. |
Workspace-prefixed scopes expose shared workspace data, not just contacts for one number. A key manager can grant only scopes allowed by their current workspace role. Number grants do not authorize workspace data. Existing keys do not gain new scopes automatically.
Grant only the scopes the calling service needs. A send-only key cannot read message status; add messages:read if the service needs that check. To use another number, create another key bound to that number. Editing or rotating a key does not change its number.
Workspace roles control who can manage keys and number settings in the dashboard. The API scopes control what the server may do. Dashboard permissions such as contact:read are not Developer API scopes.
Make a read-only request
The example uses curl, a command-line tool for HTTP requests. Set WAARU_API_KEY in your service’s secret manager or local environment before running it. $WAARU_API_KEY reads that value; it is not a literal API key. The following request needs messages:read:
curl --fail-with-body 'https://api.waaru.app/v1/conversations?limit=10' \
--header "Authorization: Bearer $WAARU_API_KEY" \
--header 'Accept: application/json'Expected result: HTTP 200 means the read request succeeded. A number with no visible retained conversations returns:
{
"items": [],
"nextCursor": null
}Use the returned conversation identifiers in later calls. Knowing another workspace's identifier does not grant access. Send the Bearer header on every request; an API key cannot be replaced with your Google token, a Meta access token, or a dashboard cookie.
Diagnose access failures
401withunauthorizedorinvalid_api_key: check the key value and whether it was rotated or revoked.403withinsufficient_scope: compare the requested operation with the key's scopes.403withapi_key_not_allowed: the route is not available to external API keys. Use the endpoint reference.409withinstance_not_api_managed: a control or mutation request requires Use Developer API. Read-only observation does not require switching handlers.409withinstance_unavailable: restore the number's connection.
Do not send secrets in query strings or paste them into support tickets. For rotation, revocation, and one-time secret display, follow Manage API keys. Continue with sending messages.
Grant lifecycle and discovery access
workspace:labels:manage: create, rename and archive workspace labels.workspace:segments:manage: update and archive static workspace segments.instance:read: read the bound number's state, mode and granted scopes.
These scopes are opt-in. Existing keys receive no new grants. Your workspace permissions must permit the corresponding operation before you can grant it. Number status and capabilities remains available with instance:read when the number is disconnected or uses another inbound handler. Other scoped reads also work in either handler mode. Disconnection does not grant send authority, and deleted numbers or inactive workspaces remain inaccessible. campaigns:read is an explicit grant requiring the key manager's broadcast-read authority; it gives no send or scheduling permission.
Number status
Inspect the number bound to your API key, its connection state, inbound handler and explicitly granted scopes.
Send WhatsApp messages
Send text or approved templates through the Waaru Developer API, understand the queued response, and track delivery without duplicating uncertain requests.