Coming Soon

Notifications push pour iOS, Android et le web.

Abstraction de la gestion des tokens, opt-in par appareil, payloads riches natifs, ciblage par segment. Même authentification, même idempotence, mêmes webhooks que tous les autres canaux Bird — car c'est la même équipe d'ingénierie qui les a tous conçus.

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 minutes entre npm install et le premier envoi

Envoyez une notification depuis le langage que vous utilisez déjà.

SDK dans tous les principaux environnements d'exécution. Enregistrez un token depuis votre client mobile ou web ; envoyez par token ou par user_id depuis votre 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();

Dix primitives qui transforment APNs et FCM en un seul endpoint.

APNs et FCM natifs sous le capot — aucun agrégateur push tiers entre vous et la plateforme. Nous masquons simplement les particularités derrière une interface unique.

  1. 01

    iOS, Android et le web en un seul appel

    Un seul bird.push.send. Nous distribuons vers APNs, FCM et le protocole W3C Push pour chaque appareil enregistré.

  2. 02

    Abstraction de la gestion des tokens

    Enregistrez un token avec bird.push.tokens.register. Nous suivons la plateforme, la langue et la dernière activité pour que vous n'ayez pas à le faire.

  3. 03

    Envoi par token ou par user_id

    Address a single device, or pass { user_id } and we fan out to every opted-in device they own.

  4. 04

    État d'opt-in par appareil

    Chaque token enregistré possède son propre état d'opt-in. Révoquez-en un sans affecter les autres.

  5. 05

    Payloads riches natifs

    Titre, corps, image, boutons d'action, URL de deep-link, données personnalisées — correctement mappés vers l'alerte APNs et la notification FCM.

  6. 06

    Notifications silencieuses / en arrière-plan

    Passez content_available: true et nous acheminons correctement via APNs background et FCM data-only selon la plateforme.

  7. 07

    Ciblage par segment

    Taguez les utilisateurs à l'inscription ; ciblez par tag depuis bird.push.send. Aucune intégration CDP tierce requise.

  8. 08

    Accusés de livraison et d'ouverture

    Événements pour push.delivered, push.opened, push.dismissed. Même enveloppe HMAC que tous les autres canaux.

  9. 09

    Cycle de vie des tokens géré

    Quand APNs / FCM renvoie un token désinscrit, nous le marquons comme inactif et cessons l'envoi. Aucun nettoyage manuel.

  10. 10

    Même authentification, même enveloppe d'erreur

    Une seule clé API pour Push, SMS, Email, WhatsApp, Voice. Un seul registre de types d'erreur pour tous.

Why we build Push

Parce que le push ne devrait pas dépendre d'un fournisseur différent de celui de vos SMS, vos e-mails et vos vérifications.

Chaque équipe produit finit avec la même stack : APNs pour iOS, FCM pour Android, un service worker pour le web, et une table en base de données qui suit quel utilisateur possède quels tokens avec quel état d'opt-in. Nous avons construit cette table, puis nous l'avons reconstruite, puis nous l'avons exposée sous la forme de bird.push.tokens.register et bird.push.send. Même authentification, même idempotence, même enveloppe d'erreur qu'Email et SMS — ainsi l'OTP qui échoue en push bascule sur SMS dans la même requête.

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

Chaque changement d'état est un webhook.

Payloads signés par HMAC, protégés contre le rejeu, idempotents. La même enveloppe sur chaque canal Bird — apprenez-en un, vous les connaissez tous.

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

Planning de réessai : 5s, 30s, 5m, 30m, 2h, 6h, 12h. Mise en dead-letter après la dernière tentative ; chaque événement en dead-letter peut être rejoué depuis le tableau de bord ou l'API.

  • push.queuedAccepté par l'API et mis en file d'attente pour l'envoi.
  • push.sentTransmis au serveur APNs / FCM / W3C Push.
  • push.deliveredLe fournisseur a confirmé la livraison sur l'appareil (quand disponible — APNs fonctionne en best-effort).
  • push.openedL'utilisateur a appuyé sur la notification (si votre app l'instrumente).
  • push.dismissedL'utilisateur a ignoré la notification sans l'ouvrir (si votre app l'instrumente).
  • push.failedÉchec permanent (token désinscrit, application supprimée). Le token est automatiquement désactivé.

Si vous avez intégré SMS, vous avez intégré Push.

Même authentification, même contrat d'idempotence, même enveloppe d'erreur, même format de webhook. La différence, c'est le transport — pas la façon dont vous l'appelez.

Push.

push
await bird.push.send({
  to:    { user_id: "usr_4hQ2m" },
  title: "Your code",
  body:  `Code: ${code}`,
});

Un seul appel. Nous distribuons vers chaque appareil opt-in de l'utilisateur, via APNs, FCM et le web.

SMS.

sms
await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your code is ${code}.`,
});

Même enveloppe, même contrat d'idempotence. Basculez en fallback quand le push échoue — ou adressez le SMS directement.

0,0005 $ par notification, toutes plateformes.

Facturé par notification livrée. Même tarif sur iOS, Android et le web. APNs et FCM sont gratuits en amont, nous facturons donc le routage et le tableau de bord, pas le transport. Les remises sur volume s'appliquent automatiquement au-delà de 10 M/mois.

Commencez avec un seul canal.
Ajoutez les autres quand vous êtes prêt.

Une clé API de test est disponible immédiatement. L'accès production se débloque dès que vous ajoutez un moyen de paiement et vérifiez un expéditeur.

CommencerLire la docou

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

Cursor