Skip to main content
Connect Shoal to Telegram for daily intelligence digests delivered to your team’s channel or group. The bot fetches top signal events and formats them as a clean, numbered digest.

What You Get

  • Daily digest — Top signal events ranked by signal score, delivered on schedule
  • Clean formatting — Numbered list with bold titles, signal scores, and concise summaries
  • Channel or group delivery — Works with Telegram channels, groups, and supergroups

Digest Format

The daily digest is formatted as a single message:
🐚 Shoal Daily Digest — Mar 11, 2026
─────

🔥 Top Signal Events

1. Aave $21M Wrongful Liquidations (signal: 23.47)
Chaos Labs' automated oracle cap update mispriced wstETH
collateral, triggering ~$21M in wrongful liquidations.
Major DeFi risk story.

2. Nasdaq Tokenization Push (signal: 20.52)
Nasdaq moves closer to "always on" trading with tokenized
securities. SEC rule change filed — potential launch late
Q3 2026.

3. Gemini/Google Product Blitz (signal: 8.0)
Google drops Gemini Embedding 2 (multimodal), Nano Banana 2
(image gen), Lyria 3 (music gen), and Flash-Lite 3.1.
Massive product week.
Events are ranked by signal score (higher = more significant relative to baseline social impressions). Each entry includes:
  • Rank and title (bold)
  • Signal score — ratio of actual impressions to platform baseline
  • Summary — concise 1-2 sentence description

Setup

1. Create a Telegram Bot

Message @BotFather on Telegram:
/newbot
Follow the prompts to name your bot. BotFather gives you a token like 8345440207:AAFOdtxvg8FlzxIwrPbe6siNMoRg9gMYF4I.

2. Get Your Channel ID

Add the bot to your channel/group as an admin, then send a message. Fetch the chat ID:
curl "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates" | python3 -m json.tool
Look for "chat": {"id": -100XXXXXXXXXX} — that negative number is your channel ID.

3. Configure Environment

# .env
SHOAL_API_KEY=your_shoal_api_key
TELEGRAM_BOT_KEY=8345440207:AAFOdtxvg8FlzxIwrPbe6siNMoRg9gMYF4I
TELEGRAM_CHANNEL_ID=-1003846621812

4. Example Script

const SHOAL_API_KEY = process.env.SHOAL_API_KEY;
const TG_TOKEN = process.env.TELEGRAM_BOT_KEY;
const TG_CHAT = process.env.TELEGRAM_CHANNEL_ID;

async function sendDigest() {
  // Fetch today's top signal events
  const since = new Date(Date.now() - 24 * 3600_000).toISOString();
  const res = await fetch(
    `https://api.shoal.xyz/v1/signal/all?since=${encodeURIComponent(since)}&limit=10`,
    { headers: { Authorization: `Bearer ${SHOAL_API_KEY}` } }
  );
  const { data: events } = await res.json();

  if (!events?.length) return;

  // Sort by signal score descending
  events.sort((a, b) => (b.signal ?? 0) - (a.signal ?? 0));

  const today = new Date().toLocaleDateString("en-US", {
    month: "short", day: "numeric", year: "numeric",
  });

  let msg = `🐚 *Shoal Daily Digest — ${today}*\n─────\n\n🔥 *Top Signal Events*\n`;

  events.forEach((e, i) => {
    const orgs = (e.eventOwner || []).map((o) => o.label).join(", ");
    msg += `\n*${i + 1}. ${e.title}* (signal: ${e.signal ?? "—"})\n`;
    msg += `${e.globalSummary}\n`;
  });

  // Send to Telegram
  await fetch(`https://api.telegram.org/bot${TG_TOKEN}/sendMessage`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      chat_id: TG_CHAT,
      text: msg,
      parse_mode: "Markdown",
    }),
  });
}

sendDigest();
Run this on a cron schedule (e.g., daily at 9 AM) to deliver a morning digest.

Architecture

┌──────────┐    cron / scheduled     ┌──────────────┐
│  Script   │ ◄────────────────────► │  Shoal API   │
│           │                        │ api.shoal.xyz│
└─────┬─────┘                        └──────────────┘

      │ sendMessage

┌──────────────┐
│ TG Channel   │
└──────────────┘
Unlike the Slack integration (which runs continuously), the Telegram integration is typically run as a scheduled task — a cron job, GitHub Action, or serverless function that fires once or twice per day.

Comparison

FeatureSlackTelegram
DeliveryReal-time (60s polling)Scheduled digest
FormatRich Block Kit cardsMarkdown messages
InteractivitySlash commandsBot commands (optional)
Best forTeam collaboration channelsMobile-first alerts, executive summaries