PropSports API is a REST API delivering real-time sports data for MLB, NFL, NBA, WNBA, NHL, tennis and soccer. 151 endpoints. All responses are JSON. All requests use GET. Cloudflare Workers edge network — sub-100ms globally.
What makes PropSports different from every other sports API: we own our Statcast data pipeline and we generate our own Poisson model odds from it. No DraftKings. No FanDuel. No sportsbook dependency. The /mlb/odds/model/* family of endpoints has no equivalent anywhere else at this price point.
Pass your API key in the X-API-Key request header or as a ?key= query param.
# Header auth (recommended) curl https://propsports-api.sales-fd3.workers.dev/mlb/schedule/today \ -H "X-API-Key: your_api_key_here" # Query param auth (also works) curl https://propsports-api.sales-fd3.workers.dev/mlb/schedule/today?key=your_api_key_here # Use your API key\ncurl https://propsports-api.sales-fd3.workers.dev/mlb/schedule/today?key=your_api_key_here
const BASE = 'https://propsports-api.sales-fd3.workers.dev'; const KEY = 'your_api_key_here'; const data = await fetch(`${BASE}/mlb/schedule/today`, { headers: { 'X-API-Key': KEY } }).then(r => r.json()); console.log(data.games);
import requests BASE = "https://propsports-api.sales-fd3.workers.dev" KEY = "your_api_key_here" r = requests.get(f"{BASE}/mlb/schedule/today", headers={"X-API-Key": KEY}) data = r.json() print(data["games"])
https://propsports-api.sales-fd3.workers.dev
| Header | Value | Notes |
|---|---|---|
| X-API-Key | your_key | Required for NFL, NBA, NHL and paid MLB access |
| Content-Type | Not required | All responses are JSON regardless |
| Origin | Any | CORS enabled — all origins allowed |
Cache-Control: public, max-age=N. Live game endpoints cache for 10–30s. Statcast leaderboards cache for 900s. Factor this into polling intervals.| Plan | Daily Requests | Sports | Price |
|---|---|---|---|
| Demo | 20 req/hr (global cap) | MLB only | $0 |
| Single Sport | 50,000 | One selected sport | $29/mo |
| Developer | 100,000 | Up to 3 selected sports | $79/mo |
| All Sports | 200,000 | All 7 core sports | $149/mo |
| Pro | 500,000 | All 7 core sports | $299/mo |
| Scale | 2,000,000 | All 7 core sports | $599/mo |
| Enterprise | 5,000,000 | All 7 core sports | $1,500/mo |
Daily counters roll over on the US Eastern calendar date. Rate limit exceeded returns 429 with a JSON error body.
All errors return a JSON body with an error field, an optional hint, and links to docs and pricing.
{
"error": "Invalid API key.",
"hint": "Get a key at propsports.proptechusa.ai/pricing.html",
"docs": "https://propsports.proptechusa.ai/docs.html",
"pricing": "https://propsports.proptechusa.ai/pricing.html"
}
| Status | Meaning |
|---|---|
| 200 | OK |
| 400 | Bad request — missing or invalid parameter |
| 401 | Invalid or missing API key |
| 403 | Your plan does not include this sport or endpoint |
| 404 | Endpoint not found — check the path |
| 429 | Daily rate limit or demo hourly cap exceeded |
| 500 | Internal server error — upstream API failure |
The production catalog has 206 documented routes across MLB, NFL, NBA, WNBA, NHL, Tennis and Soccer. Every route is listed in the API reference, and the machine-readable route catalog is available at GET /sports. GET /health reports the same total.
| Sport | Routes |
|---|---|
| MLB | 45 |
| NFL | 36 |
| NBA | 19 |
| WNBA | 32 |
| NHL | 24 |
| Tennis | 25 |
| Soccer | 25 |
| All sports | 206 |
Use the sport guides for examples, response shapes and implementation notes. Plans determine which sports are included on your API key.
All PropBetEdge Poisson model odds for today. Grouped by market. Generated from owned Statcast data — no DraftKings, no FanDuel dependency. Refreshed 6× daily: 8AM, 10AM, 12PM, 2PM, 5PM, 8PM CT.
| Param | Type | Required | Description |
|---|---|---|---|
| market | string | optional | Filter by market: hr, totalbases, hits, strikeouts, rbi, runs |
| player | string | optional | Filter by player name substring. e.g. Soto |
| direction | string | optional | OVER or UNDER |
{
"date": "2026-06-09",
"source": "PropBetEdge Poisson Model",
"model": "Statcast xSLG + barrel% + EV allowed + park factor",
"total": 184,
"markets": {
"hr": [ ... ],
"totalbases": [ ... ],
"hits": [ ... ]
},
"top_value": [
{
"player_name": "Aaron Judge",
"market": "hr",
"line": 0.5,
"direction": "OVER",
"expected_stat": 0.38,
"implied_prob": 0.314,
"odds_fmt": "+310"
}
]
}
Top OVER value plays for today ranked by expected stat. Returns only positive-odds plays (implied prob < 50%). The fastest way to surface model edges.
| Param | Type | Required | Description |
|---|---|---|---|
| limit | integer | optional | Max results. Default: 20. Max: 200. |
| market | string | optional | Filter to one market. Default: all markets. |
const plays = await fetch( 'https://propsports-api.sales-fd3.workers.dev/mlb/odds/model/top?limit=10', { headers: { 'X-API-Key': KEY } } ).then(r => r.json()); plays.plays.forEach(p => { console.log(`${p.player_name} ${p.market} OVER ${p.line} → ${p.odds_fmt}`); });
All model markets for a single player. Returns HR, total bases, hits, strikeouts, RBI, and runs in one call.
| Param | Type | Required | Description |
|---|---|---|---|
| name | string | required | Player name substring. e.g. Soto or Aaron Judge |
curl "https://propsports-api.sales-fd3.workers.dev/mlb/odds/model/player?name=Soto" \ -H "X-API-Key: your_key"
Home run props from DraftKings and FanDuel, merged and ranked by best line. No sportsbook key required.
| Param | Type | Required | Description |
|---|---|---|---|
| name | string | optional | Filter by player name substring |
| direction | string | optional | OVER or UNDER |
{
"date": "2026-06-09",
"market": "home_runs",
"dk_count": 72,
"fd_count": 68,
"count": 86,
"source": "DraftKings + FanDuel",
"results": [
{
"player": "Aaron Judge",
"market": "hr",
"line": 0.5,
"direction": "OVER",
"best_book": "DraftKings",
"best_odds": 310,
"best_odds_fmt": "+310",
"all_books": {
"DraftKings": { "odds": 310, "odds_fmt": "+310" },
"FanDuel": { "odds": 290, "odds_fmt": "+290" }
}
}
]
}
Total bases props. DK + FanDuel merged. Same response shape as /mlb/odds/hr. Params: name, direction.
Hits props. DK + FanDuel merged. Params: name, direction.
Pitcher strikeout props. DK + FanDuel merged. Params: name, direction.
RBI props. DK + FanDuel merged. Params: name, direction.
All book prop markets (HR, total bases, hits, strikeouts) in a single response. Grouped by market key. Optional name filter applies to all markets.
All book markets for a single player. ?name=Soto returns HR, total bases, hits, and strikeouts from DK + FanDuel.
| Param | Type | Required |
|---|---|---|
| name | string | required |
Game-level MLB odds from ESPN. Spread, over/under, moneyline for each game today.
Full MLB slate for today. Hydrated with probable pitchers, venue, teams, and linescore. Source: MLB Stats API.
{
"date": "2026-06-09",
"games": [
{
"gamePk": 747892,
"gameDate": "2026-06-09T18:10:00Z",
"status": { "abstractGameState": "In Progress" },
"teams": {
"away": { "team": { "name": "New York Yankees" }, "score": 4,
"probablePitcher": { "fullName": "Gerrit Cole" } },
"home": { "team": { "name": "Boston Red Sox" }, "score": 2,
"probablePitcher": { "fullName": "Brayan Bello" } }
},
"venue": { "name": "Fenway Park" }
}
]
}
Schedule for any date.
| Param | Type | Required | Description |
|---|---|---|---|
| date | string | optional | YYYY-MM-DD. Defaults to today ET. |
All MLB games currently in progress with live linescore. Returns an empty array when no games are live.
Confirmed batting lineups when posted. Probable pitcher + lineup array for both teams.
| Param | Type | Required | Description |
|---|---|---|---|
| date | string | optional | YYYY-MM-DD. Defaults to today ET. |
Inning-by-inning linescore for any game. gamePk from /mlb/schedule.
Full boxscore. Hitting and pitching lines for both teams including all standard stats.
Play-by-play. Returns most recent N plays.
| Param | Type | Required | Description |
|---|---|---|---|
| limit | integer | optional | Number of recent plays to return. Default: 20. |
Season stats by MLB player ID.
| Param | Type | Required | Description |
|---|---|---|---|
| group | string | optional | hitting (default) or pitching |
| season | integer | optional | 4-digit year. Defaults to current season. |
Game-by-game log for any player. Full split history per appearance.
PropTechUSA owned Statcast leaderboard. 150 active batters aggregated nightly from Baseball Savant. The most comprehensive public Statcast endpoint available at any price point.
| Field | Type | Description |
|---|---|---|
| avgEV | float | Average exit velocity (mph) |
| maxEV | float | Maximum exit velocity in season |
| hardHitPct | float | Hard hit rate — 95+ mph |
| barrelPct | float | Barrel rate percentage |
| xBA / xSLG / xwOBA | float | Expected BA, SLG, wOBA from Statcast |
| sprintSpeed | float | Sprint speed ft/s |
| l7HR / l7EV | float | Last-7-day HR count and average EV |
| evSpike | float | l7EV minus season avgEV — positive = trending up |
| hrStreak | integer | Consecutive games with HR |
| gamesWithoutHR | integer | Consecutive games without HR |
| vsRHP | object | HR, PA, avgEV vs right-handed pitchers |
| vsLHP | object | HR, PA, avgEV vs left-handed pitchers |
| bats | string | L, R, or S |
PropTechUSA owned Statcast for the complete current-season pitcher dataset. EV allowed, barrel rate, hard hit rate, average and recent velo, velo drop detection, pitch mix, HR rate, and sample size. Returns all current-season pitchers by default; use ?limit= and ?offset= for pagination.
| Field | Type | Description |
|---|---|---|
| avgEVAllowed | float | Average EV allowed this season |
| barrelRateAllowed | float | Barrel rate allowed % |
| hrsAllowed | integer | HR allowed this season |
| paPerHR | float | PA per HR allowed — lower = more homer-prone |
| avgVelo | float | Average fastball velocity |
| recentVelo | float | Recent 3-start velo average |
| veloDown | boolean | True if recent velo significantly below season avg |
| pitchMix | object | Pitch type percentages |
| sampleSize | integer | PA in dataset |
Real-time weather for a single ballpark. Indoor parks (Tropicana, Rogers Centre, Globe Life, Chase, LoanDepot, Minute Maid, American Family) return "indoor": true.
| Param | Type | Required | Description |
|---|---|---|---|
| park | string | required | Exact park name e.g. Fenway Park, Yankee Stadium |
{
"indoor": false,
"park": "Fenway Park",
"parkFactor": 104,
"windSpeed": 12.4,
"windDir": 220,
"windLabel": "SW",
"temp": 71
}
Weather for every ballpark hosting a game today (or on the specified date). One call for all parks.
| Param | Type | Required |
|---|---|---|
| date | string | optional — YYYY-MM-DD |
Home plate umpire assignments for today's games. Combine with your own K-rate data for umpire angle plays.
| Param | Type | Required |
|---|---|---|
| date | string | optional — YYYY-MM-DD |
NFL schedule. Defaults to current week. Returns spread, over/under, venue, and score for each game. Source: ESPN.
| Param | Type | Required | Description |
|---|---|---|---|
| week | integer | optional | Week number 1–18 |
| season | integer | optional | 4-digit year |
All NFL games currently in progress.
Game-level NFL odds. Spread, over/under, home and away moneyline. Filters out games without odds.
Normalized NFL scoreboard by date or week. Returns teams, score, status, venue, broadcast context, current situation, and game-level odds when present upstream.
| Param | Type | Required | Description |
|---|---|---|---|
| date | YYYYMMDD | optional | Scoreboard date. Defaults to the current Eastern date. |
| week | integer | optional | NFL week. When supplied, week mode takes precedence over date. |
| season | integer | optional | NFL season year. Defaults to the current year. |
| season_type | integer | optional | ESPN season type. Defaults to 2 for regular season. |
Current NFL standings normalized into all eight division groups with team metadata and provider-supplied standings statistics.
NFL team directory with stable ESPN IDs, abbreviations, names, logos, colors, active status, and links.
Normalized profile for one NFL team. Use the team ID returned by /nfl/teams.
Current roster with player IDs, names, jersey, position, headshot, age, height, weight, experience, and roster status when supplied upstream.
Team-specific event schedule with event IDs, dates, names, season/week references, competition references, and links.
| Param | Type | Required | Description |
|---|---|---|---|
| season | integer | optional | Season year. |
Full normalized game package: teams, score, status, venue, possession, down-and-distance, drives, play-by-play, player statistics, leaders, and win probability. Use an ESPN game ID returned by the schedule or scoreboard routes.
Player box-score groups and labels for both teams. Fields remain source-aware rather than inventing missing statistics.
Play-by-play with period, clock, field position, down-and-distance, participants, scoring state, and score context.
Drive history with offense, result, yards, play count, elapsed time, start/end field position, and contained plays.
Passing, rushing, and receiving game leaders. If the provider omits a leader block, PropSports derives leaders only from factual box-score yardage.
Provider-supplied game win-probability series keyed to play IDs. Returns an empty series when the upstream game package does not supply win probability.
Today's NBA games. Playoff-aware — tries the playoff schedule first, falls back to regular season. Returns status, score, period, clock, team logos, spread, and over/under.
All NBA games with status.type.state === "in".
Full boxscore with computed True Shooting % (TS%) and Usage Rate (USG%) per player. Most APIs return raw stats and leave the math to you. We do the math.
{
"name": "Jayson Tatum",
"points": 34, "rebounds": 9, "assists": 6,
"fgMade": 12, "fgAttempts": 22, "fgPct": 54.5,
"tsPct": 68.4, // True Shooting % — computed
"usgPct": 34.1, // Usage Rate % — computed
"minutes": 38, "plusMinus": 12
}
Play-by-play with event classification: score, miss, rebound, turnover, foul, block, steal, sub, timeout.
| Param | Type | Required |
|---|---|---|
| limit | integer | optional — default 50 |
Current 5-man lineup via substitution walk through the play-by-play. ~95% accurate during live games. Returns both teams' current on-court players with headshots and jerseys.
Shot chart with x/y coordinates. Made/missed indicator, player, team, period, and clock. Coordinate system: ESPN-native, x 0–50, y 0–47.
Live win probability curve by play. homeWinPct at each play event.
League leaders by stat category. Top 25 returned.
| Param | Type | Required | Values |
|---|---|---|---|
| stat | string | optional | PTS, REB, AST, STL, BLK, FG_PCT, FT_PCT, FG3_PCT. Default: PTS |
| season | string | optional | Format: 2025-26. Default: current. |
Game-level NBA odds. Spread, over/under, moneyline.
Today's NHL games with TV broadcast info, venue, scores, and game state. Source: NHL Stats API.
All NHL games with gameState of LIVE or CRIT (overtime/close game).
Full conference and division standings. Source: NHL Stats API.
| Param | Type | Required |
|---|---|---|
| date | string | optional — YYYY-MM-DD |
Skater leaders by category. Top 25 returned.
| Param | Type | Required | Values |
|---|---|---|---|
| category | string | optional | goals (default), assists, points |
| season | string | optional | Format: 20252026. Default: current. |
Season stats for any NHL player by NHL Stats API player ID. Returns goals, assists, points, plusMinus, pim, shots, shootingPctg, and more.
Game-level NHL odds. Puck line, over/under, moneyline from ESPN.
Plans from $29/mo; all 7 core sports from $149/mo. Key in your inbox after checkout. Cancel anytime.
Questions? support@proptechusa.ai · 1-888-784-3881