Provision a bridge, pair a phone number, and start sending messages over REST. No SDKs, no vendor approval, no infrastructure to manage.
WABridges is a hosted relay between your application and the WhatsApp network. Your app makes REST calls to your bridge; inbound events fire back to your webhook URL in real time.
POST to /api/instances with a customer_ref you control (any string: user ID, order number, etc.) and your webhook URL. The response includes a bridge ID and a per-bridge API secret used to authenticate all proxy calls.
{
"customer_ref": "user-123",
"webhook_url": "https://your-app.com/whatsapp/hook"
}
← {
"id": "br_a1b2c3",
"api_secret": "sk_live_...",
"status": "unpaired"
}
Scan the QR in the dashboard, or call /proxy/pair to request a link code programmatically. Open WhatsApp → Linked Devices → Link a device → Link with phone number and enter the 8-character code. Session persists across restarts.
{ "phone": "15550001234" }
← { "code": "ABCD-EFGH" }
Once paired, GET /proxy/status returns "status":"connected" along with the linked phone number and display name.
POST to /proxy/send/text with the destination number (no +, digits only) and message body. Authenticate with Authorization: Bearer {api_secret}. The response returns a message ID and Unix timestamp.
{ "chat": "15559876543", "body": "Hello from my app!" }
← { "message_id": "ACE41E...", "timestamp": 1777180605 }
The same proxy accepts media, polls, reactions, locations, and more. See the API reference for all endpoints.
Every inbound message, delivery receipt, call, or status change fires a POST to your webhook URL automatically. No polling. Respond with 200 OK to acknowledge.
{
"type": "message",
"from": "15559876543",
"body": "Hey, got your message!",
"timestamp": 1777180621,
"message_id": "BD71F2...",
"customer_ref": "user-123"
}
Send your first message using any HTTP client. Replace INSTANCE_ID and API_SECRET with the values returned from step 1.
curl -X POST \ https://wabridges.com/api/instances/$INSTANCE_ID/proxy/send/text \ -H "Authorization: Bearer $API_SECRET" \ -H "Content-Type: application/json" \ -d '{"chat":"15559876543","body":"Hello!"}'
const res = await fetch( `https://wabridges.com/api/instances/${INSTANCE_ID}/proxy/send/text`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_SECRET}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ chat: '15559876543', body: 'Hello!', }), } ); const { message_id, timestamp } = await res.json();
import requests res = requests.post( f"https://wabridges.com/api/instances/{INSTANCE_ID}/proxy/send/text", headers={"Authorization": f"Bearer {API_SECRET}"}, json={"chat": "15559876543", "body": "Hello!"}, ) data = res.json() # {"message_id": "ACE41E...", "timestamp": 1777180605}
First bridge is free for 7 days, no credit card required. Read the full API reference for every endpoint, webhook format, and error code.