Player props are the fastest-moving pre-match lines in sports betting. When a star player is listed as questionable, or when sharp money hits a line, the odds shift within minutes — hours before tipoff. This tutorial builds a Python system that monitors NBA player prop lines before games start, detects significant movements, and sends you alerts so you can act before the market corrects.
All three happen pre-match — typically 1-4 hours before tipoff. This is when monitoring is most valuable, because lines are still adjusting to new information and the market is least efficient. Pre-match prop lines offer significantly more edge and +EV opportunities than live lines, because live odds are algorithmically adjusted in real-time and leave almost no exploitable advantage. Pre-match lines, on the other hand, react slower to breaking news — giving you a window to find genuine edge before the market corrects. The FieldFunded API provides pre-match player props across all major sports, refreshed every 300ms.
import requestsAPI_KEY = "your_api_key_here"BASE = "https://api.fieldfunded.com/v1"H = {"X-API-Key": API_KEY}def get_player_props(event_id): """Fetch all player prop markets for a given event.""" odds = requests.get( f"{BASE}/events/{event_id}/odds", headers=H ).json() prop_keywords = [ "player", "goalscorer", "points", "rebounds", "assists", "threes", "steals", "blocks", "passing", "rushing", "receiving" ] props = [] for market in odds.get("markets", []): name_lower = market["name"].lower() if any(kw in name_lower for kw in prop_keywords): for sel in market["selections"]: props.append({ "market": market["name"], "market_id": market["id"], "selection": sel["name"], "selection_id": sel["id"], "odds": sel["odds"], }) return props# Example: get props for a specific NBA game# props = get_player_props("event_abc123")# print(f"Found {len(props)} player prop lines")
import osDISCORD_WEBHOOK = os.environ.get("DISCORD_WEBHOOK")POLL_INTERVAL = 60 # secondsmonitor = PropMonitor( threshold_pct=3.0, discord_webhook=DISCORD_WEBHOOK,)print("=== NBA Player Props Monitor ===")print(f"Threshold: {monitor.threshold}%")print(f"Poll interval: {POLL_INTERVAL}s\n")while True: nba_events = get_nba_events() print(f"[{datetime.now().strftime('%H:%M:%S')}] " f"Scanning {len(nba_events)} NBA games...") for event in nba_events: name = f"{event['home_team']} vs {event['away_team']}" monitor.check_event(event["id"], name) # Rate limit protection time.sleep(0.3) time.sleep(POLL_INTERVAL)
Output:
=== NBA Player Props Monitor ===Threshold: 3.0%Poll interval: 60s[20:15:30] Scanning 6 NBA games...↓ [SHORTENED] Lakers vs Celtics Player Points O/U — LeBron James Over 25.5 2.10 → 1.85 (-11.9% from last, -11.9% from baseline)↑ [DRIFTED] Nuggets vs Timberwolves Player Rebounds O/U — Nikola Jokic Over 12.5 1.75 → 1.95 (+11.4% from last, +11.4% from baseline)
import pandas as pddef export_alerts(monitor, filename="prop_alerts.csv"): """Save all detected movements to CSV.""" if not monitor.alerts: print("No alerts to export") return df = pd.DataFrame(monitor.alerts) df.to_csv(filename, index=False) print(f"Exported {len(df)} alerts to {filename}") # Quick summary print(f"\nTop movers:") top = df.sort_values("change_pct", key=abs, ascending=False).head(5) for _, row in top.iterrows(): print(f" {row['selection']}: {row['change_pct']:+.1f}%")# Call after monitoring session# export_alerts(monitor)
Set the threshold to 3-5% for actionable alerts. Below 3% generates too much noise from normal market fluctuations.
Focus on the 2-4 hour window before tipoff. This is when injury reports drop and sharp money moves the lines most.
Pre-match props are where the edge is. Live odds are adjusted algorithmically and are extremely efficient — pre-match lines lag behind news, creating genuine +EV windows and exploitable edge that can last minutes to hours.
Player prop lines adjust faster than match winner lines to news. A “questionable” tag on a star player can move his points O/U by 10-15% within an hour.
Combine with the settlement API to automatically check if your bets on these movements won after the game.