A scoped HTTP API for WhatsApp Business — send OTPs, send templates, send free-form replies, query message history, and receive signed webhook events. Built for tenant backends, signup services, and support tooling.
Production-grade Meta Cloud API integration. We handle the WABA setup, token rotation, and signature verification — you call REST.
Each key is bound to one brand and one set of scopes. A signup key can only send OTPs, never read messages.
Versioned Quixess-shaped event envelopes, HMAC-signed, retried with exponential backoff. Replay any failed delivery.
Pass Idempotency-Key on any send. Same key within 24h returns the original response — safe to retry from your queue.
Three steps to your first WhatsApp send.
Open Settings → API Keys in the dashboard. Pick a brand to bind the key to, select the scopes you need (e.g. whatsapp:send_otp), and copy the qxs_… secret — it's shown only once.
Most sends require a Meta-approved template. Submit one at WhatsApp → Templates — the OTP authentication preset approves in ~1 hour. List your approved templates via GET /external/templates.
POST to /api/v1/whatsapp/external/send/otp with the recipient phone and code. The brand is resolved from your API key — never sent in the request body.
Sample request
curl -X POST 'https://api.quixess.com/api/v1/whatsapp/external/send/otp' \
-H 'X-API-Key: qxs_YOUR_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 7c4a8d09-ca37-4d1b-a5b3-9f8e2c1d4e6f' \
-d '{"to": "+12818184370", "code": "482913", "template_name": "signup_otp"}'When a customer messages your WhatsApp Business number, we forward a canonical event envelope to the webhook URL you configured at connection time. HMAC-signed, retried with exponential backoff (1s → 5s → 30s → 2m → 10m → 1h → 6h), and replayable via the dashboard.
Inbound message event
POST https://api.bordercart.com/webhooks/quixess
Content-Type: application/json
X-Quixess-Event-Id: evt_01HFXYZ...
X-Quixess-Event-Type: message.received
X-Quixess-Signature-256: sha256=...
{
"id": "evt_01HFXYZ...",
"type": "message.received",
"version": "1",
"occurred_at": "2026-05-15T10:30:00Z",
"delivered_at": "2026-05-15T10:30:00.234Z",
"brand_id": "...",
"data": {
"wa_message_id": "wamid.HBgL...",
"from": { "phone": "12818184370", "name": "Frank" },
"to": { "phone_number_id": "...", "waba_id": "..." },
"type": "text",
"content": { "body": "Hi there" },
"reply_to": null
}
}message.receivedInbound message from a customer — text, image, voice note, button tap, location, reaction.
message.deliveredOutbound delivery confirmation (sent → delivered).
message.readCustomer opened the message (blue tick).
message.failedSend failed. data.errors carries Meta's error code + reason.
template.status_changedMeta approved / rejected / paused a template you submitted.
call.receivedInbound WhatsApp call (when Business Calling API is approved on your WABA).
The full external WhatsApp surface — 12 endpoints, 7 scopes, cursor pagination, idempotency. Every endpoint authenticates with X-API-Key. Click an endpoint to expand its full request/response reference.
https://social-api.quixess.comPass the API key in the X-API-Key request header on every call.
X-API-Key: qxs_dZ4VJbDi...
Mint keys at /app/settings/api-keys in the dashboard. Each key is bound to one brand at creation — you can't override that brand from the request body.
whatsapp:send_otp— WhatsApp · Send OTPwhatsapp:send_template— WhatsApp · Send Templatewhatsapp:reply— WhatsApp · Reply (text / media / quote)whatsapp:read_templates— WhatsApp · Read Templateswhatsapp:read_messages— WhatsApp · Read Messageswhatsapp:read_conversations— WhatsApp · Read Conversationswhatsapp:manage_webhooks— WhatsApp · Manage Webhook Events| Status | Meaning | Fix |
|---|---|---|
| 401 | Missing or invalid X-API-Key header. | Verify you copied the full qxs_… secret and that the key has not been revoked. |
| 403 | The key is valid but does not have the required scope. | Recreate the key with the right scope checked, or extend it from this page. |
| 400 | Validation error or brand-not-bound. | For WhatsApp scopes, ensure the key has a brand binding. Otherwise check the response body for the missing field. |
| 404 | Resource not found — no active WhatsApp connection, or the template+language combo is not in the cache. | Reconnect the WABA or call POST /whatsapp/templates/sync to refresh the template cache after Meta approval. |
| 409 | Template exists but is not yet APPROVED. | Wait for Meta approval (~1h for AUTH, ~24h for UTILITY/MARKETING). Status updates land via the webhook. |
| 502 | Meta returned an error (wrapped in whatsapp_error.error). | Inspect the response body — common Meta errors include 131008 (button parameter missing) and 132000 (template not approved). |
Already signed up for Quixess Social? Mint a key in the dashboard and you're a single curl call away from your first WhatsApp send.