L’API de WhatsApp, documentée.
REST pour envoyer et lire, webhooks signés pour recevoir et un serveur MCP prêt pour votre agent. Intégrez WhatsApp dans votre produit avec line_id et clés API.
De zéro à votre premier message en 3 étapes.
1. Connecte une ligne
Dans la console, scanne le QR avec le WhatsApp du numéro que tu souhaites utiliser. Tu obtiens un line_id.
2. Crée une clé API
Dans la console, générez une clé API. Commencez par wzb_live_ et elle s’affiche une seule fois.
3. Appelle l’API
Utilisez votre line_id et votre clé API pour envoyer le premier message (exemple ci-dessous).
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":"Bonjour depuis WAzion Bridge"}'
La console est l’endroit où vous gérez les lignes, les clés API et les webhooks. La documentation décrit la même API que vous pouvez tester là-bas.
Base de l’API et authentification.
| Base REST | https://www.wazion.com/api/bridge/v1 |
|---|---|
| Serveur MCP | https://www.wazion.com/api/bridge/mcp |
| En-tête | Authorization: Bearer wzb_live_... |
Toute demande est authentifiée avec une clé API dans l’en-tête Authorization (une autre méthode est également acceptée). X-Bridge-Key). Les clés API se créent dans la console et commencent par wzb_live_. Chaque réponse inclut un en-tête X-Request-Id outil pour le support et le débogage. L’API prend en charge CORS (Access-Control-Allow-Origin: *).
Authorization: Bearer wzb_live_xxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
Comment est organisé Bridge.
line_id
Identifiez une ligne WhatsApp connectée par QR. Toute demande d’envoi ou de lecture utilise un line_id.
API key
Identifiant wzb_live_ qui authentifie votre application. Vous pouvez en créer, faire tourner et révoquer plusieurs dans la console.
Webhook
Vous recevez des événements entrants (messages, états) signés avec HMAC à l’URL que vous configurez.
Vous travaillez toujours avec line_id et des clés API. Bridge cache la session interne de WhatsApp : vous n’exposez jamais ni n’utilisez la session_key.
Points de terminaison REST.
| Action | Endpoint |
|---|---|
| Compte, plan et limites | GET /v1/me |
| Consommation de la période | GET /v1/usage |
| Lister les lignes | GET /v1/lines |
| Détail d’une ligne | GET /v1/lines/{line_id} |
| Envoyer du texte | POST /v1/messages/send |
| Envoyer un média | POST /v1/messages/send-media |
| Répondre en citant | POST /v1/messages/reply |
| Réagir avec un emoji | POST /v1/messages/react |
| Marquer comme lu | POST /v1/messages/read |
| Archiver le chat | POST /v1/chats/archive |
| Lister les chats | GET /v1/chats |
| Lire des messages | GET /v1/messages |
| Lister / créer des webhooks | GET /v1/webhooks · POST /v1/webhooks |
| Tester un webhook | POST /v1/webhooks/{id}/test |
POST /v1/messages/send
| Paramètre | Type | Description | |
|---|---|---|---|
line_id | string | obligatoire | Ligne connectée depuis laquelle on envoie. |
to | string | obligatoire | Numéro de destination au format international, par ex. +34600000000. |
message | string | obligatoire | Texte du message. |
archive_policy | enum | optionnel | never · always · preserve_if_previously_archived |
Les envois (send, send-media, reply) acceptent l’en-tête Idempotency-Key. Les lectures GET /v1/chats et GET /v1/messages limitent le résultat à 500 et 200 respectivement.
Envoyer un message dans ta langue.
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);
Envoyer une image, une vidéo, un audio ou un document.
Utilisez media_type avec l’une de ces valeurs : image, video, audio, document. Le champ media_url doit être une URL publique que le serveur peut télécharger.
| Paramètre | Type | Description | |
|---|---|---|---|
line_id | string | obligatoire | Ligne d’expédition. |
to | string | obligatoire | Téléphone de destination. |
media_url | string (URL) | obligatoire | URL publique du fichier. |
media_type | enum | optionnel | image · video · audio · document (par défaut image) |
caption | string | optionnel | Texte joint au fichier. |
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":"Bonjour"}'
Idempotence.
Pour ne pas envoyer le même message deux fois (réessais de réseau, redémarrages), envoie l’en-tête. Idempotency-Key avec un identifiant unique de votre opération. Si vous répétez la même clé avec le même corps, Bridge renvoie la réponse enregistrée sans renvoyer. La clé est mémorisée pendant 24 heures et s’applique à send, send-media et reply.
-H "Idempotency-Key: pedido-1001"
Si vous réutilisez la même clé avec un corps différent, vous recevez 409 idempotency_conflict.
Recevoir des événements signés.
Créez un webhook avec une URL HTTPS publique. Bridge enverra un POST à cette URL à chaque événement. Chaque webhook a son propre secret. (wzb_whsec_...) qui s’affiche une seule fois lors de sa création.
Événements auxquels vous pouvez vous abonner (ils sont livrés tels que produits par le moteur de WhatsApp) : message.received, message.sent, message.status, line.status.
Chaque livraison comprend ces en-têtes :
X-WAzion-Bridge-Event: message.received
X-WAzion-Bridge-Signature: sha256=<hmac>
Content-Type: application/json
{
"event": "message.received",
"line_id": "line_xxx",
"data": { ... }
}
Vérifier la signature
La signature est un HMAC-SHA256 du corps brut utilisant le secret du webhook. Compare toujours avant de traiter :
// 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; }
Vous pouvez lancer un événement de test à votre webhook depuis la console ou avec POST /v1/webhooks/{id}/test.
Gestion des erreurs.
Les erreurs d’authentification, de compte et de serveur utilisent une enveloppe normalisée :
{
"ok": false,
"error": { "code": "unauthorized", "message": "...", "retryable": false }
}
Les erreurs de validation et de métier utilisent une forme plate avec le code en erreur :
{ "error": "quota_exceeded", "message": "Monthly quota exceeded", "metric": "sent_messages", "used": 10000, "limit": 10000, "plan": "pro" }
| Code | HTTP | Signification |
|---|---|---|
unauthorized | 401 | Clé API absente, invalide ou révoquée. |
subscription_required | 402 | L’abonnement Bridge n’est pas actif. |
validation_error | 400 | Il manque des champs ou ils sont invalides. |
line_not_found | 404 | Le line_id n’existe pas dans votre compte. |
line_not_connected | 409 | La ligne n’est pas connectée à WhatsApp. |
idempotency_conflict | 409 | Même Idempotency-Key avec un corps différent. |
quota_exceeded | 429 | Vous avez dépassé le quota de la période. |
line_limit_reached | 429 | Vous avez atteint le maximum de lignes du plan. |
server_error | 500 | Erreur interne ; vous pouvez réessayer. |
Cotisations par plan.
- Les quotas (messages envoyés, événements de webhook, nombre de lignes) sont par compte et sont comptées dans votre cycle de facturation.
- En dépassant un quota, vous recevez 429 (quota_exceeded ou line_limit_reached) avec les détails de used, limit et plan.
- GET /v1/chats renvoie au maximum 500 chats et GET /v1/messages au maximum 200 messages par requête.
- Pour la stabilité de WhatsApp, les envois d’une même ligne sont espacés de quelques secondes ; ils répartissent les envois massifs dans le temps.
Consulte votre consommation à tout moment avec GET /v1/usage. Les limites concrètes de chaque plan sont dans la page des plans.
Serveur MCP pour votre agent.
Bridge expose un serveur MCP (Model Context Protocol) pour que votre agent envoie et lise WhatsApp sans écrire de code REST. Ajoutez-le avec :
claude mcp add --transport http wazion-bridge \ https://www.wazion.com/api/bridge/mcp \ --header "Authorization: Bearer wzb_live_xxx"
| Tool | Paramètres |
|---|---|
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? |
Prêt à intégrer.
Connecte une ligne, créez votre clé API et testez chaque point de terminaison depuis la console.