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
258
Total users
11
Monthly active users
1.9 days
Issues response
a day 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 a fixed price per request.
/inplayreturns every live event with current prices.
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, Shots. 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, Shots); 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 |
markets | string | all | Only these markets, by name, case-insensitive, at most 100. Comma-separated or repeated: markets=To%20Be%20Fouled,Fouls%20Committed,Shots. Names not in the answer are listed under missing_markets (with tab, that includes names outside that tab). One charge, as without it; during play, free when none of the names is in the answer. |
/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","format_version": 1}
format_version is on every response, errors included. It changes only when a field is removed or renamed or its meaning changes, and any such change is announced to users at least 14 days before it takes effect. New fields can appear at any time and never alter existing ones, so read the fields you use and ignore the rest. Alert on format_version if you want a machine check.
Responses are compressed when your client sends Accept-Encoding: gzip. Python requests, Node fetch and Go do so by default; with curl, add --compressed. A full football /match is about 620 KB as JSON and about 33 KB on the wire.
Error
{"success": false,"error": "Unknown sport: xyz. Valid: soccer, basketball, ...","format_version": 1}
| Status | Error | Meaning |
|---|---|---|
| 404 | Competition not found | Slug or ID not recognized |
| 404 | No upcoming matches are listed for this competition right now | A competition we cover has no matches listed at the moment, e.g. between international windows. If you expected matches, retry in a minute. Not charged |
| 400 | Unknown sport | Sport slug not valid |
| 400 | Missing required parameter | Required query param missing |
| 404 | Match not found / Full markets are not available | Match ID doesn't exist, or the match has finished |
| 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. Between rounds, when no matches are listed yet, the call answers 404 No upcoming matches are listed for this competition right now; outright odds stay available on /outright/uefa-nations-league.
/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", "team_id": "5b0e1c7a92d4", "player_id": "a41f07c3e9b2", "shirt_number": 7, "column": "Player / Last 5"},{"name": "Gabriel Jesus", "last_5": "0,0,1,0,0", "team": "Arsenal", "team_id": "5b0e1c7a92d4", "player_id": "0c8d52e6f1a7", "shirt_number": 9, "column": "Player / Last 5"},{"name": "", "odds": 2.5, "odds_fractional": "6/4", "column": "Score", "row": "Bukayo Saka", "player_id": "a41f07c3e9b2"},{"name": "", "odds": 3.0, "odds_fractional": "2/1", "column": "Score", "row": "Gabriel Jesus", "player_id": "0c8d52e6f1a7"},{"name": "", "odds": 3.75, "odds_fractional": "11/4", "column": "Assist", "row": "Bukayo Saka", "player_id": "a41f07c3e9b2"}]},{"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, "row": "Sam Darnold"},{"name": "", "odds": 1.071, "odds_fractional": "1/14", "rung": "150", "milestone_threshold": 150.0, "row": "Drake Maye"},{"name": "", "odds": 4.75, "odds_fractional": "15/4", "rung": "300", "milestone_threshold": 300.0, "row": "Sam Darnold"}]}]}
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. A selection in such a column carries no column. That includes the player-name column, which has a header (Player / Last 5) only on matches that show players' recent form, so identify a price's player by its row, never by looking for name rows.
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.
Players and teams have ids. Player rows carry team_id and shirt_number, and, where the book identifies the player, player_id, which every price in that player market carries too. A player's id and a team's id are the same in every match and competition, and team_id equals the match's home_team_id or away_team_id (in metadata), so players and teams can be paired with another source without comparing names. player_id is on the Champions League and the major domestic leagues; Europa League matches do not carry it so far, and there team_id with shirt_number identifies the player. 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, and every price names its player in row, so {"rung": "150", "row": "Sam Darnold"} is Darnold's price at 150 yards. The same holds for football ladders such as To Be Fouled and Fouls Committed.
A grid whose rows and prices do not line up exactly is left without row rather than labelled wrongly. Only then, pair by position: take the named selections in order as the rows and read each rung in that same order, counting selections, not prices, because a player the book is not pricing at a threshold arrives as a selection with no odds.
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 returns no markets on this endpoint. The markets bet365 offers only inside its Bet Builder (for example the Total Shots lines) are not available here, and the call says so, free of charge. Every other tab's markets are in the full answer.
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. Check it before parsing: a live answer carries fewer fields (no kickoff, tabs, unpriced_markets or unresolved_markets), its markets carry no columns and its prices no column or row, some market names differ from the pre-match ones (Fulltime Result for Full Time Result), player line markets such as Player Shots and Player Assists do not yet name the player on each price (scorer and booking markets do), and tab is ignored. 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
SofaScore
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
From October 25, 2026, a full match costs $0.01 per /match/{id} call: every market and tab of the match in one answer. Every other request costs $0.00299. Until then, every request costs $0.00299.
Paid plans pay slightly less: Bronze $0.0099 per match, Silver $0.0097 per match and $0.00289 per request, Gold and above $0.0095 and $0.00279.
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 narrow to one category, or markets to get only the markets you name.
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.
Does a match keep its match_id?
Yes. A match keeps the same match_id from the day it is listed until kickoff, on every endpoint that lists it before kickoff, and that id keeps working on /match/{id} once the match is in play. /inplay uses its own match_id for each match; to link its rows to your fixtures, use the home and away names. You rarely need to, since your stored id keeps working on /match/{id}.
Can I get only the markets I use?
Yes. /match/{id}?markets=To%20Be%20Fouled,Fouls%20Committed returns only those markets, for the same single charge. Names are case-insensitive; any not in the answer come back under missing_markets, so a typo never looks like an empty market. During play, an answer with none of them is not charged.
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.
