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.
{
"mcpServers": {
"bigballs-sports-data": {
"url": "https://mcp.bigballsdata.com/mcp"
}
}
}2. Tools your agent gets
get_matchesLive, upcoming or historical matches for a sport or league.
get_coverageMachine-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.
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.
- 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/matchesbashcurl -s "https://api.bigballsdata.com/v1/matches?sport=american_football&league=ncaaf&status=live" \ -H "x-api-key: $BBS_API_KEY" - 02
Poll one selected game
Refresh only the open match. Keep the match response freshness separate from the play panel freshness.
GET /v1/matches/:idbashcurl -s "https://api.bigballsdata.com/v1/matches/$MATCH_ID" \ -H "x-api-key: $BBS_API_KEY" - 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/playsbashcurl -s "https://api.bigballsdata.com/v1/live-stats/american_football/$MATCH_ID/plays" \ -H "x-api-key: $BBS_API_KEY" - 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 modeljavascriptconst 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.
| Method | Path | Returns | Why you need it | Plan |
|---|---|---|---|---|
| GET | /v1/matches?sport=american_football&league=ncaaf&status=live | FBS match UUIDs, teams, live status, score and linescore | The 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/:id | One match with its current score and status | Refresh one open tile instead of refetching the entire Saturday board. | Free |
| GET | /v1/live-stats/american_football/:matchId/plays | Ordered descriptive plays with down, distance, scores and freshness metadata | Adds 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
GET /v1/matches?sport=american_football&league=ncaaf&status=live\nGET /v1/matches/{matchId}Pro route
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
- How to build a fantasy hockey app
- How to build a fantasy basketball app
- How to build a soccer xG app
- How to build a cricket app
- NFL fantasy football API tutorial
- How to build an NFL scouting tool
- How to build an NFL conditions analytics tool
- NFL betting model API tutorial
- NFL live game center API tutorial
- How to build college football rankings and conference standings
- How to build an NCAAF fantasy football app
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.
Related APIs
Other APIs you can build with: