Blog

· 4 min de lectura

Envía anuncios a Discord, Slack y Telegram con una sola llamada a la API

Difunde notas de versión y anuncios a un canal de Discord, uno de Slack y uno de Telegram desde tu app, con una sola petición REST y sin registrar apps de desarrollador.

Tu comunidad está en tres sitios: un servidor de Discord, un espacio de trabajo de Slack y un canal de Telegram. En cada versión, alguien copia el mismo anuncio en los tres a mano. Suele llegar tarde, a veces falta en uno de ellos y el formato nunca queda del todo bien.

Automatizarlo por tu cuenta son tres integraciones distintas:

  • Discord espera un payload JSON en el webhook del canal, con las imágenes como embeds y un límite de 2000 caracteres.
  • Slack espera otra forma de payload, dirigida a la URL de un incoming webhook.
  • Telegram espera un token de bot, un chat ID y un método distinto para texto, fotos, vídeos y álbumes.

Esta guía muestra cómo enviar el mismo anuncio a los tres con una sola petición, usando Hapi. Ninguno de los tres pide una app de desarrollador ni una revisión de la plataforma, así que puedes tenerlo en marcha en unos diez minutos.

Paso 1: Consigue una credencial de cada plataforma

Discord: abre el servidor, entra en Ajustes del servidor → Integraciones → Webhooks → Nuevo webhook (en inglés: Server Settings → Integrations → Webhooks → New Webhook), elige el canal (por ejemplo #announcements) y pulsa Copiar URL del webhook.

Slack: crea un incoming webhook para el espacio de trabajo y elige el canal donde publica (por ejemplo #launches). Copia la URL que empieza por https://hooks.slack.com/services/.

Telegram: escribe a @BotFather, envía /newbot y copia el token del bot. Añade el bot a tu canal como administrador. El chat ID es el @username del canal, o su identificador numérico si el canal es privado.

Paso 2: Conéctalos en Hapi

Crea una cuenta de Hapi, abre Accounts → Connect y pega cada credencial. Hapi comprueba que cada URL sea un webhook real de Discord o de Slack antes de guardarla. Las URL de webhook y los tokens de bot se cifran en reposo (AES-256-GCM) y nunca vuelven al navegador, así que nadie del equipo puede copiarlos desde el panel.

Después crea una clave en API keys y ponla en el entorno:

bash
export HAPI_API_KEY="hapi_live_..."

Paso 3: Envía un anuncio a todas partes

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"]
  }'

Recibes un 201 con un resultado por canal, así que ves enseguida que llegó a Discord, a Slack y a Telegram.

Desde el pipeline de despliegue (Node.js)

El mejor sitio para esta llamada es el final del script de despliegue: el anuncio sale en el momento en que se publica la versión.

js
await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
    // La misma clave en un despliegue reintentado = el anuncio no se duplica.
    "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"],
  }),
});

Aquí la Idempotency-Key importa. Los jobs de CI se reintentan y, sin esa clave, un despliegue inestable puede anunciar la misma versión tres veces.

Paso 4: Adapta el mensaje a cada canal

Puede que el espacio de Slack sea para clientes y el canal de Telegram para el resto de la comunidad. Con platformOptions cambias el texto de cada canal en la misma petición:

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 valida cada versión contra los límites de esa plataforma antes de aceptar la petición. Si el texto de Discord pasa de 2000 caracteres, te enteras ahora, no después del lanzamiento.

Paso 5: Prográmalo para el momento justo

¿Quieres salir a las 9:00 en la zona horaria de tus usuarios, y no cuando termine el despliegue? Añade una hora:

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

Ninguna de estas tres plataformas permite que un webhook o un bot deje un mensaje programado. Hapi guarda la publicación, la envía a su hora y después dispara hacia tu app un webhook firmado, post.published o post.failed, con el resultado de cada canal.

Conviene saber

  • Imágenes: Discord muestra hasta 10 imágenes como embeds. Telegram envía una sola foto o un vídeo, o un álbum de hasta 10 si adjuntas varias. Con medios adjuntos, Telegram limita el texto que los acompaña a 1024 caracteres, así que los anuncios con imagen conviene dejarlos cortos.
  • Respuestas en Telegram: añade firstComment y Hapi lo publica como respuesta a tu anuncio. Viene bien para un «lo hablamos aquí» o para enlazar el changelog completo.
  • Borrar: las publicaciones de Discord y de Telegram se pueden borrar con DELETE /v1/posts/{id}. Los incoming webhooks de Slack no pueden borrar mensajes, así que revisa el texto de Slack antes de enviarlo.
  • Más redes, la misma llamada: añade "x", "linkedin" o "bluesky" a platforms para anunciarlo también en público.

Lo que te ahorras

  • Tres formatos de payload y tres conjuntos de límites
  • Cifrar y guardar con seguridad las URL de webhook y los tokens de bot
  • Un sistema que las programe, porque ninguna de estas plataformas lo hace por ti
  • Reintentos sin duplicados, y un aviso de fallo por canal

Empieza tu prueba de 15 días → La prueba de 5 USD cubre 5 canales conectados y 300 publicaciones durante 15 días: suficiente para Discord, Slack y Telegram desde el primer día.