La API de WhatsApp Business, sin el rodeo del 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.
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 minutos desde npm install hasta el primer envío
Envía un WhatsApp desde el lenguaje que ya usas.
SDK en todos los runtimes principales. El primer envío va a un destinatario de prueba autorizado (+15005550009) con una plantilla preaprobada, para que puedas incluir un check de CI antes de enviar tu primera plantilla a aprobación.
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();Diez cosas que el filtro del BSP te oculta. Nosotros no.
WhatsApp está controlado por Meta. Elegir un BSP es decidir si las restricciones aparecen en tu código o se esconden en un dashboard. Nosotros elegimos el código.
- 01
Proveedor oficial de soluciones de negocio de Meta (BSP)
Relación directa con Meta desde que existe la API. Sin tránsito revendido, sin saltos de terceros.
- 02
Gestión de plantillas
Envía, rastrea el estado de aprobación y recibe un webhook en cuanto Meta aprueba o rechaza.
- 03
Control de ventana de sesión
El SDK te indica si se permite formato libre o plantilla antes de enviar.
- 04
Mensajes interactivos
Buttons, lists, product cards, and WhatsApp Flows, declared in the same payload.
- 05
Multimedia y contenido enriquecido
Imágenes, vídeo, documentos, ubicación, contactos, vistas previas de enlaces, reacciones y respuestas.
- 06
WhatsApp Flows
Formularios multi-paso dentro de la app con validación en backend, definidos como JSON, ejecutados por Meta.
- 07
Anuncios Click-to-WhatsApp
Integración con Meta Ads Manager para que los clics en anuncios lleguen a una conversación que puedas responder.
- 08
Fallback multicanal
Add fallback: "sms" to any send. Session expiry routes through SMS automatically.
- 09
Webhooks de mensajes entrantes
Eventos firmados con HMAC para mensajes entrantes, confirmaciones de lectura, reacciones y estado de plantillas.
- 10
Más de 2 mil millones de usuarios en un solo endpoint
Más de dos mil millones de usuarios mensuales de WhatsApp accesibles desde una sola llamada a bird.whatsapp.send.
Por qué desarrollamos WhatsApp
Fuimos uno de los primeros BSP de WhatsApp. Seguimos siendo de los pocos que programan contigo.
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.
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..."
Cada cambio de estado es un webhook.
HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.
{
"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"
}
}
Programa de reintentos: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter tras el último intento; cada evento dead-letter se puede reenviar desde el dashboard o la API.
whatsapp.queuedAceptado por la API y en cola para envío a Meta.whatsapp.sentEntregado a la Cloud API de Meta.whatsapp.deliveredMeta confirma que el mensaje llegó al dispositivo del destinatario.whatsapp.readEl destinatario abrió el mensaje (si las confirmaciones de lectura están activadas).whatsapp.failedPermanent failure: reason code in the payload.whatsapp.receivedMensaje entrante de un usuario dentro de la ventana de sesión de 24 h.whatsapp.template.approvedMeta aprobó una plantilla que enviaste.whatsapp.template.rejectedMeta rejected a template: rejection reason in the payload.
El fallback a SMS es un solo atributo, no una segunda integración.
Si WhatsApp no puede entregar —sesión expirada, destinatario sin opt-in, plantilla aún no aprobada— Bird enruta el mismo mensaje por SMS en la misma solicitud. Misma autenticación, mismo contrato de idempotencia, mismo formato de webhook en el otro extremo.
WhatsApp con 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 directo.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order BRD-49217 has shipped.`,
category: "transactional",
});
Los mismos canales, dirigidos directamente. Úsalo cuando quieras la ruta de SMS de forma explícita.