Angażuj klientów na całym świecie dzięki WhatsApp API

Połącz zespoły marketingu, obsługi klienta i operacji z klientami w najpopularniejszej aplikacji do komunikacji na świecie.

send-notification.ts
202 · 480ms
import { BirdClient } from "@messagebird/sdk";

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

const msg = await bird.whatsapp.send({
  to: "+15551234567",
  template: {
    slug: "bird_delivery_update",
    components: [{ type: "body", parameters: [
      { type: "text", name: "ref",  text: "#4821" },
      { type: "text", name: "date", text: "Wednesday" },
    ] }],
  },
});

console.log(msg.id, msg.status);
// → "wam_01krdgeqcxet5s7t44vh8rt9mg", "accepted"
Reminder: you have an appointment on 3 Sep at 14:30. We look forward to seeing you.9:42 AM
Reschedule
Your order #4821 is out for delivery, arriving Wednesday. Thanks for shopping with us.9:43 AM
Your subscription renews on 3 Sep for €12.00. No action is needed.9:44 AM
View plan

5 minut od npm install do pierwszej wysyłki

Wyślij wiadomość WhatsApp w języku, którego już używasz.

SDK w każdym popularnym środowisku uruchomieniowym. Pierwsza wiadomość jest wysyłana za pomocą szablonu zarządzanego przez Bird, np. bird_delivery_update, już zatwierdzonego przez Meta i automatycznie wybierającego nadawcę — dzięki temu widzisz dostarczenie prawdziwej wiadomości, zanim stworzysz własną.

1
2
3
4
5
6
7
8
const msg = await bird.whatsapp.send({
  to: "+15551234567",
  template: {
    slug: "bird_otp",
    components: [{ type: "body", parameters: [{ type: "text", text: "123456" }] }],
  },
});
console.log(msg.id, msg.status);

Osiem rzeczy, które obsługujemy między Tobą a Meta.

WhatsApp jest chroniony bramkami: zatwierdzony szablon, odbiorca ze zgodą, zweryfikowana firma. Te bramki się nie zmieniają. Twój dostawca decyduje, czy pojawią się w Twoim kodzie, czy zostaną ukryte w panelu.

  1. 01

    Oficjalny dostawca rozwiązań biznesowych Meta (BSP)

    Bezpośrednia relacja z Meta od momentu powstania API. Bez pośredników, bez dodatkowych przeskoków.

  2. 02

    Zarządzanie szablonami

    Przeglądaj katalog i decyzje Meta dla każdego języka z poziomu CLI lub narzędzi MCP. Tworzenie i przesyłanie szablonów odbywa się w panelu.

  3. 03

    Szablony w każdym języku

    Jeden identyfikator, wiele języków. Wskaż go przy wysyłce lub pozwól, aby domyślny język szablonu został zastosowany automatycznie.

  4. 04

    Przyciski i karuzele

    Przyciski z linkiem, szybką odpowiedzią, numerem telefonu i kodem do skopiowania oraz karuzele od 2 do 10 kart.

  5. 05

    Multimedia i treści rozszerzone

    Obrazy, wideo, audio, naklejki, dokumenty i lokalizacja — każdy typ w jednym polu wysyłki.

  6. 06

    Tagi i metadane w każdej wysyłce

    Tagi stają się wymiarami filtrów i analityki; metadane wracają w każdym webhooku.

  7. 07

    Webhooki wiadomości przychodzących

    Zdarzenia podpisane HMAC dla wiadomości przychodzących, potwierdzeń dostarczenia i potwierdzeń odczytu.

  8. 08

    Ponad 3 mld użytkowników w jednym endpoincie

    Ponad trzy miliardy aktywnych miesięcznie użytkowników WhatsApp dostępnych z jednego wywołania bird.whatsapp.send.

Dlaczego tworzymy WhatsApp

Byliśmy jednym z pierwszych BSP WhatsApp. Nadal jesteśmy jednym z niewielu, którzy dostarczają kod razem z Tobą.

WhatsApp jest chroniony bramkami. Potrzebujesz zatwierdzonego szablonu; potrzebujesz otwartego okna obsługi klienta, aby wysłać cokolwiek poza szablonem; potrzebujesz weryfikacji biznesowej Meta. To się nie zmienia i nie zmieni. Zmienia się to, czy Twój BSP ułatwia, czy utrudnia przejście przez te bramki: udostępniając je w Twoim kodzie, w webhookach, które możesz subskrybować, w błędach, które dokładnie mówią, co jest nie tak. My wybraliśmy to pierwsze.

