Una API para cada
mensaje que envías.

Envía mensajes transaccionales y notificaciones a través de Bird. Proporciona tu texto y remitente, o usa una plantilla; inspecciona la codificación y el conteo de segmentos en la respuesta. Añade una clave de idempotencia para reintentos seguros y sigue la entrega mediante webhooks firmados.

Un mensaje. Un resultado visible.

Envío de ejemplo

FNotas de campo
Tu pedido #4821 está listo para recoger.
Estado202 Accepted
CodificaciónGSM-7
Segmentos1

Explora la aceptación y un acuse de recibo posterior del operador. Este ejemplo no envía un mensaje de texto; la entrega no demuestra que alguien lo haya leído.

Prueba tu primera integración con SMS.

Desde el lenguaje que ya usas.

El envío es el núcleo de la Bird SMS API. El ejemplo siguiente muestra la estructura de la solicitud. Para una prueba controlada, reemplaza el destinatario con el número de sandbox documentado +15005550006. Configura un remitente adecuado en EE. UU. y habilita el destino primero, luego verifica los eventos de aceptación y entrega antes de enviar a clientes.

1
2
3
4
5
6
7
const msg = await bird.sms.send({
  from: "+15557654321",
  to: "+14155550100",
  text: "Your verification code is 123456.",
  category: "authentication",
});
console.log(msg.id, msg.status);

Un envío SMS entrega el texto que proporcionas. Para inicio de sesión y verificación de cuenta, usa Bird Verify para generar, expirar y verificar códigos como parte de un flujo de verificación.

Construye sobre un contrato de envío claro.

Prepara la solicitud y sigue el resultado.

  1. 01

    Conteo de segmentos antes de enviar.

    Bird reporta la codificación calculada y el conteo de segmentos en su respuesta. Usa la calculadora de segmentos para inspeccionar un borrador antes de enviarlo.

  2. 02

    GSM-7 y Unicode, decidido por ti.

    Los caracteres determinan la codificación. GSM-7 cabe en 160 unidades en un solo segmento; Unicode cabe en 70. Los mensajes multiparte reservan espacio para el reensamblaje, y los emoji pueden ocupar más de una unidad.

  3. 03

    Lote en una sola llamada.

    Envía hasta 100 mensajes independientes en un solo lote. La validación ocurre antes del encolado; cada mensaje aceptado tiene su propio resultado.

  4. 04

    Reintenta con una clave de idempotencia.

    Usa una clave de idempotencia por solicitud lógica y reutilízala para un reintento idéntico. La respuesta retenida de la API puede reproducirse; esto no garantiza entrega exactamente-una-vez por parte del operador.

  5. 05

    Eventos de entrega para tu aplicación.

    Suscríbete a eventos de aceptación, envío y resultado terminal. Verifica firmas, deduplica reintentos de webhooks y usa lecturas de mensajes para investigar observaciones faltantes o retrasadas.

Avanza la integración con una prueba controlada.

Mapea los campos de tu solicitud actual, registros de remitente y manejo de eventos a Bird. Reconcilia las bajas antes de mover tráfico, luego compara con una prueba controlada antes de cambiar el enrutamiento de producción.

twilio.ts
Twilio
import twilio from "twilio";

const client = twilio(accountSid, authToken);

await client.messages.create({
  from: "+14155550172",
  to:   "+15005550006",
  body: "Your code is 123456.",
});
bird.ts
Bird
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

await bird.sms.send({
  from:     "+14155550172",
  to:       "+15005550006",
  text:     "Your code is 123456.",
  category: "authentication",
});

Conoce el conteo de segmentos antes del envío.

GSM-7 cabe en 160 septetos en un solo segmento; UCS-2 cabe en 70 unidades de código. La capacidad multiparte es 153 o 67 respectivamente. Los caracteres extendidos de GSM-7 usan dos septetos y los emoji pueden usar dos unidades de código. Bird devuelve la codificación y los segmentos en la aceptación; la tarifa aplicable y cualquier cargo del operador se facturan por separado.

segments.ts
202 · 1 segment
const { data, error } = await bird.sms.send({
  from:     "Bird",
  to:       "+31612345678",
  text:     "Your code is 123456.",
  category: "authentication",
}).safe();
if (error) throw error;

