BIRD Realtime
Realtime API para as suas apps. Subscreva, publique, escale.
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 TypeScript, Python, Go e PHP, clientes de navegador, Swift e Kotlin para o lado de subscrição, e HTTP simples quando preferir não adicionar uma dependência. Um canal não precisa de provisionamento: ele existe assim que algo se inscreve nele.
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
Resultados e pontuações ao vivo
Atualizações de partidas, resultados de sondagens, noites eleitorais: uma chamada de publicação distribui o novo valor para todos os ecrãs subscritos ao mesmo tempo.
- 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
Um estafeta no mapa do cliente, amigos a partilhar uma rota, uma frota no ecrã de despacho: publique coordenadas e cada observador acompanha, com a última posição conhecida em cache para participantes tardios.
- 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.
Explore o Realtime
Cada funcionalidade em detalhe. Uma app, um par de chaves.
Canais.
Públicos, privados, de presença, encriptados e em cache — tudo definido pelo nome.
Presença.
Quem está na sala, quem acabou de sair e como contactar alguém diretamente.
Segurança.
Subscrições assinadas pelo seu backend, conexões autorizadas e encriptação ponta a ponta.
Webhooks.
O seu servidor é notificado quando um canal enche, esvazia ou perde o cache.
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.
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);
});
Cada mudança de estado é um webhook.
Clientes entram e saem sem nunca tocar no seu backend. É assim que ele fica a saber: inicie o trabalho pesado quando o primeiro subscritor chega, pare quando o último sai e mantenha a sua própria visão de quem está numa sala.
{
"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.
Put it into practice.
Continue with the documentation, guides and examples for this topic. Resources are in English.