Blog

· 4 min de lecture

Envoyer une annonce sur Discord, Slack et Telegram en un seul appel API

Diffusez notes de version et annonces vers un salon Discord, un canal Slack et un canal Telegram depuis votre application, avec une seule requête REST et sans app développeur à déclarer.

Votre communauté vit à trois endroits : un serveur Discord, un espace Slack et un canal Telegram. À chaque version, quelqu’un recopie la même annonce dans les trois, à la main. Souvent en retard, parfois en oubliant l’un d’eux, et le formatage n’est jamais tout à fait le même.

L’automatiser soi-même, c’est trois intégrations différentes :

  • Discord attend un JSON envoyé au webhook du salon, avec les images en embeds et une limite de 2 000 caractères.
  • Slack attend une autre forme de payload, vers l’URL d’un incoming webhook.
  • Telegram attend un token de bot, un identifiant de chat, et une méthode différente pour le texte, les photos, les vidéos et les albums.

Voici comment envoyer la même annonce aux trois avec une seule requête, via Hapi. Aucun des trois ne demande d’application développeur ni de validation de plateforme : vous pouvez être en ligne en une dizaine de minutes.

Étape 1 : récupérer un identifiant sur chaque plateforme

Discord : ouvrez votre serveur, allez dans Paramètres du serveur → Intégrations → Webhooks → Nouveau webhook, choisissez le salon (par exemple #announcements) et cliquez sur Copier l’URL du webhook.

Slack : créez un incoming webhook pour votre espace de travail et choisissez le canal de destination (par exemple #launches). Copiez l’URL qui commence par https://hooks.slack.com/services/.

Telegram : écrivez à @BotFather, envoyez /newbot et copiez le token du bot. Ajoutez le bot à votre canal en tant qu’administrateur. L’identifiant du chat est le @username du canal, ou son identifiant numérique s’il est privé.

Étape 2 : les connecter dans Hapi

Créez un compte Hapi, ouvrez Accounts → Connect et collez chaque secret. Hapi vérifie que chaque URL est bien un webhook Discord ou Slack avant de l’enregistrer. Les URL de webhook et les tokens de bot sont chiffrés au repos (AES-256-GCM) et ne sont jamais renvoyés au navigateur : personne dans l’équipe ne peut les recopier depuis le tableau de bord.

Créez ensuite une clé sous API keys et placez-la dans votre environnement :

bash
export HAPI_API_KEY="hapi_live_..."

Étape 3 : une annonce, partout

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: release-2-4-0" \
  -d '{
    "content": "v2.4 is out 🎉 Dark mode, CSV export and 3x faster search. Full notes: https://example.com/changelog",
    "platforms": ["discord", "slack", "telegram"],
    "mediaUrls": ["https://example.com/v2.4-banner.png"]
  }'

La réponse est un 201 avec un résultat par canal. Vous voyez tout de suite que le message est bien arrivé sur Discord, Slack et Telegram.

Depuis votre pipeline de release (Node.js)

L’endroit le plus utile pour cet appel, c’est la fin du script de déploiement : l’annonce part au moment où la version est en ligne.

js
await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
    // Same key on a retried deploy = no duplicate announcement.
    "Idempotency-Key": `release-${process.env.RELEASE_VERSION}`,
  },
  body: JSON.stringify({
    content: `${process.env.RELEASE_VERSION} is live 🚀 ${process.env.RELEASE_NOTES_URL}`,
    platforms: ["discord", "slack", "telegram"],
  }),
});

L’en-tête Idempotency-Key compte ici. Les jobs de CI sont relancés, et sans cette clé un déploiement capricieux peut annoncer trois fois la même version.

Étape 4 : adapter le message à chaque canal

Votre espace Slack s’adresse peut-être aux clients, et votre canal Telegram à la communauté au sens large. platformOptions change le texte par canal, dans la même requête :

json
{
  "content": "v2.4 is out 🎉 Dark mode, CSV export and 3x faster search.",
  "platforms": ["discord", "slack", "telegram"],
  "platformOptions": {
    "slack": { "content": "v2.4 is live for all workspaces. Dark mode, CSV export and faster search. Questions? Reply in this thread." },
    "telegram": { "content": "v2.4 is out 🎉 Dark mode, CSV export, 3x faster search. Changelog: https://example.com/changelog" }
  }
}

Hapi valide chaque version contre les limites de la plateforme avant d’accepter la requête. Si le texte Discord dépasse 2 000 caractères, vous le savez maintenant, pas après la mise en ligne.

Étape 5 : l’envoyer au bon moment

Vous voulez que le lancement parte à 9 h dans le fuseau de vos utilisateurs, et non à l’heure où le déploiement s’est terminé ? Ajoutez une date :

json
{
  "content": "Launch day 🚀 v3.0 is here.",
  "platforms": ["discord", "slack", "telegram"],
  "scheduledAt": "2026-11-20T09:00:00-05:00",
  "timezone": "America/New_York"
}

Aucun de ces trois réseaux ne permet à un webhook ou à un bot de programmer un message. Hapi conserve le post et l’envoie à l’heure dite, puis émet un webhook signé post.published ou post.failed vers votre application, avec le résultat de chaque canal.

Bon à savoir

  • Images : Discord affiche jusqu’à 10 images en embeds. Telegram envoie une seule photo ou vidéo, ou un album de 10 au plus si vous en joignez plusieurs. Avec un média, la légende Telegram est limitée à 1 024 caractères : gardez les annonces illustrées courtes.
  • Réponses Telegram : ajoutez firstComment et Hapi le publie en réponse à votre annonce. Pratique pour un « on en discute ici » ou un lien vers le changelog complet.
  • Suppression : vous pouvez supprimer les posts Discord et Telegram via DELETE /v1/posts/{id}. Les incoming webhooks Slack ne savent pas supprimer un message : relisez le texte Slack avant l’envoi.
  • D’autres réseaux, le même appel : ajoutez "x", "linkedin" ou "bluesky" à platforms pour annoncer publiquement en même temps.

Ce que vous avez évité

  • Trois formats de payload et trois jeux de limites
  • Le chiffrement et le stockage sûr des URL de webhook et des tokens de bot
  • Un planificateur, puisque aucune de ces plateformes ne programme pour vous
  • Des relances sans doublon, et un compte-rendu d’échec par canal

Démarrer l’essai de 15 jours → L’essai à 5 $ couvre 5 canaux connectés et 300 publications sur 15 jours : assez pour Discord, Slack et Telegram dès le premier jour.