Note · 2026-05-15

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

Methodology details: /methodology#signal-steam_detection.