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 yang membangun semuanya.
import { BirdClient } from "@messagebird/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.
Code samples arrive when this API ships. The SDKs already cover the live channels.
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 tiap platform di balik satu format.
- 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
Targetkan satu perangkat, atau kirim
{ user_id }dan kami akan meneruskan ke setiap perangkat opt-in yang mereka miliki. - 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 dengan benar ke APNs alert dan FCM notification.
- 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.
Mengapa kami membangun Push
Karena push seharusnya tidak berada di vendor yang berbeda dari SMS, email, dan verifikasi Anda.
Setiap tim produk akhirnya memiliki stack yang sama: APNs untuk iOS, FCM untuk Android, service worker untuk web, dan tabel database yang melacak pengguna mana memiliki token mana 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, format error sama seperti Email dan SMS, sehingga OTP yang gagal via push bisa fallback ke SMS dalam request yang sama.
import { BirdClient } from "@messagebird/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 ditandatangani HMAC, dilindungi dari replay, idempoten. Format yang sama di setiap channel Bird: pelajari satu, Anda sudah memahami 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, format error sama, format webhook sama. Yang berbeda adalah transportnya, 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}.`,
category: "authentication",
});
Format sama, kontrak idempotensi sama. Fallback saat push gagal, atau kirim SMS secara langsung.