Developers
WhatsApp and OTP in a few lines of code
One API key, plain JSON, signed webhooks. Send messages and verification codes from your CRM, shop or app.
send a WhatsApp message
curl -X POST https://signalxas.com/api/v1/whatsapp/messages \
-H "Authorization: Bearer sx_live_β¦" \
-H "Content-Type: application/json" \
-d '{"to":"447700900123","text":"Your order has shipped π¦"}'
β 202 {"id":123,"status":"QUEUED","to":"447700900123"}Simple auth
Create keys in your portal; send them as a Bearer token. Only a hash is stored.
Text, media, templates
Images and documents by URL; approved templates on official API numbers.
OTP built in
Send and verify codes: hashed, 5-minute expiry, 5 tries, rate-limited.
Signed webhooks
Incoming messages and delivery receipts, signed with HMAC-SHA256.
Messages
message types
# image
{"to":"β¦","image":{"url":"https://β¦/photo.jpg","caption":"New stock"}}
# document
{"to":"β¦","document":{"url":"https://β¦/invoice.pdf","filename":"invoice.pdf"}}
# template (official Cloud API numbers)
{"to":"β¦","template":{"name":"order_ready","language":"en_US","params":["Ann"]}}
# send from a given number
{"to":"β¦","text":"β¦","number":"<number id>"}status
GET /api/v1/whatsapp/messages/123
β {"id":123,"status":"DELIVERED"} QUEUED β SENT β DELIVERED β READ | FAILED
GET /api/v1/whatsapp/numbers
β {"numbers":[{"id":"β¦","kind":"qr","phone":"β¦","status":"CONNECTED"}]}OTP & webhooks
one-time codes
POST /api/v1/otp/send {"to":"447700900123","brand":"Acme","length":6}
β 202 {"id":"β¦","expiresIn":300}
POST /api/v1/otp/verify {"to":"447700900123","code":"482913"}
β {"valid":true}webhook we POST to you
X-SignalXas-Event: message
X-SignalXas-Signature: sha256=<HMAC-SHA256(secret, body)>
{"event":"message","number":{"id":"β¦","phone":"β¦"},
"message":{"id":124,"from":"447700900123","name":"Ann",
"type":"text","body":"Hi!","at":"β¦"}}Errors are plain
400 bad input Β· 401 wrong key Β· 402 balance too low Β· 409 number not linked Β· 429 limit reached β always with a readable βerrorβ message.
