Notificações push para iOS, Android e web.
Abstração de gestão de tokens, opt-in por dispositivo, payloads nativos avançados, segmentação por segmento. Mesma autenticação, mesma idempotência, mesmos webhooks de qualquer outro canal Bird — porque a mesma equipa de engenharia construiu todos.
import { BirdClient } from "@messagebird/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 de npm install até ao primeiro envio
Envie uma notificação na linguagem que já utiliza.
SDKs em todos os principais runtimes. Registe um token a partir do seu cliente móvel ou web; envie por token ou por user_id a partir do seu backend.
import { BirdClient } from "@messagebird/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();Dez primitivas que transformam APNs e FCM num único endpoint.
APNs e FCM reais por baixo — sem agregador de push de terceiros no meio. Apenas ocultamos as peculiaridades de cada plataforma por detrás de um formato único.
- 01
iOS, Android e web numa única chamada
Um bird.push.send. Distribuímos para APNs, FCM e o W3C Push Protocol por dispositivo registado.
- 02
Abstração de gestão de tokens
Registe um token com bird.push.tokens.register. Rastreamos plataforma, idioma e última atividade para que não tenha de o fazer.
- 03
Envie por token ou por user_id
Address a single device, or pass
{ user_id }and we fan out to every opted-in device they own. - 04
Estado de opt-in por dispositivo
Cada token registado tem o seu próprio estado de opt-in. Revogue um sem afetar os outros.
- 05
Payloads nativos avançados
Título, corpo, imagem, botões de ação, URL de deep-link, dados personalizados — mapeados corretamente para APNs alert e FCM notification.
- 06
Notificações silenciosas / em segundo plano
Passe content_available: true e encaminhamos corretamente via APNs background e FCM data-only por plataforma.
- 07
Segmentação por segmento
Etiquete utilizadores no momento do registo; direcione por etiqueta a partir de bird.push.send. Sem necessidade de integração com CDP de terceiros.
- 08
Recibos de entrega e abertura
Eventos para push.delivered, push.opened, push.dismissed. Mesmo envelope HMAC de qualquer outro canal.
- 09
Ciclo de vida dos tokens gerido automaticamente
Quando APNs / FCM devolve um token não registado, marcamo-lo como inativo e paramos de enviar. Sem limpeza manual.
- 10
Mesma autenticação, mesmo envelope de erros
Uma chave API para Push, SMS, Email, WhatsApp, Voice. Um único registo de tipos de erro para todos.
Por que criamos o Push
Porque o push não deveria estar num fornecedor diferente do seu SMS, do seu email e das suas verificações.
Todas as equipas de produto acabam com a mesma stack: APNs para iOS, FCM para Android, um service worker para web, e uma tabela de base de dados que regista qual utilizador tem quais tokens com qual estado de opt-in. Construímos essa tabela, depois construímo-la novamente, e depois expusemo-la como bird.push.tokens.register e bird.push.send. Mesma autenticação, mesma idempotência, mesmo envelope de erros que Email e SMS — para que o OTP que falha via push recorra a SMS no mesmo pedido.
import { BirdClient } from "@messagebird/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 mudança de estado é um webhook.
Payloads assinados com HMAC, protegidos contra replay, idempotentes. O mesmo envelope em todos os canais Bird — aprenda um, aprendeu todos.
{
"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
}
}Agenda de tentativas: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter após a tentativa final; cada evento em dead-letter pode ser reprocessado a partir do painel ou da API.
push.queuedAceite pela API e colocado na fila para envio.push.sentEntregue ao servidor APNs / FCM / W3C Push.push.deliveredO fornecedor confirmou a entrega ao dispositivo (quando disponível — APNs é best-effort).push.openedO utilizador tocou na notificação (se a sua app o instrumentar).push.dismissedO utilizador descartou sem abrir (se a sua app o instrumentar).push.failedFalha permanente (token não registado, app removida). O token é desativado automaticamente.
Se integrou SMS, integrou Push.
Mesma autenticação, mesmo contrato de idempotência, mesmo envelope de erros, mesmo formato de webhook. A diferença é o transporte — não a forma como o chama.
Push.
await bird.push.send({
to: { user_id: "usr_4hQ2m" },
title: "Your code",
body: `Code: ${code}`,
});Uma chamada. Distribuímos para todos os dispositivos com opt-in do utilizador, via APNs, FCM e web.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your code is ${code}.`,
});Mesmo envelope, mesmo contrato de idempotência. Recorra a SMS quando o push falha — ou direcione SMS diretamente.