WhatsApp est en cours de mise à niveau

L'API WhatsApp Business, sans les tracas des BSP.

Official Meta Business Solution Provider since the API existed. Template approval, session windows, media, interactive messages, all handled. Two billion-plus monthly WhatsApp users, addressable from a single endpoint that looks like every other Bird channel.

order-shipped.ts
200 · 480ms
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.whatsapp.send({
  to:       "+15005550009",
  template: "order_shipped",
  locale:   "en_US",
  variables: {
    customer_name:   "Ada",
    order_id:        "BRD-49217",
    tracking_url:    "https://track.bird.dev/49217",
    eta:             "Thursday, May 21",
  },
}).safe();

if (error) throw error;
console.log(data.id);
// → "wa_msg_8nB91Yk3p..."

5 minutes entre npm install et le premier envoi

Envoyez un WhatsApp dans le langage que vous utilisez déjà.

SDK disponibles dans tous les principaux environnements d'exécution. Le premier envoi est adressé à un destinataire de test autorisé (+15005550009) avec un modèle pré-approuvé, pour que vous puissiez intégrer une vérification CI avant même de soumettre votre premier modèle à approbation.

1
2
3
4
5
6
7
8
9
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.whatsapp.send({
  to:       "+15005550009",
  template: "hello_world",
  locale:   "en_US",
}).safe();

Dix choses que les BSP vous cachent. Pas nous.

WhatsApp est contrôlé par Meta. Le choix du BSP détermine si les contraintes apparaissent dans votre code ou sont dissimulées dans un tableau de bord. Nous avons choisi le code.

  1. 01

    Fournisseur officiel de solutions Meta Business (BSP)

    Relation directe avec Meta depuis la création de l'API. Aucun transit revendu, aucun intermédiaire tiers.

  2. 02

    Gestion des modèles

    Soumettez, suivez l'état d'approbation et recevez un webhook dès que Meta approuve ou rejette.

  3. 03

    Gestion de la fenêtre de session

    Le SDK vous indique si un message libre ou un modèle est autorisé avant l'envoi.

  4. 04

    Messages interactifs

    Buttons, lists, product cards, and WhatsApp Flows, declared in the same payload.

  5. 05

    Médias et contenu enrichi

    Images, vidéos, documents, localisation, contacts, aperçus de liens, réactions et réponses.

  6. 06

    WhatsApp Flows

    Formulaires multi-étapes intégrés à l'application avec validation backend, définis en JSON, exécutés par Meta.

  7. 07

    Publicités Click-to-WhatsApp

    Intégration avec Meta Ads Manager pour que les clics publicitaires ouvrent une conversation à laquelle vous pouvez répondre.

  8. 08

    Basculement cross-canal

    Add fallback: "sms" to any send. Session expiry routes through SMS automatically.

  9. 09

    Webhooks de messages entrants

    Événements signés HMAC pour les messages entrants, les accusés de lecture, les réactions et l'état des modèles.

  10. 10

    2 Md+ d'utilisateurs sur un seul endpoint

    Plus de deux milliards d'utilisateurs WhatsApp par mois accessibles via un seul appel bird.whatsapp.send.

Pourquoi nous développons WhatsApp

Nous avons été l'un des premiers BSP WhatsApp. Nous sommes toujours l'un des rares à coder avec vous.

WhatsApp is gated. You need an approved template; you need an opted-in session window; you need a Meta business verification. That part doesn't change, and won't. What changes is whether your BSP makes those gates easier or harder to walk through: by exposing them in your code, on webhooks you can subscribe to, in errors that say exactly what's wrong. We chose the first.

order-shipped.ts
200 · 480ms
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.whatsapp.send({
  to:       "+15005550009",
  template: "order_shipped",
  locale:   "en_US",
  variables: {
    customer_name:   "Ada",
    order_id:        "BRD-49217",
    tracking_url:    "https://track.bird.dev/49217",
    eta:             "Thursday, May 21",
  },
}).safe();

if (error) throw error;
console.log(data.id);
// → "wa_msg_8nB91Yk3p..."

Chaque changement d'état est un webhook.

HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.

POST /webhooks/bird
signed
{
  "type": "whatsapp.read",
  "id":   "evt_7kQ02v...",
  "created_at": "2026-05-19T15:42:08.114Z",
  "data": {
    "wa_msg_id":   "wa_msg_8nB91Yk3p",
    "from":        "+15551234567",
    "to":          "+15005550009",
    "conversation_id": "wa_conv_3pX1g7t",
    "template":    "order_shipped",
    "delivered_at": "2026-05-19T15:42:01.802Z",
    "read_at":      "2026-05-19T15:42:08.020Z"
  }
}

Calendrier de renvoi : 5s, 30s, 5m, 30m, 2h, 6h, 12h. Mise en dead-letter après la dernière tentative ; chaque événement en dead-letter est rejouable depuis le tableau de bord ou l'API.

  • whatsapp.queuedAccepté par l'API et mis en file d'attente pour envoi à Meta.
  • whatsapp.sentTransmis à l'API Cloud de Meta.
  • whatsapp.deliveredMeta confirme que le message est arrivé sur l'appareil du destinataire.
  • whatsapp.readLe destinataire a ouvert le message (si les accusés de lecture sont activés).
  • whatsapp.failedPermanent failure: reason code in the payload.
  • whatsapp.receivedMessage entrant d'un utilisateur dans la fenêtre de session de 24 h.
  • whatsapp.template.approvedMeta a approuvé un modèle que vous avez soumis.
  • whatsapp.template.rejectedMeta rejected a template: rejection reason in the payload.

Le basculement vers SMS, c'est un attribut, pas une seconde intégration.

Si WhatsApp ne peut pas livrer — session expirée, destinataire sans opt-in, modèle pas encore approuvé — Bird achemine le même message par SMS dans la même requête. Même authentification, même contrat d'idempotence, même format de webhook de l'autre côté.

WhatsApp avec basculement.

whatsapp + fallback
await bird.whatsapp.send({
  to:       "+15005550009",
  template: "order_shipped",
  variables: { order_id: "BRD-49217" },
  fallback: "sms",
});

One payload, one auth. Session expiry, opt-in gap, unapproved template: all route through SMS automatically.

SMS direct.

sms
await bird.sms.send({
  from:     "Bird",
  to:       "+15005550006",
  text:     `Your order BRD-49217 has shipped.`,
  category: "transactional",
});

Les mêmes canaux, adressés directement. Utilisez-le quand vous voulez explicitement le chemin SMS.

Un tarif par message, frais Meta inclus.

Tarification à l'usage. Chaque tarif couvre les frais Meta et les nôtres en un seul montant, et suit le pays de destination et la catégorie de message. Aucun frais par utilisateur et rien qui exige un engagement annuel.

Commencez avec un seul canal.
Ajoutez les autres quand vous êtes prêt.

Une clé API de test est disponible immédiatement. L'accès production se débloque dès que vous ajoutez un moyen de paiement et vérifiez un expéditeur.

Vous utilisez Claude Code, Cursor ou Codex ? Copiez un prompt de configuration et votre agent installe la CLI Bird et les compétences pour vous. Choisissez le vôtre :

Cursor