Coming Soon

Notificaciones push para iOS, Android y web.

Abstracción de gestión de tokens, opt-in por dispositivo, payloads nativos enriquecidos, segmentación por segmentos. Misma autenticación, misma idempotencia, mismos webhooks que cualquier otro canal de Bird — porque el mismo equipo de ingeniería los construyó todos.

push.ts
200 · 0.2s
import { BirdClient } from "@bird/sdk";

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

// Send by device token...
const { data, error } = await bird.push.send({
  to:    "token_aPa91Hb...XzQ",
  title: "Your driver is two minutes away",
  body:  "Tap to see the live map.",
  data:  { ride_id: "ride_2891" },
}).safe();

// ...or by user_id — we fan out to every opted-in device.
await bird.push.send({
  to:    { user_id: "usr_4hQ2m" },
  title: "Your code is 482917",
  body:  "Enter it on the login screen.",
  data:  { kind: "otp" },
});

if (error) throw error;
console.log(data.id);
// → "push_2nQ81oP3..."

5 minutos desde npm install hasta el primer envío

Envía una notificación desde el lenguaje que ya usas.

SDKs en todos los runtimes principales. Registra un token desde tu cliente móvil o web; envía por token o por user_id desde tu backend.

1
2
3
4
5
6
7
8
9
10
import { BirdClient } from "@bird/sdk";

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

const { data, error } = await bird.push.send({
  to:    "token_aPa91Hb",
  title: "Hello",
  body:  "From Bird Push",
  data:  { kind: "demo" },
}).safe();

Diez primitivas que convierten APNs y FCM en un solo endpoint.

APNs y FCM reales bajo el capó — sin agregador de push de terceros en el medio. Solo ocultamos las particularidades de cada plataforma detrás de una única interfaz.

  1. 01

    iOS, Android y web desde una sola llamada

    Un solo bird.push.send. Distribuimos a APNs, FCM y el protocolo W3C Push por cada dispositivo registrado.

  2. 02

    Abstracción de gestión de tokens

    Registra un token con bird.push.tokens.register. Rastreamos plataforma, idioma y última actividad para que tú no tengas que hacerlo.

  3. 03

    Envía por token o por user_id

    Address a single device, or pass { user_id } and we fan out to every opted-in device they own.

  4. 04

    Estado de opt-in por dispositivo

    Cada token registrado tiene su propio estado de opt-in. Revoca uno sin afectar a los demás.

  5. 05

    Payloads nativos enriquecidos

    Título, cuerpo, imagen, botones de acción, URL de deep-link, datos personalizados — mapeados correctamente a APNs alert y FCM notification.

  6. 06

    Notificaciones silenciosas / en segundo plano

    Pasa content_available: true y enrutamos correctamente a través de APNs background y FCM data-only según la plataforma.

  7. 07

    Segmentación por segmentos

    Etiqueta usuarios en el momento del registro; dirige por etiqueta desde bird.push.send. Sin necesidad de integración con un CDP de terceros.

  8. 08

    Recibos de entrega y apertura

    Eventos para push.delivered, push.opened, push.dismissed. Mismo sobre HMAC que cualquier otro canal.

  9. 09

    Ciclo de vida de tokens gestionado

    Cuando APNs / FCM devuelve un token no registrado, lo marcamos como inactivo y dejamos de enviar. Sin limpieza manual.

  10. 10

    Misma autenticación, mismo formato de errores

    Una sola clave API para Push, SMS, Email, WhatsApp, Voice. Un solo registro de tipos de error para todos.

Why we build Push

Porque push no debería estar en un proveedor distinto al de tu SMS, tu email y tus verificaciones.

Todos los equipos de producto terminan con el mismo stack: APNs para iOS, FCM para Android, un service worker para web, y una tabla de base de datos que rastrea qué usuario tiene qué tokens con qué estado de opt-in. Construimos esa tabla, luego la construimos de nuevo, y luego la expusimos como bird.push.tokens.register y bird.push.send. Misma autenticación, misma idempotencia, mismo formato de errores que Email y SMS — así el OTP que falla por push recurre a SMS en la misma solicitud.

push.ts
200 · 0.2s
import { BirdClient } from "@bird/sdk";

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

// Send by device token...
const { data, error } = await bird.push.send({
  to:    "token_aPa91Hb...XzQ",
  title: "Your driver is two minutes away",
  body:  "Tap to see the live map.",
  data:  { ride_id: "ride_2891" },
}).safe();

// ...or by user_id — we fan out to every opted-in device.
await bird.push.send({
  to:    { user_id: "usr_4hQ2m" },
  title: "Your code is 482917",
  body:  "Enter it on the login screen.",
  data:  { kind: "otp" },
});

if (error) throw error;
console.log(data.id);
// → "push_2nQ81oP3..."

Cada cambio de estado es un webhook.

Payloads firmados con HMAC, protegidos contra replay, idempotentes. El mismo sobre en cada canal de Bird — aprende uno y los habrás aprendido todos.

POST /webhooks/bird
signed
{
  "type": "push.delivered",
  "id":   "evt_9pT81y...",
  "created_at": "2026-05-19T15:42:01.221Z",
  "data": {
    "push_id":   "push_2nQ81oP3",
    "user_id":   "usr_4hQ2m",
    "platform":  "ios",
    "device":    "iPhone15,2",
    "latency_ms": 218
  }
}

Calendario de reintentos: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter tras el último intento; cada evento en dead-letter se puede reenviar desde el dashboard o la API.

  • push.queuedAceptado por la API y en cola para envío.
  • push.sentEntregado a APNs / FCM / servidor W3C Push.
  • push.deliveredEl proveedor confirmó la entrega al dispositivo (cuando está disponible — APNs es best-effort).
  • push.openedEl usuario tocó la notificación (si tu app lo instrumenta).
  • push.dismissedEl usuario descartó sin abrir (si tu app lo instrumenta).
  • push.failedFallo permanente (token no registrado, app eliminada). El token se desactiva automáticamente.

Si has integrado SMS, has integrado Push.

Misma autenticación, mismo contrato de idempotencia, mismo formato de errores, misma estructura de webhooks. La diferencia es el transporte — no cómo lo llamas.

Push.

push
await bird.push.send({
  to:    { user_id: "usr_4hQ2m" },
  title: "Your code",
  body:  `Code: ${code}`,
});

Una sola llamada. Distribuimos a cada dispositivo con opt-in que posea el usuario, a través de APNs, FCM y la web.

SMS.

sms
await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your code is ${code}.`,
});

Mismo sobre, mismo contrato de idempotencia. Recurre a SMS cuando push falla — o dirige a SMS directamente.

$0,0005 por notificación, en todas las plataformas.

Precio por notificación entregada. Misma tarifa en iOS, Android y web. APNs y FCM son gratuitos en origen, así que cobramos por el enrutamiento y el dashboard, no por el transporte. Los descuentos por volumen se aplican automáticamente a partir de 10M/mes.

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.

ComenzarLeer documentacióno

Using Claude Code, Cursor, or Codex? Point it at our MCP server — tools for every channel we expose, with scoped agent keys.

Cursor