WhatsApp se está actualizando

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.

order-shipped.ts
200 · 480ms
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.

1
2
3
4
5
6
7
8
9
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.

  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

    Envía, rastrea el estado de aprobación y recibe un webhook en cuanto Meta aprueba o rechaza.

  3. 03

    Control de ventana de sesión

    El SDK te indica si se permite formato libre o plantilla antes de enviar.

  4. 04

    Mensajes interactivos

    Buttons, lists, product cards, and WhatsApp Flows, declared in the same payload.

  5. 05

    Multimedia y contenido enriquecido

    Imágenes, vídeo, documentos, ubicación, contactos, vistas previas de enlaces, reacciones y respuestas.

  6. 06

    WhatsApp Flows

    Formularios multi-paso dentro de la app con validación en backend, definidos como JSON, ejecutados por Meta.

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

  8. 08

    Fallback multicanal

    Add fallback: "sms" to any send. Session expiry routes through SMS automatically.

  9. 09

    Webhooks de mensajes entrantes

    Eventos firmados con HMAC para mensajes entrantes, confirmaciones de lectura, reacciones y estado de plantillas.

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

order-shipped.ts
200 · 480ms
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.

POST /webhooks/bird
signed
{
  "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.

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

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

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