Saw a competitor ship a feature I liked. Shipped it on our end this morning. (Odds Drop)
Hey r/parlayapi,
Quick update on a feature that just landed: /v1/odds-drop/{sport_key}, an SSE stream that pushes events only when a tracked price moves by >= a configured threshold. Live in the docs at parlay-api.com/docs (streaming section).
Background, since some of you have asked about this:
We've had the raw odds WebSocket and SSE streams for a while. They push every price change, even tiny ones, and your code maintained the previous-price state to detect actual line moves. That's the right architecture for most use cases, but if you're running an arb / +EV / line-shopping scanner specifically, it means rebuilding that state-tracking layer for every (event, book, side) tuple. Worth a Saturday of work, not exactly fun.
A competitor (pinnodds.com) launched an /odds-drop feature last week with this exact ergonomics. Good feature. I'd rather ship it than tell our paying customers to write the same plumbing themselves.
So:
GET /v1/odds-drop/basketball_nba?apiKey=YOUR_KEY&threshold=10
Params:
threshold: minimum American-odds delta to trigger (default 10, so -110 → -120 fires; -110 → -115 doesn't)direction:both | toward_favorite | toward_dog(filter to one direction of line movement, useful for sharp-money detection)bookmakers,markets,event_id: narrowing filtersheartbeat_s: 1-30 seconds
Event shape:
{
"type": "odds_drop",
"event_id": "2026-05-12_Lakers_Warriors",
"bookmaker": "pinnacle",
"side": "h2h_home",
"kind": "game",
"prev": -110,
"new": -120,
"delta": -10,
"direction": "toward_favorite",
"home_team": "Los Angeles Lakers",
"away_team": "Golden State Warriors",
"commence_time": "2026-05-12T22:30:00Z",
"last_update": 1747000000123,
"timestamp": 1747000000124
}
For player props the event also carries player, market_key, market, and line.
Tier: Business+ ($40/mo), same gate as our other streams.
Behavior to know about:
- First observation of each
(event_id, bookmaker, side)is silent. The first time you see a side, we record the current price but don't emit an event. From the next price change onwards, you'll get drops crossing the threshold. So a freshly-opened stream takes 1-3 seconds to "prime" before drops start landing. - Per-connection state. Each customer's connection has its own tracking dict, no shared state. If you reconnect frequently, you re-prime each time.
- Side keys for props are
{market_key}:{player}:over@{line}and{market_key}:{player}:under@{line}. For game lines:h2h_home,h2h_away,spread_home@-7.5,total_over@218.5, etc.
Verification: I stress-tested 10 concurrent connections, all 10 streamed cleanly with ~2 drops/sec/client on active NBA + MLB markets. No errors, no leaked sessions, no memory growth.
Open question for you all: what shape do you actually want this in? Some likely directions:
- "Only emit when the move crosses a vig threshold" (e.g. the implied probability moved by 5%+)
- "Only emit when multiple books move the same side in the same direction within X seconds" (sharp-money confirmation)
- "Only emit when this side's price is the new best across all books I track" (line-shopping winner)
- Something else entirely
Drop a comment with what your scanner actually needs. Easier to ship the right feature if you tell me what good looks like.
Jacob