Push-Benachrichtigungen für iOS, Android und Web.
Token-management abstraction, per-device opt-in, native rich payloads, segment targeting. Same auth, same idempotency, same webhooks as every other Bird channel, because the same engineering team built them all.
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 Minuten von npm install bis zum ersten Versand
Senden Sie eine Benachrichtigung in der Sprache, die Sie bereits verwenden.
SDKs für jede gängige Laufzeitumgebung. Registrieren Sie ein Token über Ihren mobilen oder Web-Client; senden Sie per Token oder per user_id von Ihrem 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();Zehn Primitive, die APNs und FCM in einen Endpunkt verwandeln.
Real APNs and FCM under the hood. No third-party push aggregator in the middle. We just hide the platform quirks behind one shape.
- 01
iOS, Android und Web mit einem Aufruf
Ein bird.push.send. Wir verteilen an APNs, FCM und das W3C Push Protocol pro registriertem Gerät.
- 02
Token-Management-Abstraktion
Registrieren Sie ein Token mit bird.push.tokens.register. Wir tracken Plattform, Sprache und letzten Zugriff – damit Sie es nicht müssen.
- 03
Versand per Token oder per user_id
Adressieren Sie ein einzelnes Gerät oder übergeben Sie
{ user_id }– wir verteilen die Nachricht an alle Geräte mit Opt-in. - 04
Gerätespezifischer Opt-in-Status
Jedes registrierte Token hat seinen eigenen Opt-in-Status. Widerrufen Sie eines, ohne die anderen zu beeinflussen.
- 05
Native Rich-Payloads
Title, body, image, action buttons, deep-link URL, custom data: mapped to APNs alert and FCM notification correctly.
- 06
Stille / Hintergrund-Benachrichtigungen
Übergeben Sie content_available: true und wir routen korrekt über APNs-Background und FCM-Data-only – je nach Plattform.
- 07
Segment-Targeting
Taggen Sie Nutzer bei der Registrierung; adressieren Sie per Tag über bird.push.send. Keine Drittanbieter-CDP-Integration erforderlich.
- 08
Zustellungs- und Öffnungsbestätigungen
Events für push.delivered, push.opened, push.dismissed. Derselbe HMAC-Envelope wie bei jedem anderen Kanal.
- 09
Token-Lifecycle automatisch verwaltet
Wenn APNs / FCM ein nicht registriertes Token zurückgibt, markieren wir es als inaktiv und stoppen den Versand. Kein manuelles Aufräumen.
- 10
Gleiche Authentifizierung, gleicher Error-Envelope
Ein API-Key für Push, SMS, Email, WhatsApp, Voice. Ein einheitliches Fehlertyp-Register für alle.
Warum wir Push entwickeln
Weil Push nicht bei einem anderen Anbieter leben sollte als Ihre SMS, Ihre E-Mails und Ihre Verifizierungen.
Every product team ends up with the same stack: APNs for iOS, FCM for Android, a service worker for web, and a database table tracking which user has which tokens with which opt-in state. We built that table, then we built it again, then we exposed it as bird.push.tokens.register and bird.push.send. Same auth, same idempotency, same error envelope as Email and SMS, so the OTP that fails on push falls back to SMS in the same request.
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..."
Jede Statusänderung ist ein Webhook.
HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.
{
"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
}
}
Retry-Intervalle: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-Letter nach dem letzten Versuch; jedes Dead-Letter-Event kann über das Dashboard oder die API erneut abgespielt werden.
push.queuedVon der API akzeptiert und zum Versand in die Warteschlange gestellt.push.sentAn APNs / FCM / W3C Push Server übergeben.push.deliveredProvider confirmed delivery to the device (when available: APNs is best-effort).push.openedNutzer hat auf die Benachrichtigung getippt (wenn Ihre App dies instrumentiert).push.dismissedNutzer hat die Benachrichtigung ohne Öffnen geschlossen (wenn Ihre App dies instrumentiert).push.failedPermanenter Fehler (Token nicht registriert, App entfernt). Das Token wird automatisch deaktiviert.
Wenn Sie SMS integriert haben, haben Sie auch Push integriert.
Same auth, same idempotency contract, same error envelope, same webhook shape. The difference is the transport, not how you call it.
Push.
await bird.push.send({
to: { user_id: "usr_4hQ2m" },
title: "Your code",
body: `Code: ${code}`,
});
Ein Aufruf. Wir verteilen an jedes Gerät des Nutzers mit Opt-in – über APNs, FCM und Web.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your code is ${code}.`,
category: "authentication",
});
Same envelope, same idempotency contract. Fall back when push fails, or address SMS directly.