Send WhatsApp messages from your own server with one endpoint and one key. Avox holds Meta's credentials, you write the code you already know.
/api/messages/send
Send any WhatsApp message from your own server. Authenticate with your number's API key - Avox handles the rest with Meta.
1curl -X POST https://api.theavoxai.com/api/messages/send \2 -H "Authorization: Bearer $AVOX_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "to": "15551234567",6 "type": "text",7 "text": { "body": "Your order #1042 has shipped!" }8 }'// Waiting for a request
If it can make an HTTPS request, it can send WhatsApp messages
- Node.js
- TypeScript
- Python
- PHP
- Laravel
- Go
- Ruby
- cURL
- Postman
- n8n
- Make
- Zapier
- Shopify
How it works
One request, four hops, zero Meta tokens in your code
Your server talks to Avox. Avox talks to WhatsApp. Here's exactly what happens in between, every time you call the API.
Your server
Calls Avox with your key, read from an environment variable.
Avox API
Verifies the key, applies its rate limit, checks the payload, logs the call.
WhatsApp Cloud API
Avox calls WhatsApp with your number's own Meta token - it never leaves Avox.
Your customer
Delivered on WhatsApp, from the number they already know.
Your server sends one POST request, with its key in the Authorization header.
Keys shown once
You see the full key exactly once. After that, Avox keeps only a hash of it.
Meta's token stays with Avox
Stored encrypted and only ever used server-side - your code never handles it.
Rate-limited per key
Every key has its own limit, so one runaway script can't drown out the rest - and a rotated key keeps the limits of the key it replaced.
Every call audited
Status, time and IP for every request, in that key's own log.
Quickstart
From zero to first message in three steps
No SDK to install, no Meta app to configure. If your number's already connected to Avox, you're one key away.
Create a key
From any connected number's page in your dashboard. Each key belongs to that one number.
Support line
+91 98•••• ••142
Keep it on your server
Store it as an environment variable or in your secrets manager - never in a browser bundle or mobile app.
1# .env - read by your server only2# (demo key shown - paste your own)3AVOX_API_KEY=avx_live_demo_4b9e1c7a2f08d356Send, then watch it land
Every call shows up in that key's audit trail. Test it any time with a safe dry run that sends nothing.
avx_live_demo · recent requests
Test · dry run- 429messages/send · text198.51.100.7now
- 200messages/send · template203.0.113.242s
- 200messages/send · text203.0.113.244s
Key lifecycle
One key per number, from first call to last
Every key belongs to one connected number. Creating, rotating and revoking one each need a code we email you, so only your team can change keys.
01
Create
From a connected number's page, with a name and description. A code we email you confirms it.
02
Copy it once
The full key is shown exactly once. After that, Avox keeps only a hash of it.
03
Send and test
Call the endpoint from your server. A test key runs every check and sends nothing.
04
Rotate
Swap in a fresh key with an emailed code. The new key keeps the old one's limits.
05
Revoke
Switch a key off for good, also confirmed by an emailed code. Calls with it get a 401.
Anatomy of a request
Everything you send, explained line by line
There's very little to learn. Hover any part on the right to see where it lives in the request.
1POST /api/messages/send HTTP/1.12Host: api.theavoxai.com3Authorization: Bearer avx_live_demo_4b9e••••d3564Content-Type: application/json5 6{7 "to": "15551234567",8 "type": "text",9 "text": { "body": "Your order #1042 has shipped!" }10}Message types
Same endpoint. Any message WhatsApp supports.
Change type and its matching object - that's the whole difference between a text, a template, an image and buttons.
1{2 "to": "15551234567",3 "type": "text",4 "text": {5 "body": "Your order #1042 has shipped!"6 }7}Acme Store
Business account
Your order #1042 has shipped!
9:41Responses
Every response, and exactly what to do with it
Errors always come back in the same shape: a code, a plain-English message, a link to that code's docs and a request ID - no guessing what went wrong.
200 Sent
1{2 "ok": true,3 "request_id": "req_...",4 "message_id": "wamid.HBgLMTU1NTEyMzQ1NjcVAgARGBI5",5 "result": {6 "messaging_product": "whatsapp",7 "contacts": [8 {9 "input": "15551234567",10 "wa_id": "15551234567"11 }12 ],13 "messages": [14 {15 "id": "wamid.HBgLMTU1NTEyMzQ1NjcVAgARGBI5"16 }17 ]18 }19}What it means
WhatsApp accepted the message. result is Meta's own response to the send.
What to do
Keep message_id - it's how delivery and read updates for this message are matched later.
Message forwarding
New customer messages, sent on to your server
Optional. Turn it on while connecting a number or later on the connection's page, and each new incoming customer message is also sent, signed, to your own HTTPS endpoint.
Customer
Avox
Your server
Signed
Every delivery carries a signature, so your server can check it came from Avox before trusting it.
Retried
Your endpoint should answer with a 2xx within 10 seconds. Failed deliveries are retried, and an Admin can resend from the delivery log.
Paused when it keeps failing
If five deliveries in a row run out of retries, forwarding pauses. Fix the endpoint, send a test event, and turn it back on.
Build with the Avox API
Reference, step-by-step guides for popular stacks, and every error code.
Developer questions?
The essentials are below. Building something bigger or need a hand with your integration? A real person replies.
People
A person reads every message
Tickets
Track replies in your dashboard
Email us or open a ticket
Bring your team onto Avox today
No switch, no lost history just faster replies from day one.