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.

FieldMeaningWhen it fires
wonThe bettor on that side wins.Over: actual > line. Under: actual < line. YES (e.g. anytime goalscorer): player recorded ≥1 of the stat.
lostThe bettor on that side loses.Over: actual < line. Under: actual > line. NO: player recorded 0 of the stat.
pushStakes refunded — no winner.actual === line (only possible on integer lines like 2.0 or 7.0 — half-lines never push).
voidBet 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.

SportData sourceMarkets graded
MLBstatsapi.mlb.comPitcher 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
NBAcdn.nba.comPoints / Rebounds / Assists / Threes / Steals / Blocks / Turnovers; PRA + every 2-way combo; Double-Double / Triple-Double; every milestone N+ tier
NHLapi-web.nhle.comGoals / Shots on Goal / Blocked Shots / Points (1+/2+/3+); Goalie Saves; Anytime / First Goal scorer; First Period scorer where posted
NCAABESPNGame lines (h2h / spreads / totals) — player props off-season, returns in November
23 soccer leaguesESPN site.apih2h / spreads / totals / BTTS / Double Chance / Draw No Bet / Correct Score / Total Corners / Total Cards / Anytime + First Goal Scorer / Player Assists / Goal-or-Assist
GolfESPN PGA scoreboardTournament winner (order=1 competitor)
TennisESPN ATP + WTAMatch winner, set / game totals, alt spreads — graded from set linescores
UFCufcstats.comFight winner / Total Rounds / Fight Distance Yes-No / Round Betting (using completed_rounds = round − 1 + time/300)
NFL + NCAAFESPN football APIGame-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.

proplineapi/propline-clv-tracker →

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.

Live example →

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.

Discord adapter docs →

How it works

Four moving parts. None of them require you to do anything different than a normal odds API call.

  1. 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. 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. 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_value back to every outcome row.
  4. 4. You read it. GET /v1/sports/{sport}/events/{id}/results returns the joined view across every book. Or subscribe to a resolution webhook and get pushed every graded prop within seconds.

Who else offers this?

Nobody, in the developer-API space. We checked.

APIPre-game oddsFinal scoresGraded prop outcomes
PropLineYesYesYes — every Over/Under, every book
the-odds-apiYesYesNo
OddsJam APIYesYesNo
SportsGameOddsYesYesNo
League stats APIs (MLB / NBA / NHL / ESPN)NoYesNo — 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.