Skip to main content

What you’ll get

A poller that prints every unusual-flow signal once, with the trades and dollars behind it, and marks a signal that keeps firing as extended rather than repeating it. A second call shows which way the money went and whether the market is liquid enough to matter. On 2026-09-17 the last hour filled a 100-signal page, most of it 15-minute crypto markets with no history to compare against.

Prerequisites

  • An API key in ROUTEUR_API_KEY
  • Python 3 with requests, or Node 18+
1

Read the signals of the last hour

Signals are scored every five minutes against the market’s own previous week. Repeated detections of the same market and kind within an hour extend one signal, so id stays the same and last_detected_at moves.
Two signals, as observed 2026-09-17 12:39 UTC:
2

Poll, and print each signal once

Keep id together with last_detected_at: a signal you have printed is only worth printing again when it has been extended.
The first pass, observed 2026-09-17 12:52 UTC and trimmed to six of 100 lines:
3

Check the money behind it

A flow signal names its market but not its size. GET /v1/insights/flows ranks markets by net money toward Yes or No over the window, carries every liquidity field, and leaves thin markets out by default (min_volume_usd, max_spread_usd, include_thin change that).
For the fills themselves, read GET /v1/markets/{venue}/{id}/trades, or GET /v1/insights/tape?min_usd=5000 for the largest fills across venues.

Read the result

Pitfalls

  • A score of 1000 is a missing baseline, not a giant surprise. The 15-minute crypto and commodity markets on Kalshi are new every quarter hour, so anything they trade is “unusual” against an empty week. Filter them out by title, or by requiring baseline_trades_per_window > 0, if you want signals on markets with history.
  • Signals describe trading, not its cause. A burst is often news arriving; a large fill can be one account hedging. Say what moved and how much money was behind it.
  • The signal carries no liquidity. market here is venue, id and title only. Read GET /v1/markets/{venue}/{id} or /v1/insights/flows for liquidity, volume_24h_usd and spread_usd before treating it as tradeable.
  • Some markets have no title. A few Kalshi signals on 2026-09-17 came back with title: ""; key on market.id, not the title.
  • Polling faster than five minutes gains nothing; scoring runs every five minutes. For fills as they happen, subscribe to the trades topic of /v1/stream instead: see Stream consumer.

Narrowing it

  • Signals: moves, large fills, one-sided money and unusual flow, and where each comes from.
  • Stream consumer: every recorded fill pushed as it happens, resumable.
  • GET /v1/insights/moves: the biggest 24-hour moves, each with its signals and how many markets the graph relates to it.
  • GET /v1/insights/tape: the largest fills across venues, with the outcome each backs.