r/ParlayAPI

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)
  • directionboth | toward_favorite | toward_dog (filter to one direction of line movement, useful for sharp-money detection)
  • bookmakersmarketsevent_id: narrowing filters
  • heartbeat_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 playermarket_keymarket, and line.

Tier: Business+ ($40/mo), same gate as our other streams.

Behavior to know about:

  1. 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.
  2. Per-connection state. Each customer's connection has its own tracking dict, no shared state. If you reconnect frequently, you re-prime each time.
  3. Side keys for props are {market_key}:{player}:over@{line} and {market_key}:{player}:under@{line}. For game lines: h2h_homeh2h_awayspread_home@-7.5total_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

reddit.com
u/JacobTheBuddha — 1 day ago

Every winning sports bettor I know has at least 5 sportsbook accounts

Not for promos, not for spreading action. For one boring reason: they shop the line.

Same game, same bet, different prices. Books don't coordinate. Here's a real spread from last night's NBA games:

Lakers -3.5

  • DraftKings: -110
  • FanDuel: -108
  • BetMGM: -112
  • Caesars: -110
  • Pinnacle: -107

Same bet. Five different prices. If you put $110 down on the Lakers at BetMGM, you'd win $98.21. The exact same bet at Pinnacle wins $102.80.

Per bet that's pocket change. Over 1,000 bets a season at $110 stakes, that's $2,000 to $3,000 you've left on the table just by not checking the other apps. For free.

Casual bettors don't shop. They open one app, place the bet, move on. They're paying the worst available price every time and wondering why their bankroll grinds down even when they hit at a normal rate.

How to actually do it without losing your mind:

  1. Open accounts at 4-5 books. DraftKings, FanDuel, BetMGM, Caesars, BetRivers cover most US states. Deposits are $0 each, no commitment.
  2. Before placing any bet, check the same market across all of them. Odds comparison sites do this in 5 seconds. Some free APIs return every book's price in a single call (this sub's whole reason for existing).
  3. Take the best price. That's the whole strategy. There is no clever step 4.

The math is boring and that's why it works. Most bettors won't do it because each shopping session feels like winning $2 instead of winning $100. The compound effect is what matters. Shopping every bet for a season is often the difference between "down a little" and "actually broke even".

The obvious counterargument: "What if I get limited at the book that always has the best price?" Soft books (DK, FanDuel especially) do limit winning bettors. The fix is the same as the original advice: spread your action across multiple books, never bet huge on one. If you're flat-staking $50-100 per bet, you fly under the radar at all of them for years.

Anyone here still using just one book? Genuinely curious what's keeping you from spreading out.

reddit.com
u/JacobTheBuddha — 4 days ago