Post EXTREME options flow to Discord
Turn your trading server into a live tape. Stand up a tiny receiver that listens for RadarPulse webhook events, the moment a name hits a high score, an EXTREME print, or smart-money confluence, verifies the signature, and drops a rich, color-coded alert into a Discord channel: score breakdown, bias, premium, and one-tap chart/news links.
What it does. RadarPulse pushes a signed JSON event to your URL when a signal fires. The receiver verifies the X-RadarPulse-Signature HMAC, then formats a Discord embed with the print, its EXTREME flag, the four-factor score breakdown, and links, no polling, no API key, and forged events are rejected.
Prerequisites
- A RadarPulse account with webhook access (Elite, in private beta, join the waitlist) and a registered webhook + its signing secret.
- A Discord server you can add a channel webhook to (Server Settings → Integrations → Webhooks).
- A Node.js 18+ host with a public HTTPS URL: Railway, Render, Fly.io, or Val Town all work.
- Flow tiering: real-time events are Elite; 15-minute-delayed flow is available on lower tiers.
The receiver
Illustrative Node/Express receiver against the RadarPulse API beta. It verifies the signature over timestamp + "." + body (the exact bytes RadarPulse signed), rejects stale or forged deliveries, then posts a Discord embed.
// extreme-flow-to-discord.mjs, relay signed RadarPulse webhook events to Discord
import express from "express";
import crypto from "node:crypto";
const SECRET = process.env.RADARPULSE_WEBHOOK_SECRET; // shown once when you create the webhook
const DISCORD = process.env.DISCORD_WEBHOOK_URL; // Discord channel "Integrations → Webhooks" URL
const app = express();
// Keep the RAW bytes, the signature is computed over exactly what was sent.
app.use(express.raw({ type: "application/json" }));
function verified(req) {
const ts = req.get("X-RadarPulse-Timestamp") || "";
const sig = req.get("X-RadarPulse-Signature") || "";
const mac = "sha256=" + crypto.createHmac("sha256", SECRET)
.update(ts + "." + req.body).digest("hex"); // HMAC over "timestamp.body"
if (sig.length !== mac.length) return false;
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mac))) return false;
return Math.abs(Date.now() - Number(ts)) < 5 * 60_000; // reject stale events (replay guard)
}
app.post("/radarpulse", async (req, res) => {
if (!verified(req)) return res.status(401).end(); // drop forged / stale deliveries
res.status(200).end(); // ack fast; fan out after
const e = JSON.parse(req.body.toString("utf8"));
const sp = e.scoreParts || {}; // { volOI, premium, dte, otm } weighted points
const embed = {
title: `${e.ticker} ${e.type ?? ""} · ${e.flag ?? "FLOW"}, score ${e.score}`,
url: e.links?.app,
color: e.bias === "BEAR" ? 0xFF4D6D : 0x2ECC8F, // red puts / green calls
description:
`**${e.bias ?? ", "}** · ${e.premiumFmt ?? e.premium ?? ", "} premium` +
(e.confluence ? `\n${e.confluence.n} aligned prints · ${e.confluence.netFmt}` : ""),
fields: [
{ name: "Vol/OI", value: `${sp.volOI ?? ", "}`, inline: true },
{ name: "Premium", value: `${sp.premium ?? ", "}`, inline: true },
{ name: "DTE", value: `${sp.dte ?? ", "}`, inline: true },
{ name: "Chart", value: `[open](${e.links?.chart})`, inline: true },
{ name: "News", value: `[open](${e.links?.news})`, inline: true }
],
footer: { text: `RadarPulse · ${e.kind ?? "flow"} ${e.side ?? ""}`.trim() }
};
await fetch(DISCORD, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username: "RadarPulse", embeds: [embed] })
});
});
app.listen(process.env.PORT || 3000, () => console.log("Listening for RadarPulse webhooks"));
The event shape (ticker, type, bias, score, scoreParts, flag, premiumFmt, links, optional confluence) and the sha256=… signature header are part of the RadarPulse API beta; the authoritative reference ships with your beta access.
How to run it
RADARPULSE_WEBHOOK_SECRET and DISCORD_WEBHOOK_URL in the receiver's env.Risk & responsibility. Alerts are informational, not signals, unusual options prints can reflect hedging or spreads and are not buy/sell recommendations. Always verify the signature and reject stale timestamps so no one can spoof alerts into your server; keep your webhook secret out of source control. You are responsible for the receiver you run, its uptime, and respecting Discord's terms and rate limits. Trading and investing involve substantial risk of loss.
Get beta webhook access
Signed, real-time flow + confluence webhooks power this bot. Join the waitlist for early developer access.
Join the waitlist →