Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.shoal.xyz/llms.txt

Use this file to discover all available pages before exploring further.

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
The examples below use the canonical event aliases (summary, owners, significance) rather than the older compatibility fields.

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 significance descending
  events.sort((a, b) => (b.significance ?? b.signal ?? 0) - (a.significance ?? 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.owners || e.eventOwner || []).map((o) => o.label).join(", ");
    msg += `\n*${i + 1}. ${e.title}* (signal: ${e.significance ?? e.signal ?? "—"})\n`;
    if (orgs) msg += `_${orgs}_\n`;
    msg += `${e.summary || 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