Hostowany pub/sub przez WebSocket. Subskrybuj, publikuj, skaluj.
Live chat, presence, in-app notifications, real-time dashboards, without running the WebSocket infrastructure yourself. Built on the same technology that ran Pusher Channels for a decade. Same auth, same idempotency, same webhook contract as every other Bird channel.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
// On your server: publish an event to a channel.
const { data, error } = await bird.realtime.publish({
channel: "orders:BRD-49217",
event: "order.shipped",
data: { status: "shipped", eta: "Thursday, May 22" },
}).safe();
// In your client: subscribe and receive it live.
const channel = bird.realtime.subscribe("orders:BRD-49217");
channel.on("order.shipped", (event) => render(event.data));
if (error) throw error;
console.log(data.id);
// → "evt_2nQ81oP3..."
5 minut od npm install do pierwszego zdarzenia
Opublikuj swoje pierwsze zdarzenie w języku, którego już używasz.
SDK dla każdego popularnego środowiska uruchomieniowego. Pierwsza publikacja trafia na dedykowany kanał testowy (bird-test:realtime), więc możesz dodać test CI, zanim uruchomisz kanał produkcyjny.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.realtime.publish({
channel: "bird-test:realtime",
event: "ping",
data: { hello: "world" },
}).safe();Dziesięć kroków między "Twój serwer publikuje" a "Twój klient otrzymuje zdarzenie".
Hostowane mechanizmy pub/sub — nazwane i audytowalne. Żadnej infrastruktury WebSocket do samodzielnego zarządzania.
- 01
Subskrybuj nazwane kanały
Klienci otwierają połączenie, subskrybują jeden lub więcej kanałów i otrzymują zdarzenia w momencie ich publikacji.
- 02
Publikuj z dowolnego miejsca
From your backend, your CLI, your CI, or an MCP-aware agent: same bird.realtime.publish call.
- 03
Kanały obecności
Wiedz, kto jest na kanale, kto dołączył, kto wyszedł. Zdarzenia webhook przy każdej zmianie.
- 04
Kanały prywatne z autoryzacją
Handshake autoryzacyjny po stronie klienta; Twój backend podpisuje żądanie subskrypcji.
- 05
Kanały szyfrowane
Szyfrowanie end-to-end dla kanałów przesyłających wrażliwe dane.
- 06
Odzyskiwanie stanu połączenia
Klienci ponownie łączą się i odtwarzają zdarzenia utracone podczas rozłączenia — w ramach konfigurowalnego okna czasowego.
- 07
Limity częstotliwości na poziomie kanału
Konfigurowalne limity publikacji per kanał. Dashboard pokazuje limit i aktualną częstotliwość.
- 08
Routing międzyregionalny
Połączenia automatycznie kierowane do najbliższego węzła brzegowego. Niskie opóźnienia w każdym regionie.
- 09
Webhooki na zmianę stanu kanału
realtime.channel.occupied, realtime.channel.vacated, realtime.member.added, realtime.member.removed. Ta sama koperta HMAC co w każdym innym kanale Bird.
- 10
Ta sama autoryzacja, ta sama struktura błędów
Jeden klucz API dla Realtime, SMS, Email, WhatsApp, Voice. Jeden rejestr typów błędów dla nich wszystkich.
Dlaczego budujemy Realtime
UX w czasie rzeczywistym to element, który psuje się pierwszy przy skalowaniu. My zajmujemy się tym od dekady.
Bird Realtime is the WebSocket infrastructure that powered Pusher Channels, the service many of you have shipped against for years. We're folding it into the new Bird API so it shares auth, observability, and billing with everything else you do on Bird. If you're already on Pusher today, your service keeps running on the same wires; the new SDK is the developer-facing change.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
// On your server: publish an event to a channel.
const { data, error } = await bird.realtime.publish({
channel: "orders:BRD-49217",
event: "order.shipped",
data: { status: "shipped", eta: "Thursday, May 22" },
}).safe();
// In your client: subscribe and receive it live.
const channel = bird.realtime.subscribe("orders:BRD-49217");
channel.on("order.shipped", (event) => render(event.data));
if (error) throw error;
console.log(data.id);
// → "evt_2nQ81oP3..."
Każda zmiana stanu to webhook.
HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.
{
"type": "realtime.member.added",
"id": "evt_3pX1g7t...",
"created_at": "2026-05-19T15:42:01.221Z",
"data": {
"channel": "presence:room-42",
"member_id": "usr_4hQ2m",
"members": 18,
"region": "us-east"
}
}
Harmonogram ponownych prób: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Po ostatniej próbie zdarzenie trafia do kolejki dead-letter; każde takie zdarzenie można odtworzyć z poziomu dashboardu lub API.
realtime.channel.occupiedPierwszy subskrybent dołączył do wcześniej pustego kanału.realtime.channel.vacatedOstatni subskrybent opuścił kanał; kanał jest teraz pusty.realtime.member.addedCzłonek dołączył do kanału obecności.realtime.member.removedCzłonek opuścił kanał obecności.realtime.message.publishedZdarzenie zostało opublikowane na kanale.
Jeśli zintegrowałeś e-mail, to zintegrowałeś już Realtime.
Same auth, same idempotency contract, same error envelope, same webhook shape. The difference is the transport: a long-lived WebSocket connection instead of a one-shot REST send.
Realtime.
const channel = bird.realtime.subscribe("orders:BRD-49217");
channel.on("order.shipped", (event) => {
render(event.data);
});
Otwórz połączenie, zasubskrybuj kanał, odbieraj zdarzenia w czasie rzeczywistym. To samo uwierzytelnianie co przy wysyłkach transakcyjnych.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order has shipped.`,
category: "transactional",
});
Ta sama struktura, ta sama idempotentność. Na wypadek, gdy zdarzenie ma trafić na telefon, a nie do podłączonego klienta.
Cennik wkrótce.
Cennik Bird Realtime jest w trakcie finalizacji. Jeśli korzystasz już z Pusher Channels, Twoja usługa pozostaje na dotychczasowym planie. Aby uzyskać wycenę nowego Bird Realtime SDK, napisz do nas.