This page is loading and it needs JavaScript. The written page below is served without it.
Every number on this site is built the same way: a player’s official game log is counted against a specific line, shrunk toward the market in proportion to how little history stands behind it, and compared to the price a sportsbook is posting. This page walks that pipeline end to end, and states plainly what it is measured to be unable to do.
Across 96,155 graded props the model tracked the de-vigged consensus of five books to within the margin those books charge. Historical testing showed that calibration alone is not enough to overcome sportsbook pricing, and no configuration tested cleared that margin, which is why this product is built on price, context, sample quality and transparency rather than a claim to finish ahead of the closing line.
The board hits about 50.9% where 52.4% is break-even at −110, against a measured margin of 3.49 points per side. Nothing here promises a win.
The same replay measured what the work did buy. Shrinkage and eligibility filtering materially improved calibration in the historical replay, though meaningful calibration error remains. Expected calibration error fell from 0.2319 to 0.0552, and the Brier score from 0.3217 to 0.2527. Calibration is accuracy about a probability, not a lead over a price. So what these figures support is numbers you can check, not a way ahead of the market.
Version 1.6, updated 9 November 2026. Each definition is read from the one place the product states it, and each term carries the date its meaning last changed.
Scheduled jobs pull prices from seven sportsbooks and final box scores from each league’s own feed, then stage both into one database.
Everything downstream is a comparison between a price and a game log, so both halves have to arrive on a schedule and land in the same place. Prices for near-term games refresh every two minutes; the day’s events are rebuilt hourly; box scores load four times a day once games are final.
Every book’s own spelling of a market, a player and a side is mapped onto one internal vocabulary, so one prop is one row rather than five.
One book calls it "Player Points", another "points"; the same player appears with and without a suffix. Without a single vocabulary the same prop would be scored five times as five different props, and a game log would never join to the line it belongs to.
Each player’s per-game statistics are stored exactly as the official box score recorded them.
A hit rate is only as trustworthy as what it counted. These are settled, official numbers: not projections, not live in-game feeds, and not anybody’s estimate of what a player was on pace for.
For a given line, we count the games in which the player actually cleared it, and publish that count over the number of games.
A bet does not settle at the line, it settles one whole unit past it: Over 0.5 needs at least 1, not at least 0. Joining a game log at the line rather than at the settling threshold is how a routine prop comes out at a 100% hit rate, sitting enormously and falsely ahead of its price. The count is always shown with the denominator behind it, because a percentage without a sample is the same defect in a different font.
Two floors decide whether a number may be computed at all and whether it may be shown as a suggestion, and a third reading reports how much history is behind it.
A rate over three games can only take four values, so a player who went 3-for-3 in a fortnight reads as a certainty. Rather than one blunt cutoff, the floors rise with the strength of the claim being made: a probability may not be computed below 5 games, and may not be recommended below 10. Above that the sample is reported rather than enforced: it sets a confidence reading shown beside the letter grade, because how much evidence exists and how often the line has been cleared are two separate questions and answering both with one letter charges a prop twice for one fact.
The raw hit rate is pulled toward the market’s own probability, by an amount set by how little evidence sits behind it.
This is the single most important correction in the pipeline. The estimate is a blend of what the player has done and what the book thinks, weighted by sample: at k = 20, a player with 20 games of history is weighted half history and half market. Regressing toward the market rather than toward a coin flip is deliberate: the book has priced the starting pitcher, the injury report and the rest day, none of which a game log can see. Unshrunk, the same board’s hit rates sat an average of 26 points ahead of their prices and topped out near 95 points ahead off two or three games.
The posted American odds are converted into the probability that price implies.
A price and a probability are the same statement in different units, and you cannot compare an estimate to a price until both are in the same units. An unusable or missing price returns nothing at all rather than a neutral 50%: a fabricated coin flip does not read downstream as missing data, it reads as analysis.
The two sides of a market imply more than 100% between them; the excess is the book’s margin, and removing it is what turns a price into a fair probability.
At −110 each way both sides imply 52.38%, summing to 104.76%. The 4.76 points of surplus are the book’s margin; removing them leaves a fair probability, and the book’s hold on that market is 4.76/104.76, or about 4.5%. This correction is now computed and published: every book quoting BOTH sides of a line is de-vigged and the median across them is shown on the card as the market’s fair price, beside the posted one. It is a reading on the card, not what the board is ordered on: the order is set out under Model ranking below. It needs at least two books on both sides, so it is present on a majority of the board and simply absent on the rest rather than filled in with a single book’s opinion. What it deliberately does NOT do is feed the hit rate vs price reading: that comparison is still measured against the raw, margin-inclusive price, which charges the model the book’s full cut on the side being valued. The letter grade uses neither price: it is a band of the hit rate alone. Two numbers with two authors, kept apart on purpose: see the limitation below.
Hit rate vs price is the shrunk estimate minus the break-even probability the price implies, in percentage points. A short record is pulled toward the price before the subtraction, not toward a league average.
This number is printed beside the letter; it does not set it: since 12 October 2026 the letter is a band of the hit rate alone. It is a description, not a verdict: it says how measured history compares to what is being charged for it. Positive does not mean the book is wrong. It is published to four decimal places under a stated rounding rule, because two implementations that round differently disagree about props sitting exactly on a boundary.
Rows that cannot support a recommendation are removed, and what survives is ordered on measured history: not on a Parlay Builder forecast, and not on the market’s fair price. Ranked by hit rate, weighted by sample: 55% over 200 games ranks above 58% over 12, because a long record is harder to fluke than a short one. 9 or 10 of the last 10, or 7 straight, ranks a little higher, as does a matchup that favors the side. Prices from −300 to +250, the range most readers can actually take, sort above the longer and shorter ones, which stay on the board below them.
Only props with 10 or more logged games and a hit rate of 55% or better, and a recent price the book still posts, are ranked. A plausibility cap also applies: past about 20 points ahead of the price, a stale price or a bad line join is a likelier explanation than an opportunity, so those rows are treated as data artifacts instead of being ranked. What orders the survivors has changed more than once. It used to be the hit rate vs price reading above, which put a Parlay Builder reading at the top of the page, and later the market’s own de-vigged fair price. It is now the hit rate itself, pulled toward a coin flip by how few games stand behind it, so a long record outranks a short hot one, with the prices most readers can take leading. A prop with no measured sample sinks to the bottom rather than being scored zero, because "not measured" and "the worst on the board" are different statements. The order describes games already played; it is not a forecast. The grade is not the rank. The table opens in this order until you pick a column to sort by. A column sort is your control over rows already chosen and ranked; it changes what is on top of your screen, not the rank.
Legs from the same game are limited, and any combined probability quoted from multiplying legs is labelled as assuming independence.
Multiplying leg probabilities assumes they are independent, and legs from one game rarely are. A three-leg slip built from a single game is one game’s worth of risk sold as three, and its advertised hit probability is simply wrong. So the builder caps legs per game and per player, and where a correlation-adjusted figure exists it is shown beside the independent one rather than replacing it silently.
The letter is a band of the measured past hit rate at this exact line: A 80%+ · B 70 to 79% · C 55 to 69% · D 50 to 54% · F under 50%. The sample caps the letter: under 10 games it can be no higher than C, and under 15 games no higher than B. An A also needs at least 15 games and recent games that back the rate up; where recent games are not on hand, only 90% or better is an A. A line that has not cleared more often than its own price needs to break even is held at B or lower. A hit rate less than 1 point above its band's floor, with consistency short of Elite (steadier than 90% of the league in that stat) and a trend running against its side (falling on an Over, rising on an Under), reads one letter lower. These checks can only hold a letter down, never raise it. Below 22% at +150 or longer it reads Longshot instead of F. The letter describes history and is not a forecast. The count of agreeing form signals is reported beside the letter without moving it.
A hit rate on six games is not the same evidence as a hit rate on sixty, so the sample caps the letter instead of only sitting beside it. The thresholds are absolute rather than a curve, so a weak slate is supposed to grade badly. Form is counted rather than applied because, measured across the board, the form composite anti-correlates with how far the hit rate sits ahead of the price. When an earlier set of these bands was tested against results, history ranked forward outcomes at about chance, which is why the letter is labelled as history and never as a probability.
Every prop the app surfaces is logged with its line, price and model numbers frozen at the moment it was shown, then settled later against the final box score.
This is what makes the track record a record rather than a replay. Grading against the numbers as they were served is the only version that cannot flatter itself; a backtest run against today’s lines is a projection, and is labelled as one wherever it appears. A line that lands exactly on the number is a push, and a player who did not play is void: neither is counted as a loss.
A worked example
A real player, a real market, and the games the number is counted from. This is the same board every other page reads. Nothing here is an illustration.
NBA · Los Angeles Lakers
Collin Sexton cleared 9.5 points in 6 of the last 10 games. That threshold comes from this player’s own distribution, not from a sportsbook.
The games behind it
10.5 average · through November 11, 2026
| Date | Opponent | Points | Result |
|---|---|---|---|
| Nov 11 | @ Milwaukee Bucks | 10 | cleared |
| Nov 9 | @ Atlanta Hawks | 18 | cleared |
| Nov 8 | @ Detroit Pistons | 17 | cleared |
| Nov 6 | vs Portland Trail Blazers | 0 | missed |
| Nov 4 | @ Sacramento Kings | 10 | cleared |
| Nov 2 | vs Miami Heat | 6 | missed |
| Nov 1 | vs Toronto Raptors | 14 | cleared |
| Oct 30 | @ Golden State Warriors | 0 | missed |
| Oct 28 | @ LA Clippers | 21 | cleared |
| Oct 27 | vs Portland Trail Blazers | 9 | missed |
Every prop on the board carries this same record: the games, the dates and the misses, not a summary of them.
Measured from official box scores. Past performance ≠ future results.
The chat is not a language model with a database bolted to it. At most two calls to a model are made in a turn, both named below, and between them sits ordinary code: choosing what to look up, running the query, ranking the rows and writing the sentence are all functions, reading the same materialised views the rest of this site reads. That is why a number in an answer can be traced to the row it came from: there is no generation step between the table and the text.
One call reads your message and returns a label from a fixed list of intents, plus any names it picked out: a player, a market, a league, a number of legs.
What comes back is checked against that list and discarded if it is not on it, and the names are sanitised before they are allowed near a query. So this call chooses which piece of code runs next and what that code searches for; it does not produce a hit rate, a price or a sentence. If it is switched off, answers slower than three seconds, or comes back below the confidence floor, a keyword classifier takes over and the turn is answered the same way: the chat works end to end with no model call at all.
If you attach a screenshot of a slip, one call transcribes it (the players, markets, lines and prices visible in the image) into structured fields.
This is the one place a figure in the conversation is produced by a model rather than read from a row, and it is worth being plain about: it is a transcription of your own screenshot, not a number we publish. Where the transcription is unsure of a load-bearing field it stops and asks rather than guessing, and what it returns is then treated as data: looked up against the same tables a typed question would hit, with anything instruction-shaped inside it classified rather than followed.
Traceability is the claim this design supports, and it is a precise one rather than a grand one: an answer can be no better than the row behind it, and every row is one you can go and check. Everything listed above under what falls short reaches the chat exactly as it reaches the board: hit rate vs price is still measured against a margin-inclusive price, a prop is still scored off one book, a pulled market can still sit there for hours, and a player whose two feeds spell him differently still carries the wrong history.
That the measured hit rate on this exact line is 80% or higher, on enough games to hold it. An A also needs at least 15 games and recent games that back the rate up; where recent games are not on hand, only 90% or better is an A. The full scale is A 80%+ · B 70 to 79% · C 55 to 69% · D 50 to 54% · F under 50%. The sample caps the letter: under 10 games it can be no higher than C, and under 15 games no higher than B. A line that has not cleared more often than its own price needs to break even is held at B or lower. These checks can only hold a letter down, never raise it. Below 22% at +150 or longer it reads Longshot instead of F. Read an A as a statement about the record, not about the bet or the price: it is not a forecast, and when the ranking was tested against results no version of it beat the market.
Because most posted lines are cleared in fewer than 70% of games on file, and the grade starts from the hit rate: anything under 70% is a C or below before the sample or the price is even read. Past the break-even cap, the price is a separate reading. A two-way prop priced at −110 on both sides carries roughly a 4.5% hold for the book. That is the book’s cut on the market, not a per-side share of it, and it is why the hit rate vs price figure for most of the board reads near zero or below, whatever the letter. The thresholds are absolute rather than a curve: a weak slate is supposed to grade badly, and a percentile scale would mint the same number of A’s every night no matter what was on offer.
No, and they can disagree. The signal score measures how strongly a prop’s supporting signals agree: consistency, trend, streak, rest, matchup. The grade is set by the measured hit rate, held down by a thin sample or a price the record has not cleared. The two are built from different things, and measured across the board the signal score also ran against the price: props with the highest signal scores had, on average, the worst prices. So a green A above an amber signal score is not a contradiction; it says the line has been cleared often over the record on file while the supporting form is thin.
No. A grade describes how often the line has been cleared in measured history, and history is not a forecast. An A can lose and an F can win. The price beside it tells you what you are paying for the chance; neither tells you what the chance will do.
It pulls a raw hit rate toward the probability the market is already implying, by an amount set by how few games stand behind it. At k=20 a player with 20 games of history is weighted half history and half market price. Without it a player who cleared a line in three of three games reads as a certainty and appears enormously ahead of the price. Unshrunk, the same board’s hit rate vs price averaged +26 points and peaked near +95 off two or three games.
Hit rates are counted from final official box scores, the same settled numbers a league publishes, never projections or in-game estimates. Odds are the prices actually posted at DraftKings, FanDuel, BetMGM, Caesars, BetRivers, theScore Bet and Hard Rock Bet, refreshed every two minutes for games starting soon. A prop is joined to its game log at the settling threshold, so an Over 0.5 line is counted against games with at least one, not at least zero.
No figure it prints about a player, a prop or a price is generated by a language model. Each one is read out of a row in the same materialised views the board reads. Retrieval, scoring and phrasing are all deterministic code, so there is no generation step between the table and the sentence, and the same question against the same board comes back in the same words. The one carve-out is stated plainly on this page: if you upload a screenshot of a bet slip, a model transcribes it, and those numbers are a reading of your own image rather than anything published here.
Two calls in a turn at most. One classifies your message into a fixed list of intents and picks out the names in it, which decides what gets looked up; it is capped at three seconds and can be switched off entirely, and a keyword classifier answers the turn the same way when it is. The other runs only when you upload a screenshot, and transcribes it. Everything else (the queries, the ranking, the wording) is ordinary code, which is what lets the chat be tested against fixed board fixtures before release rather than sampled after it.
Not for that comparison, and that is now a deliberate split rather than a missing capability. The de-vig itself is live: wherever at least two sportsbooks quote both sides of a line, each book’s pair has its margin stripped out and the median across those books is published on the card as the market’s fair price, beside the posted one. It is present on a majority of the board and simply absent where fewer than two books quote both sides, rather than being filled in from one book’s opinion. The hit rate vs price reading is still measured against the raw posted price with the margin left in, which charges the model the book’s full cut on the side being valued; that is why most of the board still reads negative. The letter grade does not use the price at all. It is a band of the hit rate, except that a rate under 22% reads Longshot rather than F at +150 or longer. Moving the comparison onto the fair price would restate every published minimum and every measured result on this page at once, so it is a versioned change to the scoring contract rather than a copy edit. Neither figure sets the board’s order. Ranked by hit rate, weighted by sample: 55% over 200 games ranks above 58% over 12.
Odds and lines come from licensed data feeds and refresh on a schedule; hit rates and grades are Parlay Builder’s own calculations.