Abios API Alternative: Free Esports Odds from Pinnacle, Polymarket & 350+ Books
Searching for the Abios API? You have probably already hit the wall: Abios is an enterprise esports data platform owned by Kambi, the sportsbook-tech company. There is no public sign-up, no free tier, and no documented price list. You fill in a “Get in contact” form and wait for a sales call. If all you want is live esports betting odds in JSON, that is a heavy way to get it.
This guide shows you how to pull real-time esports odds, from Pinnacle and prediction markets like Polymarket and Kalshi, with a single free API key and about ten lines of Python. (For the broader esports walkthrough across CS2, LoL and Dota, see our Esports Odds API guide.) We will use a live match from The International (Dota 2’s biggest tournament) as the worked example, with numbers pulled straight from the API as this post was written.
Abios vs OddsPapi: What Each One Actually Does
First, an honest distinction, because these two tools solve different problems. Abios is a data and statistics feed: in-game telemetry (KDA, gold, item timings, map positions), historical databases, and widgets, across 15+ esports titles. It is built for operators who want to run their own trading and build live betting products. Per their own documentation, the deep player-stats layer sits in the Enterprise tier, and access is sales-gated.
OddsPapi is an odds aggregator. We do not ship in-game player stats. What we ship is the betting market: the actual prices that 372 bookmakers, sharps, exchanges, and prediction markets are quoting on a given fixture, in one normalized JSON shape, on a free tier you can self-serve with a key.
So the question is not “which is better.” It is “do you need esports telemetry, or do you need esports odds?” If it is odds, you do not need a contract.
| Abios | OddsPapi | |
|---|---|---|
| Primary product | Esports data, stats & widgets | Aggregated bookmaker odds |
| Owner | Kambi (sportsbook tech) | Independent |
| Free tier | None (sales-gated) | Yes, free API key |
| Sign-up | “Get in contact” form | Instant key, no card |
| Coverage | 15+ esports titles, deep stats | 372 bookmakers across 69 sports |
| Sharp / exchange prices | You run your own trading | Pinnacle, Betfair, Polymarket, Kalshi included |
| Historical odds | 180 days (Match) / 5+ yrs (Enterprise) | Free on every fixture |
| Real-time | Low-latency feed (Enterprise) | REST + WebSocket push |
The Pivot: You Still Need a Sportsbook for Odds
Here is the thing an enterprise stats feed does not solve. Even with the richest in-game data in the world, the price you can bet or trade against lives at the bookmakers. To compare those prices, find the best line, or benchmark against a sharp book like Pinnacle, you need the bookmaker layer. That is exactly what OddsPapi aggregates.
And esports is one of the clearest cases for line shopping. The books that price a Dota 2 or CS2 match are a mixed bag, a sharp (Pinnacle), a couple of US/AU sportsbooks, and prediction markets (Polymarket, Kalshi). They disagree, and the disagreement is the opportunity. Let us prove it with live data.
Tutorial: Pull Live Esports Odds in Python
Step 1: Authenticate
Grab a free key, then authenticate. Note the one gotcha that trips up every newcomer: the API key is a query parameter, not a header.
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.oddspapi.io/v4"
# apiKey is a QUERY PARAMETER, not a header
r = requests.get(f"{BASE_URL}/sports", params={"apiKey": API_KEY})
print(r.status_code) # 200
Step 2: Find the Esports Sports IDs
OddsPapi covers 69 sports, and esports titles each have their own sport ID. The headline ones:
| Title | sportId | slug |
|---|---|---|
| Dota 2 | 16 | esport-dota |
| Counter-Strike 2 | 17 | esport-counter-strike |
| League of Legends | 18 | esport-league-of-legends |
| Valorant | 61 | esport-valorant |
| Call of Duty | 56 | esport-call-of-duty |
Coverage follows the competitive calendar. When this post was written (mid-June), Dota 2’s The International was live, so Dota carried the most fixtures with odds, while CS2 and LoL were between splits. Always discover fixtures live rather than assuming a title is in season. (Title-specific deep dive: our Valorant Odds API guide walks the VCT feed the same way.)
Step 3: Fetch Esports Fixtures with Odds
Pull the fixture list for Dota 2 over a date window (max 10 days), then keep only the fixtures that actually have odds attached (hasOdds: true).
from datetime import date, timedelta
today = date.today()
params = {
"apiKey": API_KEY,
"sportId": 16, # Dota 2
"from": today.isoformat(),
"to": (today + timedelta(days=9)).isoformat(),
}
fixtures = requests.get(f"{BASE_URL}/fixtures", params=params).json()
with_odds = [f for f in fixtures if f.get("hasOdds")]
for f in with_odds[:5]:
print(f["participant1Name"], "vs", f["participant2Name"],
"|", f["tournamentName"], "|", f["fixtureId"])
For our example this surfaced an upcoming The International match: Power Rangers vs L1Ga Team (fixtureId id1601391172115550, status Pre-Game).
Step 4: Get the Odds Across Every Book
Now hit /odds for that fixture. The response is highly nested: bookmakerOdds -> {slug} -> markets -> {marketId} -> outcomes -> {outcomeId} -> players["0"] -> price. For esports the moneyline is market 161 (“Winner”), with outcomes 161 (participant 1) and 162 (participant 2).
fid = "id1601391172115550"
data = requests.get(f"{BASE_URL}/odds",
params={"apiKey": API_KEY, "fixtureId": fid}).json()
books = data["bookmakerOdds"]
def winner_prices(slug):
outs = books.get(slug, {}).get("markets", {}).get("161", {}).get("outcomes", {})
out = {}
for oid in ("161", "162"):
node = outs.get(oid, {}).get("players", {}).get("0", {})
# always check active before trusting a price
if node and node.get("active", True):
out[oid] = node["price"]
return out
for slug in sorted(books):
p = winner_prices(slug)
print(f"{slug:18} P1 {p.get('161')} P2 {p.get('162')}")
Real output for this Dota 2 match, five venues pricing the same game:
| Bookmaker | Type | Power Rangers | L1Ga Team |
|---|---|---|---|
| pinnacle | Sharp | 2.01 | 1.813 |
| polymarket | Prediction market | 2.083 | 1.887 |
| kalshi | Prediction market | 2.083 | 1.887 |
| betrivers | US sportsbook | 1.90 | 1.80 |
| pointsbet.com.au | AU sportsbook | 2.05 | suspended |
That is the whole pitch in one table. An enterprise stats feed gives you player KDA; it does not tell you that Polymarket is paying 2.083 on Power Rangers while BetRivers is only paying 1.90, a 9.6% better price on the same outcome. That gap is invisible without the bookmaker layer, and capturing it is exactly what line shopping in Python is for.
Step 5: Benchmark Against the Sharp and Find the Best Price
Pinnacle is the sharpest public book, so de-vigging its line gives you a fair-probability anchor. With two-way odds the math is simple proportional normalisation:
pin = winner_prices("pinnacle") # {'161': 2.01, '162': 1.813}
inv = 1/pin["161"] + 1/pin["162"]
overround = (inv - 1) * 100
fair_p1 = 1 / (1/pin["161"] / inv) # de-vigged fair decimal odds
fair_p2 = 1 / (1/pin["162"] / inv)
print(f"Pinnacle overround: {overround:.2f}%")
print(f"Fair line -> P1 {fair_p1:.3f} P2 {fair_p2:.3f}")
# best available price on each side, across every active book
def best(oid):
quotes = [(winner_prices(s).get(oid), s) for s in books]
return max((q for q in quotes if q[0]), default=(None, None))
print("Best Power Rangers:", best("161"))
print("Best L1Ga Team:", best("162"))
Result: Pinnacle’s overround is 4.91%, with a no-vig fair line of 2.109 / 1.902 (Power Rangers 47.4% to win, L1Ga 52.6%). The best available prices were 2.083 on Power Rangers and 1.887 on L1Ga, both at Polymarket and Kalshi. Notably the prediction markets were quoting above Pinnacle’s price on both sides here, which is the best available price, not a guaranteed edge (early lines tighten as the match approaches and these markets are thin). Treat it as a line-shopping signal, not free money.
Beyond the Moneyline
Dota 2 carries more than the match winner. The same nested parse works for Total Maps Over/Under 2.5 (market 163, the “will it go to game 3” line in a Bo3) and Maps Handicap (markets 1625 / 1637, the esports equivalent of an Asian handicap). On this fixture Pinnacle priced Total Maps Over 1.884 / Under 1.854. Build your market lookup live from /markets?sportId=16 rather than hardcoding, the catalog is large and shifts per title.
Free Historical Esports Odds
Backtesting an esports model? The same fixture exposes its full price history on /historical-odds, free. The response shape differs from the live endpoint: the top key is bookmakers (not bookmakerOdds), and players["0"] is a list of timestamped snapshots, not a single price. Max three bookmakers per call.
h = requests.get(f"{BASE_URL}/historical-odds",
params={"apiKey": API_KEY, "fixtureId": fid,
"bookmakers": "pinnacle,polymarket,kalshi"}).json()
snaps = h["bookmakers"]["pinnacle"]["markets"]["161"]["outcomes"]["161"]["players"]["0"]
for s in snaps[:5]:
print(s["createdAt"], s["price"])
That is line-movement data Abios reserves for its paid Enterprise tier, given away on the free key.
Where Abios Genuinely Wins
To keep this honest: if you are building a live esports product that needs in-game telemetry, KDA, gold differentials, item timings, map control, hero picks, Abios (or PandaScore) is the right tool and OddsPapi is not. We aggregate prices, not match state. Abios also carries official rights-holder data and broader title coverage with deep stats. If your job is running a trading desk, that telemetry is the input you price against.
But if you are a developer, modeler, or sharp bettor who needs the odds, the prices to shop, the sharp line to benchmark, the history to backtest, you do not need an enterprise contract or a sales call. You need a free key.
FAQ
Is there a free Abios API?
No. Abios does not advertise a free tier, public trial, or self-serve sign-up. Access is sales-gated through a “Get in contact” form, and it is owned by Kambi. For free, self-serve esports odds, OddsPapi offers an instant API key with no card required.
Does OddsPapi provide esports player stats like Abios?
No. OddsPapi is an odds aggregator, not a stats feed, so it does not ship in-game telemetry (KDA, gold, positions). It provides the betting market: real-time and historical odds across 372 bookmakers for the fixtures that books price.
Which esports does OddsPapi cover?
Dota 2 (16), Counter-Strike 2 (17), League of Legends (18), Valorant (61), and Call of Duty (56), among others. Odds availability tracks the competitive calendar, so discover fixtures live with hasOdds rather than assuming a title is in season.
What bookmakers price esports on OddsPapi?
It varies by tournament tier. Top-tier events like The International draw a mix of Pinnacle (sharp), prediction markets (Polymarket, Kalshi), and US/AU sportsbooks. Smaller tournaments carry fewer books.
Can I get historical esports odds for backtesting?
Yes, free. The /historical-odds endpoint returns the full timestamped price history for a fixture (up to three bookmakers per call), with players["0"] as a list of snapshots.
Stop Waiting on a Sales Call
Abios is a serious esports data platform, but it is built for operators with budgets and procurement cycles. If you just need esports odds in JSON, sharp prices, prediction-market lines, and free history, you can have them in the next five minutes. Get your free OddsPapi API key and pull your first live esports line today.