Flashscore API endpoint
Returns the scoring history of a tennis, volleyball, badminton, handball or basketball match, grouped by set, quarter or half. Tennis lists each game with its server, winner, the running score inside the game and break, set and match point flags, plus tiebreak points; the other sports list every rally or basket with the leading side's margin. When a tennis match is live, current_game holds the game or tiebreak in progress. Other sports and matches without coverage return not found.
/flashscore/match-point-by-pointQuery parameters:
id (required): eight-character match id from a Flashscore match URL, for example 8v653Rz9.Returns the scoring history of a tennis, volleyball, badminton, handball or basketball match. periods lists the sets, quarters or halves in order (title such as Set 1, 1st Quarter, 1st Half); each period has sections (Point by point - Set 1, Tiebreak - Set 1, Point by point (+ advantage of the leading team), Goal by goal (+ advantage of the leading team)) holding numbered entries.
Entry fields (winner, server and side values are home or away):
home_score, away_score: the running score after the entry. In tennis a game entry carries the games score of the set and a tiebreak section counts tiebreak points from 0-0; volleyball and badminton restart at 0-0 in every set. Basketball and handball carry the running match score across periods, so the second quarter or half starts from where the previous one ended.winner: who won the game, point, rally or basket. server is the serving side when Flashscore reports it; server_lost is true when the server lost the game or point (a break of serve in tennis).points (tennis games): the running score inside the game as home and away strings (0, 15, 30, 40 or A for advantage), for example 40 to 15. The point that wins the game is not listed; winner names who won it. Each score can carry markers, the ball flags Flashscore shows next to a score; a marker's type is break_point, set_point or match_point. They do not say which player holds the chance (a break point belongs to the receiver); tiebreak entries are the exception, where markers also names the side.home_tiebreak_score, away_tiebreak_score: present on the entry that closes a set decided by a tiebreak, for example 7 and 3 on the 7-6 set row.lead (volleyball, badminton, handball, basketball): side (home or away), margin and narrowed (true when the leading side's margin shrank on this entry). It is omitted when the score is level.current_game is null unless a game is in progress. For a live tennis match it holds title (Current game, or Tiebreak - Set N during a tiebreak), the serving server when known, and the points played so far in the game or tiebreak (in a tiebreak the values are plain point counts). If the live-game feed is unavailable, the game row embedded in the history feed is used instead.
Coverage depends on the match: tennis matches without point-by-point data, and every other sport (football, hockey, baseball, table tennis, darts and more), return the empty feed, which is reported as 404, as is an unknown match id. Individual games inside a tennis match can lack points.
Example response (shortened):
{"code":200,"msg":"OK","data":{"source_url":"https://global.flashscore.ninja/2/x/feed/df_mh_1_8v653Rz9","match_id":"8v653Rz9","periods":[{"title":"Set 1","sections":[{"title":"Point by point - Set 1","entries":[{"number":1,"home_score":1,"away_score":0,"winner":"home","server":"home","points":[{"home":"15","away":"0"},{"home":"30","away":"0"},{"home":"30","away":"15"},{"home":"40","away":"15"}]},{"number":13,"home_score":7,"away_score":6,"winner":"home","home_tiebreak_score":7,"away_tiebreak_score":3}]},{"title":"Tiebreak - Set 1","entries":[{"number":2,"home_score":0,"away_score":2,"winner":"home","server":"away","server_lost":true}]}]}],"current_game":null}}
| Field | Filled in, of 2 checked | Values in the sample |
|---|---|---|
| title | 2 | “Set 1” and 1 other value |
| sections | 2 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Eight-character Flashscore match id | 8v653Rz9 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/flashscore/match-point-by-point?id=8v653Rz9" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://global.flashscore.ninja/2/x/feed/df_mh_1_8v653Rz9",
"match_id": "8v653Rz9",
"periods": [
{
"title": "Set 1",
"sections": [
{
"title": "Point by point - Set 1",
"entries": [
{
"number": 1,
"home_score": 1,
"away_score": 0,
"winner": "home",
"server": "home",
"points": [
{
"home": "15",
"away": "0"
},
{
"home": "30",
"away": "0"
},
{
"home": "30",
"away": "15"
},
{
"home": "40",
"away": "15"
}
]
},
{
"number": 13,
"home_score": 7,
"away_score": 6,
"winner": "home",
"home_tiebreak_score": 7,
"away_tiebreak_score": 3
}
]
},
{
"title": "Tiebreak - Set 1",
"entries": [
{
"number": 2,
"home_score": 0,
"away_score": 2,
"winner": "home",
"server": "away",
"server_lost": true
}
]
}
]
}
],
"current_game": null
}
}Request schema
No body schema
Response schema
#/definitions/flashscore.matchPointByPointResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | flashscore.matchPointByPointDataDoc | No | ||||
| data.current_game | flashscore.pointByPointCurrentGameDoc | No | ||||
| data.current_game.points | array | No | ||||
| data.current_game.points[].away | string | No | 30 | |||
| data.current_game.points[].home | string | No | 40 | |||
| data.current_game.points[].markers | array | No | ||||
| data.current_game.points[].markers[].side | string | No | home, away | home | ||
| data.current_game.points[].markers[].type | string | No | break_point, set_point, match_point | break_point | ||
| data.current_game.server | string | No | home, away | away | ||
| data.current_game.title | string | No | Current game | |||
| data.match_id | string | No | 8v653Rz9 | |||
| data.periods | array | No | ||||
| data.periods[].sections | array | No | ||||
| data.periods[].sections[].entries | array | No | ||||
| data.periods[].sections[].entries[].away_score | integer | No | 0 | |||
| data.periods[].sections[].entries[].away_tiebreak_score | integer | No | 3 | |||
| data.periods[].sections[].entries[].home_score | integer | No | 1 | |||
| data.periods[].sections[].entries[].home_tiebreak_score | integer | No | 7 | |||
| data.periods[].sections[].entries[].lead | flashscore.pointByPointLeadDoc | No | ||||
| data.periods[].sections[].entries[].lead.margin | integer | No | 4 | |||
| data.periods[].sections[].entries[].lead.narrowed | boolean | No | true | |||
| data.periods[].sections[].entries[].lead.side | string | No | home, away | away | ||
| data.periods[].sections[].entries[].markers | array | No | ||||
| data.periods[].sections[].entries[].markers[].side | string | No | home, away | home | ||
| data.periods[].sections[].entries[].markers[].type | string | No | break_point, set_point, match_point | break_point | ||
| data.periods[].sections[].entries[].number | integer | No | 1 | |||
| data.periods[].sections[].entries[].points | array | No | ||||
| data.periods[].sections[].entries[].points[].away | string | No | 30 | |||
| data.periods[].sections[].entries[].points[].home | string | No | 40 | |||
| data.periods[].sections[].entries[].points[].markers | array | No | ||||
| data.periods[].sections[].entries[].points[].markers[].side | string | No | home, away | home | ||
| data.periods[].sections[].entries[].points[].markers[].type | string | No | break_point, set_point, match_point | break_point | ||
| data.periods[].sections[].entries[].server | string | No | home, away | home | ||
| data.periods[].sections[].entries[].server_lost | boolean | No | false | |||
| data.periods[].sections[].entries[].winner | string | No | home, away | home | ||
| data.periods[].sections[].title | string | No | Point by point - Set 1 | |||
| data.periods[].title | string | No | Set 1 | |||
| data.source_url | string | No | https://global.flashscore.ninja/2/x/feed/df_mh_1_8v653Rz9 | |||
| 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-point-by-point?id=8v653Rz9" \
-H "x-api-key: $CRAWLORA_API_KEY"