Sign inGet started

Publicando eventos

Publique a partir do seu servidor usando sua chave Bird API e a chave e o segredo do app Realtime. Nunca inclua o segredo do app em código do lado do cliente. Para permitir que clientes inscritos troquem sinais de curta duração, use eventos de cliente em canais privados ou de presença.

Uma publicação mínima

Um evento requer um nome e pelo menos um canal. Seu payload opcional pode conter qualquer objeto, array ou escalar JSON.
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({
  apiKey: process.env.BIRD_API_KEY,
  realtime: {
    key: process.env.BIRD_REALTIME_KEY,
    secret: process.env.BIRD_REALTIME_SECRET,
  },
});

await bird.realtime.publish("rap_01krdgeqcxet5s7t44vh8rt9mg", {
  event: "order-updated",
  channels: ["orders"],
  data: { id: 42, status: "shipped" },
});
Clientes vinculados a order-updated em orders recebem o evento. O API rejeita nomes publicados pelo servidor que comecem com os prefixos de protocolo bird: ou bird_internal:. Nomes de eventos originados pelo cliente devem começar com client-.
A solicitação e a resposta completas, incluindo todos os campos, estão na referência publicar um evento.

O que um 200 significa

A publicação é concluída depois que a borda Realtime aceita o evento. A entrega é assíncrona e não tem confirmação por cliente. Um cliente que se desconectar durante a entrega pode perder o evento, e o Realtime não o reenvia após a reconexão.
Armazene estado durável no seu banco de dados. Use eventos para anunciar mudanças e faça os clientes recarregarem o estado atual após a reconexão.

Transmitindo para vários canais

Uma chamada pode enviar o mesmo evento para até 100 canais. Um canal private-encrypted- deve ser o único canal na publicação, porque cada canal criptografado usa uma chave diferente. O API rejeita um fan-out criptografado com E23000. Veja Canais criptografados.
await bird.realtime.publish(appId, {
  event: "price-changed",
  channels: ["ticker-btc", "ticker-eth", "ticker-sol"],
  data: { at: "2026-07-31T09:00:00Z" },
});
Cada canal de destino conta como uma mensagem separada para uso. Este exemplo conta como três mensagens. Uma publicação para 10.000 canais por usuário conta, portanto, como 10.000 mensagens.

Agrupando eventos não relacionados em lote

Um broadcast envia um evento para vários canais. Um lote envia até 10 eventos diferentes, cada um para um canal, em uma única solicitação.
await bird.realtime.publishBatch(appId, {
  events: [
    { event: "order-updated", channels: ["orders-42"], data: { status: "shipped" } },
    { event: "stock-changed", channels: ["inventory-99"], data: { left: 3 } },
  ],
});
Use um lote para combinar atualizações não relacionadas em uma solicitação. Cada evento ainda conta separadamente para uso, e um lote aceita no máximo 10 eventos. Veja Publicar um lote.

Excluindo o cliente que executou a ação

Se um cliente já aplicou sua ação localmente, passe o ID de conexão dele para evitar que a publicação resultante aplique a mesma mudança novamente. A borda ignora apenas essa conexão.
await bird.realtime.publish(appId, {
  event: "message.created",
  channels: ["presence-room-1"],
  data: { body: "hello" },
  exclude_connection_id: "26896.319537",
});
Leia o ID da conexão atual do cliente e inclua-o na solicitação que dispara a mudança. Outras abas usam conexões separadas e ainda recebem o evento.

Lendo o estado do canal ao publicar

Use include para retornar o estado de cada canal de destino no momento da publicação e evitar uma solicitação separada de estado do canal:
const result = await bird.realtime.publish(appId, {
  event: "order-updated",
  channels: ["presence-lobby"],
  data: { id: 42 },
  include: ["member_count", "connection_count"],
});
member_count funciona apenas em canais de presença. connection_count requer contagem de conexões no app. Solicitar esses atributos conta como uma mensagem extra para uso.

Limites

LimiteValor
Canais por publicação100
Eventos por lote10
Payload do evento10 KB serializado
Nome do canal164 caracteres, letras, dígitos e _ - = @ , . ;
Nome do evento200 caracteres
Exceder qualquer limite retorna um erro de validação. O API não trunca a solicitação.

Tentando novamente com segurança

Tente novamente uma publicação com a mesma Idempotency-Key para evitar entrega duplicada. Os SDKs de TypeScript e Go geram uma chave e a reutilizam para tentativas automáticas. Se sua aplicação tentar novamente uma solicitação, forneça e reutilize sua própria chave. Veja Idempotência.

Próximos passos