# How do I pull NFL exchange odds in Python?

> Independent. Not affiliated with, endorsed by or sponsored by Novig.

Canonical: https://novigapi.com/answers/nfl-exchange-odds-python
Updated: 2026-11-15

Send one GET to /api/v1/markets with league=NFL, status=open and your key in the Authorization header, then read each outcome's bid, ask and fair price. With Python's requests that is five lines. Novig had 14,529 NFL markets open on 15 Nov 2026, and each 100 rows cost 1 credit. (Source: [novigapi.com pricing](https://novigapi.com/pricing))

The sample below needs only requests. A standard-library client (`novigapi`, urllib and json only) is prepared for PyPI and will shorten it further once published.

## How the options compare

Python options, checked 15 Nov 2026

| Source | Free tier | Paid plans | Books and venues |
| --- | --- | --- | --- |
| novigapi.com | 100 credits a month, 20 requests a minute, no card | Developer $49, Production $149, Scale $499 a month; $9 for 1,000 credits that never expire | Novig, plus FanDuel and DraftKings prices beside Novig lines for +EV, arbitrage and compare |
| The Odds API | 500 credits a month, no historical odds | $30 (20K credits) to $249 (15M credits) a month | 23 US sportsbooks, 5 US fantasy sites and 7 US exchanges listed |
| TheRundown | 20,000 data points a day, 5-minute delay, no history | Starter $49 (60 s delay, 7-day history) to Max $2,499 (unlimited history) a month | 25+ books; Kalshi and Polymarket on paid plans |
| ParlayAPI | 1,000 credits a month, 48 hours of lookback | $5 (20K credits) to $200 (50M credits) a month | Sportsbooks plus Kalshi |


## Where novigapi.com falls short

> There are no pandas helpers yet; you build the DataFrame yourself from the rows, and our Python client is not on PyPI yet.

## Try it

```python
import os, requests

def nv(path, **params):
    r = requests.get("https://novigapi.com/api/v1/" + path, params=params, timeout=30,
                     headers={"Authorization": "Bearer " + os.environ["NOVIGAPI_KEY"]})
    r.raise_for_status()
    return r.json()

page = nv("markets", league="NFL", status="open", limit=100)
for m in page["data"]:
    o = m["outcomes"][0]
    print(f'{m["description"]:<50} bid {o["bid"]}  ask {o["ask"]}  fair {o["fair"]}')
```

Read the [endpoint reference](https://novigapi.com/docs/endpoints), compare [plans and credits](https://novigapi.com/pricing), or send a request from the [playground](https://novigapi.com/playground).

## Questions

### Is the Python client on PyPI?

The package is prepared as novigapi and not yet published; until then, call the REST API with requests or urllib.

## Sources

- [The Odds API: plans](https://the-odds-api.com/#get-access)
- [TheRundown: API pricing](https://therundown.io/pricing/api)
- [ParlayAPI: pricing](https://parlay-api.com/pricing)
- [novigapi.com endpoint reference](https://novigapi.com/docs/endpoints)

---

Get a free API key: https://novigapi.com/sign-up . Docs: https://novigapi.com/docs . MCP: https://novigapi.com/api/mcp . Operated by Stunning Couches LLC. Independent. Not affiliated with, endorsed by or sponsored by Novig.
