Push

Bird Push is the push-notification API for developers. iOS, Android, and web — one endpoint, one auth model, one webhook contract. Tokens are managed on Bird, opt-in state is per-device, and you address users by token, user id, or segment without writing a fan-out worker yourself.

Concept

Push is three vendors stacked on a thin shell: APNs for iOS, FCM for Android (and Chrome web), VAPID for Safari and standards-compliant browsers. We abstract all three behind one endpoint. You register a device token once; we keep track of which user it belongs to, which platform it's for, whether it's still valid, and whether the user is currently opted in.

Send

The same call works for one device, a user (one or more registered tokens), or a segment:

import { BirdClient } from "@bird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

// To a single token
await bird.push.send({
  to: "ptok_01HZQK7E9K3M4P5R6S7T8V9W0X",
  title: "Order shipped",
  body: "It'll arrive Friday.",
  data: { order_id: "1024" },
});

// To every active device for a user
await bird.push.send({
  to: { user_id: "usr_42" },
  title: "New message",
  body: "Alex: Are you free Friday?",
  badge: 3,
});

// To a segment defined in the dashboard
await bird.push.send({
  to: { segment: "weekend_planners_NL" },
  title: "Weekend plans?",
  body: "Three new spots opened up in your area.",
  image: "https://example.com/push/weekend.jpg",
});

The response carries an aggregate state (queued, sent, partial, failed) and a recipients count. Per-device delivery surfaces in push.delivered / push.failed webhooks.

Token management

Register a token the first time your app gets one from the platform:

await bird.push.tokens.register({
  token: deviceToken,
  platform: "ios", // "ios" | "android" | "web"
  user_id: "usr_42",
  app_id: "com.example.app",
  locale: "en-US",
});

Tokens move between users (one phone, two accounts), expire on uninstall, and rotate periodically — we track all of that. On every send we ignore tokens we know are dead, but you should call bird.push.tokens.unregister(id) on logout so we don't ship the next notification to the wrong account.

Opt-in state

Every device has a per-channel active: boolean flag in our store. iOS and Android both expose user-level permission state; we sync it via the SDK helper on app start:

// In your iOS / Android app, on resume:
await birdSDK.push.tokens.syncPermission({ active: hasPermission });

We never send to inactive tokens. The push.opted_out webhook fires when a token flips inactive.

Rich payloads

iOS supports image attachments via APNs mutable-content, action categories, interruption levels (active, time-sensitive, critical). Android supports big-picture style, channels, importance. Web supports a constrained subset. The same payload routes correctly per platform — we translate fields:

await bird.push.send({
  to: { user_id: "usr_42" },
  title: "Limited-time deal",
  body: "Free shipping ends in 2 hours.",
  image: "https://shop.example.com/push/deal.jpg",
  sound: "default",
  badge: 1,
  ttl: 7200, // seconds
  collapse_key: "deal_2026_05",
  data: { deeplink: "/deals/free-shipping" },
});

Provide platform-native overrides when you need them — ios: { interruption_level: "time-sensitive" } and android: { channel_id: "deals" } ride through unchanged.

Events

push.queued     push.sent       push.delivered    push.failed
push.opened     push.dismissed  push.opted_out

Per-recipient events carry the token id and the user id, so you can wire deep-link attribution without scraping logs.

Pricing

$0.0005 per notification, every platform — same rate on iOS, Android, and web. Bulk segment sends bill per recipient. See pricing for the full grid.

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Jetzt startenDokumentation lesenoder

Sie nutzen Claude Code, Cursor oder Codex? Verbinden Sie es mit unserem MCP-Server – 141 Tools, eines pro API-Endpunkt, mit eingeschränkten Agent-Keys.