Broncos Betbot 2026: the program

A user manual and a guide to what the software does, why, and what it has shown. Written Mon Oct 5 2026, after the Week 4 settle; numbers from the ledger, the settle reports and the study notes as of that afternoon. Terms with a dotted underline link to the glossary (hover for the definition); figure and section references link to their targets. Repo copy: docs\BETBOT_PROGRAM.html.

Part 1. What Betbot is contents

1.1 In one paragraph

Betbot is a player performance model with a betting slip attached. Every week it takes the free NFL data (play-by-play, usage, snap counts, injuries, Next Gen Stats, pressure and coverage charting), the weather and the referee, and predicts what each player on the Broncos game will do: catches, yards, carries, touchdowns, passing lines. It then reads every line FanDuel offers on the game, works out where its own probability beats the price by a margin, sizes those lines with a fraction of the Kelly stake, and prints a card. The operator places the card by hand, ticks each ticket off on a local confirm page, and on Monday the whole thing is reconciled against FanDuel's own record to the cent and graded. The question it is built to answer is whether its probabilities are right; whether that makes money at FanDuel's prices is the second question, and the card's record answers it in the open.

1.2 What you get each week

OutputWhat it is
The cardA priced table of the lines the model stakes: market, player, side and line, FanDuel's price, the model's probability, the market's no-vig probability, the edge in points, the stake, the minimum price to accept, the token to attach, a one-line reason. The footer shows the roll it was sized on, the Kelly fraction, the caps and the gate numbers.
The route pageThe same tickets in the order FanDuel's app is laid out: biggest money first, with the search word, the market tab and the button label to tap. Rows turn red if a ticket was placed with no ledger row.
ServeA confirm page on 127.0.0.1:8787. Each placed ticket is ticked with its real stake and price; ladder tickets ask for the rung from the slip, because FanDuel's rung label is the line (the "3+" rung is over 2.5).
PreviewsThe matchup preview (who is pressuring whom, what the secondary allows each receiving role), the injury preview (what the card would look like with the inactives' usage redistributed), and from Week 5 the paper board: every game on the slate priced as paper, the model's calibration evidence.
The Monday reportThe card graded against what happened and against the closing price; the card by side; the calibration table; the gate line that says whether the Kelly step is earned; one reconciling cash line so the roll ties to FanDuel's balance.

1.3 The rules, on one screen

1.4 Who does what

The operator presses the keys, saves the pages, types what the system cannot see (tokens, inactives, the referee, shadow matchups, the rung on a ladder ticket), places and confirms every ticket, and makes every money and doctrine decision. Code (Claude Code) builds the software from written, numbered pastes, one commit per step with the tests green, and reports back. The reviewer reads the reports and the logs, writes the next paste, keeps the state page and the tracker current, and tells the operator what to press. The runner (GitHub Actions) refreshes the data every night and takes the closing and paper-board snapshots on schedule.

Part 2. Why it exists contents

2.1 The objective, in the operator's words

"I'm ok with high percentage bets - even if the margin isn't wide. I want a player performance prediction model more than I want a 'book-beater'. I'm ok with aggregate consistency, or high percentage parlays with the boosts they offer. The idea is narrowing the guesswork on each individual player's performance given the conditions and matchups - and how that equates to the team's performance."

Steve, Oct 5 2026

That sets the bar. A book-beater is judged on dollars against the close, a few tickets a week, and takes a season to say anything. A performance model is judged on whether its probabilities are right on every line it prices, hundreds a week across the league, and says something in a month. Betbot is built for the second test and keeps the first as a diagnostic.

2.2 Why a model at all

The 2025 season was a manual system with AI help. Its 52 recorded picks beat FanDuel's closing price by +5.05% on raw prices and +0.57% after the book's margin, with 19 of 52 beating the close: a coin flip, on a sample that could not be told from luck because nothing recorded a probability before the game. In 2026 every line on the board gets a probability before kickoff, every ticket is recorded with the price taken, the model's number, the market's number, the closing price and the result, and Monday ties the lot to FanDuel's record. "Is the model any good" becomes a table, and from Week 5 the table grows by about 490 lines a week.

2.3 Why the money rules look like this

RuleSettingWhy
Kelly at a quarter0.25 of the growth-optimal stakeThe standard discount for a probability that is estimated rather than known; a bad week stays a bad week. The step to a half is a coded gate (D6): it opens only when calibration has been measured on enough lines, and the report prints KELLY GATE MET the week it does.
Caps4% a ticket, 80% a week, 10% on one-sided markets, SGPs at half the fraction and $10The operator's own activity is not scored here; the weekly report carries one aggregate line for it (paste 53).
The band and the edgeBoth probabilities between 25% and 75%; the model at least one point over the marketThe model has no record on longshots and FanDuel's margin is widest there.
The blendSizing on the average of the model's and the market's probability, edge capped at eight pointsThe 2025 study showed the raw model is overconfident on two-way lines (figure 3); a card sized on it would have sat 14 to 25 points above the market in Week 1.
The stake gateThree targets in the last three games, 10% target share, 40% snap shareWeek 2 priced a tight end on his 2025 starter role two weeks after he lost it.
One-sided marketsPriced against a market-fair reference, shrunk 70% toward it, withheld past +400Anytime TD and ladder rungs have no opposite side to remove the margin from (D16).

2.4 Why calibration is the proof (D19)

Closing-line value is the bettor's classic test: did the price you took beat the price at the close. It has two problems here. The card places eight to ten tickets a week, so four weeks are forty measurements and a yes or no at that count is noise. And FanDuel's props board often does not move at all in the last hours: in Week 4 none of the 1,496 selections moved between the card and the close (figure 10), so every ticket's CLV was exactly zero, which says nothing about the model either way.

Calibration asks a better question of a performance model: when it says 60%, does it win 60% of the time? The gate to half Kelly reads exactly that, by decile, on every line the model prices league-wide: largest gap five points or under on 1,000 or more two-way lines over four graded weeks. The paper board (section 5.6) supplies the lines; the first reading comes around the Week 7 settle. CLV stays in the report as a diagnostic.

2.5 Why the card is the only evidence (D17)

A FanDuel account carries more than the card: a substitution when a line moved, a parlay built by hand, an in-play ticket. In one pile with the card's tickets, the model's record would be unreadable after a season. So the card's own tickets at the card's stake and price are the evidence; everything else is recorded in the ledger because the roll has to tie, is capped by a rule of the operator's own, and appears in the report as one cash line. A card ticket placed after the close or after kickoff leaves the pre-close record for the same reason: it has no close to be judged against.

2.6 Why nothing changed at Week 5 (D18)

The 2025 study (figure 2) says the model's favoured overs lose at the close and its unders hold, and the reviewer recommended unstaking the overs. The operator declined: "The model is what it is. Without long-term statistical proof that overs are a bad choice, there is no reason to change them." One season of backtest is one sample and 44 live tickets are noise; a settings change on that would be the over-fitting the project exists to avoid. The live by-side table in every report is the running test, and the question re-opens at the Week 9 settle.

2.7 What is being built next, and why

Bo Nix vs LAC pass rush: LAC pressure 27.6% (10th), DEN allows 22.6% (17th), expected 28.9%
DEN run game vs LAC front: DEN line yards 2.99 (15th), LAC allows 3.06 (20th), expected 3.14
DEN passing vs LAC secondary: LAC allows 7.64 (26th) yards an attempt; its defensive backs allow 9.55 (28th) yards a target
LAC against WR2 (Courtland Sutton): 69 yards on 6.7 targets a game (28th fewest)
Justin Herbert vs DEN pass rush: DEN pressure 22.2% (21st), LAC allows 30.1% (31st), expected 31.0%

2.8 The decisions that shape it

DecisionWhenWhat it says
D3Aug 25No browser automation against FanDuel. Saved pages and typed inputs only; The Odds API for prices.
D6Aug 25, amended Oct 5The Kelly step from 0.25 to 0.50 is a coded gate rather than a judgment call; it now reads calibration.
D7Aug 25, amended Oct 5What counts as proof: calibration and accuracy on every priced line; CLV a diagnostic.
D16Sep 10One-sided markets priced against a market-fair reference and shrunk toward it; longshots withheld; matchup features ship one at a time with a backtest against the market baseline.
D17Sep 28The card is the only model evidence; other tickets on the account are recorded for the cash tie-out and go no further.
D18Oct 5No settings change for Week 5; overs, passing markets and the stake gate stay as live all season; review at the Week 9 settle.
D19Oct 5Proof is calibration. The league-wide paper board; the multi-season backfill; a pattern search on the whole history.

Part 3. Running a week contents

Everything is a key on one menu, ops\Betbot.cmd. The header shows the next game, the countdown, the newest card, open tickets, tokens, whether the close task is scheduled and whether the feature table is fresh. Every key leaves a dated transcript in ops\logs; the quick-start card is H and the full manual is M.

Tue to FriCode works the pastes; the runner refreshes nightly.
Wed 6:15 PMRunner: paper board for the Thursday game.
Sat 6 PM, Sun 9 AMRunner: paper boards for the slate.
Sun T-90Inactives post; save the Rewards page.
Sun T-70G: tokens, inactives, matchups, card, previews.
Sun T-60 to T-20Place from the route page; confirm each ticket on serve; 5 at T-20.
Sun T-9The close (scheduled task; 6 is the fallback).
Kickoff onNo card tickets. The model's week is over; the grade is Monday.
Figure 1. One week by the clock. Orange is the Sunday sequence that puts money at risk; navy is what the operator presses alone (Monday settle, Saturday prep); the rest is Code and the runner. T-70 means kickoff minus 70 minutes.

3.1 Saturday: prep

Find the week's referee on footballzebras.com, then press P. It refreshes the feature table through the current week, checks the close task is scheduled for kickoff minus nine (press 2 if the header says otherwise), asks for the referee (Enter skips; game lines stay unquoted without one), opens the shadow-matchup file in Notepad (one line per pairing, CB <defender> shadows WR <receiver>; close it if none), prices the paper board for the games already snapshotted, makes the capture folder and prints the Sunday clock.

3.2 Sunday: the card

  1. Kickoff minus 90. The inactives post. Save FanDuel's Rewards page into data\exports (Ctrl+S, "Webpage, Single File").
  2. Kickoff minus 70. Press G. It runs the status check, refreshes only if the table is stale, takes the tokens (Notepad: one add line per boost, or the saved Rewards page once paste 52 lands), the referee, the inactives file, the matchups file, then builds the board, the card, the route page and serve, prints the injury preview and the paper board, and shows the clock. It refuses after the close and asks before the inactives are out.
  3. Placing. Work the route page in its order. After FanDuel confirms a ticket, tick it on serve before starting the next. Tap exactly the button the route page names; read the side back from the slip before Place Bets. Line moved: skip it, never the neighbouring line. Ladder lines: FanDuel's rung label is the line. A token whose minimum stake is above the card stake stays unused. SGP only at or above the ladder's first non-zero price.
  4. Kickoff minus 20. Press 5: every placed ticket has a ledger row, by name; nothing on the wrong side; the close task is Ready.
  5. Kickoff minus 9. The close lands by itself; L shows CLOSE LANDED with the feed's own timestamp. If it did not, 6 runs the fallback loop. From here, no card tickets.
  6. After the game. Save My Bets (settled) and Transaction History (from its own URL, one save per page) into data\exports with the names 7 prints.

3.3 Monday: settle

Press 7. It reads the two saved pages, proposes every ledger change (tickets matched by FanDuel id, voids, the cash rows, the runner's closing snapshot, the paper board) and writes nothing. Send the log to the reviewer; on a yes press 8: the same with apply, then the grade, the report in docs\reports, the roll tied to FanDuel's balance, the spent close task removed. Decisions, if any are due, are made here and recorded in docs\DECISIONS.md.

3.4 Reading the report

BlockWhat to look at
Card as built, card as placedThe model's result at card prices, and what the operator's placement did to it. The gap between the two is execution, and every gap so far has produced a rule or a tool.
By sideOvers and unders separately: the running test of D18.
Evidence tickets and CLVTickets placed before the close, with the price movement to the close. Zero movement is a measurement.
CalibrationPredicted against realised by decile, with n, for the card and (from Week 5) the paper board; both counts shown, priced rows and two-way lines.
The gate lineWhere the Kelly step stands against its numbers.
Other account activityOne cash line so the roll ties; nothing else.

Part 4. What the evidence says contents

Every number below is walk-forward (the model never sees the game it is scored on), scored against what happened and against FanDuel's closing price with the margin removed, reported with its count, and produced under a pass sentence written before the run. Noise is stated with the number: the standard error of a hit rate on n sides is about 50/√n points.

4.1 The 2025 season against FanDuel's closes

2026-10-08T08:01:22.230663 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ overs (1,898 sides) unders (6,276 sides) unders, edge 5+ (3,559 sides) 40.0 42.5 45.0 47.5 50.0 52.5 55.0 57.5 60.0 % 48.5% 51.3% 53.2% 53.2% 54.0% 52.8% 2025 walk-forward, 284 games against FanDuel's closes, by favoured side hit rate break-even at the close
Figure 2. 284 games, 8,174 two-way lines. Hit rate against break-even at the closing price, by the side the model favoured: the overs fall 2.8 points short (2.4 standard errors), the unders sit on break-even, and the unders with a claimed edge of five points or more clear it by 1.2 points (1.4 standard errors on 3,559 sides).
2026-10-05T20:39:49.115589 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ under 5 pts 5-8 pts 8+ pts −6 −4 −2 0 2 4 flat ROI at the close -4.0% +0.6% +1.4% Return per dollar by claimed edge (2025, 8,174 two-way lines)
Figure 3. Flat return per dollar at the close by the model's claimed edge. Under five points the claim is noise; above it the claim is roughly honest.
2026-10-05T20:39:49.180564 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ −8 −6 −4 −2 0 2 4 6 8 season ROI on the simulated cards (2025 closes) all four loosenings, DEN model alone (no market blend), DEN stake gate off, DEN min_edge 5, DEN overs unstaked, league-wide overs unstaked, DEN live settings, league-wide (284) live settings, DEN (19 games) -6.0% -1.2% -2.8% -1.5% -0.3% +5.6% -0.6% +2.8% The 2025 cards re-simulated under each setting, scored at the close
Figure 4. The 2025 cards re-simulated under each setting. No setting makes the league-wide card positive at the close; unstaking the overs helps the Broncos slice; every loosening loses.

What it means. The model's probabilities are useful on unders and on claimed edges above five points, and nothing in the settings makes it a book-beater at the close. Passing markets lose on both sides. The dollars, if they come, come from placing at kickoff minus 70 against a close that rarely moves, or from a better model, which the matrix in section 4.5 is testing now.

4.2 The card's record, Weeks 1-4

2026-10-05T20:39:49.232358 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ start Wk 1 at KC Wk 2 vs JAX Wk 3 vs LA Wk 4 at SF −80 −60 −40 −20 0 20 cumulative net, $ $0 -33.10 -58.58 -56.03 -42.45 The card's record: cumulative net of card tickets at card prices, Weeks 1-4
Figure 5. The card's own record, cumulative: card lines at card prices on pre-close tickets, with lines the operator did not place carried as paper evidence. 46 tickets, 16-28 with one void, -$42.45 on $553.50 (-7.7%): noise-sized either way.
2026-10-05T20:39:49.274616 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ model's overs (incl. alt lines) model's unders one-sided other (anytime TD etc.) −150 −100 −50 0 50 100 150 net, $ -113.99 6-19 on $327 +107.54 10-4 on $190.50 -36.00 0-5 on $36 2026 card tickets by side, Weeks 1-4 (44 settled)
Figure 6. The same tickets by side. Unders 10-4, overs 6-19: the split the 2025 study predicted, at a count (7.5 points of standard error) that agrees in sign and proves nothing yet.
2026-10-05T20:39:49.321460 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ <55% (one-sided longshots) 60-65% 65-70% 70%+ 0 20 40 60 80 100 % n=10 n=6 n=4 n=3 Live calibration, 23 settled card tickets with a model probability model said actually won
Figure 7. Calibration on the 23 card tickets that carry a model probability. Every bucket won less often than the model said; the error bars show how little 23 tickets can say. The paper board replaces this with hundreds of lines a week.

4.3 Three studies the card is waiting on

2026-10-05T20:39:49.447373 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ as fitted (live) proportional redistribution position-aware redistribution 0.70 0.71 0.72 0.73 0.74 0.75 log-loss (lower is better) Probabilities improve all 8,172 lines 2,429 lines a teammate's absence moved as fitted (live) proportional redistribution position-aware redistribution −4 −3 −2 −1 0 1 flat ROI on the moved lines -1.0% -1.7% -1.9% The bets do not (noise 1.1 pts) Injury-aware usage, 2025 walk-forward (paste 44)
Figure 8. Injury-aware usage: redistributing an absent starter's targets and carries before pricing improves the probabilities on the lines it moves (left) and leaves the money within noise (right). Passes its sentence thinly; decision at the Oct 12 settle.
2026-10-05T20:39:49.591810 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ price implied actually happened 0 10 20 30 40 % 35.8% 24.9% "To record a sack", 2,021 closes market (calibrated) model 1.2.0 0.50 0.52 0.54 0.56 0.58 log-loss, 809 held-out closes 0.5551 0.5507 Model beats the price slightly; its largest calibration gap is 14.5 pts (limit 5) Sacks, 2025 closes (paste 36)
Figure 9. Sacks: FanDuel charges about 11 points of margin (price says 35.8%, it happens 24.9%), and the sacks model beats the price slightly while being badly calibrated (largest gap 14.5 points against a limit of 5). No sack line reaches the card until a re-fit passes.
2026-10-05T20:39:49.657670 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 11:36 AM to 2:01 PM (145 min, card build) 2:01 PM to 2:17 PM (16 min, close) Week 3 close window (41 min) Week 1, 10 min apart 0 10 20 30 40 50 60 70 % of selections that moved 667 of 1,489 0 of 1,496 145 of 1,487 843 of 1,504 Share of the board that moved between two snapshots
Figure 10. How much of the board moved between two snapshots. Week 4's close window moved nothing; the feed had refreshed (checked for 80 credits). This is why CLV alone cannot be the proof.

4.4 What would prove the reasoning wrong

4.5 Being tested now: the regression matrix

One harness, eight fixed folds inside 2025 (weeks 7 to 14 scored), a holdout nobody chose anything with (2025 weeks 15-18, the playoffs, 2024 as it lands), and a pass sentence written before each run. Rows: the persistence of each stat year over year (which picks the model's windows); injury usage; Next Gen Stats; FTN tendencies; the matchup features, each and cumulative; the live LightGBM against a tuned one and an automated ensemble with SHAP so the patterns have names; the market-anchored refit; sacks re-fitted on posted players; the boost lane. A feature row is adopted if log-loss beats the base on every market it feeds, its largest reliability gap is no worse, and the holdout agrees in sign. A row that passes the folds and fails the holdout fails. Verdict in docs\REGRESSION_MATRIX_2025.md; decisions at the Oct 12 settle.

Part 5. How it works contents

Free data (nflverse)play-by-play, usage, snaps, injuries,Next Gen Stats, PFR, FTN chartingnightly, 2016-2026, $0The Odds API (credits)FanDuel boards and closeslive: about 65 credits a boardhistory: props 2023-25, lines 2020-FanDuel pages, saved by handMy Bets, Transaction History,Rewards, market tabs, D/STCtrl+S in Chrome; no automationFeature table + modelsplayer_game (55 inputs, live)ngs_player, ftn_team, matchup_*(study only until a row passes)LightGBM props 1.1.0, game lines,market-fair references, calibrationsThe Broncos cardevery line priced; gates, band,blend, Kelly 0.25, caps, tokens,SGP; route page; serveThe paper boardevery slate game, every week,two snapshots, priced as paper,graded: the calibration evidenceLedger (SQLite)bets, legs, cards,card_lines, tokens,snapshots, activity,bankroll; additiveonly; tied MondayOps layer: the Betbot.cmd menu (P, G, 1 to 8, I, L ...), the scheduled close, the GitHub nightly, closing-snapshot and paper-board jobsthe operator presses keys and types the inputs (tokens, inactives, referee, matchups, rungs); every run leaves a transcript in ops\logs;Code builds from numbered pastes, one commit per step with the suite green; the reviewer reads the logs and writes the next paste
Figure 11. Three inputs (free stats, paid prices, saved FanDuel pages), one feature table and model set, two outputs (the Broncos card, the paper board), one ledger, and an ops layer the operator drives by key.

5.1 Data

2026-10-05T20:39:49.705780 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2016 2018 2020 2022 2024 2026 FanDuel player-prop closes, available to buy FanDuel player-prop closes, on disk FanDuel game-line closes (Odds API, available) participation: box, rushers, coverage (post-season only) FTN charting, per play (nflverse) PFR pressure and coverage, weekly (nflverse) Next Gen Stats, weekly (nflverse) play-by-play, usage, snaps, rosters, injuries (nflverse) Seasons covered by each source
Figure 12. Seasons covered by each source. Navy is free and on disk; grey is study-only; orange is the paid prop closes on disk; outlined is paid and available to buy.

The free side is nflverse: play-by-play, usage, snap counts, rosters and injuries since 2016, Next Gen Stats since 2016, PFR pressure and coverage since 2018, FTN per-play charting since 2022, refreshed nightly by the runner and on Saturday by P. Weather is an hourly forecast at the stadium. The paid side is The Odds API with the FanDuel filter: a live board is about 1,500 selections across 58 markets for 65 credits; historical closes are sold at ten credits a market from May 2023 for props. The feature table (player_game) holds each player's rolled usage and production before each game, about 25,000 rows a season, 55 inputs; the Next Gen, charting and matchup tables sit beside it and are joined only by study rows, so nothing enters the live model without a decision.

5.2 Models

The live props model (player_props-1.1.0) is LightGBM, one model per market, predicting a mean and a spread per player-game; counts are priced on a negative binomial, yards on a log-normal or gamma, and the probability of any line comes from the fitted distribution. Game lines are Normals with the closing line as an input; their first backtest said they do not beat the close, so they price team totals and SGP legs and are rarely staked. One-sided markets use a market-fair reference fitted on 2025 closes. Two refits are queued behind the matrix: a dispersion refit per market and position (1.3.0) if the spread check fails, and the market-anchored refit (2.0.0) that takes the market's number as an input and learns where it is wrong.

5.3 From board to card

  1. Pull FanDuel's board for the game (one full pull; a second inside 15 minutes is refused; a credit floor stops any pull unless forced).
  2. Price every selection: the model's probability, the market's no-vig probability, the edge, the EV.
  3. Gate: feature readiness (no referee, no game lines), the stake gate, the role-change check in weeks 1-3, the band on both probabilities, the minimum edge, the TD price floor.
  4. Size: blend the two probabilities, Kelly 0.25 of the ledger's roll, then the caps.
  5. Tokens: assigned after sizing; a token never raises a stake.
  6. SGP: a copula proposer builds the parlay from card legs; the ladder prints the stake at each FanDuel price.
  7. Write the card, the route page and serve; store every line with its numbers as of the build.

5.4 The ledger and the settle

SQLite, additive only. Every priced selection ever stored (about 226,000 rows, 189,000 of them historical closes), every card and its lines, every ticket with its origin, stake, price, boost, model probability, closing price and result, every token with its terms, every Transaction History row. Corrections are new rows with the ticket id as evidence; paper tickets are evidence and never cash. Monday's settle proposes, then applies: My Bets matched by FanDuel id, cash rows imported, the closing snapshot fetched, the paper board graded, the report written, the roll tied to the balance.

5.5 The runner and the close

GitHub Actions does three things: the nightly data refresh and feature build (10:00 UTC), a closing snapshot at kickoff minus eight for every standard slot (guarded so it only fires when a Broncos game is inside the window; the result is downloaded at the settle), and the paper-board snapshots at six weekly slots plus 6 AM Sunday for London. On the PC a scheduled task takes the close at kickoff minus nine; the close refuses a stale feed, so a flat board is a measurement, never an artefact.

5.6 The paper board

Every slate game is snapshotted twice by the runner, early and late, and priced as paper by the same model and settings as the Broncos card with stakes sized on the $400 opening roll so weeks compare. Monday grades it, and the report's calibration block reports priced rows and two-way lines separately, because the gate counts two-way lines once each: about 490 a week, so the 1,000-line floor is reached around the Week 7 settle. Paste 52 adds game lines (weather and a referees file for every game), an early-against-late movement section, and pricing on the runner right after the snapshot.

5.7 What it costs

2026-10-05T20:39:49.763790 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 20000 40000 60000 80000 100000 120000 Odds API credits Oct left (expires Nov 1) Oct probes and tests Oct live + runner Oct 2024 batch 1 Oct 2025 backfill Sep expired unused Sep historical Sep live pulls 21,243 158 385 11,220 66,889 97,953 900 1,150 The 100K plan's credits, two cycles: 200,000 bought, about 80,800 used
Figure 13. The 100K plan's two cycles. Red is what expired unused in September; orange is the October backfills; the light bar is what is left and expires Nov 1.

Everything but the prices is free. The Odds API is $59 a month for 100,000 credits: a full board is $0.04, a live game week about $0.24, a season of historical closes about $39.50, a paper-board week about $1.10. The rules since October: no plan change mid-cycle (unused credits expire on the 1st), a spend-down check on the 25th, backfills in batches of 40 games with the estimate printed first and a credit ceiling on every call, and any test that could spend runs on a copy of the ledger with a zero ceiling.

5.8 How the work moves

Glossary contents

Every term below is linked from its first use in each section (dotted underline; hover for the definition).

Two-way line
A line with an over and an under at posted prices; the unit the gate counts.
Paper board
Every slate game, every week, priced as paper tickets and graded; the calibration evidence.
Paper ticket
A recorded prediction with no money on it; evidence in grading and calibration, excluded from the roll and every cap.
Route page
The placement order for the card in FanDuel's own layout, with the search word, the tab and the button label.
One-sided market
A line with no opposite side to remove the margin from (anytime TD, ladder rungs, sacks); priced against a market-fair reference.
CLV, closing-line value
How much better the price taken was than the closing price, raw or with the book's margin removed; a diagnostic since D19.
Close, closing line
The board at kickoff minus nine minutes, taken by the scheduled task or the runner; the market's last price.
No-vig
The market's probability with the book's margin removed (the two sides of a line scaled to sum to 100%).
Fold, walk-forward
A fit on weeks 1 to k, scored on week k+1; eight fixed folds inside 2025 for the matrix (weeks 7 to 14 scored).
Holdout
Data never used to choose anything, scored once at the end: 2025 weeks 15-18, the playoffs, 2024 as it lands.
Log-loss, Brier
Scores of a probability against what happened; lower is better; both are reported against the market's no-vig number.
Calibration, reliability
Whether lines the model calls x% win x% of the time, measured by decile; the largest gap between predicted and realised is the gate's number.
Decile
One of ten probability buckets (50-60%, 60-70% ...) that the calibration table is read by; each bucket needs enough lines for its gap to mean anything.
Standard error, noise
How far a measured rate can sit from the truth by chance alone: about 50 divided by the square root of n, in points, for a hit rate on n sides. A result inside two standard errors of zero is reported as noise.
Kelly gate (D6)
The coded rule (D6, read through D19) that moves the Kelly fraction from 0.25 to 0.50: largest decile gap five points or under on 1,000 or more two-way lines over four graded weeks. The card footer and the settle report print its numbers (the gate line); the report prints KELLY GATE MET the week it opens.
Kelly fraction
The share of the growth-optimal stake actually used; 0.25 live, 0.50 behind the calibration gate.
Stake gate (6b)
Usage thresholds a player must clear before his line is staked: three targets in the last three games, 10% target share, 40% snap share.
Ladder, rung
FanDuel's alternate lines on a stat (10+, 20+ yards); the rung label is the line (3+ is over 2.5).
SGP
Same-game parlay; the price is read from FanDuel's slip and typed by hand; nothing is scraped.
Token
A FanDuel promotion (profit boost, bet reset, no-sweat, bonus bet) with its terms, inventoried and assigned after sizing.
Snapshot, batch
One pull of a board into odds_snapshots; every row carries its batch id and, since schema v10, the feed's own timestamp.
Paste
A numbered instruction file the reviewer writes for Code (ops\pastes\paste_NN_name.md); Code works it in order and reports back.
Settle
Monday's two-phase tie-out (propose, apply) of the ledger to FanDuel's record, then the grade and the report.
Serve
The local confirm form (127.0.0.1:8787) where each placed ticket is ticked with its real stake and price.
Roll
The FanDuel balance as the ledger knows it; cards size on it; $496.03 today.
Edge
The model's probability minus the market's no-vig probability, in points.
EV
Expected value: the average return per dollar if the probability is right, price and boost included.
Credits
The Odds API's unit of spend: one per market per region per request for live boards, ten for historical.
The Odds API
The licensed price feed that carries FanDuel's board and closes; costs credits, carries no account risk; the only paid data source.
nflverse
The open-source NFL data project (play-by-play, stats, snaps, rosters, injuries, Next Gen Stats, PFR, FTN charting); free, refreshed nightly.
Runner
The GitHub Actions jobs: nightly refresh, closing snapshots at kickoff minus eight, paper-board snapshots. Downloads to the PC as artifacts; never writes the ledger.
Board
Every selection FanDuel offers on a game at one moment, as stored from The Odds API (about 1,500 selections) or from saved pages.
Card
The model's priced table of staked lines for the Broncos game, with stakes, minimum prices and token suggestions; the only model evidence.