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.
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.
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.
- 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.
- 02
Abstraksi manajemen token
Daftarkan token dengan bird.push.tokens.register. Kami melacak platform, locale, dan last-seen sehingga Anda tidak perlu melakukannya.
- 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. - 04
Status opt-in per perangkat
Setiap token terdaftar memiliki status opt-in sendiri. Cabut satu tanpa memengaruhi yang lain.
- 05
Payload kaya native
Judul, isi, gambar, tombol aksi, URL deep-link, data kustom — dipetakan ke APNs alert dan FCM notification dengan benar.
- 06
Notifikasi senyap / latar belakang
Kirim content_available: true dan kami merutekan melalui APNs background dan FCM data-only dengan benar per platform.
- 07
Penargetan segmen
Tag pengguna saat pendaftaran; targetkan berdasarkan tag dari bird.push.send. Tidak perlu integrasi CDP pihak ketiga.
- 08
Tanda terima pengiriman dan pembukaan
Event untuk push.delivered, push.opened, push.dismissed. Envelope HMAC yang sama seperti setiap channel lainnya.
- 09
Siklus hidup token ditangani
Ketika APNs / FCM mengembalikan token tidak terdaftar, kami menandainya mati dan berhenti mengirim. Tanpa pembersihan manual.
- 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.
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.
{
"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.
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.
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.