Bet365 Real-Time Odds API - Live & Pre-Match Betting Odds
Pricing
from $2.99 / 1,000 requests
Bet365 Real-Time Odds API - Live & Pre-Match Betting Odds
Bet365 betting odds in real time via REST API. Pre-match and live odds for 39 sports. Full Time Result, Asian Handicap, Over/Under, Player Props, Outrights. Decimal, fractional, American formats. Instant responses via Standby mode.
Pricing
from $2.99 / 1,000 requests
Rating
0.0
(0)
Developer
Zen Studio
Maintained by CommunityActor stats
3
Bookmarked
248
Total users
17
Monthly active users
2 days
Issues response
2 days ago
Last modified
Categories
Share
Bet365 Real-Time Odds REST API | Live & Pre-Match Betting Odds
From Zen Studio, creators of DraftKings Odds, FanDuel Odds and BetMGM Odds. One team behind a growing suite of sportsbook and player-prop data tools.
Why choose this actor?
- Go beyond match-winner odds. Collect player props, Asian handicaps, goal totals, corners, cards and futures where available. Match responses organize markets, selections and prices so you can compare lines and track changes without rebuilding the board yourself.
- Three odds formats, pre-match and in-play. Request decimal, fractional or American prices. Search teams and competitions, discover available matches, then collect their detailed markets through the same API.
- Monitor throughout the day. Poll competitions and matches on your own schedule at one flat price per request.
/inplayserves the live schedule from a real-time feed.
Start with Premier League odds
Open the API route explorer and call /competition/england-premier-league with odds_format=decimal and token=YOUR_APIFY_TOKEN.
Use a returned match ID with /match/{id} to collect detailed markets and discover its available tabs. For futures, start with /outrights?sport=soccer. Replace YOUR_APIFY_TOKEN with your Apify API token.
Prefer a dataset preview? Open actor input and use:
{"preset": "england-premier-league","oddsFormat": "decimal"}
The batch preview returns competition odds for up to 20 matches from one of six soccer leagues. Use the full API for player props, futures, search and in-play coverage. Available markets depend on the sport and match.
| Zen Studio · Sportsbook Data | ||||
You are here | Lines & props | Game boards | Alternate lines | Player projections |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start building with this API.
Bet365 Odds API. Base: https://zen-studio--bet365-real-time-odds.apify.actor Auth: ?token=APIFY_TOKEN (get at https://console.apify.com/account/integrations). Endpoints: GET / (route explorer), GET /sports (all sports with slugs), GET /competitions?sport=X (competitions for a sport), GET /competition/{id} (match odds for a competition, sport param optional for known slugs like nba or england-premier-league), GET /match/{id}?tab=X (full match detail with all markets and player props; tab is the market tab name as shown in the bet365 UI, case-insensitive; call without tab to see the available list per match. Soccer: Popular, Asian Lines, Goals, Half, Corners, Bet Builder. NBA: Points, Threes, Assists, Rebounds, Combos, Defence. MLB: Pitcher Props, Batter Props. NHL: Goalscorers, Shots, Goalie), GET /search?q=X (search matches/teams), GET /inplay (in-play schedule), GET /outrights?sport=X (futures catalog), GET /outright/{id} (outright odds). All odds endpoints accept odds_format=decimal|fractional|american. Competition slugs: nba ncaab nhl mlb afl england-premier-league england-championship scotland-premiership euroleague. To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
Also available as an MCP server: add zen-studio/bet365-real-time-odds for natural language access.
Key Features
- Full market depth -- match result, Asian handicap, over/under, both teams to score, correct score, player props, corners, specials, and more
- Multiple sports -- soccer, basketball, tennis, ice hockey, American football, baseball, cricket, darts, esports, MMA, and more; use
/sportsto discover the available catalog - Three odds formats -- decimal (default), fractional, American on every endpoint
- Human-readable slugs -- use
england-premier-leagueornbainstead of opaque IDs - Outrights -- league winner, top scorer, relegation, and other futures markets
Endpoints
Discovery (free)
| Endpoint | Method | Description |
|---|---|---|
/ | GET | Route explorer with all endpoints |
/health | GET | Health check and connection status |
/sports | GET | Available sports with slugs |
/competitions | GET | All competitions for a sport with slugs |
Odds ($0.003/request)
| Endpoint | Method | Description |
|---|---|---|
/competition/{id} | GET | All matches in a competition with 1X2/spread/total odds |
/match/{id} | GET | Full match detail: all markets, player props, selections |
/search | GET | Search matches, competitions, teams |
/inplay | GET | Full in-play schedule across all sports |
/outrights | GET | Futures catalog (league winner, top scorer, relegation) |
/outright/{id} | GET | Specific outright market odds |
Quick Start
1. List sports
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/sports?token=YOUR_APIFY_TOKEN"
2. Get soccer competitions
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/competitions?sport=soccer&token=YOUR_APIFY_TOKEN"
3. Get Premier League match odds
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/competition/england-premier-league?sport=soccer&token=YOUR_APIFY_TOKEN"
4. Get full match detail with all markets
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/match/e282e4f7ddd8?token=YOUR_APIFY_TOKEN"
5. Get Asian handicap markets only
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/match/e282e4f7ddd8?tab=asian&token=YOUR_APIFY_TOKEN"
6. Search for a team
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/search?q=lakers&token=YOUR_APIFY_TOKEN"
7. Get in-play schedule
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/inplay?token=YOUR_APIFY_TOKEN"
8. Get outright markets for soccer
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/outrights?sport=soccer&token=YOUR_APIFY_TOKEN"
9. Get outright odds
$curl "https://zen-studio--bet365-real-time-odds.apify.actor/outright/6d09504757e3?token=YOUR_APIFY_TOKEN"
Parameters
/sports
No parameters. Returns all 49 sports.
/competitions
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | soccer | Sport slug: soccer, basketball, tennis, ice-hockey, american-football, baseball, etc. |
/competition/{id}
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | optional | Sport slug. Not needed for known slugs (nba, england-premier-league, etc.) or IDs discovered via /competitions. |
odds_format | string | decimal | decimal, fractional, or american |
The {id} can be a human-readable slug (e.g., england-premier-league, nba) or an opaque ID returned by /competitions. 56 competitions have hardcoded slugs.
/match/{id}
| Param | Type | Default | Description |
|---|---|---|---|
tab | string | all | Market tab name as shown in the bet365 UI (case-insensitive). Tabs vary per match, so call without a tab to see the available list under tabs. Examples: soccer (Popular, Asian Lines, Goals, Half, Corners, Bet Builder); NBA (Points, Threes, Assists, Rebounds, Combos, Defence); MLB (Pitcher Props, Batter Props); NHL (Goalscorers, Shots, Goalie). Omit for all markets. |
odds_format | string | decimal | decimal, fractional, or american |
/search
| Param | Type | Default | Description |
|---|---|---|---|
q | string | required | Search query. Matches against team names, competition names, player names. |
odds_format | string | decimal | decimal, fractional, or american |
/inplay
No parameters. Returns every event currently in play, across all sports.
| Field | Description |
|---|---|
match_id | Pass straight to /match/{id} for the full live market set |
home, away | Team or player names |
sport, competition, league_code | What is being played, and where |
score, timer | Live score and match clock |
odds | Current board price, keyed 1/X/2 (or 1/2 for a two-way market) |
market | Which market the odds are for, e.g. To Win Match or Match Handicap (Games). Present when the book names it; absent for board prices that carry no market label |
suspended | true while the book has the price suspended |
events contains matches only. The board also carries section headings such as
CS2, Esoccer or a Top Finishes outright group; those are returned separately
under sections so they never inflate total_events, and they have no fixture, id
or price. One-sided events such as horse and greyhound races are real fixtures and
stay in events.
Not every live match carries a price. Table tennis and some esports are not
published individually by the book, so those rows have no odds and a null
match_id. For full market depth on any live match, follow its match_id to
/match/{id}.
The full response shape, including which fields are optional, is in the openapi.json, which you can hand straight to an AI assistant.
/outrights
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | required | Sport slug |
/outright/{id}
| Param | Type | Default | Description |
|---|---|---|---|
odds_format | string | decimal | decimal, fractional, or american |
Competition Slugs
Use human-readable slugs instead of opaque IDs. Pass them as {id} on /competition/{id}.
| Slug | Competition |
|---|---|
england-premier-league | England Premier League |
spain-la-liga | Spain La Liga |
germany-bundesliga-i | Germany Bundesliga I |
italy-serie-a | Italy Serie A |
france-ligue-1 | France Ligue 1 |
uefa-champions-league | UEFA Champions League |
uefa-europa-league | UEFA Europa League |
nba | NBA |
nfl | NFL |
nhl | NHL |
mlb | MLB |
atp-wimbledon | ATP Wimbledon (in season) |
/competitions?sport=X is the authoritative list: it returns the slug for every competition currently carrying fixtures, and a slug only resolves while its competition has upcoming matches. Slugs that differ by one segment are accepted, so germany-bundesliga also reaches Germany Bundesliga I and champions-league reaches the UEFA Champions League.
Opaque IDs also work: the ID returned by /competitions can be passed directly to /competition/{id}.
Response Format
Success
Every endpoint returns a success field.
{"success": true,"count": 12,"...": "endpoint-specific data"}
Error
{"success": false,"error": "Unknown competition: xyz. Use /competitions to discover available IDs."}
| Status | Error | Meaning |
|---|---|---|
| 404 | Unknown competition | Slug or ID not recognized |
| 400 | Unknown sport | Sport slug not valid |
| 400 | Missing required parameter | Required query param missing |
| 404 | Match not found | Match ID doesn't exist |
| 404 | Outright not found | Outright ID doesn't exist |
| 500 | Internal error | Unexpected server error |
Output Examples
/sports
{"success": true,"count": 49,"sports": [{"name": "Soccer", "sport_id": "800b8bd9a54a", "slug": "soccer"},{"name": "Basketball", "sport_id": "3fece606a9a4", "slug": "basketball"},{"name": "Tennis", "sport_id": "abc123def456", "slug": "tennis"}]}
/competition/england-premier-league?sport=soccer
{"success": true,"competition": "England Premier League","match_count": 20,"matches": [{"match_id": "b104ba211825","home": "Arsenal","away": "Leeds","kickoff": "2026-10-10T11:30:00+00:00","in_play": false,"result_odds": {"home": 1.38, "draw": 4.5, "away": 7.5}}]}
A tournament the book runs in divisions, such as uefa-nations-league, returns every division's matches together, and each match names its own in division (for example "division": "UEFA Nations League C"). Ask for one division by its own slug (uefa-nations-league-a) to get only that one.
/match/{id}
{"success": true,"match_id": "e282e4f7ddd8","home": "Arsenal","away": "Bournemouth","competition": "FA Barclaycard","kickoff": "2026-04-11T12:30:00+00:00","status": "pre_match","markets": [{"name": "Full Time Result","selections": [{"name": "Arsenal", "odds": 1.444, "odds_fractional": "4/9"},{"name": "Draw", "odds": 4.1, "odds_fractional": "31/10"},{"name": "Bournemouth", "odds": 7.5, "odds_fractional": "13/2"}]},{"name": "Score or Assist","columns": ["Player / Last 5", "Score", "Assist", "Score or Assist"],"selections": [{"name": "Bukayo Saka", "last_5": "0,1,0,0,1", "team": "Arsenal", "column": "Player / Last 5"},{"name": "Gabriel Jesus", "last_5": "0,0,1,0,0", "team": "Arsenal", "column": "Player / Last 5"},{"name": "", "odds": 2.5, "odds_fractional": "6/4", "column": "Score", "row": "Bukayo Saka"},{"name": "", "odds": 3.0, "odds_fractional": "2/1", "column": "Score", "row": "Gabriel Jesus"},{"name": "", "odds": 3.75, "odds_fractional": "11/4", "column": "Assist", "row": "Bukayo Saka"}]},{"name": "Goals Over/Under","columns": [null, "Over", "Under"],"selections": [{"name": "2.5", "suspended": false},{"name": "", "odds": 1.533, "odds_fractional": "8/15", "column": "Over", "row": "2.5"},{"name": "", "odds": 2.5, "odds_fractional": "6/4", "column": "Under", "row": "2.5"}]},{"name": "Passing Yards","columns": ["Player / Last 5", null],"selections": [{"name": "Sam Darnold", "suspended": false, "column": "Player / Last 5"},{"name": "Drake Maye", "suspended": false, "column": "Player / Last 5"},{"name": "", "odds": 1.056, "odds_fractional": "1/18", "rung": "150", "milestone_threshold": 150.0},{"name": "", "odds": 1.071, "odds_fractional": "1/14", "rung": "150", "milestone_threshold": 150.0},{"name": "", "odds": 4.75, "odds_fractional": "15/4", "rung": "300", "milestone_threshold": 300.0}]}]}
Markets are grids, and the response tells you the shape. columns lists the market's columns in order, and every priced selection names the column it sits in. That is what separates an Over price from an Under price, one team's handicap from the other's, and a player-name row from the prices beneath it. A column with no header of its own is reported as null so the width stays accurate.
Every price names its row. In a grid whose first column holds the rows (players in Score or Assist, corner counts in Alternative Corners, Goals / Corners / Cards in First 10 Minutes), each price carries row, the label of the row it belongs to, so {"column": "Assist", "row": "Bukayo Saka"} is Saka's assist price. Markets that pair two players (Either to Assist, Either to be Booked, ...) name both in players on the row and on each of its prices. Long lists come back in full: every player of Score or Assist, every line of Alternative Corners.
A market that offers a ladder of thresholds (150 through 350 passing yards, 1+ through 4+ passing touchdowns, 1+ through 8+ total bases) splits one column into rungs. rung is the book's own label for the rung and milestone_threshold is that label as a number, so a price is never ambiguous about which rung it belongs to.
To attach such a price to a player, take the named selections in order as the rows, then read each rung in that same order: with two players, the first two rung: "150" selections are Sam Darnold and Drake Maye at 150, and so on for each rung. Count selections, not prices. Every rung holds one selection per player, and a player the book is not pricing at that threshold arrives as a selection with no odds rather than as a gap. Dropping the unpriced ones before pairing shifts every player after them onto the wrong price.
Column and rung labels are the book's own, so they follow the market's own wording rather than a fixed vocabulary.
For player props already joined to their player, use the Bet365 Player Props actor instead, which does this pairing for you and returns one row per player per market.
The /match/{id} endpoint returns every available market for the match, merged across all of its tabs, for one charge. Use the tab parameter to narrow it to a single category. Tabs are sport-specific and exactly match the labels shown in the bet365 UI: call /match/{id} without a tab to see the list available for that match under tabs.
A tab can return markets: [] with a message: its markets are already carried by the match's main view, so the tab has nothing of its own. That is a normal, unbilled answer, not a failure. If you want everything for a match, ask without a tab.
Bet Builder is the one tab that never has markets of its own on this endpoint. Its selections are assembled in the book's own app rather than published as a market list, so they are not part of what /match/{id} returns.
Markets that carry no odds are listed by name instead of being left out, in one of two fields, and the difference tells you what to do next:
unpriced_markets: the book offers the market and is not pricing it. A bookmaker publishes a market before opening its prices, and suspends prices during play, so a market can exist with nothing to quote. Retrying will not change this; poll again later and the same names move intomarketsonce prices open.unresolved_markets: odds for these markets were not available on this call. This says nothing about whether the book is pricing them. Retry after about 30 seconds and they commonly come back priced. It can also name a market that IS inmarketsbut came back only partly listed (the first rows of a long player list or ladder); a retry usually returns it in full. Usually empty.
So if a market you expect is not in markets, check both before treating it as unsupported.
Both lists accompany pre-match responses. A match that is already in play returns its live market set on its own, without them.
/match/{id} serves both pre-match and live markets. Before kick-off you get the published market set; once a match is in play you get its live market set, which is typically smaller because the book suspends and retires markets as the game develops. The status field tells you which you are looking at: pre_match or live. If a match has finished, or its markets are not published yet, the endpoint says so rather than returning an empty set.
| Sport | Common tabs |
|---|---|
| Soccer | Popular, Asian Lines, Goals, Half, Corners, Bet Builder, Specials, Cards, Player, Minutes |
| Basketball (NBA) | Popular, Points, Threes, Assists, Rebounds, Combos, Defence, Flash Bets, Game, Team, Quarter, Bet Builder |
| Baseball (MLB) | Popular, Pitcher Props, Batter Props |
| Ice Hockey (NHL) | Popular, Goalscorers, Shots, Goalie |
Tab names are case-insensitive and tolerant of extra whitespace (?tab=points, ?tab=Points, ?tab=Pitcher%20Props all work).
/search?q=lakers
{"success": true,"query": "lakers","count": 32,"results": [{"match_id": "eba4aecae217","home": "WAS Wizards","away": "LA Lakers","sport": "Basketball","competition": "NBA","odds": [{"name": "1", "odds": 1.909, "line": "+16.0", "bet_summary": "WAS Wizards +16.0"},{"name": "2", "odds": 1.909, "line": "-16.0", "bet_summary": "LA Lakers -16.0"}]}]}
/outrights?sport=soccer
{"success": true,"sport": "Soccer","competitions": [{"name": "England Premier League 2025/26","country": "United Kingdom","markets": [{"name": "To Win Outright", "outright_id": "6d09504757e3"},{"name": "Top Goalscorer", "outright_id": "88277a57c3f7"},{"name": "To be Relegated", "outright_id": "3dc17a054c17"}]}]}
/outright/{id}
{"success": true,"competition": "England Premier League 2025/26","market": "Win Only","selections": [{"name": "Arsenal", "odds": 1.1, "odds_fractional": "1/10"},{"name": "Man City", "odds": 7.0, "odds_fractional": "6/1"},{"name": "Man Utd", "odds": 501.0, "odds_fractional": "500/1"}]}
More Zen Studio scrapers for sports betting
🏟️ Sportsbook odds
Action Network
FanDuel
DraftKings
BetMGM
Bet365
🎯 Daily fantasy & player props
Player Props Aggregator
PrizePicks
Underdog Fantasy
Sleeper
DraftKings Pick6
Bet365
🎾 Live scores & match data
Tennis Abstract
Flashscore
Supported Sports
39 sports available. The most popular:
| Sport | Slug | Competitions |
|---|---|---|
| Soccer | soccer | 500+ |
| Basketball | basketball | 150+ |
| Tennis | tennis | 200+ |
| Ice Hockey | ice-hockey | 80+ |
| American Football | american-football | 20+ |
| Baseball | baseball | 30+ |
| Cricket | cricket | 50+ |
| Darts | darts | 15+ |
| Esports | esports | 40+ |
| MMA | mma | 10+ |
Use /sports for the full list of all 49 sports with their slugs.
Pricing
One flat price per request.
| Plan | Cost | Best for |
|---|---|---|
| Per request | $0.003/call | Lookups, monitoring, polling at any interval |
A request that returns nothing to price, such as a tab with no markets of its own, is not charged.
Use Cases
Odds Comparison
Pull competition odds from /competition/{id} across multiple leagues. Compare with other bookmakers for value bets and arbitrage opportunities.
Pre-Match Analysis
Fetch full market depth via /match/{id} before kickoff. Access Asian handicaps, over/under lines, correct score, player props, and 50+ other markets per match.
In-Play Monitoring
Poll /inplay for live events. Track which games are currently in play across all 39 sports. Combine with /match/{id} for live market prices.
Outright Tracking
Monitor futures markets via /outrights and /outright/{id}. Track league winner odds, top scorer markets, relegation prices throughout the season.
Live Odds Monitoring
Poll /inplay every few seconds to follow live events as they change. Compare with other bookmakers for live arbitrage windows.
Automated Alerts
Set up a cron job that polls specific competitions and notifies when odds cross a threshold. Cost: under $1/month for hourly monitoring of 5 leagues.
FAQ
Do I need to start the actor before calling it? No. Call the endpoints directly. The service answers each request and scales with demand; there is nothing to start, schedule or keep alive.
What do I pay? Only the per-request price. There is no compute charge, and nothing to pay while you are not calling it.
What odds formats are supported?
Decimal (default), fractional, and American. Pass odds_format=fractional or odds_format=american on any odds endpoint. Decimal is always included regardless of the format you choose.
How do I find competition IDs?
Start with /sports to get sport slugs. Then /competitions?sport=soccer to get competition slugs and IDs. 56 competitions have human-readable slugs like england-premier-league or nba. All others use opaque IDs.
What markets are available on /match/{id}?
Every market Bet365 offers for that match. This typically includes: Full Time Result, Double Chance, Both Teams to Score, Over/Under, Asian Handicap, Correct Score, Half Time/Full Time, Player Props (goals, assists, cards, shots), Corners, Specials, and more. Use the tab parameter to filter by category.
Why does the same match return more markets closer to kick-off? Because the book prices it that way. A fixture opens with the headline markets and gains the rest (shots, cards, tackles, player props) as trading builds, typically within the last day or two. A market that is absent has not been priced yet; it is not a gap in the response.
Can I get historical odds? No. This actor returns current live odds only. Odds change continuously and are not stored historically.
How often should I poll for odds updates? Odds update frequently, especially close to kickoff and during live events. Every 1-5 minutes is typical for pre-match monitoring. For in-play odds, every 30-60 seconds.
What's the difference between /competition/{id} and /match/{id}?
/competition/{id} returns all matches in a competition with headline odds (1X2, spread, total). /match/{id} returns full market depth for a single match, including player props, corners, specials, and every other available market.
Are in-play odds available?
Yes. Matches that are currently in play have live odds. Use /inplay to find active events, then /match/{id} for live market prices.
What's the difference between this and the Bet365 Live Scores actor? This actor provides betting odds and markets. The Live Scores actor provides real-time scores, lineups, events, and match statistics. Different data, different use cases. Use both together for a complete picture.
Can I use slugs everywhere?
Slugs work on /competition/{id} for the 56 hardcoded competitions. For /match/{id} and /outright/{id}, use the opaque IDs returned by the discovery endpoints.
Support
Bug reports, feature requests, or questions? Open an issue in the Issues tab.
Pre-match and in-play betting odds. 39 sports. Every market. $0.003/request.
