Sign inGet started

Publicar eventos

Publica desde tu servidor usando tu clave Bird API y la clave y el secreto de la app de Realtime. Nunca incluyas el secreto de la app en código del cliente. Para que los clientes suscritos intercambien señales efímeras, usa eventos de cliente en canales privados o de presencia.

Una publicación mínima

Un evento requiere un nombre y al menos un canal. Su payload opcional puede contener cualquier objeto, arreglo o 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" },
});
Los clientes vinculados a order-updated en orders reciben el evento. El API rechaza nombres publicados desde el servidor que comiencen con los prefijos de protocolo bird: o bird_internal:. Los nombres de eventos originados por el cliente deben comenzar con client-.
La solicitud y respuesta completas, incluidos todos los campos, están en la referencia de publicar un evento.

Qué significa un 200

La publicación se completa cuando el borde de Realtime acepta el evento. La entrega es asíncrona y no tiene confirmación por cliente. Un cliente que se desconecte durante la entrega puede perder el evento, y Realtime no lo reproduce tras reconectarse.
Almacena el estado persistente en tu base de datos. Usa eventos para anunciar cambios y haz que los clientes recarguen el estado actual tras reconectarse.

Transmitir a varios canales

Una sola llamada puede enviar el mismo evento a hasta 100 canales. Un canal private-encrypted- debe ser el único canal en su publicación porque cada canal cifrado usa una clave diferente. El API rechaza un fan-out cifrado con E23000. Consulta Canales cifrados.
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 cuenta como un mensaje independiente para el consumo. Este ejemplo cuenta como tres mensajes. Una publicación a 10.000 canales por usuario cuenta, por lo tanto, como 10.000 mensajes.

Agrupar eventos no relacionados en lotes

Una transmisión envía un evento a muchos canales. Un lote envía hasta 10 eventos diferentes, cada uno a un canal, en una sola solicitud.
await bird.realtime.publishBatch(appId, {
  events: [
    { event: "order-updated", channels: ["orders-42"], data: { status: "shipped" } },
    { event: "stock-changed", channels: ["inventory-99"], data: { left: 3 } },
  ],
});
Usa un lote para combinar actualizaciones no relacionadas en una sola solicitud. Cada evento sigue contando por separado en el consumo, y un lote acepta como máximo 10 eventos. Consulta Publicar un lote.

Excluir al cliente que realizó la acción

Si un cliente ya aplicó su acción localmente, pasa su ID de conexión para evitar que la publicación resultante aplique el mismo cambio de nuevo. El borde omite solo esa conexión.
await bird.realtime.publish(appId, {
  event: "message.created",
  channels: ["presence-room-1"],
  data: { body: "hello" },
  exclude_connection_id: "26896.319537",
});
Lee el ID de la conexión actual del cliente e inclúyelo en la solicitud que desencadena el cambio. Otras pestañas usan conexiones separadas y siguen recibiendo el evento.

Leer el estado del canal al publicar

Usa include para devolver el estado de cada canal de destino en el momento de la publicación y evitar una solicitud de estado de canal aparte:
const result = await bird.realtime.publish(appId, {
  event: "order-updated",
  channels: ["presence-lobby"],
  data: { id: 42 },
  include: ["member_count", "connection_count"],
});
member_count solo funciona en canales de presencia. connection_count requiere conteo de conexiones en la app. Solicitar estos atributos cuenta como un mensaje extra en el consumo.

Límites

LímiteValor
Canales por publicación100
Eventos por lote10
Payload del evento10 KB serializados
Nombre de canal164 caracteres, letras, dígitos y _ - = @ , . ;
Nombre de evento200 caracteres
Superar cualquier límite devuelve un error de validación. El API no trunca la solicitud.

Reintentar de forma segura

Reintenta una publicación con la misma Idempotency-Key para evitar entregas duplicadas. Los SDK de TypeScript y Go generan una clave y la reutilizan en reintentos automáticos. Si tu aplicación reintenta una solicitud, proporciona y reutiliza su propia clave. Consulta Idempotencia.

Próximos pasos