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

How to build an NCAAF scoreboard and live game center

Start with a free FBS score board, then add the play descriptions that turn a score tile into a game center. The two feeds update at different speeds, and this guide keeps that distinction visible.

API coverage and endpoint overview: Explore the NCAAF API

Why this is hard

A college football game center has two update cycles

Score, linescore and status come from the match feed; period, clock and descriptive plays come from a separate licensed feed. Treating them as one stream creates false freshness and a brittle client.

  • FBS is league=ncaaf. NCAAF FCS is a separate league=ncaaf-fcs and must not be mixed into an FBS board accidentally.
  • Scores poll about every 15 seconds while a game is active, but the first kickoff can take about two minutes to appear from the idle cadence.
  • Live plays refresh on an approximately five-minute worker cadence. They are context, not a second-by-second animation feed.
  • The play route carries home_win_probability for supported NFL rows, not NCAAF. A college game center must not manufacture that chart.

Path 1 · recommended

Have your AI agent build it

Use get_matches to build the score board. The live NCAAF play route is not exposed as an MCP tool, so the agent must make one authenticated REST call for play descriptions.

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 FBS college football scoreboard.

Use get_coverage for american_football first, then get_matches filtered to
league ncaaf and status live. Render home and away teams, score, linescore and
status. Poll the match route for score changes.

For a selected match UUID, call
GET /v1/live-stats/american_football/{matchId}/plays directly. Show the latest
descriptive plays and label that panel with its own meta.as_of and meta.stale.
Do not derive or display win probability for NCAAF. Keep league=ncaaf-fcs out
of this FBS board.

What the agent cannot reach

MCP can discover matches but has no live-play tool. The REST play route is Pro-gated, refreshes roughly every five minutes, and does not provide NCAAF win probability. Per-player box scores are a postgame surface, not a live scoring substitute.

Path 2 · hand-coded

Build it yourself

These calls use the same canonical match UUID. No response examples are shown because this page did not capture an authenticated production payload; the code reads only fields declared in the served OpenAPI contract.

  1. 01

    Fetch the live FBS board

    Ask for American football, the FBS league key, and live status. An empty data array is the correct off-hours state.

    GET /v1/matchesbash
    curl -s "https://api.bigballsdata.com/v1/matches?sport=american_football&league=ncaaf&status=live" \
      -H "x-api-key: $BBS_API_KEY"
  2. 02

    Poll one selected game

    Refresh only the open match. Keep the match response freshness separate from the play panel freshness.

    GET /v1/matches/:idbash
    curl -s "https://api.bigballsdata.com/v1/matches/$MATCH_ID" \
      -H "x-api-key: $BBS_API_KEY"
  3. 03

    Add licensed play descriptions

    The live-play route accepts the same match UUID and returns ordered plays plus meta.as_of and meta.stale. It requires Pro.

    GET /v1/live-stats/american_football/:matchId/playsbash
    curl -s "https://api.bigballsdata.com/v1/live-stats/american_football/$MATCH_ID/plays" \
      -H "x-api-key: $BBS_API_KEY"
  4. 04

    Render two freshness labels

    Display score and play timestamps independently. Never replace a stale play panel with a made-up current drive.

    Freshness-aware view modeljavascript
    const latestPlay = plays.data.plays.at(-1);
    const gameCenter = {
      score: match.data.score,
      linescore: match.data.linescore,
      period: latestPlay?.period ?? null,
      clock: latestPlay?.clock ?? null,
      plays: plays.data.plays.slice(-8).reverse(),
      playsAsOf: plays.meta.as_of,
      playsStale: plays.meta.stale,
    };

Reference

Every endpoint this tutorial uses

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

MethodPathReturnsWhy you need itPlan
GET/v1/matches?sport=american_football&league=ncaaf&status=liveFBS match UUIDs, teams, live status, score and linescoreThe score-board feed and the source of the canonical match UUID. Read the endpoint guide.Approximately 15-second active polling; first kickoff can take about two minutes to appear while the worker leaves idle cadence.Free
GET/v1/matches/:idOne match with its current score and statusRefresh one open tile instead of refetching the entire Saturday board.Free
GET/v1/live-stats/american_football/:matchId/playsOrdered descriptive plays with down, distance, scores and freshness metadataAdds play context to the selected score tile. Review authentication.Roughly five-minute refresh. home_win_probability is not available for NCAAF and must remain absent.Pro

Pricing, honestly

Scores are free; live play context is Pro

A useful FBS score board is free. Upgrade only when the selected-game view needs the licensed descriptive play feed.

Free routes

texttext
GET /v1/matches?sport=american_football&league=ncaaf&status=live\nGET /v1/matches/{matchId}

Pro route

texttext
GET /v1/live-stats/american_football/{matchId}/plays
  • The free build still shows teams, score, linescore and game status.
  • Pro adds descriptive plays; it does not change the score feed cadence.
  • No tier unlocks NCAAF win probability today, so the UI should not reserve a fake chart for it.

More tutorials

Other build guides

Known gaps

What this game center deliberately leaves out

The omissions are product boundaries, not unfinished code in the tutorial.

  • NCAAF home win probability is not served. The similarly named field on the play contract is populated only for supported NFL rows.
  • Per-player and team box scores are postgame data for NCAAF. Do not label them live.
  • FCS uses league=ncaaf-fcs. Add it as a separate board only if your product intends to cover that division.

Questions

Can I build the NCAAF scoreboard on the free tier?
Yes. The match list and single-match refresh routes are free. The licensed live-play route requires Pro.
How quickly do NCAAF scores update?
While a game is active, score, linescore and status poll about every 15 seconds plus a small scheduling stagger. The first kickoff can take about two minutes to register while the worker is leaving its idle cadence.
Does the play feed update at the same speed?
No. Live NCAAF plays currently refresh about every five minutes, so give the play panel its own as-of label.
Does NCAAF play-by-play include win probability?
No. Do not infer it from the NFL field on the shared contract and do not substitute a guessed value.
Are FBS and FCS the same league filter?
No. Use league=ncaaf for FBS and league=ncaaf-fcs for FCS.

Build the FBS score board first

Start with the free match feed, then add Pro play context when your selected-game screen needs it.