Steam detection: what 'sharp money' actually looks like in our logs
Coordinated line moves across multiple sharp books inside a 5-minute window. Two real examples from the steam log + what we filter out as noise.
Every minute during NFL active windows we pull current prices from five sharp books: Pinnacle, Circa, BetOnline, Bookmaker, and 5Dimes. When ≥2 of them move the same market in the same direction by ≥2pp inside a 5-minute window, that's a steam event. We log it, dispatch it to a Slack webhook, and surface it on /trust/steam.
What steam actually looks like
A typical steam event from the log:
11:42 ET KC@LAR h2h/home +3.2pp Pinnacle, Circa
11:43 ET KC@LAR h2h/home +2.8pp BetOnline
Three sharp books moved Chiefs ML higher within 90 seconds. Pinnacle and Circa moved first; BetOnline followed within a minute. That's the coordination we're detecting — it doesn't happen because each book independently decided to move; it happens because real money hit Chiefs at one of them and the others followed the sharpest book's lead.
What we deliberately filter out
Single-book moves
If only Pinnacle moves and the other four sit still, that's most likely a Pinnacle correction (operator error, late injury news Pinnacle priced first) — not coordinated sharp money. We require ≥2 books before we call it steam.
Sub-2pp jitter
Sharp books retick prices constantly as bots arb against each other in microseconds. A 0.5pp move on Pinnacle that drifts back within 90 seconds is jitter, not action. The 2pp floor filters this.
Moves outside the 5-minute window
A move at 11:42 and another at 11:55 might be related but most often isn't. The 5-minute window catches the coordination burst; longer windows muddle real signal with bookkeeping activity.
Two real examples from the production log
Example 1: Late injury news
On a Sunday morning at 11:42 ET, the starting safety for the home team gets ruled out. Sharp books that have insider feeds adjust within seconds. Three of our five sharp anchors move the spread by 2-4pp inside the next two minutes. Steam fires. Anyone watching the alert had a 4-8 minute window before retail books (DraftKings, FanDuel) caught up.
Sharp users with our watchlist set on that game got the alert pushed to /me/alerts in real time. Whether they acted on it is their call — we don't tell users what to bet, just when the sharps move.
Example 2: Sharp action with no news
More interesting: a Friday afternoon, no injury news, no weather change, no public coverage. Two sharp books move the total over by 2.5pp inside 4 minutes. No retail book moves for another 20 minutes.
That's a syndicate or a sharp group placing real money quietly. We don't know who or why. What we know: when this pattern fires on a game we have a model take on, our pick either agrees with the steam (confidence ↑) or disagrees (worth pausing to reconcile).
Why the dispatch is best-effort, not authoritative
We dispatch to a Slack webhook if you've configured one and fan out per-user alerts to anyone watchlisting the game. The authoritative surface is the in-product /trust/steam feed — it's polling every 60 seconds and shows the last 50 alerts. Slack/email can drop messages, the feed cannot.
The honest caveats
- NFL is the only sport with steam detection wired today. Other sports get the watchlist + per-user alerts when we extend the cron.
- Sharp books occasionally move in concert for non-sharp reasons (operator error, limit changes). The 2pp floor + 5-minute window catches most coordination, not all.
- Steam direction tells you SHARP money is on a side. It does not guarantee that side wins. Sharps lose. Sharps lose less than the public on average.
Methodology details: /methodology#signal-steam_detection.