Bovada API: Pull 141 NFL Markets per Fixture as Lines Post
Bovada publishes no developer API. We searched for documentation or a key request page on 6 November 2026 and found neither. If you want Bovada’s NFL board as JSON, you read it through an aggregator. OddsPapi carries it as the slug bovada.lv, and its sister brand Bodog as bodog.eu.
We measured the feed on 6 November 2026. On 13 NFL Week 10 fixtures, Bovada priced a median 141 active markets per fixture, 24 of them player props. Its moneyline margin sat at 3.85%, level with Pinnacle’s 3.86% and under DraftKings at 4.23%. On 43 NFL fixtures from Weeks 8 to 10, Bovada posted its first price a median 4.2 hours after Pinnacle, every time.
Pull Bovada, Bodog and Pinnacle in One Call
One /odds call with three slugs returns Bovada, Bodog and the sharp reference on the same fixture ID. Get a free key at oddspapi.io. The key goes in the apiKey query parameter, never in a header. NFL is tournamentId 31, and market 141 is the moneyline (Winner, overtime included).
import time
import requests
from datetime import datetime, timedelta, timezone
API_KEY = "YOUR_API_KEY"
BASE = "https://api.oddspapi.io/v4"
def get(endpoint, **params):
"""GET with the key as a query parameter; wait and retry on a 429."""
while True:
r = requests.get(f"{BASE}/{endpoint}", params={"apiKey": API_KEY, **params})
if r.status_code != 429:
return r
time.sleep(2.0)
def is_live(price):
return price.get("active") is not False
# 1. Confirm the slugs in the catalogue
books = {b["slug"]: b for b in get("bookmakers").json()}
for slug in ("bovada.lv", "bodog.eu"):
print(slug, books[slug]["bookmakerName"], "cloneOf:", books[slug]["cloneOf"])
# 2. Next NFL fixtures (tournamentId 31)
now = datetime.now(timezone.utc)
time.sleep(1.0)
fixtures = get("fixtures", tournamentId=31,
**{"from": now.strftime("%Y-%m-%dT%H:%M:%SZ"),
"to": (now + timedelta(days=4)).strftime("%Y-%m-%d")}).json()
fixture = sorted(fixtures, key=lambda f: f["startTime"])[0]
# 3. Bovada, Bodog and Pinnacle on one fixture, one call
time.sleep(1.0)
board = get("odds", fixtureId=fixture["fixtureId"],
bookmakers="bovada.lv,bodog.eu,pinnacle").json()["bookmakerOdds"]
print(f"\n{fixture['participant1Name']} v {fixture['participant2Name']} {fixture['startTime'][:16]}")
for slug, book in board.items():
live = [m for m in book["markets"].values()
if any(is_live(p) for o in m["outcomes"].values() for p in o["players"].values())]
ml = book["markets"]["141"]["outcomes"] # 141 = Winner (incl. overtime)
prices = [ml[o]["players"]["0"]["price"] for o in ("141", "142")]
margin = (sum(1 / p for p in prices) - 1) * 100
print(f"{slug:<10} {prices[0]:>6} {prices[1]:>6} margin {margin:.2f}% {len(live)} active markets")
# 4. Are Bovada and Bodog one feed?
def flat(book):
return {(m, o, pl): p["price"] for m, mk in book["markets"].items()
for o, oc in mk["outcomes"].items() for pl, p in oc["players"].items()}
a, b = flat(board["bovada.lv"]), flat(board["bodog.eu"])
same = sum(1 for k in a if b.get(k) == a[k])
print(f"\nbodog.eu matches bovada.lv on {same} of {len(a)} prices")
Output on 6 November 2026, 09:23 UTC (kick-off 8 November):
bovada.lv Bovada cloneOf: None
bodog.eu Bodog cloneOf: bovada.lv
Atlanta Falcons v Cincinnati Bengals 2026-11-08T14:30
bodog.eu 2.48 1.578 margin 3.69% 139 active markets
bovada.lv 2.48 1.578 margin 3.69% 139 active markets
pinnacle 2.47 1.584 margin 3.62% 100 active markets
bodog.eu matches bovada.lv on 638 of 638 prices
Bodog is Bovada. Here the catalogue’s cloneOf flag tells the truth, and the price check proves it: every price matched. Keep one of the two slugs. If you keep both, a consensus or a book count counts the same price twice. The consensus odds guide shows the dedupe step on a full board.

