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.
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"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.
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.
- 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.
- 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.
- 03
Templates em todos os idiomas
Um slug, muitos idiomas. Indique um no envio, ou deixe o idioma predefinido do template resolver.
- 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.
- 05
Media e conteúdo rico
Imagens, vídeo, áudio, stickers, documentos e localização, cada um num campo de envio.
- 06
Tags e metadados em cada envio
As tags tornam-se dimensões de filtro e análise; os metadados regressam em cada webhook.
- 07
Webhooks de mensagens recebidas
Eventos assinados com HMAC para mensagens recebidas, confirmações de entrega e confirmações de leitura.
- 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.
Explore a plataforma WhatsApp
Cada funcionalidade em detalhe. Uma API, um conjunto de chaves.
Templates.
Categorias, aprovação por idioma e placeholders preenchidos no momento do envio.
Envio.
Um tipo de conteúdo por requisição, chaves de idempotência, tags e metadados.
Bidirecional.
Mensagens recebidas, janela de atendimento de 24 horas e respostas.
Números.
Remetentes geridos pela Bird, uso do seu próprio número e contas empresariais.
Preços.
Uma tarifa única por mensagem, por país de destino e categoria.
Perguntas frequentes.
Todas as perguntas sobre WhatsApp num só lugar, do primeiro envio à análise.
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.
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.
{
"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.
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
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.
Put it into practice.
Continue with the documentation, guides and examples for this topic. Resources are in English.