WAservix Django integration
Connect WAservix to your Django 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
Django 4+ and requests.
pip install requests
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.
# settings.py: read from the environment, never commit keys
import os
WASERVIX_KEY = os.environ['WASERVIX_KEY']
WASERVIX_WEBHOOK_SECRET = os.environ['WASERVIX_WEBHOOK_SECRET']
Set up the client
Base URL https://tekservix.com/waservix/api. Send the key as Authorization: Bearer wpk_….
# yourapp/waservix.py
import requests
from django.conf import settings
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.
def send_message():
r = requests.post(
'https://tekservix.com/waservix/api/send-message',
headers={'Authorization': 'Bearer ' + settings.WASERVIX_KEY},
json={
'to': '+250788123456',
'text': 'Hello Aline, your order is ready'
},
timeout=30,
)
r.raise_for_status()
return r.json()
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.
def send_document():
r = requests.post(
'https://tekservix.com/waservix/api/send-message',
headers={'Authorization': 'Bearer ' + settings.WASERVIX_KEY},
json={
'to': '+250788123456',
'text': 'Your invoice',
'documentUrl': 'https://example.com/inv-1042.pdf',
'fileName': 'Invoice-1042.pdf'
},
timeout=30,
)
r.raise_for_status()
return r.json()
Check message status
status is queued, sent, delivered, read, played or failed. Webhooks tell you without polling.
def message_status():
r = requests.get(
'https://tekservix.com/waservix/api/messages/58213/info',
headers={'Authorization': 'Bearer ' + settings.WASERVIX_KEY},
timeout=30,
)
r.raise_for_status()
return r.json()
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).
# yourapp/views.py
import hashlib, hmac, json
from django.conf import settings
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
@csrf_exempt # webhooks can't send a CSRF token; the signature check protects this view
@require_POST
def wapenda_webhook(request):
if not hmac.compare_digest(settings.WASERVIX_WEBHOOK_SECRET, request.headers.get('X-Webhook-Signature', '')):
return HttpResponse(status=401)
event = json.loads(request.body)
if event['event'] == 'messages.received':
m = event['data']['messages']
print(m['key'].get('cleanedSenderPn'), m.get('messageBody'))
return HttpResponse(status=200)
# urls.py
# path('webhooks/wapenda/', views.wapenda_webhook)
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.