What Bovada Prices on an NFL Fixture
The /v4/markets endpoint names every market ID. Group Bovada’s live markets by type and period to see the menu. This block reuses get, is_live and board from the first one.
from collections import Counter
# Name every market ID once, then group Bovada's live markets by type
time.sleep(1.0)
names = {m["marketId"]: m for m in get("markets", sportId=14).json()}
families = Counter()
props = 0
for mid, m in board["bovada.lv"]["markets"].items():
if not any(is_live(p) for o in m["outcomes"].values() for p in o["players"].values()):
continue
info = names[int(mid)]
families[f"{info['marketType']} / {info['period']}"] += 1
props += info["playerProp"]
print(f"{sum(families.values())} active Bovada markets, {props} player props")
for family, n in families.most_common(10):
print(f"{n:>4} {family}")
Output for Falcons v Bengals, same run:
139 active Bovada markets, 23 player props
25 totals / result
23 spreads / result
9 bothteamsscore / result
9 spreads / p1+p2
9 totals / p1+p2
6 playertotals-receivingyards / result
5 bothteamsscore / p1+p2
3 bothteamsscore / p1
2 playertotals-passcompletions / result
2 playertotals-tdpasses / result
Bovada’s NFL depth is in the alternate spreads and totals. It posts about 25 rungs of each on the full game, plus first-half lines (p1+p2). Its props cover receiving, rushing and passing yards, completions and touchdown scorers. DraftKings and FanDuel list far more props, so read Bovada for its main and alternate lines and the US books for prop depth.
We ran the same count on five tournaments that morning. The figure is the median number of active markets per fixture.
| Tournament (fixtures read) | bovada.lv |
pinnacle |
draftkings |
fanduel |
|---|---|---|---|---|
| NFL Week 10 (13) | 141 | 91 | 547 | 517 |
| NCAA football (8) | 63 | 39 | 323 | 269 |
| NBA (9) | 53 | 56 | 178 | 634 |
| NHL (3) | 51 | 63 | 78 | 31 |
| Premier League (4) | 111 | 99 | 143 | 128 |
Fixtures kick off 6 to 9 November 2026. The NBA count is for games on the night of the read, when Bovada had props on three of the nine. Prop counts rise as tip-off gets closer, so measure on the night you trade.

When Bovada Posts Its NFL Lines
Pinnacle posts most of the next NFL week’s moneylines around midnight UTC on Sunday night. Bovada follows in three or four batches. On 43 fixtures from Weeks 8 to 10, Bovada’s first moneyline came a median 4.2 hours after Pinnacle’s (1.3 to 11.0 hours), and it never came first. On 13 of 14 Week 9 fixtures, both of Bovada’s opening prices sat just under Pinnacle’s prices at that moment. For Week 9, Bovada posted 10 of 14 games at 05:03 UTC on Monday 26 October, about five hours after Pinnacle.
DraftKings works on a different clock. It had every Week 10 fixture up by 27 October, five to six days before Pinnacle and Bovada. The NFL odds opening study maps the whole board’s ramp.
To see the opening time and the close for any played fixture, ask /historical-odds for one outcome at a time. The outcomeId filter keeps each response near 200 KB. The endpoint takes three bookmakers per call, and you wait 4.6 seconds after each successful call.

