Conecta con clientes en todo el mundo con WhatsApp API
Conecta a los equipos de marketing, atención al cliente y operaciones con los clientes en la app de mensajería más popular del 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 hasta el primer envío
Envía un WhatsApp desde el lenguaje que ya usas.
SDKs en todos los principales entornos de ejecución. El primer envío sale con una plantilla gestionada por Bird como bird_delivery_update, ya aprobada por Meta y con un remitente asignado automáticamente, para que veas un mensaje real llegar antes de crear uno propio.
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);Ocho cosas que gestionamos entre tú y Meta.
WhatsApp tiene restricciones: una plantilla aprobada, un destinatario con consentimiento, un negocio verificado. Esas restricciones no cambian. Tu proveedor decide si aparecen en tu código o se ocultan en un panel de control.
- 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
Consulta el catálogo y el veredicto de Meta por idioma desde la CLI o las herramientas MCP. La creación y el envío se realizan en el panel de control.
- 03
Plantillas en todos los idiomas
Un slug, muchos idiomas. Indica uno en el envío o deja que se resuelva con el idioma predeterminado de la plantilla.
- 04
Botones y carruseles
Botones de enlace, respuesta rápida, número de teléfono y código para copiar, y carruseles de 2 a 10 tarjetas.
- 05
Multimedia y contenido enriquecido
Imágenes, vídeo, audio, stickers, documentos y ubicación, cada uno en un solo campo de envío.
- 06
Etiquetas y metadatos en cada envío
Las etiquetas se convierten en dimensiones de filtro y análisis; los metadatos se devuelven en cada webhook.
- 07
Webhooks de mensajes entrantes
Eventos firmados con HMAC para mensajes entrantes, acuses de entrega y confirmaciones de lectura.
- 08
Más de 3 mil millones de usuarios en un solo endpoint
Más de tres mil millones de usuarios mensuales de WhatsApp accesibles desde una sola llamada a bird.whatsapp.send.
Explora la plataforma de WhatsApp
Cada capacidad en detalle. Una API, un conjunto de claves.
Plantillas.
Categorías, aprobación por idioma y marcadores de posición completados en el momento del envío.
Envío.
Un tipo de contenido por solicitud, claves de idempotencia, etiquetas y metadatos.
Bidireccional.
Mensajes entrantes, la ventana de atención al cliente de 24 horas y respuestas.
Números.
Remitentes gestionados por Bird, uso de tu propio número y cuentas de empresa.
Precios.
Una tarifa única por mensaje, según país de destino y categoría.
Preguntas frecuentes.
Todas las preguntas sobre WhatsApp en un solo lugar, desde el primer envío hasta la analítica.
Por qué desarrollamos WhatsApp
Fuimos uno de los primeros BSP de WhatsApp. Seguimos siendo de los pocos que programan contigo.
WhatsApp tiene restricciones. Necesitas una plantilla aprobada; necesitas una ventana de atención al cliente abierta para enviar cualquier cosa que no sea una; necesitas una verificación de negocio en Meta. Esa parte no cambia, ni cambiará. Lo que cambia es si tu BSP facilita o dificulta el paso por esas restricciones: exponiéndolas en tu código, en webhooks a los que puedes suscribirte, en errores que dicen exactamente qué está mal. Nosotros elegimos lo primero.
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 cambio de estado es un webhook.
Payloads firmados con HMAC, protegidos contra repetición, idempotentes. El mismo formato en cada canal de Bird: aprende uno y los conoces 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" }
}
}Programación de reintentos: 5s, 5m, 30m, 2h, 5h, y luego 10h dos veces. Tras el último, la entrega falla permanentemente, y la repetición lo recupera desde el panel de control o la API.
whatsapp.acceptedAceptado 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.rejectedRechazado antes del envío y sin cargo: código de motivo en el payload.whatsapp.failedFallo permanente: código de motivo en el payload.whatsapp.receivedMensaje entrante de un usuario de WhatsApp.
Contactar al mismo cliente por SMS es la misma llamada, solo un campo de diferencia.
Mismo cliente, misma autenticación, mismo formato de error, misma estructura de webhook. Lo que cambia es el payload: WhatsApp lleva una plantilla aprobada por Meta, SMS lleva texto. Las etiquetas y los metadatos acompañan a ambos, así que un solo conjunto de paneles cubre los dos.
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" },
] }],
},
});Una plantilla gestionada por Bird: aprobada por Meta, disponible en más de 70 idiomas, y selecciona su propio remitente. Los valores de los marcadores se envían como componentes.
SMS
await bird.sms.send({
from: "Bird",
to: "+15551234567",
text: `Your order BRD-49217 has shipped.`,
category: "transactional",
});El mismo verbo en el otro canal: texto libre más una categoría, sin aprobación de plantilla de por medio.
Una tarifa por mensaje, con la tarifa de Meta incluida.
Precios según el uso. Cada tarifa cubre la de Meta y la nuestra en una sola cifra, y varía según el país de destino y la categoría del mensaje. Sin coste por usuario y sin nada supeditado a un compromiso anual.
Put it into practice.
Continue with the documentation, guides and examples for this topic. Resources are in English.