Live odds
In-play prices for a match that's under way, one entry per bookmaker quoting it. Poll it during the match to follow how the markets move as the game unfolds.
https://api.soccer-data.co/v1/matches/{match_id}/odds/live
Live Pro or Business plan
- Needs a paid plan (Pro or Business). The Free plan gets 403 PLAN_UPGRADE_REQUIRED.
- Only useful while the match is live. Check live_odds_available on the match first. When there are no in-play prices, including after full time, you get 404 NOT_FOUND.
- Prices come from Bet365, Paddy Power, BetMGM UK and Betfair Exchange, in that order. Pinnacle has no in-play prices here.
- Bookmakers suspend and reopen markets during play, so a market or a bookmaker can drop out of one poll and be back in the next.
- Answers are normally at most 15 seconds old, so polling more often than that returns the same prices. If a fresh answer can't be fetched, you may get an older copy marked X-Cache: STALE instead: see When an answer is stale.
- Prices are decimal odds sent as strings, such as "2.000".
The match's id, like match_…. Find one with the ID guide.
The match these prices are for.
One entry per bookmaker quoting in-play prices right now.
Bookmaker name: Bet365, Paddy Power, BetMGM UK or Betfair Exchange.
Markets this bookmaker is quoting now, keyed by market name. Each selection below is a price object (see {price} fields).
Three-way result markets: match_odds, first_half_result and second_half_result.
Two-way markets: draw_no_bet and to_qualify.
Double chance.
Both teams to score markets: btts, btts_first_half and btts_second_half.
Which side scores first. none means no goals.
Match over/under markets, keyed by line such as "2.5": total_goals, match_corners and total_cards.
Team over/under markets, split by side and then keyed by line: team_total_goals and team_corners.
Asian handicap price for each side, keyed by that side's handicap, such as "-0.5" or "+0.5".
Three-way handicap, keyed by the home team's handicap such as "-1" or "+2".
Exact score, keyed as home-away such as "2-1".
The current decimal price. For Betfair Exchange it matches the best back price.
Betfair Exchange only: up to 3 price levels you can back at, best first. An empty list means no unmatched offers right now. Missing for the other bookmakers.
Decimal price at this level.
Money available at this price.
Betfair Exchange only: up to 3 price levels you can lay at, best first. Same rules as available_to_back.
Decimal price at this level.
Money available at this price.
curl "https://api.soccer-data.co/v1/matches/match_yoeml0e6ae37/odds/live" \ -H "X-Api-Key: $SOCCER_DATA_KEY"
const res = await fetch("https://api.soccer-data.co/v1/matches/match_yoeml0e6ae37/odds/live", {
headers: { "X-Api-Key": process.env.SOCCER_DATA_KEY },
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://api.soccer-data.co/v1/matches/match_yoeml0e6ae37/odds/live",
headers={"X-Api-Key": os.environ["SOCCER_DATA_KEY"]},
)
data = res.json()["data"]
$data = Http::withHeaders(['X-Api-Key' => env('SOCCER_DATA_KEY')])
->get('https://api.soccer-data.co/v1/matches/match_yoeml0e6ae37/odds/live')
->json('data');
{
"data": {
"match_id": "match_yoeml0e6ae37",
"bookmakers": [
{
"bookmaker": "Bet365",
"markets": {
"match_odds": {
"home": {
"live": "2.000"
},
"draw": {
"live": "2.600"
},
"away": {
"live": "8.000"
}
},
"btts": {
"yes": {
"live": "4.333"
},
"no": {
"live": "1.200"
}
},
"total_goals": {
"1.5": {
"over": {
"live": "2.100"
},
"under": {
"live": "1.700"
}
},
"2.5": {
"over": {
"live": "4.500"
},
"under": {
"live": "1.182"
}
}
},
"asian_handicap": {
"home": {
"-0.5": {
"live": "1.950"
}
},
"away": {
"+0.5": {
"live": "1.875"
}
}
},
"correct_score": {
"0-0": {
"live": "4.500"
},
"1-0": {
"live": "3.750"
}
}
}
},
{
"bookmaker": "Betfair Exchange",
"markets": {
"match_odds": {
"home": {
"live": "2.020",
"available_to_back": [
{
"price": 2.02,
"size": 1854.3
},
{
"price": 2.0,
"size": 2210.15
}
],
"available_to_lay": [
{
"price": 2.04,
"size": 960.42
},
{
"price": 2.06,
"size": 1375.0
}
]
},
"draw": {
"live": "2.640",
"available_to_back": [
{
"price": 2.64,
"size": 812.55
}
],
"available_to_lay": [
{
"price": 2.68,
"size": 590.1
}
]
},
"away": {
"live": "8.400",
"available_to_back": [
{
"price": 8.4,
"size": 120.75
}
],
"available_to_lay": []
}
}
}
}
]
}
}
### GET /matches/{match_id}/odds/live
Live odds
In-play prices for a match that's under way, one entry per bookmaker quoting it. Poll it during the match to follow how the markets move as the game unfolds.
Requires the Pro or Business plan.
- Needs a paid plan (Pro or Business). The Free plan gets 403 PLAN_UPGRADE_REQUIRED.
- Only useful while the match is live. Check live_odds_available on the match first. When there are no in-play prices, including after full time, you get 404 NOT_FOUND.
- Prices come from Bet365, Paddy Power, BetMGM UK and Betfair Exchange, in that order. Pinnacle has no in-play prices here.
- Bookmakers suspend and reopen markets during play, so a market or a bookmaker can drop out of one poll and be back in the next.
- Answers are normally at most 15 seconds old, so polling more often than that returns the same prices. If a fresh answer can't be fetched, you may get an older copy marked X-Cache: STALE instead: see [When an answer is stale](/docs/concepts/rate-limits#when-an-answer-is-stale).
- Prices are decimal odds sent as strings, such as "2.000".
Response fields:
- `data.match_id` (string): The match these prices are for.
- `data.bookmakers[]` (array): One entry per bookmaker quoting in-play prices right now.
- `data.bookmakers[].bookmaker` (string): Bookmaker name: Bet365, Paddy Power, BetMGM UK or Betfair Exchange.
- `data.bookmakers[].markets` (object): Markets this bookmaker is quoting now, keyed by market name. Each selection below is a price object (see {price} fields).
- `data.bookmakers[].markets.{market}.{home|draw|away}` (object): Three-way result markets: match_odds, first_half_result and second_half_result.
- `data.bookmakers[].markets.{market}.{home|away}` (object): Two-way markets: draw_no_bet and to_qualify.
- `data.bookmakers[].markets.double_chance.{home_draw|home_away|draw_away}` (object): Double chance.
- `data.bookmakers[].markets.{market}.{yes|no}` (object): Both teams to score markets: btts, btts_first_half and btts_second_half.
- `data.bookmakers[].markets.first_team_to_score.{home|away|none}` (object): Which side scores first. none means no goals.
- `data.bookmakers[].markets.{market}.{line}.{over|under}` (object): Match over/under markets, keyed by line such as "2.5": total_goals, match_corners and total_cards.
- `data.bookmakers[].markets.{market}.{home|away}.{line}.{over|under}` (object): Team over/under markets, split by side and then keyed by line: team_total_goals and team_corners.
- `data.bookmakers[].markets.asian_handicap.{home|away}.{line}` (object): Asian handicap price for each side, keyed by that side's handicap, such as "-0.5" or "+0.5".
- `data.bookmakers[].markets.handicap_result.{line}.{home|draw|away}` (object): Three-way handicap, keyed by the home team's handicap such as "-1" or "+2".
- `data.bookmakers[].markets.correct_score.{score}` (object): Exact score, keyed as home-away such as "2-1".
- `{price}.live` (string): The current decimal price. For Betfair Exchange it matches the best back price.
- `{price}.available_to_back[]` (array): Betfair Exchange only: up to 3 price levels you can back at, best first. An empty list means no unmatched offers right now. Missing for the other bookmakers.
- `{price}.available_to_back[].price` (number): Decimal price at this level.
- `{price}.available_to_back[].size` (number): Money available at this price.
- `{price}.available_to_lay[]` (array): Betfair Exchange only: up to 3 price levels you can lay at, best first. Same rules as available_to_back.
- `{price}.available_to_lay[].price` (number): Decimal price at this level.
- `{price}.available_to_lay[].size` (number): Money available at this price.
Example: curl "https://api.soccer-data.co/v1/matches/match_yoeml0e6ae37/odds/live" -H "X-Api-Key: $SOCCER_DATA_KEY"