# Opening time and closing price on a played NFL fixture
time.sleep(1.0)
played = get("fixtures", tournamentId=31,
**{"from": (now - timedelta(days=8)).strftime("%Y-%m-%d"),
"to": now.strftime("%Y-%m-%d")}).json()
played = [f for f in played if f["statusName"] == "Finished"]
game = sorted(played, key=lambda f: f["startTime"])[0]
kickoff = game["startTime"]
history = {}
for outcome in ("141", "142"):
time.sleep(1.0)
r = get("historical-odds", fixtureId=game["fixtureId"],
bookmakers="bovada.lv,pinnacle,draftkings", outcomeId=outcome)
for slug, book in r.json()["bookmakers"].items():
snaps = book["markets"]["141"]["outcomes"][outcome]["players"]["0"]
history.setdefault(slug, {})[outcome] = [s for s in snaps
if s["active"] and s["createdAt"] < kickoff]
time.sleep(4.6)
print(f"\n{game['participant1Name']} v {game['participant2Name']} kick-off {kickoff[:16]}")
for slug, legs in history.items():
opened = min(legs[o][0]["createdAt"] for o in legs)
close = [legs[o][-1]["price"] for o in ("141", "142")]
margin = (sum(1 / p for p in close) - 1) * 100
print(f"{slug:<10} first price {opened[:16]} close {close[0]}/{close[1]} margin {margin:.2f}%")
Output on 6 November 2026 (the first finished fixture in the window):
Green Bay Packers v Carolina Panthers kick-off 2026-10-30T00:15
bovada.lv first price 2026-10-26T05:03 close 1.513/2.65 margin 3.83%
draftkings first price 2026-10-20T21:51 close 1.541/2.54 margin 4.26%
pinnacle first price 2026-10-26T00:07 close 1.537/2.66 margin 2.66%
Bovada’s Close Against Pinnacle and DraftKings
We ran that loop on all 14 NFL Week 9 fixtures (29 October to 2 November 2026). The close is the last active price before the scheduled kick-off. A move is a change from the previous active price on either side.
| Book | First price, hours before kick-off | Opening margin | Closing margin | Pre-match moves |
|---|---|---|---|---|
bovada.lv |
157 (91 to 182) | 4.20% | 4.00% (3.35% to 4.75%) | 78 (32 to 176) |
pinnacle |
162 (96 to 190) | 3.21% | 2.68% (2.42% to 3.21%) | 130 (72 to 232) |
draftkings |
284 (218 to 315) | 4.27% | 4.29% (4.09% to 4.71%) | 120 (40 to 212) |
All figures are medians across the 14 fixtures. Bovada closed tighter than DraftKings on 10 of 14. Its no-vig home probability at the close sat a median 0.46 points from Pinnacle’s fair probability, with a maximum of 1.75 points. Bovada moved its price about 40% less often than Pinnacle. On a news day, compare its latest price with Pinnacle’s latest move before you trust the gap. The historical odds API guide covers the close-cutting rules, and the line shopping guide puts Bovada next to every other book on the board.
Bovada’s offshore neighbour Bookmaker.eu runs one feed under four slugs. See the Bookmaker.eu odds API post for that family. For the regulated US side, see the DraftKings API post.

Scraping Bovada Against One API Call
| Scrape bovada.lv | OddsPapi | |
|---|---|---|
| Access | Your own parser and proxies; it breaks when the site changes | One API key |
| Other books | Bovada only | Pinnacle, DraftKings, FanDuel and 300+ in total |
| IDs | Bovada’s own event paths | Shared fixture, market and outcome IDs across every book |
| History | Only what you stored yourself | Timestamped snapshots back to the first price, on the free plan |
| Push updates | Poll the site | WebSocket feed on the B2B plan |

Frequently Asked Questions
Does Bovada have a public API?
We found no public Bovada developer documentation and no self-serve API key (search on 6 November 2026). Developers read Bovada prices through an aggregator. OddsPapi carries the book as the slug bovada.lv, next to Pinnacle and 300+ other bookmakers under shared fixture and market IDs.
Are Bovada and Bodog the same odds feed?
Yes. The catalogue marks bodog.eu as cloneOf bovada.lv, and on 6 November 2026 Bodog matched Bovada on 638 of 638 prices on an NFL fixture. Query bovada.lv once and drop bodog.eu before you average prices or count books.
How many NFL markets does Bovada price?
On the 13 NFL Week 10 fixtures we read on 6 November 2026, Bovada priced a median 141 active markets per fixture (124 to 147), 24 of them player props: spreads, totals, first-half lines, receiving, rushing and passing yards, and touchdown scorers.
When does Bovada post its NFL lines?
On 43 NFL fixtures from Weeks 8 to 10 of 2026, Bovada posted its first moneyline a median 4.2 hours after Pinnacle (1.3 to 11.0 hours), in three or four batches a week. DraftKings had the same fixtures up five to six days earlier.
How does the Bovada margin compare with Pinnacle and DraftKings?
On 14 NFL Week 9 fixtures, Bovada closed the moneyline at a 4.00% median margin. Pinnacle closed at 2.68% and DraftKings at 4.29%. Bovada closed tighter than DraftKings on 10 of the 14.
Is Bovada historical odds data free?
On OddsPapi, yes. The /historical-odds endpoint is on the free plan and returns timestamped Bovada snapshots for up to three bookmakers per call, back to the first price the book posted.
Get Started
Read Bovada next to Pinnacle, DraftKings and 300+ bookmakers under one set of IDs, with free history back to the first price it posts. The Bovada bookmaker page shows its live coverage, and the NFL board shows this week’s fixtures.