Hostowany pub/sub przez WebSocket. Subskrybuj, publikuj, skaluj.
Czat na żywo, obecność, powiadomienia w aplikacji, dashboardy w czasie rzeczywistym — bez samodzielnego zarządzania infrastrukturą WebSocket. Zbudowane na tej samej technologii, która przez dekadę napędzała Pusher Channels. Ta sama autoryzacja, ta sama idempotentność, ten sam kontrakt webhooków co w każdym innym kanale Bird.
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
Z Twojego backendu, CLI, CI lub agenta obsługującego MCP — to samo wywołanie bird.realtime.publish.
- 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 to infrastruktura WebSocket, która napędzała Pusher Channels — usługę, z którą wielu z Was pracuje od lat. Włączamy ją do nowego API Bird, aby współdzieliła autoryzację, obserwowalność i rozliczenia ze wszystkim, co robicie na Bird. Jeśli już korzystacie z Pusher, Wasza usługa działa na tych samych połączeniach; nowe SDK to zmiana widoczna po stronie programisty.
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.
Ładunki podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne. Ta sama koperta w każdym kanale Bird — poznaj jedną, znasz je wszystkie.
{
"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.
To samo uwierzytelnianie, ten sam kontrakt idempotentności, ta sama struktura błędów, ten sam format webhooka. Różnica to transport — trwałe połączenie WebSocket zamiast jednorazowego wywołania REST.
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.