console.log(data.segments);
// → { characters: 20, count: 1, encoding: "GSM_7BIT" }

Un mensaje o cien, una sola llamada.

Agrupa hasta 100 mensajes independientes en un lote, cada uno con su propio destinatario y texto. Una entrada inválida rechaza la solicitud antes del encolado. Tras una respuesta 202 exitosa, el procesamiento y la entrega pueden tener éxito o fallar por separado para cada SMS. Reutiliza la solicitud y la clave de idempotencia al reintentar dentro de la ventana de retención documentada.

reminders.ts
202 · batch
const { data: batch, error } = await bird.sms
  .sendBatch(
    users.map((u) => ({
      from: "Bird",
      to:   u.phone,
      text: `Hi ${u.name}, your appointment is tomorrow at ${u.time}.`,
    })),
  )
  .safe();

if (error) throw error;
console.log(`queued ${batch.data.length} messages`);

Sigue la aceptación hasta el resultado reportado.

Una solicitud exitosa devuelve 202 Accepted. El cobro y el envío al operador ocurren después y aún pueden fallar. Consume eventos de entrega firmados e inspecciona el registro del mensaje al investigar el resultado.

app/api/webhooks/bird/route.ts
signed
import { bird } from "@/lib/bird";

export async function POST(req: Request) {
  const event = bird.webhooks.unwrap(
    await req.text(),
    Object.fromEntries(req.headers),
  );

  switch (event.type) {
    case "sms.delivered":
      await markDelivered(event.data.sms_id);
      break;
    case "sms.failed":
      await flag(event.data.to, event.data.error?.description);
      break;
  }

  return new Response(null, { status: 204 });
}

Inspecciona los fallos por su razón reportada. Las palabras clave STOP admitidas y las bajas del operador crean supresiones; otros fallos de entrega no se convierten automáticamente en una baja.

  • sms.acceptedAceptado por la API y en cola para la entrega al operador.
  • sms.sentEnviado al SMSC del operador de destino.
  • sms.deliveredAcuse de recibo del operador (DLR).
  • sms.failedUn fallo terminal para este intento de SMS. Inspecciona el error reportado y la línea de tiempo del mensaje.

Profundiza en la documentación.

Configura webhooks, haz cada envío seguro de reintentar con claves de idempotencia y consulta la referencia de errores para manejar cada fallo correctamente.

Preguntas antes de construir

¿Elijo yo el remitente?
Para un envío de texto libre, indica un remitente que tu espacio de trabajo pueda usar en el destino y la categoría de mensaje adecuada. Un envío con plantilla del sistema resuelve su categoría y remitente a partir de la plantilla.
¿Cómo evitan los reintentos un mensaje duplicado?
Incluye una clave de idempotencia y reutilízala para reintentar la misma solicitud. Un envío sin esa clave puede tratarse como un mensaje nuevo.
¿Aceptado significa entregado?
No. Una respuesta 202 significa que la API aceptó la solicitud. Sigue el registro del mensaje y los eventos firmados para conocer el resultado informado por el operador. Un acuse de entrega no establece que el destinatario haya leído el mensaje.
¿Es lo mismo un lote que una difusión?
Un lote contiene hasta 100 mensajes independientes, cada uno con su propio destinatario y cuerpo. Una difusión es una campaña de audiencia con contenido compartido y un ciclo de envío gestionado. Elige el flujo que se ajuste a tu necesidad.

Escala sin
perder el control.

Organiza equipos en espacios de trabajo, controla el acceso a la API y rastrea cambios en los registros de auditoría.

BirdHarborOrganización
Espacios de trabajoProducciónSandbox

Agente de entrega

Clave de API · Equipo de Operaciones de clientes
Activo
PermisosAcceso
EmailLectura y escritura
SMSLectura y escritura
ALAlex Lee AdministradorPermisos actualizados

Registro de auditoría

Producción
Espacio de trabajo
Producción
Recurso
Agente de entrega
WhatsApp
Acceso de lecturaLectura y escritura
Completado

Empieza con SMS.
Construye en todos los canales con Bird.

Tu próxima idea.
Lista para conectar.