Skip to content

get_prop_backtest

25 creditsBacktestsPOST /v1/get_prop_backtest

How often a kind of player prop hit against what the market implied, by your filters, since May 2023

Use it when you want to test an idea about props before building anything: how often a kind of prop hit against what the market implied, by season, with the sample size and interval.

Parameters

marketenum: player_points | player_rebounds | player_assists | player_threes | player_points_rebounds_assists | player_blocks | player_steals | player_points_rebounds | player_points_assists | player_rebounds_assists | player_double_double | player_triple_doublerequired
The market, e.g. player_points.
sideenum: over | underoptional
over (default) or under. Yes/no markets are graded on the yes price: over only.
from_datestringoptional
First game date, YYYY-MM-DD. Default all held.
to_datestringoptional
Last game date, YYYY-MM-DD. Default all held.
player_idstringoptional
One player's id (e.g. 3945274, from search_players).
teamstringoptional
The player's team, e.g. BOS.
opponentstringoptional
The team he played.
home_awayenum: home | awayoptional
Whether his team was at home.
team_roleenum: favorite | underdogoptional
Whether his team was favored, by the books' closing moneylines.
line_minnumberoptional
Lowest median closing line to include.
line_maxnumberoptional
Highest median closing line to include.
fair_minnumberoptional
Lowest fair probability of this side to include, 0 to 1.
fair_maxnumberoptional
Highest fair probability of this side to include, 0 to 1.
leagueenum: nba | wnba | ncaamoptional
League. Defaults to nba. One of: nba, wnba, ncaam.

Notes

  • Over MCP, ask for it in plain English and the client calls get_prop_backtest itself. Point any MCP client at https://mcp.dunkapi.com/mcp?key=YOUR_API_KEY.
  • Each call costs 25 credits, taken before it runs and refunded if the server errors.
  • Not the call you need? Find the right call by what you are trying to answer.

Request

curl -X POST https://mcp.dunkapi.com/v1/get_prop_backtest \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
  "market": "player_points",
  "side": "over",
  "home_away": "away",
  "team_role": "underdog",
  "from_date": "2024-10-01"
}'

Response

json
{
  "market": "player_points",
  "label": "points",
  "side": "over",
  "filters": {
    "from_date": "2024-10-01",
    "home_away": "away",
    "team_role": "underdog"
  },
  "results": 12372,
  "hits": 6017,
  "misses": 6355,
  "pushes": 0,
  "hit_rate": 0.486,
  "avg_implied_prob": 0.531,
  "avg_fair_prob": 0.498,
  "no_result": 337,
  "no_price": 0,
  "games": 1651,
  "players": 529,
  "avg_books": 5,
  "avg_line": 12.6,
  "avg_actual": 12.8,
  "hit_rate_minus_implied": -0.045,
  "hit_rate_minus_fair": -0.012,
  "hit_rate_interval_95": [
    0.478,
    0.495
  ],
  "market_inside_interval": false,
  "by_season": [
    {
      "season": 2025,
      "results": 5913,
      "hits": 2895,
      "misses": 3018,
      "pushes": 0,
      "hit_rate": 0.49,
      "avg_implied_prob": 0.531,
      "avg_fair_prob": 0.498
    },
    {
      "season": 2026,
      "results": 5880,
      "hits": 2840,
      "misses": 3040,
      "pushes": 0,
      "hit_rate": 0.483,
      "avg_implied_prob": 0.531,
      "avg_fair_prob": 0.498
    },
    {
      "season": 2027,
      "results": 579,
      "hits": 282,
      "misses": 297,
      "pushes": 0,
      "hit_rate": 0.487,
      "avg_implied_prob": 0.531,
      "avg_fair_prob": 0.499
    }
  ],
  "method": "One result per player per game: the closing line is the median across books, the market's probability comes from the books at that line, and a push counts in neither the hits nor the rate. no_result counts players with no result for the game (not played, or no stat line of ours), no_price those with no price on this side. team_role is by the books' closing moneylines. avg_implied_prob averages each book's implied probability, margin included. fair_prob takes the margin out of each book's two prices for the same line, proportionally, then averages. Only identical lines are combined.",
  "caution": "A past result is not a forecast. Trying many filters will turn up some that beat the market by luck, so check by_season and the interval. Not a recommendation."
}

Response fields

marketstring
labelstring
sidestring
filtersobject
filters.from_datestring
filters.home_awaystring
filters.team_rolestring
resultsnumber
hitsnumber
missesnumber
pushesnumber
hit_ratenumber
avg_implied_probnumber
avg_fair_probnumber
no_resultnumber
no_pricenumber
gamesnumber
playersnumber
avg_booksnumber
avg_linenumber
avg_actualnumber
hit_rate_minus_impliednumber
hit_rate_minus_fairnumber
hit_rate_interval_95[]array
List of number
market_inside_intervalboolean
by_season[]array
List of objects
by_season[].seasonnumber
by_season[].resultsnumber
by_season[].hitsnumber
by_season[].missesnumber
by_season[].pushesnumber
by_season[].hit_ratenumber
by_season[].avg_implied_probnumber
by_season[].avg_fair_probnumber
methodstring
cautionstring

Related endpoints

Try it

500 free credits every month: 20 calls to get_prop_backtest, and no card.