Circa Sports API: How to Access Circa Odds Without an Official API
Looking for a Circa Sports API? There Isn’t One
Circa Sports is the sharpest book in Las Vegas. It opened the Circa Resort in 2020 on a simple promise: post early, take the biggest limits in the state, and let sharp money set the line. Professionals bet Circa because it doesn’t ban winners the way the soft books do. That makes Circa’s prices some of the most informative in the US market.
So naturally, developers want to pull Circa odds programmatically. The problem: Circa has no public API. No developer portal, no documentation, no API key. If you want Circa’s lines in JSON, you are out of luck through official channels.
This guide shows you how to get Circa Sports odds anyway, in Python, alongside Pinnacle and 350+ other bookmakers through a single OddsPapi call. We’ll pull a live World Cup line, de-vig it, and show how Circa stacks up against Pinnacle, the only other book in its sharpness class.
Why Scraping Circa Yourself Is a Bad Idea
The DIY route is to scrape circasports.com or reverse-engineer their mobile app. Both are fragile and adversarial:
| The Old Way (Scraping Circa) | The OddsPapi Way |
|---|---|
| Geo-fenced to NV/CO/IA — needs a presence in-state | One HTTPS call from anywhere |
| Markup changes break your parser weekly | Stable JSON schema |
| One book in isolation, no context | Circa next to Pinnacle + 350 books in the same payload |
| Rate-limited / blocked on detection | Clean API key, documented limits |
| You build the odds converter | Decimal, American & fractional pre-computed |
OddsPapi already aggregates Circa under the slug circasports. You query the fixture, you get Circa’s price in the response. No state residency, no headless browser, no cat-and-mouse.
The Tutorial: Pull Circa Odds in Python
Step 1 — Authenticate
OddsPapi auth is a query parameter, never a header. One key works on every endpoint.
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.oddspapi.io/v4"
r = requests.get(f"{BASE}/sports", params={"apiKey": API_KEY})
print(r.status_code) # 200
Step 2 — Find a Fixture Circa Prices
Circa is a US-regulated mainline book. It prices the events its sharp customers bet most: the big soccer tournaments, MLB, NFL, NBA and futures. Pull fixtures for a sport and date range, then keep the ones that carry odds.
def fixtures(sport_id, frm, to):
r = requests.get(f"{BASE}/fixtures", params={
"apiKey": API_KEY, "sportId": sport_id, "from": frm, "to": to,
})
r.raise_for_status()
return [f for f in r.json() if f.get("hasOdds")]
# Soccer = sportId 10. World Cup window:
fx = fixtures(10, "2026-06-22", "2026-06-24")
print(len(fx), "fixtures with odds")
Step 3 — Read Circa’s Price From the Nested JSON
The /odds response is deeply nested: bookmakerOdds → slug → markets → marketId → outcomes → outcomeId → players["0"]. For Circa, the slug is circasports. Here is a defensive parser for the Full Time Result market (1X2, market 101; outcomes 101 home, 102 draw, 103 away):
def market_prices(fixture_id, slug, market_id="101"):
o = requests.get(f"{BASE}/odds", params={
"apiKey": API_KEY, "fixtureId": fixture_id,
}).json()
book = o.get("bookmakerOdds", {}).get(slug)
if not book:
return None # this book doesn't price this fixture
market = book["markets"].get(market_id)
if not market:
return None
out = {}
for oid, od in market["outcomes"].items():
node = od.get("players", {}).get("0")
if node and node.get("active") and node.get("price", 0) > 0:
out[oid] = node["price"]
return out
# Argentina v Austria, World Cup
fid = "id1000001666457022"
circa = market_prices(fid, "circasports")
print(circa) # {'101': 1.571, '102': 4.03, '103': 6.33}
That is Circa’s real line, captured live: Argentina 1.571, Draw 4.03, Austria 6.33.
Step 4 — De-Vig and Compare Circa to Pinnacle
A raw price includes the book’s margin (the vig). To read Circa’s true opinion, strip the vig by normalising the implied probabilities so they sum to 100%. Then do the same for Pinnacle and compare the two sharpest books in the world:
def devig(prices):
inv = {k: 1 / v for k, v in prices.items()}
overround = sum(inv.values())
fair = {k: inv[k] / overround for k in prices} # true probability
fair_odds = {k: 1 / p for k, p in fair.items()} # fair decimal odds
return (overround - 1) * 100, fair, fair_odds
pinnacle = market_prices(fid, "pinnacle")
for slug, p in [("Circa", circa), ("Pinnacle", pinnacle)]:
vig, fair, fair_odds = devig(p)
print(f"{slug:9s} vig {vig:.2f}% "
f"Arg {fair['101']*100:.1f}% Draw {fair['102']*100:.1f}% "
f"Aut {fair['103']*100:.1f}%")
Output, captured live for Argentina v Austria:
| Book | Vig | Argentina (fair) | Draw (fair) | Austria (fair) |
|---|---|---|---|---|
| Circa | 4.27% | 61.0% (1.64) | 23.8% (4.20) | 15.2% (6.60) |
| Pinnacle | 3.81% | 62.7% (1.60) | 23.4% (4.28) | 13.9% (7.17) |
This is the whole point of pulling Circa. The two sharpest books on earth land within roughly 1.7 points on every outcome, and both run a tighter margin than the soft books. When Circa and Pinnacle agree, you have a high-confidence read on the true probability. When they diverge, that gap is itself a signal worth investigating.
Step 5 — Line-Shop Circa Against the Full Board
Circa is sharp, but sharp does not mean “best price to bet into.” Widen the same parser across every book in the payload to find the best available number on each outcome:
def best_prices(fixture_id, market_id="101"):
o = requests.get(f"{BASE}/odds", params={
"apiKey": API_KEY, "fixtureId": fixture_id,
}).json()
books = o.get("bookmakerOdds", {})
best = {}
for slug, data in books.items():
m = data.get("markets", {}).get(market_id)
if not m:
continue
for oid, od in m["outcomes"].items():
node = od.get("players", {}).get("0")
if node and node.get("active") and node.get("price", 0) > 0:
if oid not in best or node["price"] > best[oid][1]:
best[oid] = (slug, node["price"])
return best
print(best_prices(fid))
# {'101': ('fourwinds', 1.637), '102': ('polymarket', 4.348), '103': ('betparx', 7.5)}
Across the 18 books pricing this fixture, the best Argentina price was 1.637 (Four Winds), the best Draw 4.348 (Polymarket), the best Austria 7.5 (BetParX) — all above Circa’s and Pinnacle’s numbers. That is the line-shopping lesson: use the sharps to find the true price, then use the full board to find the best price. (These are best-available numbers, not a guaranteed edge — always sanity-check outliers against the sharp consensus.)
What Circa Actually Prices
Be realistic about Circa’s coverage. Circa is a mainline and futures book, not a prop factory. On the Argentina fixture, Circa priced three market families — Full Time Result, Over/Under, and Asian Handicap — while Pinnacle carried 91 markets including corners, bookings, team totals and inning-by-inning lines. On MLB, Circa carries the moneyline, run line, totals and first-five-innings markets, plus a handful of strikeout and home-run props, typically 7 to 9 markets per game.
| Sport | sportId | Circa markets | In season? |
|---|---|---|---|
| Soccer (World Cup) | 10 | 1X2, Over/Under, Asian Handicap | Yes (summer 2026) |
| MLB | 13 | Moneyline, run line, totals, F5, select props | Yes |
| NFL / NBA | 14 / 11 | Spreads, totals, moneylines, futures | Seasonal |
If you need player props at depth, lean on FanDuel, DraftKings or Pinnacle in the same payload. If you want a sharp US benchmark for the mainline, Circa is exactly the book you want.
Honest Caveats
- Circa posts close to game time. For MLB, Circa’s lines for a given day’s slate appear hours before first pitch, not days out. World Cup and futures markets carry longer pre-game windows.
- Mainlines only. No deep prop tree. Pair Circa with a soft US book for props.
- Snapshot, not advice. The numbers above are a live capture from June 2026 and move as money comes in. Re-pull before acting on any price.
- Sharp ≠ beatable. Circa’s tight margin means there is rarely free money in its lines. Its value to you is as a benchmark, not a soft target.
Why Circa + OddsPapi Beats a Single Book
A scraper gives you one book’s number with no context. OddsPapi gives you Circa’s sharp line sitting next to Pinnacle, the exchanges, the prediction markets and 350+ books in one JSON response, with decimal, American and fractional formats pre-computed and free historical odds for backtesting your read. You get the sharpest US opinion and the full market to shop against, on a free tier, without ever touching circasports.com.
Once you have Circa in your parser, the natural next steps are line-shopping it against the full board (see our line shopping tutorial), pulling the full World Cup odds board, layering in MLB run lines and totals, and comparing access patterns with other no-API books like Bet365. New to the API? Start with the free odds API guide.
Get Your Free API Key
Stop scraping. Grab a free OddsPapi API key, drop the circasports slug into your parser, and pull the sharpest lines in Vegas alongside 350+ books today.
Frequently Asked Questions
Does Circa Sports have a public API?
No. Circa Sports does not offer a public API, developer portal or documentation. The only programmatic way to access Circa odds is through an aggregator like OddsPapi, which exposes Circa under the slug circasports alongside 350+ other bookmakers.
How do I get Circa Sports odds in Python?
Call GET /v4/odds with a fixtureId and read bookmakerOdds["circasports"] from the JSON response. OddsPapi returns Circa’s price pre-converted to decimal, American and fractional formats. A free API key is enough to start.
Is Circa Sports a sharp book?
Yes. Circa is widely regarded as the sharpest book in Las Vegas. It posts early, accepts very high limits and does not restrict winning bettors, which makes its lines highly informative. In our live World Cup sample, Circa’s de-vigged probabilities landed within ~1.7 points of Pinnacle’s on every outcome.
What sports and markets does Circa cover on OddsPapi?
Circa is a mainline and futures book. On soccer it prices Full Time Result, Over/Under and Asian Handicap; on MLB it carries moneyline, run line, totals, first-five-innings and select props. It does not offer a deep player-prop tree, so pair it with FanDuel or DraftKings for props.
Is accessing Circa odds through OddsPapi free?
Yes. Circa odds, the full 350+ book board and free historical odds are all available on the OddsPapi free tier. Authentication is a single apiKey query parameter.