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.

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 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.

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

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 05

    Multimedia y contenido enriquecido

    Imágenes, vídeo, audio, stickers, documentos y ubicación, cada uno en un solo campo de envío.

  6. 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.

  7. 07

    Webhooks de mensajes entrantes

    Eventos firmados con HMAC para mensajes entrantes, acuses de entrega y confirmaciones de lectura.

  8. 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.

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.

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 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.

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

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.

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

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

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.

Empieza con un canal.
Añade los demás cuando estés listo.

Una clave API de prueba es tuya de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

¿Usas Claude Code, Cursor o Codex? Copia un prompt de configuración y tu agente instalará el Bird CLI y las habilidades por ti. Elige el tuyo:

Cursor