BIRD Realtime
Realtime API dla Twoich aplikacji. Subskrybuj, publikuj, skaluj.
Czat na żywo, obecność, powiadomienia w aplikacji i dashboardy w czasie rzeczywistym — bez samodzielnego zarządzania infrastrukturą WebSocket.
import { BirdRealtime } from "@messagebird/realtime";
const bird = new BirdRealtime({
appKey: APP_KEY,
region: "us1",
});
const channel = bird.subscribe("orders-42");
channel.bind("order-shipped", (data) => {
render(data);
});
5 minut od npm install do pierwszego zdarzenia
Opublikuj swoje pierwsze zdarzenie w języku, którego już używasz.
SDK serwerowe dla TypeScript, Python, Go i PHP, klienty przeglądarkowe, Swift i Kotlin po stronie subskrypcji oraz zwykły HTTP, gdy wolisz nie dodawać zależności. Kanał nie wymaga provisioningu — istnieje od momentu, gdy coś zacznie go subskrybować.
const result = await bird.realtime.publish("rap_01krdgeqcxet5s7t44vh8rt9mg", {
event: "order.updated",
channels: ["orders", "presence-lobby"],
data: { order_id: "ord_123", status: "shipped" },
});
console.log(result.data?.length); // one entry per channelCo możesz zbudować z Realtime
Wprowadź aktualizacje na żywo do każdego zakątka Twojego produktu — od czatu i dashboardów po śledzenie i gry — wszystko przez jedno proste API.
- 01
Wyniki na żywo
Aktualizacje meczów, wyniki ankiet, wieczory wyborcze: jedno wywołanie publish rozsyła nową wartość na każdy zasubskrybowany ekran jednocześnie.
- 02
Czat w aplikacji
Kanał na pokój, obecność dla sprawdzenia kto jest online i zdarzenia klienckie dla wskaźników pisania — bez podróży na serwer i z powrotem.
- 03
Współpraca online
Zdarzenia klienckie rozsyłają pozycje kursorów, zaznaczenia i sygnały współedycji między uczestnikami przez kanał — bez pośrednictwa backendu.
- 04
Gry wieloosobowe
Obecność zapełnia lobby, zdarzenia klienckie przenoszą ruchy, a kanał na mecz utrzymuje stan widoczny dla każdego gracza.
- 05
Wykresy i dashboardy na żywo
Publikuj metryki w momencie ich zmiany. Kanał cache przekazuje aktualną wartość każdemu spóźnionemu, więc wykresy nigdy nie renderują się puste.
- 06
Wskaźniki obecności
Kanały obecności śledzą członków, gdy dołączają i odchodzą; webhooki utrzymują synchronizację rejestru w Twoim backendzie.
- 07
Śledzenie lokalizacji na żywo
Kurier na mapie klienta, znajomi współdzielący trasę, flota na ekranie dyspozytorni: publikuj współrzędne, a każdy obserwator podąża za nimi — z ostatnią znaną pozycją w cache dla spóźnionych.
- 08
Status zamówienia i dostawy
Kanał cache na zamówienie przechowuje aktualny status, więc subskrypcja jednocześnie pobiera stan początkowy.
- 09
Aukcje i licytacje
Każda oferta trafia jednocześnie na ekran każdego licytującego, a kanał cache przekazuje aktualną najwyższą ofertę każdemu, kto dołączy w trakcie aukcji.
- 10
Kanały powiadomień per użytkownik
Jeden prywatny kanał na użytkownika, subskrypcje podpisane przez Twój backend — tylko właściwy klient może nasłuchiwać.
Poznaj Realtime
Każda funkcja w szczegółach. Jedna aplikacja, jedna para kluczy.
Kanały.
Publiczne, prywatne, obecności, szyfrowane i buforowane — wszystko określane przez nazwę.
Obecność.
Kto jest w pokoju, kto właśnie wyszedł i jak dotrzeć bezpośrednio do konkretnej osoby.
Bezpieczeństwo.
Subskrypcje podpisywane przez Twój backend, autoryzowane połączenia i szyfrowanie end-to-end.
Webhooki.
Twój serwer otrzymuje powiadomienie, gdy kanał się zapełni, opustoszeje lub nie trafi w cache.
Dlaczego Realtime
UX na żywo to pierwsza rzecz, która się psuje przy skalowaniu. My prowadzimy to od ponad dekady.
Stan połączenia, obecność, fan-out, backoff przy ponownym łączeniu i zdolność do absorpcji skoków ruchu — to elementy funkcji na żywo, które łatwo prototypować, a trudno utrzymywać. Realtime uruchamia je jako zarządzaną usługę wewnątrz Bird API, więc kanał na żywo współdzieli uwierzytelnianie, obserwowalność i webhooki, których już używasz do e-maili i SMS.
import type { Member } from "@messagebird/realtime";
const room = bird.subscribe("presence-room-42");
room.bind("bird:subscription_succeeded", () => {
const members = [...room.members.values()];
render({ me: room.myId, members });
});
room.bind<Member>("bird:member_added", (member) => {
addToRoster(member.member_id);
});
room.bind<Member>("bird:member_removed", (member) => {
removeFromRoster(member.member_id);
});
Każda zmiana stanu to webhook.
Klienci przychodzą i odchodzą, nie dotykając Twojego backendu. Oto jak się o tym dowiaduje: uruchom kosztowne zadanie, gdy pojawi się pierwszy subskrybent, zatrzymaj je, gdy odejdzie ostatni, i utrzymuj własny widok tego, kto jest w pokoju.
{
"type": "realtime.member_added",
"timestamp": "2026-05-19T15:42:01.221Z",
"data": {
"channel": "presence-room-42",
"member_id": "usr_4hQ2m"
}
}
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.connection_countLiczba połączeń kanału uległa zmianie.
Jeśli zintegrowałeś e-mail, to zintegrowałeś już Realtime.
Ta sama autoryzacja, ten sam kontrakt idempotentności, ta sama koperta błędów, ten sam format webhooków. Różnica polega na transporcie: trwałe połączenie WebSocket zamiast jednorazowego wysłania przez REST.
Realtime.
await bird.realtime.members.send(APP_ID, "usr_4hQ2m", {
event: "order-shipped",
data: { status: "shipped" },
});
Dociera do osoby wszędzie tam, gdzie jest połączona — w każdej karcie i na każdym urządzeniu jednocześnie. Bez nazwy kanału, bez śledzenia połączeń.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order has shipped.`,
category: "transactional",
});
To samo wywołanie, tylko inny kanał. Gdy aktualizacja musi trafić na telefon zamiast do połączonego klienta.
Put it into practice.
Continue with the documentation, guides and examples for this topic. Resources are in English.