WAservix Node.js integration
Connect WAservix to your Node.js app: send WhatsApp messages from your own WhatsApp number, check delivery and receive replies by webhook. Copy the examples, add your key and run.
Requirements
Node.js 18 or newer (built-in fetch). The webhook example uses Express.
npm install express
Add your API key
Create a key under WAservix → Devices → API key (it starts with wpk_). Keep it on your server, in an environment variable or secret store. Never put it in a website, a mobile app or a public repository.
# .env (load it with node --env-file=.env app.js, Node 20.6+)
WASERVIX_KEY=wpk_your_key
WASERVIX_WEBHOOK_SECRET=your_webhook_secret
Set up the client
Base URL https://tekservix.com/waservix/api. Send the key as Authorization: Bearer wpk_….
// app.mjs
Send a WhatsApp message
Messages are queued and sent one at a time per number, so the answer comes back at once with "status": "in_progress" and a msgId.
const res = await fetch('https://tekservix.com/waservix/api/send-message', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.WASERVIX_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
to: '+250788123456',
text: 'Hello Aline, your order is ready'
}),
});
const json = await res.json();
if (!res.ok) throw new Error(json.message || res.statusText);
console.log(json.data);
Send a document or image
Use imageUrl, videoUrl, audioUrl or documentUrl with a public https link. Groups work too: put the group JID (…@g.us) in to.
const res = await fetch('https://tekservix.com/waservix/api/send-message', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.WASERVIX_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
to: '+250788123456',
text: 'Your invoice',
documentUrl: 'https://example.com/inv-1042.pdf',
fileName: 'Invoice-1042.pdf'
}),
});
const json = await res.json();
if (!res.ok) throw new Error(json.message || res.statusText);
console.log(json.data);
Check message status
status is queued, sent, delivered, read, played or failed. Webhooks tell you without polling.
const res = await fetch('https://tekservix.com/waservix/api/messages/58213/info', {
method: 'GET',
headers: { 'Authorization': `Bearer ${process.env.WASERVIX_KEY}` },
});
const json = await res.json();
if (!res.ok) throw new Error(json.message || res.statusText);
console.log(json.data);
Receive WhatsApp messages by webhook
Set a webhook URL and events for the number under WAservix → Devices. Each request carries X-Webhook-Signature, which equals that device’s webhook secret. Compare it in constant time, answer 2xx quickly and process the message after answering (we retry 3 times).
// npm install express
import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post('/webhooks/wapenda', express.json(), (req, res) => {
const got = Buffer.from(req.get('X-Webhook-Signature') || '');
const secret = Buffer.from(process.env.WASERVIX_WEBHOOK_SECRET);
if (got.length !== secret.length || !crypto.timingSafeEqual(got, secret)) return res.sendStatus(401);
res.sendStatus(200); // answer fast, then do the work
const event = req.body;
if (event.event === 'messages.received') console.log(event.data.messages.key.cleanedSenderPn, event.data.messages.messageBody);
});
app.listen(3000);
Errors, limits and retries
Every answer has success; errors add a readable message. 401 means a wrong key, 402 no active plan for this number or phone, 409 the number or phone isn’t connected, 429 too many requests (300 a minute per key): wait for the Retry-After seconds and try again. Retry 5xx and network errors with a back-off, but don’t blindly retry a send that may have worked: check its status first, or you could send twice.
Full list of endpoints and fields: WAservix API reference.
Questions
Is this the official WhatsApp Business API?
No. WAservix links your own number as a companion device, like WhatsApp Web, so there is no Meta approval. Only message people who expect to hear from you: WhatsApp can ban numbers that spam.
Can I call the API from a mobile app or browser?
Don’t. Anyone could read the key from the app or page. Call the API from your server and let your app talk to your server.