BIRD Realtime
Realtime API for your apps. Subscribe, publish, scale.
Live chat, presence, in-app notifications, and real-time dashboards, without running the WebSocket infrastructure yourself.
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 minutes from npm install to first event
Publizieren Sie Ihr erstes Event in der Sprache, die Sie bereits nutzen.
Server SDKs for Node, Python, and Go, a browser client for the subscribe side, and plain HTTP when you would rather not add a dependency. A channel needs no provisioning: it exists as soon as something subscribes to it.
curl -X POST "https://us1.platform.bird.com/v1/realtime/apps/{realtime_app_id}/events" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"event": "order-updated",
"channels": [
"orders",
"orders-42"
],
"exclude_connection_id": "123.4567",
"include": [
"member_count"
]
}'What you can build with Realtime
Bring live updates to every corner of your product, from chat and dashboards to tracking and games, all through one simple API.
- 01
Live scores and results
Match updates, poll results, election nights: one publish call fans the new number out to every subscribed screen at once.
- 02
In-app chat
A channel per room, presence for who's online, and client events for typing indicators, with no server round-trip.
- 03
Online collaboration
Client events fan cursor positions, selections, and co-editing signals between peers through the channel, no backend hop in the loop.
- 04
Multiplayer games
Presence fills the lobby, client events carry the moves, and a channel per match keeps the state in front of every player.
- 05
Live charts and dashboards
Publish metrics as they change. A cache channel hands the current value to every late joiner, so charts never render empty.
- 06
Presence indicators
Presence channels track members as they join and leave; webhooks keep your backend's roster in sync.
- 07
Live location tracking
A courier on the customer's map, friends sharing a route, a fleet on the dispatch screen: publish coordinates and every watcher follows, with the last known position cached for late joiners.
- 08
Order and delivery status
A cache channel per order holds the current status, so the subscription doubles as the initial state fetch.
- 09
Auctions and bidding
Every bid lands on every bidder's screen together, and a cache channel hands the current high bid to anyone who joins mid-auction.
- 10
Per-user notification feeds
One private channel per user, subscriptions signed by your backend, so only the right client can listen.
Why Realtime
Live UX is the part that breaks first when you scale. We've been running it for over a decade.
Connection state, presence, fan-out, reconnection backoff, and the capacity to absorb a traffic spike are the parts of a live feature that are easy to prototype and hard to operate. Realtime runs them as a managed service inside the Bird API, so a live channel shares the auth, observability, and webhooks you already use for email and SMS.
const room = bird.subscribe("presence-room-42");
room.bind("bird:subscription_succeeded", () => {
const members = [...room.members.values()];
render({ me: room.myId, members });
});
room.bind("bird:member_added", (member) => {
addToRoster(member.member_id);
});
room.bind("bird:member_removed", (member) => {
removeFromRoster(member.member_id);
});
Jede Statusänderung ist ein Webhook.
Clients come and go without ever touching your backend. These are how it finds out: start the expensive job when the first subscriber arrives, stop it when the last one leaves, and keep your own view of who is in a room.
{
"type": "realtime.member_added",
"timestamp": "2026-05-19T15:42:01.221Z",
"data": {
"channel": "presence-room-42",
"member_id": "usr_4hQ2m"
}
}
realtime.channel_occupiedErster Subscriber hat einen zuvor leeren Channel betreten.realtime.channel_vacatedDer letzte Subscriber hat den Channel verlassen; der Channel ist jetzt leer.realtime.member_addedEin Mitglied ist einem Presence-Channel beigetreten.realtime.member_removedEin Mitglied hat einen Presence-Channel verlassen.realtime.connection_countA channel's connection count changed.
Wenn Sie E-Mail integriert haben, haben Sie auch Realtime integriert.
Dieselbe Authentifizierung, derselbe Idempotenz-Vertrag, dasselbe Fehler-Envelope, dasselbe Webhook-Format. Der Unterschied ist der Transport: eine langlebige WebSocket-Verbindung statt eines einmaligen REST-Sends.
Realtime.
await bird.realtime.members.send(APP_ID, "usr_4hQ2m", {
event: "order-shipped",
data: { status: "shipped" },
});
Reaches the person wherever they are connected, every tab and device at once. No channel to name, no connection to track.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order has shipped.`,
category: "transactional",
});
The same call, one channel over. For when the update needs to land on a phone instead of a connected client.