BIRD Realtime
Realtime API for your apps. Subscribe, publish, scale.
Chat ao vivo, presença, notificações in-app e dashboards em tempo real, sem gerir a infraestrutura 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 minutos de npm install ao primeiro evento
Publique o seu primeiro evento na linguagem que já utiliza.
SDK de servidor para Node, Python e Go, um cliente de browser para o lado da subscrição, e HTTP simples quando preferir não adicionar uma dependência. Um canal não precisa de provisionamento: existe assim que algo o subscreve.
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 channelO que pode construir com Realtime
Leve atualizações ao vivo a cada canto do seu produto, de chat e dashboards a rastreamento e jogos, tudo através de uma API simples.
- 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
Chat in-app
Um canal por sala, presença para quem está online e eventos de cliente para indicadores de digitação, sem ida e volta ao servidor.
- 03
Colaboração online
Eventos de cliente distribuem posições de cursor, seleções e sinais de coedição entre pares através do canal, sem passagem pelo backend.
- 04
Jogos multijogador
A presença preenche o lobby, eventos de cliente transportam as jogadas e um canal por partida mantém o estado visível para cada jogador.
- 05
Gráficos e dashboards ao vivo
Publique métricas à medida que mudam. Um canal com cache entrega o valor atual a cada participante tardio, para que os gráficos nunca apareçam vazios.
- 06
Indicadores de presença
Canais de presença rastreiam membros à medida que entram e saem; webhooks mantêm o registo do seu backend sincronizado.
- 07
Rastreamento de localização ao vivo
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
Estado de encomenda e entrega
Um canal com cache por encomenda mantém o estado atual, de modo que a subscrição funciona também como consulta do estado inicial.
- 09
Leilões e licitações
Cada lance chega a todos os ecrãs dos licitantes ao mesmo tempo, e um canal com cache entrega a licitação mais alta a quem entra a meio do leilão.
- 10
Feeds de notificação por utilizador
Um canal privado por utilizador, subscrições assinadas pelo seu backend, para que apenas o cliente certo possa ouvir.
Porquê Realtime
A UX ao vivo é a primeira coisa que falha quando escala. Nós gerimos isto há mais de uma década.
Estado de conexão, presença, fan-out, backoff de reconexão e a capacidade de absorver picos de tráfego são as partes de uma funcionalidade ao vivo que são fáceis de prototipar e difíceis de operar. O Realtime executa-as como um serviço gerido dentro da Bird API, para que um canal ao vivo partilhe a autenticação, a observabilidade e os webhooks que já usa para email e 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);
});
Cada mudança de estado é um 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_occupiedO primeiro subscritor juntou-se a um canal anteriormente vazio.realtime.channel_vacatedO último subscritor saiu; o canal está agora vazio.realtime.member_addedUm membro juntou-se a um canal de presença.realtime.member_removedUm membro saiu de um canal de presença.realtime.connection_countA contagem de conexões de um canal foi alterada.
Se você já integrou e-mail, já integrou o Realtime.
Mesma autenticação, mesmo contrato de idempotência, mesmo envelope de erros, mesmo formato de webhooks. A diferença está no transporte: uma conexão WebSocket persistente em vez de um envio REST pontual.
Realtime.
await bird.realtime.members.send(APP_ID, "usr_4hQ2m", {
event: "order-shipped",
data: { status: "shipped" },
});
Alcança a pessoa onde quer que esteja conectada, em cada aba e dispositivo ao mesmo tempo. Sem canal para nomear, sem conexão para rastrear.
SMS.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order has shipped.`,
category: "transactional",
});
A mesma chamada, um canal acima. Para quando a atualização precisa chegar a um telefone em vez de um cliente conectado.