Sign inGet started

Publier des événements

Publiez depuis votre serveur avec votre clé Bird API ainsi que la clé et le secret de l'application Realtime. Ne livrez jamais le secret de l'application dans le code client. Pour permettre aux clients abonnés d'échanger des signaux éphémères, utilisez les événements client sur les canaux privés ou de présence.

Une publication minimale

Un événement nécessite un nom et au moins un canal. Son contenu optionnel peut être n'importe quel objet, tableau ou scalaire 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" },
});
Les clients liés à order-updated sur orders reçoivent l'événement. Le API rejette les noms publiés par le serveur qui commencent par les préfixes de protocole bird: ou bird_internal:. Les noms d'événements émis par le client doivent commencer par client-.
La requête et la réponse complètes, avec chaque champ, se trouvent dans la référence publier un événement.

Ce que signifie un 200

La publication se termine dès que le point d'entrée Realtime accepte l'événement. La livraison est asynchrone et ne génère aucun accusé de réception par client. Un client qui se déconnecte pendant la livraison peut manquer l'événement, et Realtime ne le rejoue pas après reconnexion.
Stockez l'état durable dans votre base de données. Utilisez les événements pour signaler les changements, puis faites recharger l'état courant par les clients après reconnexion.

Diffuser vers plusieurs canaux

Un seul appel peut envoyer le même événement à 100 canaux maximum. Un canal private-encrypted- doit être le seul canal de sa publication, car chaque canal chiffré utilise une clé différente. Le API rejette une diffusion chiffrée avec E23000. Voir Canaux chiffrés.
await bird.realtime.publish(appId, {
  event: "price-changed",
  channels: ["ticker-btc", "ticker-eth", "ticker-sol"],
  data: { at: "2026-07-31T09:00:00Z" },
});
Chaque canal cible compte comme un message distinct pour la consommation. Cet exemple compte comme trois messages. Une publication vers 10 000 canaux par utilisateur compte donc comme 10 000 messages.

Regrouper des événements indépendants

Une diffusion envoie un événement vers plusieurs canaux. Un lot envoie jusqu'à 10 événements différents, chacun vers un canal, en une seule requête.
await bird.realtime.publishBatch(appId, {
  events: [
    { event: "order-updated", channels: ["orders-42"], data: { status: "shipped" } },
    { event: "stock-changed", channels: ["inventory-99"], data: { left: 3 } },
  ],
});
Utilisez un lot pour combiner des mises à jour indépendantes en une seule requête. Chaque événement compte toujours séparément pour la consommation, et un lot accepte au maximum 10 événements. Voir Publier un lot.

Exclure le client à l'origine de l'action

Si un client a déjà appliqué son action localement, transmettez son identifiant de connexion pour empêcher la publication résultante d'appliquer le même changement une seconde fois. Le point d'entrée ignore uniquement cette connexion.
await bird.realtime.publish(appId, {
  event: "message.created",
  channels: ["presence-room-1"],
  data: { body: "hello" },
  exclude_connection_id: "26896.319537",
});
Lisez l'identifiant depuis la connexion courante du client et incluez-le dans la requête qui déclenche le changement. Les autres onglets utilisent des connexions séparées et reçoivent toujours l'événement.

Lire l'état du canal lors de la publication

Utilisez include pour renvoyer l'état de chaque canal cible au moment de la publication et éviter une requête d'état de canal séparée :
const result = await bird.realtime.publish(appId, {
  event: "order-updated",
  channels: ["presence-lobby"],
  data: { id: 42 },
  include: ["member_count", "connection_count"],
});
member_count fonctionne uniquement sur les canaux de présence. connection_count nécessite le comptage des connexions sur l'application. Demander ces attributs compte comme un message supplémentaire pour la consommation.

Limites

LimiteValeur
Canaux par publication100
Événements par lot10
Contenu de l'événement10 Ko sérialisé
Nom du canal164 caractères, lettres, chiffres et _ - = @ , . ;
Nom de l'événement200 caractères
Dépasser une limite renvoie une erreur de validation. Le API ne tronque pas la requête.

Réessayer en toute sécurité

Réessayez une publication avec la même Idempotency-Key pour éviter une livraison en double. Les SDK TypeScript et Go génèrent une clé et la réutilisent pour les tentatives automatiques. Si votre application réessaie une requête, fournissez et réutilisez sa propre clé. Voir Idempotence.

Étapes suivantes