The Best Free Odds API in 2026 (And Why Free Tiers Actually Matter)

James Whitfield
Most developers trying to build a betting tool hit the same wall. They find an odds API, get excited, start integrating, then realise the free tier is a 7-day trial and locks the good markets behind a paywall. By the time they've figured that out, they've already built half their app around it.
We built the free tier at Odds-API.io to not be that. This article explains what a genuinely useful free odds API looks like, why we offer one with no time limit, and what you can actually build with 100 requests per hour, a 3-day WebSocket trial, and access to real markets across 5,000+ leagues and 50+ sports. Most APIs cap you at the major leagues, even on paid plans. We cover so much more, and that starts on the free tier.
Why a free tier matters (for you and for us)
A free tier isn't charity. It's the only honest way to sell a data product.
Odds data is hard to evaluate from a pricing page. You need to see the structure of the responses, check whether the markets you care about are covered, test the latency, and find out whether the docs actually reflect what the API does. None of that happens in a sales call. It happens when a developer makes their first request at 11pm and either gets what they expected or doesn't.
For developers, the benefit is obvious: you get to validate whether the API fits your use case before spending anything. For us, it means the people who eventually upgrade have already integrated the API, trust the data, and know exactly what they're paying for. That's a better business relationship than one built on a trial that expired before anyone finished reading the docs.
It also means students, hobbyists, and researchers can build real things without needing a budget. Some of the most creative uses of our API have come from free-tier users who were just experimenting.
What you actually get on the free tier
No time limit. No credit card. 100 requests per hour, resetting every hour, forever. Plus 3 days of WebSocket access across two bookmakers to try real-time streaming.
That's the headline. Here's what's included:
- All sports: NFL, NBA, MLB, NHL, football (soccer), tennis, cricket, esports, and 50+ more
- Pre-match odds: full pre-match coverage across all sports and markets. Live odds are available on paid plans
- Multiple bookmakers: compare odds from top books in your region
- All market types: moneyline, spreads, totals, Asian handicap, both teams to score, anytime goalscorer, corners, and more
- WebSocket real-time feed (3-day trial): free tier users get WebSocket access across two bookmakers for three days. Log in to your dashboard at odds-api.io/dashboard and activate the trial to get started
- Clean JSON responses: well-documented, consistent structure across all sports and markets
- Instant access: your API key arrives immediately after signup, no review process
The main difference between free and paid is request volume, the number of bookmakers you can access, live odds access, and ongoing WebSocket access. Free gives you 100 REST requests per hour, pre-match odds, and a 3-day WebSocket trial; paid plans start at 5,000 requests per hour with live odds and continuous WebSocket access. For testing, personal projects, and proof-of-concept builds, the free tier is enough to do real work and the WebSocket trial means you can evaluate the full product before deciding.
How the API works
Getting odds from the REST API takes three requests: leagues, then events, then odds. One thing worth knowing upfront: Odds-API.io uses a unified event ID system, so the same event ID works across all bookmakers and across both REST and WebSocket. You never have to map or reconcile IDs between sources. For WebSocket, see our docs here https://docs.odds-api.io/guides/websockets
Step 1: Get the league slug from /leagues
curl -X 'GET' \
'https://api.odds-api.io/v3/leagues?apiKey=YOUR_KEY&sport=football&all=true' \
-H 'accept: application/json'This returns a list of all available leagues for that sport. Each one has a slug you'll use in the next step:
[
{
"name": "International - FIFA World Cup",
"slug": "international-fifa-world-cup",
"eventsCount": 48
}
]Step 2: Get events from /events
Pass the league slug to get upcoming events and their IDs:
curl -X 'GET' \
'https://api.odds-api.io/v3/events?apiKey=YOUR_KEY&sport=football&league=international-fifa-world-cup&status=pending' \
-H 'accept: application/json'[
{
"id": 66456928,
"home": "Brazil",
"away": "Morocco",
"date": "2026-06-13T22:00:00Z",
"league": {
"name": "International - FIFA World Cup",
"slug": "international-fifa-world-cup"
},
"status": "pending"
}
]There are four variants of the events endpoint depending on what you need:
/events— returns upcoming events, requires a league slug. Accepts abookmakerparameter so you can filter to only events available at a specific bookmaker/events/live— returns all currently live events, no slug needed/events/search— find events by team name/events/{id}— returns a single event by its ID
Step 3: Get odds from /odds
Use the id from the events response to pull odds for that specific match:
curl -X 'GET' \
'https://api.odds-api.io/v3/odds?apiKey=YOUR_KEY&eventId=66456928&bookmakers=Bet365' \
-H 'accept: application/json'Key parameters:
apiKey(required): your API keyeventId(required): the numeric ID from the /events responsebookmakers(optional): filter to specific bookmakers, e.g.Bet365,DraftKings,Kambi
What the response looks like
Here is a real response from the API, England vs Croatia in the FIFA World Cup 2026, from Bet365:
{
"id": 66457042,
"home": "England",
"away": "Croatia",
"date": "2026-06-17T20:00:00Z",
"status": "pending",
"sport": {
"name": "Football",
"slug": "football"
},
"league": {
"name": "International - FIFA World Cup",
"slug": "international-fifa-world-cup"
},
"urls": {
"Bet365": "https://www.bet365.com/#/AC/B1/C1/D8/E185942637/F3/I1/P32778/H1/"
},
"bookmakers": {
"Bet365": [
{
"name": "ML",
"updatedAt": "2026-06-09T23:19:20.811Z",
"odds": [{ "home": "1.727", "draw": "3.800", "away": "4.750" }]
},
{
"name": "Spread",
"updatedAt": "2026-06-07T11:59:56.863Z",
"odds": [{ "hdp": -0.75, "home": "1.950", "away": "1.900" }]
},
{
"name": "Totals",
"updatedAt": "2026-06-09T23:32:07.48Z",
"odds": [{ "hdp": 2.25, "over": "1.900", "under": "1.950" }]
},
{
"name": "Both Teams To Score",
"updatedAt": "2026-06-10T02:13:11.116Z",
"odds": [{ "yes": "2.050", "no": "1.700" }]
},
{
"name": "Anytime Goalscorer",
"updatedAt": "2026-06-12T01:57:57.38Z",
"odds": [
{ "label": "Harry Kane", "hdp": 0.5, "over": "2.300" },
{ "label": "Bukayo Saka", "hdp": 0.5, "over": "3.500" },
{ "label": "Jude Bellingham", "hdp": 0.5, "over": "4.333" }
]
}
]
}
}A few things worth noting in that response:
urls.Bet365 is a direct link to that event on Bet365. If you're building an odds comparison tool or alert system, you can send users straight to the right page without any extra lookup.
updatedAt on each market tells you exactly when that line was last captured. For live betting applications, this matters: you can check freshness before displaying odds to a user.
hdp is the handicap value. On the Spread market above, -0.75 means England are giving Croatia a 0.75-goal head start. On Totals, 2.25 is the line for over/under goals. The same field name is used consistently across all handicap markets.
Market depth: this is a single event returning 14+ market types from one bookmaker, including player props (anytime goalscorer for 30+ players), corners, half-time lines, and European handicap at multiple lines. That's the same depth available on the free tier.
Building something with it
Here's a minimal Python script that fetches odds for a specific event and prints the moneyline and totals markets:
import requests
API_KEY = "your_api_key_here"
EVENT_ID = "66457042" # England vs Croatia, World Cup 2026
url = "https://api.odds-api.io/v3/odds"
params = {
"apiKey": API_KEY,
"eventId": EVENT_ID,
"bookmakers": "Bet365"
}
response = requests.get(url, params=params)
data = response.json()
event_name = f"{data['home']} vs {data['away']}"
print(f"\n{event_name} | {data['league']['name']}\n")
for bookmaker, markets in data["bookmakers"].items():
print(f"Bookmaker: {bookmaker}")
for market in markets:
if market["name"] in ("ML", "Totals"):
print(f" {market['name']}: {market['odds']}")That's all it takes to get structured odds into Python. From there you could:
- Store results in a database and track line movement over time
- Compare the same event across multiple bookmakers to spot discrepancies
- Build a Telegram or Discord bot that alerts you when odds shift on specific markets
- Power a web dashboard showing live odds for upcoming fixtures
- Feed data into a model that tracks closing line value
What we cover
Our odds infrastructure tracks (full coverage sheet here):
- 250+ bookmakers globally: including Bet365, Polymarket, DraftKings, William Hill, SingBet, and regional books across Europe, Asia, and the Americas
- 50+ sports: football, basketball, tennis, baseball, ice hockey, cricket, esports, and more
- 500+ market types: moneyline, Asian handicap, over/under, correct score, both teams to score, anytime goalscorer, corners, half-time markets, and others
- Live and pre-match odds: live odds available on paid tiers; pre-match on all tiers
- Sub-150ms latency on odds updates
- 99.9% uptime, SLA-backed
Getting started
Sign up at odds-api.io and get your API key instantly. No credit card, no trial period, no expiry. Your 100 hourly requests reset every hour and the free tier runs indefinitely.
If you outgrow the free tier (running production applications, higher polling frequency, or commercial use), paid plans start at 5,000 requests per hour. For custom infrastructure or enterprise rate limits, reach out at hello@odds-api.io.
Get your free API key at odds-api.io/pricing/free.
Common questions from developers
Is there really a free sports betting odds API with no time limit?
Yes. The Odds-API.io free tier gives you 100 requests per hour, permanently. There's no trial period and no expiry date. It's free forever.
What happens when I hit 100 requests in an hour?
Your key gets rate-limited until the next hour resets. If you're regularly hitting the ceiling, that's a sign your project has grown enough to warrant a paid plan, which starts at 5,000 requests per hour.
Can I try the WebSocket on the free tier?
Yes. Free tier users get a 3-day WebSocket trial covering two bookmakers. Log in to your dashboard at odds-api.io/dashboard and activate the trial from there. It gives you enough time to integrate it properly and see whether streaming odds suits your use case before upgrading to a paid plan.
Can I access live odds on the free tier?
No. The free tier covers pre-match odds only. Live odds are available on paid plans.
How many bookmakers can I access on the free tier?
The free tier gives you access to two bookmakers at a time, but they are interchangeable. You can swap them out at any point using the /bookmakers endpoint, so you're not permanently locked to any two. If you need access to more simultaneously, paid plans unlock the full range of 250+ bookmakers we track.
What market types are available?
All of them. Moneyline, spreads, totals, Asian handicap, correct score, both teams to score, anytime goalscorer, corners, half-time lines, and more. The same market coverage is available on free and paid tiers.
Can I use the free tier for a commercial project?
The free tier is intended for development, testing, and personal projects. For production applications with commercial use, please upgrade to a paid plan.
Do I need to provide payment details to sign up?
No. You get your API key immediately after entering your email. No credit card, no payment information required at any point on the free tier.
