Notifiche push per iOS, Android e web.
Astrazione della gestione dei token, opt-in per dispositivo, payload nativi avanzati, targeting per segmento. Stessa autenticazione, stessa idempotenza, stessi webhook di ogni altro canale Bird — perché lo stesso team di ingegneri li ha costruiti tutti.
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 minuti da npm install al primo invio
Invia una notifica dal linguaggio che già utilizzi.
SDK per ogni runtime principale. Registra un token dal tuo client mobile o web; invia per token o per user_id dal tuo backend.
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();Dieci primitive che trasformano APNs e FCM in un unico endpoint.
APNs e FCM reali sotto il cofano — nessun aggregatore push di terze parti nel mezzo. Nascondiamo semplicemente le peculiarità delle piattaforme dietro un'unica interfaccia.
- 01
iOS, Android e web con una sola chiamata
Un unico bird.push.send. Distribuiamo verso APNs, FCM e il W3C Push Protocol per ogni dispositivo registrato.
- 02
Astrazione della gestione dei token
Registra un token con bird.push.tokens.register. Tracciamo piattaforma, lingua e ultimo accesso, così non devi farlo tu.
- 03
Invia per token o per user_id
Address a single device, or pass
{ user_id }and we fan out to every opted-in device they own. - 04
Stato di opt-in per dispositivo
Ogni token registrato ha il proprio stato di opt-in. Revocane uno senza influire sugli altri.
- 05
Payload nativi avanzati
Titolo, corpo, immagine, pulsanti di azione, URL di deep-link, dati personalizzati — mappati correttamente su APNs alert e FCM notification.
- 06
Notifiche silenziose / in background
Passa content_available: true e instraderemo correttamente tramite APNs background e FCM data-only per ogni piattaforma.
- 07
Targeting per segmento
Tagga gli utenti al momento della registrazione; indirizza per tag da bird.push.send. Nessuna integrazione CDP di terze parti necessaria.
- 08
Ricevute di consegna e apertura
Eventi per push.delivered, push.opened, push.dismissed. Stesso envelope HMAC di ogni altro canale.
- 09
Ciclo di vita dei token gestito
Quando APNs / FCM restituisce un token non registrato, lo contrassegniamo come inattivo e interrompiamo l'invio. Nessuna pulizia manuale.
- 10
Stessa autenticazione, stesso formato di errore
Una sola chiave API per Push, SMS, Email, WhatsApp, Voice. Un unico registro di tipi di errore per tutti.
Why we build Push
Perché il push non dovrebbe risiedere presso un fornitore diverso da quello dei tuoi SMS, delle tue email e delle tue verifiche.
Ogni team di prodotto finisce con lo stesso stack: APNs per iOS, FCM per Android, un service worker per il web e una tabella di database che traccia quale utente ha quali token con quale stato di opt-in. Noi abbiamo costruito quella tabella, poi l'abbiamo ricostruita, poi l'abbiamo esposta come bird.push.tokens.register e bird.push.send. Stessa autenticazione, stessa idempotenza, stesso formato di errore di Email e SMS — così l'OTP che fallisce su push ricade su SMS nella stessa richiesta.
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..."Ogni cambio di stato è un webhook.
Payload firmati con HMAC, protetti da replay, idempotenti. Lo stesso envelope su ogni canale Bird — impara uno e li hai imparati tutti.
{
"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
}
}Programma di retry: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter dopo l'ultimo tentativo; ogni evento in dead-letter è riproducibile dalla dashboard o dall'API.
push.queuedAccettato dall'API e messo in coda per l'invio.push.sentConsegnato al server APNs / FCM / W3C Push.push.deliveredIl provider ha confermato la consegna al dispositivo (quando disponibile — APNs è best-effort).push.openedL'utente ha toccato la notifica (se la tua app lo strumenta).push.dismissedL'utente ha ignorato senza aprire (se la tua app lo strumenta).push.failedErrore permanente (token non registrato, app rimossa). Il token viene disabilitato automaticamente.
Se hai integrato SMS, hai integrato Push.
Stessa autenticazione, stesso contratto di idempotenza, stesso formato di errore, stessa struttura webhook. La differenza è il trasporto — non il modo in cui lo chiami.
Push.
await bird.push.send({
to: { user_id: "usr_4hQ2m" },
title: "Your code",
body: `Code: ${code}`,
});Una sola chiamata. Distribuiamo a ogni dispositivo con opt-in attivo dell'utente, attraverso APNs, FCM e il web.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your code is ${code}.`,
});Stesso envelope, stesso contratto di idempotenza. Ricadi su SMS quando il push fallisce — oppure indirizza SMS direttamente.