Flashscore API endpoint
Returns a darts match leg by leg: who started and won each leg, the leg score, every visit with the points scored, the score remaining and 180 or 140-plus highlights, and the score the winner finished from, plus the statistics comparison (three-dart average, 180s, 140+ and 100+ visits, checkout percentage, highest checkout). Set-play matches add the set of each leg, the leg score within the set and the statistics of every set; a live match includes the leg being played. Streamed events whose scoring is not tracked and non-darts matches return not found.
/flashscore/match-dartsQuery parameters:
id (required): eight-character match id from a Flashscore darts match URL, for example KMrRR6R1.Returns a darts match leg by leg plus the statistics comparison. source_url is the throw-by-throw feed and statistics_url the statistics feed.
legs entries (starter, winner and side values are home or away):
number (counted across the whole match), starter (who threw first), winner, home_legs and away_legs (the legs score after the leg) and start_score (for example 501).visits: every turn before the finishing visit, with number, side, scored (points scored), remaining (the thrower's score left) and an optional highlight: 180 for a maximum or 140_plus for a visit of 140 to 179.checkout: the score the winner finished from. Flashscore does not publish the finishing visit itself, so it is not in visits; the winner's last visit scored exactly checkout. Because of this, the 140+ count in statistics can exceed the number of 140_plus visits by the legs finished from 140 or more.Set-play matches (the legs are played in sets) also carry:
set on every leg: the set the leg belongs to, starting at 1. home_legs and away_legs are then the legs score within that set and start again at 0-0 with each set. The field is absent for matches decided on legs alone.set_statistics: one entry per set with set and the same statistics rows as below, taken from that set only. A set whose values are all blank is left out. The field is absent for matches decided on legs alone. The top-level statistics always describes the whole match.A live match includes the leg being played as the last entry of legs (of the last set), with in_progress set to true, an empty winner, checkout of 0, and every visit so far in visits. Its home_legs and away_legs are the score before that leg. in_progress is absent for finished legs.
statistics rows carry key, id, name, home and away values as displayed text. The keys seen are average_3_darts (for example 92.91), 180_thrown, 140_plus_thrown, 100_plus_thrown, checkouts (for example 35.29% (6/17)), checkouts_100_plus, highest_checkout and, for set-play matches, legs_won. A row with a new provider id appears as stat_<id>.
Streamed events whose scoring is not tracked (for example MODUS Super Series) publish no throws and placeholder statistics; they return 404, as do non-darts matches and unknown ids. If only one of the two feeds has data the other part is returned empty: legs is an empty list for a match without throw-by-throw coverage, and statistics is empty when the values are placeholders. A match whose feed does not follow the layouts above, or whose own scores contradict each other (a thrower's remaining score that goes up), is reported as a 503 rather than guessed at. Each visit is read from the side that threw; the score shown beside it for the side that did not throw is not used, because some real feeds show a stale value there.
Example response (shortened):
{"code":200,"msg":"OK","data":{"source_url":"https://global.flashscore.ninja/2/x/feed/df_mhn_1_KMrRR6R1","statistics_url":"https://global.flashscore.ninja/2/x/feed/df_stn_1_KMrRR6R1","match_id":"KMrRR6R1","legs":[{"number":1,"starter":"away","winner":"away","home_legs":0,"away_legs":1,"start_score":501,"checkout":84,"visits":[{"number":1,"side":"away","scored":60,"remaining":441},{"number":2,"side":"home","scored":86,"remaining":415},{"number":5,"side":"away","scored":180,"remaining":165,"highlight":"180"}]}],"statistics":[{"key":"average_3_darts","id":"55","name":"Average (3 darts)","home":"92.91","away":"97.05"},{"key":"highest_checkout","id":"54","name":"Highest checkout","home":"97","away":"121"}]}}
| Field | Filled in, of 14 checked | Values in the sample |
|---|---|---|
| number | 14 | 1 to 14, median 7 |
| starter | 14 | away (7), home (7) |
| winner | 14 | away (8), home (6) |
| home_legs | 14 | 0 to 6, median 2 |
| away_legs | 14 | 1 to 8, median 5 |
| start_score | 14 | 501 |
| checkout | 14 | 12 to 121, median 40 |
| visits | 14 | median 9 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Eight-character Flashscore match id | KMrRR6R1 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/flashscore/match-darts?id=KMrRR6R1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://global.flashscore.ninja/2/x/feed/df_mhn_1_KMrRR6R1",
"statistics_url": "https://global.flashscore.ninja/2/x/feed/df_stn_1_KMrRR6R1",
"match_id": "KMrRR6R1",
"legs": [
{
"number": 1,
"starter": "away",
"winner": "away",
"home_legs": 0,
"away_legs": 1,
"start_score": 501,
"checkout": 84,
"visits": [
{
"number": 1,
"side": "away",
"scored": 60,
"remaining": 441
},
{
"number": 2,
"side": "home",
"scored": 86,
"remaining": 415
},
{
"number": 5,
"side": "away",
"scored": 180,
"remaining": 165,
"highlight": "180"
}
]
}
],
"statistics": [
{
"key": "average_3_darts",
"id": "55",
"name": "Average (3 darts)",
"home": "92.91",
"away": "97.05"
},
{
"key": "highest_checkout",
"id": "54",
"name": "Highest checkout",
"home": "97",
"away": "121"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/flashscore.matchDartsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | flashscore.matchDartsDataDoc | No | ||||
| data.legs | array | No | ||||
| data.legs[].away_legs | integer | No | 1 | |||
| data.legs[].checkout | integer | No | 84 | |||
| data.legs[].home_legs | integer | No | 0 | |||
| data.legs[].in_progress | boolean | No | true | True only for the leg being played in a live match. | ||
| data.legs[].number | integer | No | 1 | |||
| data.legs[].set | integer | No | 1 | Only present for set-play matches: the set the leg belongs to. | ||
| data.legs[].start_score | integer | No | 501 | |||
| data.legs[].starter | string | No | home, away | away | ||
| data.legs[].visits | array | No | ||||
| data.legs[].visits[].highlight | string | No | 180, 140_plus | 180 | ||
| data.legs[].visits[].number | integer | No | 5 | |||
| data.legs[].visits[].remaining | integer | No | 165 | |||
| data.legs[].visits[].scored | integer | No | 180 | |||
| data.legs[].visits[].side | string | No | home, away | away | ||
| data.legs[].winner | string | No | home, away | away | Empty while the leg is still being played. | |
| data.match_id | string | No | KMrRR6R1 | |||
| data.set_statistics | array | No | Only present for set-play matches: the statistics of each set. | |||
| data.set_statistics[].set | integer | No | 1 | |||
| data.set_statistics[].statistics | array | No | ||||
| data.set_statistics[].statistics[].away | string | No | 97.05 | |||
| data.set_statistics[].statistics[].home | string | No | 92.91 | |||
| data.set_statistics[].statistics[].id | string | No | 55 | |||
| data.set_statistics[].statistics[].key | string | No | average_3_darts, 180_thrown, 140_plus_thrown, 100_plus_thrown, checkouts, checkouts_100_plus, highest_checkout, legs_won | average_3_darts | ||
| data.set_statistics[].statistics[].name | string | No | Average (3 darts) | |||
| data.source_url | string | No | https://global.flashscore.ninja/2/x/feed/df_mhn_1_KMrRR6R1 | |||
| data.statistics | array | No | ||||
| data.statistics[].away | string | No | 97.05 | |||
| data.statistics[].home | string | No | 92.91 | |||
| data.statistics[].id | string | No | 55 | |||
| data.statistics[].key | string | No | average_3_darts, 180_thrown, 140_plus_thrown, 100_plus_thrown, checkouts, checkouts_100_plus, highest_checkout, legs_won | average_3_darts | ||
| data.statistics[].name | string | No | Average (3 darts) | |||
| data.statistics_url | string | No | https://global.flashscore.ninja/2/x/feed/df_stn_1_KMrRR6R1 | |||
| 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-darts?id=KMrRR6R1" \
-H "x-api-key: $CRAWLORA_API_KEY"