Prop Resolution API
Every player prop, graded against
the actual box score.
The-odds-api stops at pre-game odds. OddsJam stops at pre-game odds. PropLine grades every Over/Under against the real stat from MLB Stats / NBA CDN / NHL API / ESPN / ufcstats — so your backtests, CLV reports, and won/lost feeds don't need a second pipeline. One endpoint, one source of truth.
Pro tier — $19/mo, 25,000 req/day. Free tier returns redacted resolution so you can prototype before upgrading.
What is prop resolution?
Every player prop is a bet on a stat clearing a line. After the game finishes, the resolver compares the actual stat from the league's official box score to the line on every Over and Under we recorded — then writes a verdict (won / lost / push / void) and the actual value back onto each outcome.
You stop running your own pipeline that fetches odds from one vendor, box scores from another, and stitches them together in a Postgres warehouse. One call to /v1/sports/{sport}/events/{id}/results returns the joined view.
| Field | Meaning | When it fires |
|---|---|---|
| won | The bettor on that side wins. | Over: actual > line. Under: actual < line. YES (e.g. anytime goalscorer): player recorded ≥1 of the stat. |
| lost | The bettor on that side loses. | Over: actual < line. Under: actual > line. NO: player recorded 0 of the stat. |
| push | Stakes refunded — no winner. | actual === line (only possible on integer lines like 2.0 or 7.0 — half-lines never push). |
| void | Bet voided — usually a scratched player. | Player is missing from the box score entirely (late scratch, name mismatch we couldn't resolve). Most books refund these. |
What you actually get back
Mariners @ Cardinals, Julio Rodriguez Total Bases prop. He hit a double + a single — 3 total bases. Over 1.5 won; Under 1.5 lost. The shape is the standard bookmakers[].markets[].outcomes[] the-odds-api consumers already parse — with resolution and actual_value appended.
{
"id": "11049",
"home_team": "St. Louis Cardinals",
"away_team": "Seattle Mariners",
"completed": true,
"scores": [
{"name": "St. Louis Cardinals", "score": 4},
{"name": "Seattle Mariners", "score": 7}
],
"bookmakers": [{
"key": "draftkings",
"title": "DraftKings",
"markets": [{
"key": "batter_total_bases",
"outcomes": [
{
"name": "Over",
"description": "Julio Rodriguez",
"point": 1.5,
"price": -125,
"resolution": "won", // ← graded against real stat
"actual_value": 3 // ← the actual TB he recorded
},
{
"name": "Under",
"description": "Julio Rodriguez",
"point": 1.5,
"price": 105,
"resolution": "lost",
"actual_value": 3
}
]
}]
}]
}The graded view is mirrored across every book that had the line. DraftKings, FanDuel, Pinnacle, Bovada, Underdog, PrizePicks — same stat, same verdict, different prices. That's the data shape you need to compute closing line value and book-by-book hit rate.
Coverage — what we grade
Every stat below is pulled from the league's own free, unauthenticated stats API on a 5-minute cadence post-game. No third-party stats vendor, no scraping fragile pages we don't control.
| Sport | Data source | Markets graded |
|---|---|---|
| MLB | statsapi.mlb.com | Pitcher K / ER / Hits Allowed / Outs; batter H / HR / RBI / TB / SB / R / 1B / 2B / Walks; H+R+RBI combo; 2+ Hits / 2+ HR / 2+ RBI / 3+ RBI; every alt line |
| NBA | cdn.nba.com | Points / Rebounds / Assists / Threes / Steals / Blocks / Turnovers; PRA + every 2-way combo; Double-Double / Triple-Double; every milestone N+ tier |
| NHL | api-web.nhle.com | Goals / Shots on Goal / Blocked Shots / Points (1+/2+/3+); Goalie Saves; Anytime / First Goal scorer; First Period scorer where posted |
| NCAAB | ESPN | Game lines (h2h / spreads / totals) — player props off-season, returns in November |
| 23 soccer leagues | ESPN site.api | h2h / spreads / totals / BTTS / Double Chance / Draw No Bet / Correct Score / Total Corners / Total Cards / Anytime + First Goal Scorer / Player Assists / Goal-or-Assist |
| Golf | ESPN PGA scoreboard | Tournament winner (order=1 competitor) |
| Tennis | ESPN ATP + WTA | Match winner, set / game totals, alt spreads — graded from set linescores |
| UFC | ufcstats.com | Fight winner / Total Rounds / Fight Distance Yes-No / Round Betting (using completed_rounds = round − 1 + time/300) |
| NFL + NCAAF | ESPN football API | Game-line resolution live; passing / rushing / receiving / anytime-TD player-prop resolution wired and ready to grade when the September 2026 season ships per-game player props |
Get graded props in 2 lines
Same auth as every other PropLine endpoint — ?apiKey= or X-API-Key header. Free tier returns the market structure with resolution nulled and redacted: true set. Pro tier returns the full graded view.
Python (official SDK)
# pip install propline
from propline import PropLine
client = PropLine(api_key="YOUR_KEY")
results = client.get_event_results(
sport="baseball_mlb",
event_id="11049",
)
for bm in results["bookmakers"]:
for market in bm["markets"]:
for o in market["outcomes"]:
if o.get("resolution") == "won":
print(
f'{o["description"]} {market["key"]} '
f'{o["name"]} {o["point"]} hit '
f'(actual: {o["actual_value"]})'
)curl
curl "https://api.prop-line.com/v1/sports/\
baseball_mlb/events/11049/results\
?apiKey=YOUR_KEY"Node / TypeScript
// npm install propline
import { PropLine } from "propline";
const client = new PropLine({
apiKey: process.env.PROPLINE_API_KEY!,
});
const results = await client.getEventResults({
sport: "baseball_mlb",
eventId: "11049",
});What people build with it
Three open-source reference implementations live on GitHub. Clone them, swap your API key in, and you've got working tools in under 5 minutes.
CLV tracker
Closing-line value reports
CSV of placed bets in → CLV% and stake-weighted portfolio CLV out. Uses /odds/history for closing snapshots and resolution for graded outcomes.
Backtester
Per-market hit-rate dashboards
Stream /v1/exports/resolved-props (Pro CSV export) into a warehouse and aggregate by market key. The /today “market accuracy panel” on prop-line.com is built on this exact feed.
Webhooks
Real-time resolution alerts
Streaming tier ($79/mo) pushes a resolution event to your endpoint within seconds of grading. HMAC-signed, exponential-backoff retries. Discord webhook adapter built in.
How it works
Four moving parts. None of them require you to do anything different than a normal odds API call.
- 1. Scraper records the prop. Every 90 seconds we poll every active sportsbook (Bovada, DraftKings, FanDuel, Pinnacle, BetMGM, BetRivers, Unibet, Underdog, PrizePicks, Kalshi, Polymarket, Matchbook, Smarkets) and write every Over/Under with the line and the price to
odds_snapshots. - 2. Game ends. We poll the league's stats API every 5 minutes. When the game flips to
completed=true, the resolver fetches the box score. - 3. Resolver grades every prop. Match player names (with team-prefix fallback for soccer / MLB, where books share roster aliases) against the box score, compare the actual stat to the line, and write
resolution+actual_valueback to every outcome row. - 4. You read it.
GET /v1/sports/{sport}/events/{id}/resultsreturns the joined view across every book. Or subscribe to aresolutionwebhook and get pushed every graded prop within seconds.
Who else offers this?
Nobody, in the developer-API space. We checked.
| API | Pre-game odds | Final scores | Graded prop outcomes |
|---|---|---|---|
| PropLine | Yes | Yes | Yes — every Over/Under, every book |
| the-odds-api | Yes | Yes | No |
| OddsJam API | Yes | Yes | No |
| SportsGameOdds | Yes | Yes | No |
| League stats APIs (MLB / NBA / NHL / ESPN) | No | Yes | No — box scores only, no line context |
If you found something we missed, tell us. We'll happily revise this page.
Start grading props in 30 seconds
Free tier returns redacted resolution so you can wire the call and confirm response shape before paying. Pro ($19/mo) unlocks the full graded feed, historical line movement, and cross-book +EV.
Free tier includes 1,000 requests/day. Upgrade anytime.
Already on a competitor? 50% off Pro for 3 months in exchange for an invoice screenshot.