send-notification.ts
202 · 480ms
import { BirdClient } from "@messagebird/sdk";

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

const msg = await bird.whatsapp.send({
  to: "+15551234567",
  template: {
    slug: "bird_delivery_update",
    components: [{ type: "body", parameters: [
      { type: "text", name: "ref",  text: "#4821" },
      { type: "text", name: "date", text: "Wednesday" },
    ] }],
  },
});

console.log(msg.id, msg.status);
// → "wam_01krdgeqcxet5s7t44vh8rt9mg", "accepted"

Każda zmiana stanu to webhook.

Payloady podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne. Ta sama struktura w każdym kanale Bird: naucz się jednego, a znasz je wszystkie.

POST /webhooks/bird
signed
{
  "type": "whatsapp.read",
  "timestamp": "2026-05-19T15:42:08.114Z",
  "data": {
    "whatsapp_id":  "wam_01krdgeqcxet5s7t44vh8rt9mg",
    "workspace_id": "ws_01krdgeqcxet5s7t44vh8rt9mg",
    "direction":    "outbound",
    "from":         { "phone_number": "+15557654321" },
    "to":           { "phone_number": "+15551234567" },
    "tags":         [{ "name": "campaign", "value": "order-updates" }],
    "metadata":     { "order_id": "BRD-49217" }
  }
}

Harmonogram ponownych prób: 5s, 5m, 30m, 2h, 5h, a potem 10h dwukrotnie. Po ostatniej próbie dostarczenie zostaje trwale oznaczone jako nieudane, a ponowne odtworzenie przywraca je z panelu lub API.

  • whatsapp.acceptedPrzyjęto przez API i umieszczono w kolejce do wysyłki do Meta.
  • whatsapp.sentPrzekazano do Meta Cloud API.
  • whatsapp.deliveredMeta potwierdza, że wiadomość dotarła na urządzenie odbiorcy.
  • whatsapp.readOdbiorca otworzył wiadomość (jeśli potwierdzenia odczytu są włączone).
  • whatsapp.rejectedOdrzucone przed wysłaniem i bez opłat: kod przyczyny w odpowiedzi.
  • whatsapp.failedTrwały błąd: kod przyczyny w payloadzie.
  • whatsapp.receivedWiadomość przychodząca od użytkownika WhatsApp.

Dotarcie do tego samego klienta przez SMS to to samo wywołanie, jedno pole dalej.

Ten sam klient, ta sama autoryzacja, ta sama struktura błędów, ten sam format webhooka. Zmienia się zawartość: WhatsApp niesie szablon zatwierdzony przez Meta, SMS niesie tekst. Tagi i metadane towarzyszą obu kanałom, więc jeden zestaw paneli obsługuje oba.

WhatsApp

whatsapp
await bird.whatsapp.send({
  to: "+15551234567",
  template: {
    slug: "bird_delivery_update",
    language: "en",
    components: [{ type: "body", parameters: [
      { type: "text", name: "ref",  text: "BRD-49217" },
      { type: "text", name: "date", text: "10 Jul 2026" },
    ] }],
  },
});

Szablon zarządzany przez Bird: zatwierdzony przez Meta, dostępny w ponad 70 językach i automatycznie dobierający nadawcę. Wartości zastępcze są przekazywane jako komponenty.

SMS

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

Ten sam czasownik na drugim kanale: dowolny tekst plus kategoria, bez konieczności zatwierdzania szablonu.

Jedna stawka za wiadomość, z opłatą Meta w cenie.

Rozliczenie według zużycia. Każda stawka obejmuje opłatę Meta i naszą w jednej kwocie i zależy od kraju docelowego oraz kategorii wiadomości. Bez opłat za użytkownika i bez niczego, co wymaga rocznego zobowiązania.

Zacznij od jednego kanału.
Dodaj kolejne, gdy będziesz gotowy.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i weryfikacji nadawcy.

Używasz Claude Code, Cursor lub Codex? Skopiuj prompt konfiguracyjny, a Twój agent zainstaluje za Ciebie Bird CLI i umiejętności. Wybierz swój:

Cursor