Die dokumentierte WhatsApp-API.
REST zum Senden und Lesen, signierte Webhooks zum Empfangen und ein MCP-Server bereit für deinen Agenten. Integriere WhatsApp in dein Produkt mit line_id und API-Schlüsseln.
Von null zu deiner ersten Nachricht in 3 Schritten.
1. Verbinde eine Linie
Scanne den QR-Code in der Konsole mit dem WhatsApp der Nummer, die du verwenden möchtest. Du erhältst eine line_id.
2. Erstelle einen API-Schlüssel
Generiere in der Konsole einen API-Schlüssel. Beginne mit wzb_live_ und er wird nur einmal angezeigt.
3. Rufe die API auf
Verwende deine line_id und deinen API-Schlüssel, um die erste Nachricht zu senden (Beispiel unten).
curl -X POST https://www.wazion.com/api/bridge/v1/messages/send \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"line_id":"TU_LINE_ID","to":"+34600000000","message":"Hallo von WAzion Bridge"}'
Die Konsole ist der Ort, an dem du Linien, API-Schlüssel und Webhooks verwaltest. Die Dokumentation beschreibt dieselbe API, die du dort testen kannst.
API-Basis und Authentifizierung.
| REST-Basis | https://www.wazion.com/api/bridge/v1 |
|---|---|
| MCP-Server | https://www.wazion.com/api/bridge/mcp |
| Kopfzeile | Authorization: Bearer wzb_live_... |
Jede Anfrage wird mit einem API-Schlüssel im Authorization-Header authentifiziert (es wird auch akzeptiert X-Bridge-Key). Die API-Schlüssel werden in der Konsole erstellt und beginnen mit wzb_live_. Jede Antwort enthält eine Überschrift X-Request-Id nützlich für Unterstützung und Debugging. Die API unterstützt CORS (Access-Control-Allow-Origin: *).
Authorization: Bearer wzb_live_xxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
Wie Bridge organisiert ist.
line_id
Identifiziere eine WhatsApp-Linie, die über QR verbunden ist. Jede Anfrage zum Senden oder Lesen verwendet eine line_id.
API key
Zugangsdaten wzb_live_, die Ihre Anwendung authentifizieren. Sie können mehrere in der Konsole erstellen, rotieren und widerrufen.
Webhook
Du erhältst eingehende Ereignisse (Nachrichten, Status) signiert mit HMAC in der von dir konfigurierten URL.
Du arbeitest immer mit line_id und API-Keys. Bridge verbirgt die interne WhatsApp-Sitzung: du exponierst oder verwendest niemals die session_key.
REST-Endpunkte.
| Aktion | Endpoint |
|---|---|
| Zahl, Plan und Grenzen | GET /v1/me |
| Verbrauch des Zeitraums | GET /v1/usage |
| Linien auflisten | GET /v1/lines |
| Detail einer Linie | GET /v1/lines/{line_id} |
| Texto senden | POST /v1/messages/send |
| Senden Sie Medien | POST /v1/messages/send-media |
| Antworten mit Zitieren | POST /v1/messages/reply |
| Mit Emoji reagieren | POST /v1/messages/react |
| Als gelesen markieren | POST /v1/messages/read |
| Chat archivieren | POST /v1/chats/archive |
| Chats auflisten | GET /v1/chats |
| Nachrichten lesen | GET /v1/messages |
| Webhooks auflisten / erstellen | GET /v1/webhooks · POST /v1/webhooks |
| Einen Webhook testen | POST /v1/webhooks/{id}/test |
POST /v1/messages/send
| Parameter | Artículo | Beschreibung | |
|---|---|---|---|
line_id | string | verpflichtend | Verbindungslinie, von der gesendet wird. |
to | string | verpflichtend | Zieltelefon im internationalen Format, z. B. +34600000000. |
message | string | verpflichtend | Text der Nachricht. |
archive_policy | enum | optional | never · always · preserve_if_previously_archived |
Die Sendungen (send, send-media, reply) akzeptieren den Header Idempotency-Key. Die GET-Anfragen /v1/chats und /v1/messages begrenzen das Ergebnis auf 500 bzw. 200.
Sende eine Nachricht in deiner Sprache.
curl -X POST https://www.wazion.com/api/bridge/v1/messages/send \
-H "Authorization: Bearer wzb_live_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1001" \
-d '{"line_id":"line_xxx","to":"+34600000000","message":"Pedido confirmado"}'
// Node 18+ (fetch nativo)
const res = await fetch("https://www.wazion.com/api/bridge/v1/messages/send", {
method: "POST",
headers: {
"Authorization": "Bearer wzb_live_xxx",
"Content-Type": "application/json",
"Idempotency-Key": "order-1001"
},
body: JSON.stringify({
line_id: "line_xxx",
to: "+34600000000",
message: "Pedido confirmado"
})
});
console.log(await res.json());
import requests
r = requests.post(
"https://www.wazion.com/api/bridge/v1/messages/send",
headers={
"Authorization": "Bearer wzb_live_xxx",
"Idempotency-Key": "order-1001",
},
json={
"line_id": "line_xxx",
"to": "+34600000000",
"message": "Pedido confirmado",
},
)
print(r.json())
<?php
$ch = curl_init("https://www.wazion.com/api/bridge/v1/messages/send");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer wzb_live_xxx",
"Content-Type: application/json",
"Idempotency-Key: order-1001",
],
CURLOPT_POSTFIELDS => json_encode([
"line_id" => "line_xxx",
"to" => "+34600000000",
"message" => "Pedido confirmado",
]),
]);
echo curl_exec($ch);
Bild, Video, Audio oder Dokument senden.
Verwende media_type mit einem dieser Werte: image, video, audio, document. Das Feld media_url muss eine öffentliche URL sein, die der Server herunterladen kann.
| Parameter | Artículo | Beschreibung | |
|---|---|---|---|
line_id | string | verpflichtend | Versandlinie. |
to | string | verpflichtend | Zieltelefon. |
media_url | string (URL) | verpflichtend | Öffentliche URL der Datei. |
media_type | enum | optional | image · video · audio · document (standardbild) |
caption | string | optional | Texto im Anhang der Datei. |
curl -X POST https://www.wazion.com/api/bridge/v1/messages/send-media \
-H "Authorization: Bearer wzb_live_xxx" \
-H "Content-Type: application/json" \
-d '{"line_id":"line_xxx","to":"+34600000000","media_url":"https://tu-cdn.com/foto.jpg","media_type":"image","caption":"Hallo"}'
Idempotenz.
Um die gleiche Nachricht nicht zweimal zu senden (Netzwerkwiederholungen, Neustarts), senden Sie die Kopfzeile. Idempotency-Key mit einer eindeutigen Kennung deiner Operation. Wenn du denselben Schlüssel mit demselben Inhalt wiederholst, gibt Bridge die gespeicherte Antwort zurück, ohne sie erneut zu senden. Der Schlüssel wird 24 Stunden lang gespeichert und gilt für send, send-media und reply.
-H "Idempotency-Key: pedido-1001"
Wenn du denselben Schlüssel mit einem anderen Körper wiederverwendest, erhältst du 409 idempotency_conflict.
Ereignisse empfangen, die signiert sind.
Erstelle einen Webhook mit einer öffentlichen HTTPS-URL. Bridge wird bei jedem Ereignis ein POST an diese URL senden. Jeder Webhook hat sein eigenes Geheimnis. (wzb_whsec_...) das nur einmal beim Erstellen angezeigt wird.
Ereignisse, die Sie abonnieren können (werden so geliefert, wie sie vom WhatsApp-Motor erzeugt werden): message.received, message.sent, message.status, line.status.
Jede Lieferung enthält diese Kopfzeilen:
X-WAzion-Bridge-Event: message.received
X-WAzion-Bridge-Signature: sha256=<hmac>
Content-Type: application/json
{
"event": "message.received",
"line_id": "line_xxx",
"data": { ... }
}
Unterschrift überprüfen
Die Signatur ist ein HMAC-SHA256 des Rohkörpers unter Verwendung des Webhook-Geheimnisses. Vergleiche immer, bevor du verarbeitest:
// Node.js
import crypto from "node:crypto";
function verify(rawBody, signatureHeader, secret) {
const expected = "sha256=" + crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected)
);
}
<?php
// PHP
$raw = file_get_contents("php://input");
$sig = $_SERVER["HTTP_X_WAZION_BRIDGE_SIGNATURE"] ?? "";
$expected = "sha256=" . hash_hmac("sha256", $raw, $secret);
if (!hash_equals($expected, $sig)) { http_response_code(401); exit; }
Du kannst ein Testereignis an deinen Webhook von der Konsole aus oder mit POST /v1/webhooks/{id}/test senden.
Fehlerbehandlung.
Die Fehler bei der Authentifizierung, dem Konto und dem Server verwenden einen standardisierten Umschlag:
{
"ok": false,
"error": { "code": "unauthorized", "message": "...", "retryable": false }
}
Die Validierungs- und Geschäftsfehler verwenden eine flache Form mit dem fehlerhaften Code:
{ "error": "quota_exceeded", "message": "Monthly quota exceeded", "metric": "sent_messages", "used": 10000, "limit": 10000, "plan": "pro" }
| Code | HTTP | Bedeutung |
|---|---|---|
unauthorized | 401 | API-Schlüssel fehlt, ungültig oder widerrufen. |
subscription_required | 402 | Die Bridge-Mitgliedschaft ist nicht aktiv. |
validation_error | 400 | Es fehlen Felder oder sie sind ungültig. |
line_not_found | 404 | Die line_id existiert nicht in deinem Konto. |
line_not_connected | 409 | Die Nummer ist nicht mit WhatsApp verbunden. |
idempotency_conflict | 409 | Gleicher Idempotency-Key mit unterschiedlichem Körper. |
quota_exceeded | 429 | Du hast das Kontingent des Zeitraums überschritten. |
line_limit_reached | 429 | Du hast die maximale Anzahl an Zeilen des Plans erreicht. |
server_error | 500 | Interner Fehler; Sie können es erneut versuchen. |
Beiträge pro Plan.
- Die Kontingente (gesendete Nachrichten, Webhook-Ereignisse, Anzahl der Zeilen) gelten pro Konto und werden innerhalb deines Abrechnungszyklus gezählt.
- Wenn du ein Kontingent überschreitest, erhältst du 429 (quota_exceeded oder line_limit_reached) mit den Details used, limit und plan.
- GET /v1/chats gibt maximal 500 Chats zurück und GET /v1/messages maximal 200 Nachrichten pro Anfrage.
- Für die Stabilität von WhatsApp werden die Sendungen einer gleichen Linie um einige Sekunden gestaffelt; die massenhaften Sendungen werden über die Zeit verteilt.
Überprüfen Sie Ihren Verbrauch jederzeit mit GET /v1/usage. Die konkreten Grenzen jedes Plans liegen in die Seite der Pläne.
MCP-Server für deinen Agenten.
Bridge bietet einen MCP-Server (Model Context Protocol), damit dein Agent WhatsApp senden und lesen kann, ohne REST-Code zu schreiben. Ergänze es mit:
claude mcp add --transport http wazion-bridge \ https://www.wazion.com/api/bridge/mcp \ --header "Authorization: Bearer wzb_live_xxx"
| Tool | Parameter |
|---|---|
bridge_list_lines | — |
bridge_send_message | line_id, to, message, archive_policy? |
bridge_send_media | line_id, to, media_url, media_type?, caption? |
bridge_reply_message | line_id, to, message, quoted_message_id |
bridge_react_message | line_id, jid, message_id, emoji |
bridge_get_chats | line_id, limit?, archived? |
bridge_get_messages | line_id, phone, limit? |
bridge_archive_chat | line_id, phone, archive? |
Bereit zur Integration.
Verbinde eine Linie, erstelle deinen API-Schlüssel und teste jeden Endpunkt von der Konsole aus.