Push is being upgraded

Notifikasi push untuk iOS, Android, dan web.

Abstraksi manajemen token, opt-in per perangkat, payload kaya native, penargetan segmen. Auth sama, idempotensi sama, webhook sama seperti setiap channel Bird lainnya — karena tim engineering yang sama membangun semuanya.

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 menit dari npm install ke pengiriman pertama

Kirim notifikasi dari bahasa pemrograman yang sudah Anda gunakan.

SDK di setiap runtime utama. Daftarkan token dari klien mobile atau web Anda; kirim berdasarkan token atau user_id dari backend Anda.

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

Sepuluh primitif yang mengubah APNs dan FCM menjadi satu endpoint.

APNs dan FCM asli di balik layar — tanpa agregator push pihak ketiga di tengah. Kami hanya menyembunyikan keunikan platform di balik satu bentuk.

  1. 01

    iOS, Android, dan web dari satu panggilan

    Satu bird.push.send. Kami fan out ke APNs, FCM, dan W3C Push Protocol per perangkat terdaftar.

  2. 02

    Abstraksi manajemen token

    Daftarkan token dengan bird.push.tokens.register. Kami melacak platform, locale, dan last-seen sehingga Anda tidak perlu melakukannya.

  3. 03

    Kirim berdasarkan token atau user_id

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

  4. 04

    Status opt-in per perangkat

    Setiap token terdaftar memiliki status opt-in sendiri. Cabut satu tanpa memengaruhi yang lain.

  5. 05

    Payload kaya native

    Judul, isi, gambar, tombol aksi, URL deep-link, data kustom — dipetakan ke APNs alert dan FCM notification dengan benar.

  6. 06

    Notifikasi senyap / latar belakang

    Kirim content_available: true dan kami merutekan melalui APNs background dan FCM data-only dengan benar per platform.

  7. 07

    Penargetan segmen

    Tag pengguna saat pendaftaran; targetkan berdasarkan tag dari bird.push.send. Tidak perlu integrasi CDP pihak ketiga.

  8. 08

    Tanda terima pengiriman dan pembukaan

    Event untuk push.delivered, push.opened, push.dismissed. Envelope HMAC yang sama seperti setiap channel lainnya.

  9. 09

    Siklus hidup token ditangani

    Ketika APNs / FCM mengembalikan token tidak terdaftar, kami menandainya mati dan berhenti mengirim. Tanpa pembersihan manual.

  10. 10

    Auth sama, envelope error sama

    Satu API key untuk Push, SMS, Email, WhatsApp, Voice. Satu registri tipe error untuk semuanya.

Why we build Push

Karena push seharusnya tidak berada di vendor yang berbeda dari SMS, email, dan verifikasi Anda.

Setiap tim produk berakhir dengan stack yang sama: APNs untuk iOS, FCM untuk Android, service worker untuk web, dan tabel database yang melacak pengguna mana memiliki token apa dengan status opt-in apa. Kami membangun tabel itu, lalu membangunnya lagi, lalu mengeksposnya sebagai bird.push.tokens.register dan bird.push.send. Auth sama, idempotensi sama, envelope error sama seperti Email dan SMS — jadi OTP yang gagal di push akan fallback ke SMS dalam request yang sama.

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

Setiap perubahan status adalah webhook.

Payload bertanda tangan HMAC, dilindungi dari replay, idempoten. Envelope yang sama di setiap channel Bird — pelajari satu, Anda sudah mempelajari semuanya.

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

Jadwal percobaan ulang: 5d, 30d, 5m, 30m, 2j, 6j, 12j. Dead-letter setelah percobaan terakhir; setiap event dead-letter dapat di-replay dari dashboard atau API.

  • push.queuedDiterima oleh API dan diantrikan untuk pengiriman.
  • push.sentDiserahkan ke server APNs / FCM / W3C Push.
  • push.deliveredProvider mengonfirmasi pengiriman ke perangkat (jika tersedia — APNs bersifat best-effort).
  • push.openedPengguna mengetuk notifikasi (jika aplikasi Anda menginstrumentasinya).
  • push.dismissedPengguna menutup tanpa membuka (jika aplikasi Anda menginstrumentasinya).
  • push.failedKegagalan permanen (token tidak terdaftar, aplikasi dihapus). Token otomatis dinonaktifkan.

Jika Anda sudah mengintegrasikan SMS, Anda sudah mengintegrasikan Push.

Auth sama, kontrak idempotensi sama, envelope error sama, bentuk webhook sama. Perbedaannya adalah transport — bukan cara Anda memanggilnya.

Push.

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

Satu panggilan. Kami fan out ke setiap perangkat opt-in yang dimiliki pengguna, melalui APNs, FCM, dan web.

SMS.

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

Envelope sama, kontrak idempotensi sama. Fallback ketika push gagal — atau targetkan SMS langsung.

$0,0005 per notifikasi, semua platform.

Harga per notifikasi terkirim. Tarif sama untuk iOS, Android, dan web. APNs dan FCM gratis di upstream, jadi kami mengenakan biaya untuk routing dan dashboard, bukan transportnya. Diskon volume otomatis berlaku di atas 10 juta/bulan.

Mulai dengan satu channel.
Tambahkan yang lain saat Anda siap.

API key uji coba langsung tersedia untuk Anda. Akses produksi terbuka setelah Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Mulai sekarangBaca dokumentasiatau

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

Cursor