Pushmeldingen voor iOS, Android en web.
Tokenbeheer-abstractie, opt-in per apparaat, native rich payloads, segmenttargeting. Dezelfde auth, dezelfde idempotentie, dezelfde webhooks als elk ander Bird-kanaal — omdat hetzelfde engineeringteam ze allemaal heeft gebouwd.
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 minuten van npm install tot eerste verzending
Verstuur een melding vanuit de taal die u al gebruikt.
SDK's in elke belangrijke runtime. Registreer een token vanuit uw mobiele of webclient; verstuur op basis van token of user_id vanuit uw 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();Tien primitieven die APNs en FCM omzetten in één endpoint.
Echte APNs en FCM onder de motorkap — geen externe push-aggregator ertussen. Wij verbergen alleen de platformverschillen achter één uniform formaat.
- 01
iOS, Android en web vanuit één aanroep
Eén bird.push.send. Wij distribueren naar APNs, FCM en het W3C Push Protocol per geregistreerd apparaat.
- 02
Tokenbeheer-abstractie
Registreer een token met bird.push.tokens.register. Wij houden platform, taal en laatst-gezien bij, zodat u dat niet hoeft te doen.
- 03
Verstuur op basis van token of user_id
Address a single device, or pass
{ user_id }and we fan out to every opted-in device they own. - 04
Opt-in-status per apparaat
Elk geregistreerd token heeft een eigen opt-in-status. Trek er één in zonder de andere te beïnvloeden.
- 05
Native rich payloads
Titel, tekst, afbeelding, actieknoppen, deep-link URL, aangepaste data — correct gemapt naar APNs alert en FCM notification.
- 06
Stille / achtergrondmeldingen
Geef content_available: true mee en wij routeren correct via APNs background en FCM data-only per platform.
- 07
Segmenttargeting
Tag gebruikers bij registratie; adresseer op tag vanuit bird.push.send. Geen externe CDP-integratie nodig.
- 08
Bezorg- en openbevestigingen
Events voor push.delivered, push.opened, push.dismissed. Dezelfde HMAC-envelope als elk ander kanaal.
- 09
Tokenlevenscyclus afgehandeld
Wanneer APNs / FCM een niet-geregistreerd token retourneert, markeren wij het als inactief en stoppen we met verzenden. Geen handmatige opschoning.
- 10
Dezelfde auth, dezelfde error-envelope
Eén API-sleutel voor Push, SMS, Email, WhatsApp, Voice. Eén error-typeregister voor alles.
Why we build Push
Omdat push niet bij een andere leverancier thuishoort dan uw SMS, uw e-mail en uw verificaties.
Elk productteam eindigt met dezelfde stack: APNs voor iOS, FCM voor Android, een service worker voor web, en een databasetabel die bijhoudt welke gebruiker welke tokens heeft met welke opt-in-status. Wij bouwden die tabel, daarna bouwden we hem opnieuw, en vervolgens maakten we er bird.push.tokens.register en bird.push.send van. Dezelfde auth, dezelfde idempotentie, dezelfde error-envelope als Email en SMS — zodat de OTP die faalt via push terugvalt op SMS in hetzelfde verzoek.
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..."Elke statuswijziging is een webhook.
HMAC-ondertekende payloads, replay-beschermd, idempotent. Dezelfde envelope op elk Bird-kanaal — leer er één, en u kent ze allemaal.
{
"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
}
}Herhalingsschema: 5s, 30s, 5m, 30m, 2u, 6u, 12u. Dead-letter na de laatste poging; elk dead-lettered event kan opnieuw worden afgespeeld vanuit het dashboard of de API.
push.queuedGeaccepteerd door de API en in de wachtrij voor verzending.push.sentOvergedragen aan APNs / FCM / W3C Push-server.push.deliveredProvider heeft bezorging op het apparaat bevestigd (indien beschikbaar — APNs is best-effort).push.openedGebruiker tikte op de melding (als uw app dit instrumenteert).push.dismissedGebruiker heeft de melding weggeveegd zonder te openen (als uw app dit instrumenteert).push.failedPermanente fout (token niet-geregistreerd, app verwijderd). Het token wordt automatisch uitgeschakeld.
Als u SMS heeft geïntegreerd, heeft u Push geïntegreerd.
Dezelfde auth, hetzelfde idempotentiecontract, dezelfde error-envelope, dezelfde webhook-structuur. Het verschil is het transport — niet hoe u het aanroept.
Push.
await bird.push.send({
to: { user_id: "usr_4hQ2m" },
title: "Your code",
body: `Code: ${code}`,
});Eén aanroep. Wij distribueren naar elk opted-in apparaat van de gebruiker, via APNs, FCM en het web.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your code is ${code}.`,
});Dezelfde envelope, hetzelfde idempotentiecontract. Val terug wanneer push faalt — of adresseer SMS rechtstreeks.