# College football odds API for NCAAF spreads, totals and moneylines

GetOdds returns college football (NCAAF) spreads, totals and moneylines from DraftKings and FanDuel's native markets, with observation times on every price. Use sport=NCAAF on the DraftKings odds endpoint and league=NCAAF on FanDuel. A full Saturday slate is larger than one page, so paginate with offset or search by team.

Canonical page: https://getoddsapi.com/college-football-odds-api

**Price.** Free development allowance: 1,000 requests per UTC day and 60 per minute per account, with no payment step. Paid: the Developer Bundle at $149 per month, with 10,000 monthly requests or credits on each of four sources.

## Free API key

Get a free GetOdds API key: **1,000 requests per UTC day and 60 per minute, no card**. One key covers REST and the hosted MCP server.

Sign up: https://getoddsapi.com/sign-up?ref=ai-claudebot

## Quickstart

1. Create an account at https://getoddsapi.com/sign-up?ref=ai-claudebot, open https://getoddsapi.com/dashboard and issue a key with the sources you need (draftkings, fanduel, betrivers, prizepicks or underdog). Keep it in a server environment variable named GETODDS_API_KEY.
2. Read current DraftKings NBA spreads with curl:

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

3. The same request in Python (standard library only):

```python
import json, os, urllib.request

req = urllib.request.Request(
    "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50",
    headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]},
)
with urllib.request.urlopen(req) as res:
    rows = json.load(res)["data"]
for row in rows:
    print(row["away"], "at", row["home"], row["side"], row["line"], row["american"], row["observed_at"])
```

4. Check `observed_at`, `age_seconds` and `stale` on every row before using a price. Full reference: https://getoddsapi.com/docs

## Use with Claude (MCP)

```bash
claude mcp add --transport http getodds https://getoddsapi.com/api/mcp \
  --header "Authorization: Bearer $GETODDS_API_KEY"
```

The MCP tools follow the key's source grants and share its allowance. Setup guide: https://getoddsapi.com/use-with-claude

## Pricing

| Plan | Allowance | Price |
| --- | --- | --- |
| Free key | 1,000 requests a day, 60 a minute | $0, no card |
| Developer Bundle | 10,000 requests or credits a month on each of four sources | $149 a month |

Free development allowance: 1,000 requests per UTC day and 60 per minute per account, with no payment step. Paid: the Developer Bundle at $149 per month, with 10,000 monthly requests or credits on each of four sources.
Details: https://getoddsapi.com/bundle

## Facts

- **Sportsbooks:** DraftKings, FanDuel
- **League code:** NCAAF
- **Page size:** 200 rows
- **Arbitrage feed:** Spreads and totals

## Page through a full Saturday

Create an account at /sign-up, open /dashboard and issue a key with the source grants you need (draftkings, fanduel, betrivers, prizepicks or underdog). Keep the key in a server environment variable named GETODDS_API_KEY and send it as a bearer token. Never put it in a URL or in browser code.

A busy college Saturday has dozens of FBS games with three markets each, which is several hundred rows. Page with limit=200 and follow pagination.next_offset until has_more is false. Rows can change between pages, so record checked_at with each page.

```python
import json, os
from urllib.request import Request, urlopen

H = {"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]}
rows, offset = [], 0
while offset is not None:
    url = f"https://getoddsapi.com/api/v1/odds?sport=NCAAF&fresh_only=true&limit=200&offset={offset}"
    with urlopen(Request(url, headers=H), timeout=20) as r:
        page = json.load(r)
    rows += page["data"]
    offset = page["pagination"]["next_offset"]  # None when there is nothing more
print(len(rows), "NCAAF prices")
```

## Find one team's game

Team names in college football are long and inconsistent across sources. Search with a distinctive fragment of the name and use the returned event ID rather than matching strings yourself.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/events/search?q=Ohio%20State&sport=NCAAF" \
  -H "Authorization: Bearer $GETODDS_API_KEY"

curl --fail-with-body "https://getoddsapi.com/api/v1/odds?sport=NCAAF&event_id=EVENT_ID" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Large spreads and key numbers

College spreads run much wider than the NFL, and mismatches of 30 points or more are common early in the season. Moneylines on those games are often extreme on both sides. When you convert a big favorite's moneyline to an implied probability, keep the full precision of the decimal price, which the API stores, rather than re-deriving it from a rounded American number.

For DraftKings versus FanDuel comparisons, /api/v1/arbitrage-bets supports league=NCAAF on half-point spreads and totals only, as with the NFL.

## FAQ

### Does the API cover every college football game?

It covers the games each sportsbook posts and the collectors capture. Use /api/v1/leagues?sport=american-football to see stored event counts, and treat missing games as unobserved rather than unavailable.

### Is college basketball available too?

Yes, as NCAAB on DraftKings and FanDuel.

### Can I get historical college football lines?

The history endpoint holds seven days of retained changes per event or offer. /api/v1/historical/events lists stored events in any 31-day window.

---

GetOdds is an independent developer product and is not affiliated with any sportsbook or pick’em operator. Prices describe data, not betting advice.
