Push is being upgraded

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.

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 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.

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();

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 05

    Native rich payloads

    Titel, tekst, afbeelding, actieknoppen, deep-link URL, aangepaste data — correct gemapt naar APNs alert en FCM notification.

  6. 06

    Stille / achtergrondmeldingen

    Geef content_available: true mee en wij routeren correct via APNs background en FCM data-only per platform.

  7. 07

    Segmenttargeting

    Tag gebruikers bij registratie; adresseer op tag vanuit bird.push.send. Geen externe CDP-integratie nodig.

  8. 08

    Bezorg- en openbevestigingen

    Events voor push.delivered, push.opened, push.dismissed. Dezelfde HMAC-envelope als elk ander kanaal.

  9. 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. 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.

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..."

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.

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
  }
}

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.

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.

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.

$0,0005 per melding, elk platform.

Prijs per bezorgde melding. Hetzelfde tarief op iOS, Android en web. APNs en FCM zijn gratis upstream, dus wij rekenen voor de routering en het dashboard, niet voor het transport. Volumekortingen worden automatisch toegepast boven 10M/maand.

Begin met één kanaal.
Voeg de rest toe wanneer je er klaar voor bent.

Een test-API-key is direct beschikbaar. Productietoegang wordt ontgrendeld zodra je een betaalmethode toevoegt en een afzender verifieert.

Aan de slagLees de docsof

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

Cursor