Build on RadarPulse
Pipe scored options flow into your own bots, dashboards, and automations. The RadarPulse API gives you the same 0–100 scored flow, daily Top 25, and smart-money trackers that power the app, plus outbound webhooks that fire the moment a name hits a high score, an EXTREME print, or smart-money confluence. The endpoints below are live and answer today; what is limited is access. The API is in private beta on the Elite tier, and keys are generated and managed in the app once your account has it.
Get a beta key. Programmatic access is rolling out to early users. Join the waitlist and mention you want API access.
Request API access →The API at a glance
Authenticate with your key via the x-api-key header. Read endpoints return a documented envelope ({ data, meta }) with honest real-vs-delayed labeling.
| Endpoint | Returns |
|---|---|
GET /api/v1/flow | Recent scored prints (filter by minScore, limit) |
GET /api/v1/flow/top | The daily Top 25, ranked by score with EXTREME/ELEVATED/NOTABLE flags |
GET /api/v1/score-explain | A print's 0–100 score broken into its four weighted factors |
GET /api/v1/heatmap | Sector/ticker premium heat data |
GET /api/v1/congress | Recent congressional trades (Pro+) |
POST /api/v1/hooks | Subscribe an outbound webhook to flow events |
Endpoints are part of the API beta; the full, authoritative reference ships with your key.
Quickstart
Fetch the day's EXTREME flow (score 85+):
# Python
import requests
r = requests.get("https://radarpulse.io/api/v1/flow",
params={"minScore": 85, "limit": 50},
headers={"x-api-key": "YOUR_KEY"})
for p in r.json()["data"]:
print(p["ticker"], p["type"], "score", p["score"], p["bias"])
// Node
const r = await fetch("https://radarpulse.io/api/v1/flow?minScore=85&limit=50",
{ headers: { "x-api-key": process.env.RADARPULSE_API_KEY } });
const { data } = await r.json();
data.forEach(p => console.log(p.ticker, p.type, "score", p.score, p.bias));
Webhooks
Subscribe a URL and RadarPulse will POST a rich, signed JSON event when a name fires. Each delivery carries the print, its score breakdown, the flag, and deep links, so a Discord/Slack/Telegram bot can render a complete alert with no extra calls.
{
"event": "flow.confluence",
"ticker": "NVDA", "type": "CALL", "bias": "BULL",
"score": 92, "flag": "EXTREME",
"scoreParts": { "volOI": 28, "premium": 30, "dte": 18, "otm": 16 },
"premium": 1840000, "premiumFmt": "$1.84M",
"volume": 12500, "oi": 3100, "volOI": 4.0,
"strike": 1300, "dte": 7, "side": "ASK", "kind": "SWEEP",
"links": {
"app": "https://radarpulse.io/?view=flow&t=NVDA",
"chart": "https://radarpulse.io/?view=charts&t=NVDA",
"news": "https://radarpulse.io/?view=news&t=NVDA"
},
"confluence": { "n": 7, "strikes": 3, "netFmt": "$920K bullish" }
}
Verify authenticity before acting. Each delivery also carries an X-RadarPulse-Timestamp header; the signature is an HMAC-SHA256 over timestamp + "." + rawBody (the exact bytes sent). Recompute it, compare in constant time, and reject stale timestamps:
// Node, verify X-RadarPulse-Signature (HMAC over "timestamp.body")
import crypto from "node:crypto";
const ts = req.get("X-RadarPulse-Timestamp"); // ms epoch, as a string
const sig = req.get("X-RadarPulse-Signature"); // "sha256=…"
const mac = "sha256=" + crypto.createHmac("sha256", SECRET)
.update(ts + "." + rawBody).digest("hex"); // sign timestamp + "." + raw body
const ok = sig.length === mac.length
&& crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mac))
&& Math.abs(Date.now() - Number(ts)) < 5 * 60_000; // bound replay
For AI agents: MCP server and llms.txt
Unlike the REST API, these two need no key and are live now. If you are pointing an agent at RadarPulse rather than writing an integration yourself, start here.
The MCP server (Model Context Protocol, streamable HTTP) is at https://flowradar-backend-production.up.railway.app/mcp. GET it for a plain descriptor, or POST JSON-RPC 2.0 for initialize, tools/list and tools/call. Four tools are exposed:
radarpulse_data_status— whether the data is real right now. Call this first if you intend to cite any figure.radarpulse_graded_record— the aggregate graded record: hit rate and sample size, or an explicit building state with counts when nothing has graded yet.radarpulse_graded_board— every tracked signal per session with its outcome and the board'sfingerprint.radarpulse_confluence— the cross-domain board: tickers where two or more of options flow, Congressional disclosures, 13F holdings and lobbying spend agree.
Every tool result carries a provenance block inline, so a number and its data state arrive together and an agent never has to infer whether a low figure means a quiet market or a quiet feed. llms.txt states the same terms in prose, including attribution and the rate limit, which is a shared public limiter rather than a per-key quota.
SDKs, bots & recipes
Official Python and JavaScript/TypeScript SDKs (with a webhook-verify helper), ready-to-run Discord / Telegram / Slack bot templates, and Zapier / Make.com integrations are part of the developer rollout. Want to see what's possible today? The automations gallery has runnable example recipes, auto paper-trade the top EXTREME flows, post Congress + flow confluence to X, and more.
Embeddable widgets
Drop a live RadarPulse widget straight into a blog post, a Notion page, or your own dashboard, no API key, no build step. Each widget is a self-contained, auto-refreshing <iframe> that reads the public flow feed and renders the latest data on every load.
Copy-paste, point src at /embed/pulse or /embed/leaderboard (add ?window=month to the leaderboard for the monthly challenge, or ?theme=light for light-background sites):
<iframe src="https://radarpulse.io/embed/pulse"
title="RadarPulse Flow Pulse"
width="440" height="276"
style="border:0;border-radius:14px;max-width:100%"
loading="lazy"></iframe>
Request a beta API key
Programmatic scored flow, the daily Top 25, and confluence/EXTREME webhooks, for your bots, dashboards, and automations. Join the waitlist for early access.
Request API access →