WhatsApp Send API for Developers
Send WhatsApp messages from your CRM, store, or internal tools with a single HTTP call. Your own number, flat monthly pricing, no Meta business verification, no per-message fees.
API keys are created in the dashboard under API Keys (Business plan).
Authentication
All requests are authenticated with an API key in the Authorization header. Keys look like bwa_live_… and are shown once at creation — BulkWA stores only a hash.
Authorization: Bearer bwa_live_YOUR_KEYBase URL: https://bulkwa-server.onrender.com. Keep keys server-side; never ship them in browser or mobile code. Revoke a leaked key instantly from the dashboard.
Send a message
/v1/messages| Field | Type | Description |
|---|---|---|
| to | string, required | Recipient phone in international format, e.g. +14155550123. 8-15 digits. |
| message | string, required | Text message body, max 4096 characters. |
| session_id | uuid, optional | Which of your WhatsApp numbers to send from. Defaults to your first connected session. |
cURL
curl -X POST https://bulkwa-server.onrender.com/v1/messages \
-H "Authorization: Bearer bwa_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155550123",
"message": "Your order #1042 has shipped!"
}'Node.js
const res = await fetch("https://bulkwa-server.onrender.com/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BULKWA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+14155550123",
message: "Your order #1042 has shipped!",
}),
});
const data = await res.json();
// { id: "wamid...", status: "sent", to: "+14155550123" }Response — 200
{
"id": "3EB0538DA65B5B2F7A2B",
"status": "sent",
"to": "+14155550123"
}API sends count against your plan’s message quota, are serialized with your campaigns’ anti-ban delays, and respect STOP opt-outs automatically. Text messages only for now — media support is planned for v1.1.
List your sessions
/v1/sessionscurl https://bulkwa-server.onrender.com/v1/sessions \
-H "Authorization: Bearer bwa_live_YOUR_KEY"Response — 200
{
"sessions": [
{
"id": "0b6a1c9e-...",
"phone_number": "+14155550100",
"status": "connected"
}
]
}Check plan & usage
/v1/mecurl https://bulkwa-server.onrender.com/v1/me \
-H "Authorization: Bearer bwa_live_YOUR_KEY"Response — 200
{
"plan": "business",
"api_access": true,
"usage": {
"messages_sent_this_month": 1250,
"monthly_limit": 10000,
"remaining": 8750,
"messages_sent_today": 84,
"daily_limit": null
}
}Rate limits
- 60 requests per minute per account on every /v1 endpoint. Exceeding it returns
429. - Message sends also count against your plan’s monthly message quota — the same pool your dashboard campaigns use.
- Sends through the same WhatsApp number are automatically spaced with anti-ban delays; bursts are queued, not dropped.
Error codes
Errors are JSON: { "error": "code", "message": "human explanation" }
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request / invalid_to | Malformed body — check that `to` has 8-15 digits and `message` is a non-empty string (max 4096 chars). |
| 401 | missing_api_key / invalid_api_key | No key, a malformed key, or a revoked key. Create a new key in the dashboard. |
| 402 | payment_locked | Your subscription payment failed. Update your payment method in Billing. |
| 403 | upgrade_required | The developer API requires the Business plan. |
| 404 | session_not_found | The session_id you passed does not belong to your account. |
| 409 | session_not_connected | No connected WhatsApp session. Reconnect in the dashboard and retry. |
| 422 | recipient_opted_out | This recipient replied STOP to you — BulkWA blocks the send for compliance. |
| 429 | quota_exceeded / rate limit | You hit your plan's message quota or the 60 requests/minute rate limit. Retry later. |
| 502 | send_failed | WhatsApp did not acknowledge the message. Safe to retry. |
| 503 | service_unavailable | Temporary backend issue (e.g. quota check failed). Retry with backoff. |
Start sending in five minutes
Upgrade to the Business plan, connect your WhatsApp number by QR code, create a key, and make your first API call.