Envolva clientes em todo o mundo com a WhatsApp API

Conecte as equipas de marketing, atendimento e operações com os clientes na aplicação de mensagens mais popular do mundo.

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 minutos desde npm install até ao primeiro envio

Envie uma mensagem WhatsApp na linguagem que já utiliza.

SDK em todos os principais runtimes. O primeiro envio sai num template gerido pela Bird, como bird_delivery_update, já aprovado pela Meta e com remetente selecionado automaticamente — assim vê uma mensagem real chegar antes de criar a sua.

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);

Oito coisas que tratamos entre si e a Meta.

O WhatsApp é restrito: um template aprovado, um destinatário com opt-in, uma empresa verificada. Essas barreiras não mudam. O seu fornecedor decide se elas aparecem no seu código ou ficam escondidas num painel.

  1. 01

    Fornecedor oficial de soluções Meta Business (BSP)

    Relação direta com a Meta desde que a API existe. Sem trânsito revendido, sem intermediários de terceiros.

  2. 02

    Gestão de templates

    Consulte o catálogo e o veredito da Meta por idioma a partir da CLI ou das ferramentas MCP. A criação e submissão são feitas no painel.

  3. 03

    Templates em todos os idiomas

    Um slug, muitos idiomas. Indique um no envio, ou deixe o idioma predefinido do template resolver.

  4. 04

    Botões e carrosséis

    Botões de link, resposta rápida, número de telefone e código de cópia, e carrosséis de 2 a 10 cartões.

  5. 05

    Media e conteúdo rico

    Imagens, vídeo, áudio, stickers, documentos e localização, cada um num campo de envio.

  6. 06

    Tags e metadados em cada envio

    As tags tornam-se dimensões de filtro e análise; os metadados regressam em cada webhook.

  7. 07

    Webhooks de mensagens recebidas

    Eventos assinados com HMAC para mensagens recebidas, confirmações de entrega e confirmações de leitura.

  8. 08

    Mais de 3 mil milhões de utilizadores num único endpoint

    Mais de três mil milhões de utilizadores mensais do WhatsApp acessíveis a partir de uma única chamada bird.whatsapp.send.

Por que construímos o WhatsApp

Fomos um dos primeiros BSPs do WhatsApp. Continuamos a ser um dos poucos que desenvolvem código consigo.

O WhatsApp é restrito. Precisa de um template aprovado; precisa de uma janela de atendimento ao cliente aberta para enviar algo que não seja um template; precisa de uma verificação empresarial da Meta. Essa parte não muda, e não vai mudar. O que muda é se o seu BSP torna essas barreiras mais fáceis ou mais difíceis de ultrapassar: expondo-as no seu código, em webhooks que pode subscrever, em erros que dizem exatamente o que está errado. Nós escolhemos a primeira opção.

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"

Cada mudança de estado é um webhook.

Payloads assinados com HMAC, protegidos contra replay, idempotentes. O mesmo envelope em todos os canais Bird: aprenda um, aprendeu todos.

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" }
  }
}

Agendamento de tentativas: 5s, 5m, 30m, 2h, 5h e depois 10h duas vezes. Após a última, a entrega falha permanentemente, e a repetição recupera-a a partir do painel ou da API.

  • whatsapp.acceptedAceite pela API e em fila para envio à Meta.
  • whatsapp.sentEntregue à Cloud API da Meta.
  • whatsapp.deliveredA Meta confirma que a mensagem chegou ao dispositivo do destinatário.
  • whatsapp.readO destinatário abriu a mensagem (se as confirmações de leitura estiverem ativas).
  • whatsapp.rejectedRecusado antes do envio, sem cobrança: código de motivo no payload.
  • whatsapp.failedFalha permanente: código de razão no payload.
  • whatsapp.receivedMensagem recebida de um utilizador do WhatsApp.

Alcançar o mesmo cliente por SMS é a mesma chamada, um campo ao lado.

Mesmo cliente, mesma autenticação, mesmo envelope de erro, mesma estrutura de webhook. O que muda é o payload: o WhatsApp transporta um template aprovado pela Meta, o SMS transporta texto. Tags e metadados acompanham ambos, pelo que um único conjunto de painéis cobre os dois.

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" },
    ] }],
  },
});

Um template gerido pela Bird: aprovado pela Meta, disponível em mais de 70 idiomas, e seleciona o seu próprio remetente. Os valores dos placeholders são enviados como componentes.

SMS

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

O mesmo verbo no outro canal: texto livre mais uma categoria, sem aprovação de template pelo meio.

Uma taxa por mensagem, com a taxa da Meta incluída.

Preços por utilização. Cada taxa cobre a da Meta e a nossa num único valor e acompanha o país de destino e a categoria da mensagem. Sem custo por utilizador e sem nada dependente de um compromisso anual.

Comece com um canal.
Adicione os outros quando estiver pronto.

Uma chave API de teste é sua imediatamente. A produção é desbloqueada quando você adiciona um método de pagamento e verifica um remetente.

Usa Claude Code, Cursor ou Codex? Copie um prompt de configuração e o seu agente instala o Bird CLI e as skills por si. Escolha o seu:

Cursor