Flashscore API endpoint
Returns bookmaker odds for a match in one viewer market, grouped by betting type and scope with every bookmaker's priced outcomes, opening odds, handicap or total lines, and a selection label. Bookmakers and prices depend on the market, so pick geo (and subdivision for US or CA) from flashscore-odds-geos. A market with no licensed bookmakers returns empty lists. Promotional bonus text is not included.
/flashscore/match-oddsReturns bookmaker odds for one match as seen by a visitor in one market. Bookmakers, markets and prices depend on the visitor's market, so choose geo (and subdivision for the United States and Canada) from /api/v1/flashscore/odds-geos. Upcoming and finished matches both return odds; a match with no listed odds returns empty markets.
Query parameters:
id (required): eight-character match id from a Flashscore match URL, for example p0aFxkkn.geo (optional, default GB): viewer market country code. One of AE, AL, AM, AO, AR, AT, AU, AZ, BA, BD, BE, BG, BO, BR, BY, CA, CH, CI, CL, CM, CN, CO, CR, CY, CZ, DE, DK, DO, DZ, EC, EE, EG, ES, ET, FI, FR, GB, GE, GH, GR, GT, HK, HN, HR, HU, ID, IE, IL, IN, IQ, IR, IS, IT, JO, JP, KE, KG, KH, KR, KW, KZ, LA, LB, LK, LT, LU, LV, LY, MA, MD, ME, MK, MM, MN, MT, MX, MY, NG, NI, NL, NO, NP, NZ, PA, PE, PH, PK, PL, PT, PY, QA, RO, RS, RU, SA, SD, SE, SG, SI, SK, SN, SV, TH, TN, TR, TW, TZ, UA, UG, US, UY, UZ, VE, VN, XK, ZA, ZM, ZW. Letter case is ignored. Markets AE, BE, BR, HR, HU, ID, KZ and LT had no bookmakers when verified and return empty lists. Many other countries share one default bookmaker group.subdivision (optional): a US state (with geo=US) or Canadian province (with geo=CA); any other combination is rejected. It changes which bookmakers are licensed. US: AK, AL, AR, AZ, CA, CO, CT, DC, DE, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VA, VT, WA, WI, WV, WY. Canada: AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, YT. Subdivisions made no difference for the other markets checked (GB, ES, IT, DE, AU, IN, NL, CH, MX, ZA, BR, BE).betting_type (optional): return only one betting type. One of HOME_DRAW_AWAY, HOME_AWAY, DRAW_NO_BET, DOUBLE_CHANCE, ASIAN_HANDICAP, EUROPEAN_HANDICAP, OVER_UNDER, BOTH_TEAMS_TO_SCORE, CORRECT_SCORE, HALF_FULL_TIME, ODD_OR_EVEN, TO_QUALIFY, NEXT_GOAL, TOP_POSITION_MERGED, TO_WIN_AND_TOP_POSITION, WIN_EACH_WAY. The first eleven were seen in live responses; the last five (TO_QUALIFY, NEXT_GOAL, TOP_POSITION_MERGED, TO_WIN_AND_TOP_POSITION, WIN_EACH_WAY) are defined by Flashscore's site but were not seen in sampled match odds.scope (optional): return only one scope. One of FULL_TIME, FULL_TIME_OVER_TIME, FIRST_HALF, SECOND_HALF, FIRST_PERIOD, FIRST_QUARTER, FIRST_SET, SECOND_SET.An unfiltered response for a United Kingdom market is large (hundreds of kilobytes); use betting_type and scope to narrow it. Invalid values return 400 before any upstream request; an unknown match id returns 404.
Response fields:
participants: the two sides, {id, side} with side home or away. Empty when the returned markets carry no per-side outcomes.bookmakers: bookmakers listed for the market, {id, name}.markets: one entry per betting_type and scope, ordered by the betting-type list above and then the scope list above. Each has offers, one per bookmaker (in bookmakers order), each with outcomes. Bookmaker rows with no priced outcomes are omitted, and so are markets left without offers.selection, side, participant_id, odds (current decimal odds, null when unpriced), opening_odds, active (false when the price is shown but suspended), handicap (the handicap or total line), handicap_type, score, half_full_time.selection is a normalized label: home, away, draw (HOME_DRAW_AWAY, HOME_AWAY, DRAW_NO_BET, ASIAN_HANDICAP, EUROPEAN_HANDICAP), home_or_draw, away_or_draw, home_or_away (DOUBLE_CHANCE), over, under (OVER_UNDER, with the line in handicap), odd, even (ODD_OR_EVEN), yes, no (BOTH_TEAMS_TO_SCORE), the score such as 2:1 (CORRECT_SCORE), and the half-time/full-time pair such as X/1 (HALF_FULL_TIME; 1 home, X draw, 2 away). The five unseen betting types carry side-based labels only where a side is present.side is home or away when the outcome belongs to a participant. The provider's item order is not stable, so always read selection or side rather than position.handicap_type is one of UNKNOWN, GOALS, GAMES, SETS, POINTS, FRAMES, LEGS, RUNS; football lines report UNKNOWN, tennis game totals report GAMES.Bookmaker promotional text and bonus offers are intentionally not returned.
Example response (shortened):
{"code":200,"msg":"OK","data":{"source_url":"https://global.ds.lsapp.eu/odds/pq_graphql?_hash=oce&eventId=p0aFxkkn&geoIpCode=GB&geoIpSubdivisionCode=&projectId=2","match_id":"p0aFxkkn","geo":"GB","participants":[{"id":"Gzrm3lW6","side":"home"},{"id":"llte1S0J","side":"away"}],"bookmakers":[{"id":16,"name":"bet365"}],"markets":[{"betting_type":"HOME_DRAW_AWAY","scope":"FULL_TIME","offers":[{"bookmaker_id":16,"outcomes":[{"selection":"home","side":"home","participant_id":"Gzrm3lW6","odds":2.6,"opening_odds":3,"active":true},{"selection":"away","side":"away","participant_id":"llte1S0J","odds":2.6,"opening_odds":2.15,"active":true},{"selection":"draw","odds":3.6,"opening_odds":3.6,"active":true}]}]}]}}
| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| betting_type | 1 | “HOME_DRAW_AWAY” |
| scope | 1 | “FULL_TIME” |
| offers | 1 | median 20 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Eight-character Flashscore match id | p0aFxkkn | |
| geo | string | No | GB | Viewer market country code from flashscore-odds-geos; defaults to GB Allowed values: AE, AL, AM, AO, AR, AT, AU, AZ, BA, BD, BE, BG, BO, BR, BY, CA, CH, CI, CL, CM, CN, CO, CR, CY, CZ, DE, DK, DO, DZ, EC, EE, EG, ES, ET, FI, FR, GB, GE, GH, GR, GT, HK, HN, HR, HU, ID, IE, IL, IN, IQ, IR, IS, IT, JO, JP, KE, KG, KH, KR, KW, KZ, LA, LB, LK, LT, LU, LV, LY, MA, MD, ME, MK, MM, MN, MT, MX, MY, NG, NI, NL, NO, NP, NZ, PA, PE, PH, PK, PL, PT, PY, QA, RO, RS, RU, SA, SD, SE, SG, SI, SK, SN, SV, TH, TN, TR, TW, TZ, UA, UG, US, UY, UZ, VE, VN, XK, ZA, ZM, ZW. | GB |
| subdivision | string | No | US state (with geo US) or Canadian province (with geo CA) code from flashscore-odds-geos; rejected with any other geo Allowed values: AB, AK, AL, AR, AZ, BC, CA, CO, CT, DC, DE, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MA, MB, MD, ME, MI, MN, MO, MS, MT, NB, NC, ND, NE, NH, NJ, NL, NM, NS, NT, NU, NV, NY, OH, OK, ON, OR, PA, PE, QC, RI, SC, SD, SK, TN, TX, UT, VA, VT, WA, WI, WV, WY, YT. | NJ | |
| betting_type | string | No | Optional filter to one betting type Allowed values: HOME_DRAW_AWAY, HOME_AWAY, DRAW_NO_BET, DOUBLE_CHANCE, ASIAN_HANDICAP, EUROPEAN_HANDICAP, OVER_UNDER, BOTH_TEAMS_TO_SCORE, CORRECT_SCORE, HALF_FULL_TIME, ODD_OR_EVEN, TO_QUALIFY, NEXT_GOAL, TOP_POSITION_MERGED, TO_WIN_AND_TOP_POSITION, WIN_EACH_WAY. | HOME_DRAW_AWAY | |
| scope | string | No | Optional filter to one scope Allowed values: FULL_TIME, FULL_TIME_OVER_TIME, FIRST_HALF, SECOND_HALF, FIRST_PERIOD, FIRST_QUARTER, FIRST_SET, SECOND_SET. | FULL_TIME | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/flashscore/match-odds?id=p0aFxkkn&geo=AE&subdivision=AB&betting_type=HOME_DRAW_AWAY&scope=FULL_TIME" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://global.ds.lsapp.eu/odds/pq_graphql?_hash=oce&eventId=p0aFxkkn&geoIpCode=GB&geoIpSubdivisionCode=&projectId=2",
"match_id": "p0aFxkkn",
"geo": "GB",
"participants": [
{
"id": "Gzrm3lW6",
"side": "home"
},
{
"id": "llte1S0J",
"side": "away"
}
],
"bookmakers": [
{
"id": 16,
"name": "bet365"
}
],
"markets": [
{
"betting_type": "HOME_DRAW_AWAY",
"scope": "FULL_TIME",
"offers": [
{
"bookmaker_id": 16,
"outcomes": [
{
"selection": "home",
"side": "home",
"participant_id": "Gzrm3lW6",
"odds": 2.6,
"opening_odds": 3,
"active": true
},
{
"selection": "away",
"side": "away",
"participant_id": "llte1S0J",
"odds": 2.6,
"opening_odds": 2.15,
"active": true
},
{
"selection": "draw",
"odds": 3.6,
"opening_odds": 3.6,
"active": true
}
]
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/flashscore.matchOddsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | flashscore.matchOddsDataDoc | No | ||||
| data.bookmakers | array | No | ||||
| data.bookmakers[].id | integer | No | 16 | |||
| data.bookmakers[].name | string | No | bet365 | |||
| data.geo | string | No | GB | |||
| data.markets | array | No | ||||
| data.markets[].betting_type | string | No | HOME_DRAW_AWAY, HOME_AWAY, DRAW_NO_BET, DOUBLE_CHANCE, ASIAN_HANDICAP, EUROPEAN_HANDICAP, OVER_UNDER, BOTH_TEAMS_TO_SCORE, CORRECT_SCORE, HALF_FULL_TIME, ODD_OR_EVEN, TO_QUALIFY, NEXT_GOAL, TOP_POSITION_MERGED, TO_WIN_AND_TOP_POSITION, WIN_EACH_WAY | HOME_DRAW_AWAY | ||
| data.markets[].offers | array | No | ||||
| data.markets[].offers[].bookmaker_id | integer | No | 16 | |||
| data.markets[].offers[].outcomes | array | No | ||||
| data.markets[].offers[].outcomes[].active | boolean | No | true | |||
| data.markets[].offers[].outcomes[].half_full_time | string | No | 1/1 | |||
| data.markets[].offers[].outcomes[].handicap | number | No | 2.5 | |||
| data.markets[].offers[].outcomes[].handicap_type | string | No | UNKNOWN, GOALS, GAMES, SETS, POINTS, FRAMES, LEGS, RUNS | UNKNOWN | ||
| data.markets[].offers[].outcomes[].odds | number | No | 2.6 | |||
| data.markets[].offers[].outcomes[].opening_odds | number | No | 3 | |||
| data.markets[].offers[].outcomes[].participant_id | string | No | Gzrm3lW6 | |||
| data.markets[].offers[].outcomes[].score | string | No | 2:1 | |||
| data.markets[].offers[].outcomes[].selection | string | No | home | |||
| data.markets[].offers[].outcomes[].side | string | No | home, away | home | ||
| data.markets[].scope | string | No | FULL_TIME, FULL_TIME_OVER_TIME, FIRST_HALF, SECOND_HALF, FIRST_PERIOD, FIRST_QUARTER, FIRST_SET, SECOND_SET | FULL_TIME | ||
| data.match_id | string | No | p0aFxkkn | |||
| data.participants | array | No | ||||
| data.participants[].id | string | No | Gzrm3lW6 | |||
| data.participants[].side | string | No | home, away | home | ||
| data.source_url | string | No | https://global.ds.lsapp.eu/odds/pq_graphql?_hash=oce&eventId=p0aFxkkn&geoIpCode=GB&geoIpSubdivisionCode=&projectId=2 | |||
| data.subdivision | string | No | NJ | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/flashscore/match-odds?id=p0aFxkkn&geo=AE&subdivision=AB&betting_type=HOME_DRAW_AWAY&scope=FULL_TIME" \
-H "x-api-key: $CRAWLORA_API_KEY"