Join waitlist →
Developer platform · beta

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.

EndpointReturns
GET /api/v1/flowRecent scored prints (filter by minScore, limit)
GET /api/v1/flow/topThe daily Top 25, ranked by score with EXTREME/ELEVATED/NOTABLE flags
GET /api/v1/score-explainA print's 0–100 score broken into its four weighted factors
GET /api/v1/heatmapSector/ticker premium heat data
GET /api/v1/congressRecent congressional trades (Pro+)
POST /api/v1/hooksSubscribe 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:

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.

Flow Pulse, bull/bear premium split + top scored signals
Leaderboard, top paper-trading challenge ranks

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 →

Keep exploring