Tutorial · 10 min · endpoints verified 2026-09-17

How to build an NCAAF betting model

Resolve the 2025 FBS archive on Solo, then use Edge historical odds for a timestamp-safe backtest. Keep FCS and missing-market rows out of the model.

API coverage and endpoint overview: Explore the NCAAF API

Why this is hard

Backtesting college football without hindsight leakage

A finished score and today’s final price are not enough. The model needs the line as it existed before kickoff and must exclude games without a loaded market.

  • Historical odds exist for FBS, not FCS.
  • The per-match odds route is current pricing, not the 2025 archive.
  • A missing odds row is not a zero-price observation.
  • Train/test splits must follow kickoff time, never random row order.

Path 1 · recommended

Have your AI agent build it

Use MCP for game discovery and REST for odds.

1. Connect the MCP server

Add the server in your MCP client and sign in with your Big Balls account. Your client registers itself and handles the token exchange — there is no key to copy.

MCP client configjson
{
  "mcpServers": {
    "bigballs-sports-data": {
      "url": "https://mcp.bigballsdata.com/mcp"
    }
  }
}

2. Tools your agent gets

  • get_matches

    Live, upcoming or historical matches for a sport or league.

  • get_coverage

    Machine-readable map of what we hold and what we do not.

3. Ask for what you want

Paste this at your agent. It is written to make the model check coverage before it designs anything, which is what stops it inventing a field we do not serve.

Prompttext
Build an NCAAF FBS closing-line backtest. Find 2025 games, request historical odds by match id, keep only pre-kickoff snapshots, and split training and evaluation chronologically. Do not include FCS or games with no odds.

What the agent cannot reach

There is no odds MCP tool. An explicit completed-season game lookup requires Solo, while historical and current odds require Edge. Missing odds rows must remain excluded.

Path 2 · hand-coded

Build it yourself

The archive and the current market are separate surfaces. Choose the one that matches the question.

  1. 01

    Load the FBS game archive

    Keep the league filter explicit so FCS is not silently mixed into the model. Because 2025 is a completed season, this first request requires Solo or higher.

    2025 FBS gamesbash
    curl -s "https://api.bigballsdata.com/v1/matches?sport=american_football&league=ncaaf&season=2025" \
      -H "x-api-key: $BBS_API_KEY"
  2. 02

    Fetch historical snapshots by match

    Use this for completed-season backtests. The current match-odds route can be empty between seasons or after a game finishes.

    Historical NCAAF oddsbash
    curl -s "https://api.bigballsdata.com/v1/odds/historical?match_id=$MATCH_ID" \
      -H "x-api-key: $BBS_API_KEY"
  3. 03

    Split chronologically

    Train on earlier kickoffs and evaluate on later ones so closing information never leaks backward.

    Time-safe splittypescript
    const ordered = rows.toSorted((a, b) => Date.parse(a.kickoff_utc) - Date.parse(b.kickoff_utc));
    const cut = Math.floor(ordered.length * 0.8);
    const train = ordered.slice(0, cut);
    const test = ordered.slice(cut);

Reference

Every endpoint this tutorial uses

All on the gateway at api.bigballsdata.com. Verified against production on 2026-09-17.

MethodPathReturnsWhy you need itPlan
GET/v1/coverage?sport=american_footballMeasured American football capability coverageChecks the available fields before the paid historical workflow begins.Free
GET/v1/matches?sport=american_football&league=ncaaf&season=2025FBS schedule, results and match idsDefines the backtest population.Solo
GET/v1/odds/historicalOpening, intermediate and closing snapshots for loaded FBS gamesProvides point-in-time prices for backtesting.The 2025 archive is partial. Measure and report the retrieved sample beside each backtest; no public exact rate is claimed because the available odds source is not approved as quotable.Edge
GET/v1/matches/:id/oddsCurrent per-book market for an active FBS gameUse for the current board, not as a substitute for historical snapshots.Edge

Pricing, honestly

Completed games begin at Solo; prices require Edge

Free can resolve the current season. This 2025 workflow starts with Solo history, while the point-in-time bookmaker archive requires Edge.

Free key

jsonjson
Current-season FBS games, scores and kickoff chronology.

Solo

jsonjson
Solo adds the completed-season game population; Edge adds current and archived bookmaker prices.
  • An explicit completed season requires Solo or higher.
  • Historical odds are an Edge capability.
  • FCS has no odds coverage today.
  • Exclude missing markets rather than imputing them.

More tutorials

Other build guides

Known gaps

Measured limits

The backtest should carry its sample boundary in the UI.

  • The 2025 odds archive is partial; report the retrieved numerator and game-population denominator for every run.
  • FCS odds are not loaded.
  • Current pricing resumes with the active board and should not be inferred from old snapshots.

Questions

Can I backtest NCAAF odds on Free?
No. Free covers the current-season game lookup. An explicit completed season such as 2025 requires Solo, and historical bookmaker snapshots require Edge.
Why is /v1/matches/:id/odds empty for a 2025 game?
That route represents the current market. Use /v1/odds/historical for completed-season snapshots.
Does the archive cover FCS?
No. Keep league=ncaaf-fcs out of the betting population.

Build the honest backtest

Start with the Solo 2025 game population, then add Edge odds without filling missing markets.