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.

Avox API reference
POST

/api/messages/send

Send any WhatsApp message from your own server. Authenticate with your number's API key - Avox handles the rest with Meta.

Response

// 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.

Bearer avx_live_…

Your server

Calls Avox with your key, read from an environment variable.

api.theavoxai.com

Avox API

Verifies the key, applies its rate limit, checks the payload, logs the call.

Meta

WhatsApp Cloud API

Avox calls WhatsApp with your number's own Meta token - it never leaves Avox.

✓✓ Delivered

Your customer

Delivered on WhatsApp, from the number they already know.

1/5

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.

1

Create a key

From any connected number's page in your dashboard. Each key belongs to that one number.

Support line

+91 98•••• ••142

Create API key
2

Keep it on your server

Store it as an environment variable or in your secrets manager - never in a browser bundle or mobile app.

.env
1# .env - read by your server only2# (demo key shown - paste your own)3AVOX_API_KEY=avx_live_demo_4b9e1c7a2f08d356
3

Send, 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 · textnow
  • 200messages/send · template2s
  • 200messages/send · text4s

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.

HTTP 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.

POST /api/messages/send · type: "text"
1{2  "to": "15551234567",3  "type": "text",4  "text": {5    "body": "Your order #1042 has shipped!"6  }7}
A

Acme Store

Business account

Your order #1042 has shipped!

9:41
Message

Responses

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

Response body
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.

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.

Product updates, occasionally. Unsubscribe any time. Privacy