Realtime is being upgraded

Hosted pub/sub over WebSockets. Subscribe, publish, scale.

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.

realtime.ts
200 · 0.2s
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 minutes from npm install to first event

Publish your first event from the language you already use.

SDKs in every major runtime. The first publish lands on a sanctioned test channel (bird-test:realtime) so you can ship a CI check before you provision a production channel.

1
2
3
4
5
6
7
8
9
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();

Ten things between "your server publishes" and "your client gets the event."

Hosted pub/sub primitives, named and audit-able. No WebSocket infrastructure to run yourself.

  1. 01

    Subscribe to named channels

    Clients open a connection, subscribe to one or more channels, receive events as they're published.

  2. 02

    Publish from anywhere

    From your backend, your CLI, your CI, or an MCP-aware agent — same bird.realtime.publish call.

  3. 03

    Presence channels

    Know who's in a channel, who joined, who left. Webhook events on every change.

  4. 04

    Private channels with auth

    Auth handshake on the client; your backend signs the subscription request.

  5. 05

    Encrypted channels

    End-to-end encryption for channels that carry sensitive payloads.

  6. 06

    Connection state recovery

    Clients reconnect and replay events missed during the disconnect, up to a configurable window.

  7. 07

    Channel-level rate limits

    Configurable per-channel publish caps. The dashboard surfaces the limit and the current rate.

  8. 08

    Cross-region routing

    Connections route to the nearest edge node automatically. Latencies stay tight in any region.

  9. 09

    Webhooks on channel state

    realtime.channel.occupied, realtime.channel.vacated, realtime.member.added, realtime.member.removed. Same HMAC envelope as every other Bird channel.

  10. 10

    Same auth, same error envelope

    One API key for Realtime, SMS, Email, WhatsApp, Voice. One error type registry across all of them.

Why we build Realtime

Live UX is the part that breaks first when you scale. We've been running it for a decade.

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.

realtime.ts
200 · 0.2s
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..."

Every state change is a webhook.

HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel — learn one, you've learned them all.

POST /webhooks/bird
signed
{
  "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"
  }
}

Retry schedule: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter after the final attempt; every dead-lettered event is replayable from the dashboard or API.

  • realtime.channel.occupiedFirst subscriber joined a previously empty channel.
  • realtime.channel.vacatedThe last subscriber left; the channel is now empty.
  • realtime.member.addedA member joined a presence channel.
  • realtime.member.removedA member left a presence channel.
  • realtime.message.publishedAn event was published to a channel.

If you've integrated email, you've integrated 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.

realtime
const channel = bird.realtime.subscribe("orders:BRD-49217");

channel.on("order.shipped", (event) => {
  render(event.data);
});

Open a connection, subscribe to a channel, get events as they fire. Same auth as your transactional sends.

SMS.

sms
await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your order has shipped.`,
});

Same envelope, same idempotency. For when the event needs to land on a phone, not in a connected client.

Pricing announcing soon.

Realtime pricing is finalizing. If you're an existing Pusher Channels customer, your service stays on its current plan. For a quote on the new Bird Realtime SDK, drop us a line.

Join the waitlist

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Jetzt startenDokumentation lesenoder

Using Claude Code, Cursor, or Codex? Point it at our hosted MCP server: curated Bird tools, a browser sign-in, and no API key. Or install the bird-ai plugin.

Cursor