Build on every darts match since 1994
One REST API over the whole archive: results with each player's statistics, fixtures and live scores, ratings, closing prices and a probability model. JSON over HTTPS, one key, and the same shapes on every plan.
- Base URL
https://api.dartsapi.com/v1- Authentication
Authorization: Bearer da_live_…- Endpoints
- 52, 16 on the free key
- Format
- JSON, times in UTC
Quickstart
From no key to real results in three steps.
- 1
Get a key
Sign in with Google and a free key is issued at once, with no card. It lives on your dashboard; keep it in an environment variable.
Get a free key - 2
- 3
Make a real call
The three most recent results of the player leading the averages. Every example here runs as written on a free key.
GET /v1/results
curl "https://api.dartsapi.com/v1/results?player_id=pl_VEB8HM&limit=3" \ -H "Authorization: Bearer $DARTS_API_KEY"
import os, requests r = requests.get( "https://api.dartsapi.com/v1/results?player_id=pl_VEB8HM&limit=3", headers={"Authorization": f"Bearer {os.environ['DARTS_API_KEY']}"}, ) print(r.json())
const r = await fetch("https://api.dartsapi.com/v1/results?player_id=pl_VEB8HM&limit=3", { headers: { Authorization: `Bearer ${process.env.DARTS_API_KEY}` }, }); const { data, meta } = await r.json();
$ch = curl_init("https://api.dartsapi.com/v1/results?player_id=pl_VEB8HM&limit=3"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("DARTS_API_KEY")], ]); $out = json_decode(curl_exec($ch), true);
/v1/usage tells you{
"data": {
"account": "ac_EXAMPLE",
"plan": {
"key": "free",
"name": "Free key",
"endpoints": 10,
"of": 41,
"reach": "every free endpoint, on results at least seven days old"
},
"window": {
"from": null,
"to": "2026-09-23",
"in_play": false
},
"rate": {
"per_minute": 60,
"used_this_minute": 1,
"resets_in_s": 38
},
"allowance": {
"period": "day",
"limit": 500,
"used": 1,
"remaining": 499,
"used_pct": 0.2,
"resets_in_s": 19238,
"resets_at": "2026-10-01T00:00:00Z"
},
"counted": "Every call that is authorised and understood counts, including this one. Refusals for plan or parameters do not.",
"key": {
"prefix": "da_live_3f9c",
"last_used": "2026-09-30T18:39:22Z"
}
},
"meta": {
"plan": "free",
"data_as_of": "2026-09-30T18:39:22Z"
}
}Every endpoint, by what it answers
52 endpoints in 10 groups. The colour shows who reaches each: Free on every key, Paid on any paid plan, Analyst on Analyst.
What the archive holds, and the competitions and calendar it holds them in.
One staging of a competition: its field, its tables and the odds over its draw.
Every player, their record, form, splits, scoring and rating.
Fixtures, results, live scores and everything held about one match.
The table, as it stands and as it stood on any date.
Closing prices, and how the market has done against what happened.
The model: any pairing in any format, and props priced from it.
Leaderboards, a change feed for syncing, and your own usage.
The world championships the match archive does not hold, round by round: the BDO's from 1978 to 2020 and the WDF's of 2023 and 2024, and with draw=women the women's (the BDO's from 2001). Compiled from Wikipedia's draws, used under CC BY-SA.
What each plan reaches
One key for life. A new plan applies the moment payment confirms, with nothing to change in your code.
| Plan | Price | Reaches | Window | Rate | Allowance |
|---|---|---|---|---|---|
| Free key | $0 | 16 endpoints | Every free endpoint, on results at least seven days old | 60 a minute | 500 a day |
| Live | $39 a month | 44 endpoints | In-play and the last thirty days | 120 a minute | 250,000 a month |
| Archive | $79 a month | 43 endpoints | The whole archive, but nothing in play | 120 a minute | 250,000 a month |
| Complete | $99 a month | 44 endpoints | In-play and the whole archive | 180 a minute | 600,000 a month |
| Analyst | $149 a month | All 52 endpoints | Everything, including the model endpoints | 240 a minute | 1,000,000 a month |
Use with Claude and agents
An agent skill teaches Claude, Cursor, Codex and other agents how to use the Darts API: what it holds, how to get a key, the calls that answer the common questions, the limits and the errors. It is built from the same registry as these pages, so it never lists an endpoint that is not there.
Install the skill
Download skill.md and save it as ~/.claude/skills/dartsapi/SKILL.md, or upload it as a skill in Claude's settings. Agents that look for skills find it at /.well-known/agent-skills/index.json.
Everything in one file
The complete reference holds every endpoint, parameter, sample response and guide in one markdown document, sized to paste into an assistant. Tools: the MCP server and the OpenAPI file.
Conventions that hold everywhere
Learn these once and every endpoint behaves the way you expect.
IDs carry their type
A player is pl_, a match mt_, a competition cp_. Pass one where another belongs and the call fails loudly, never quietly wrong. Ids never change.
Two ways to page
page for a pager in a UI, cursor for walking a whole set. A cursor pages by position, so the ten-thousandth page is as fast as the first.
Limits in every response
X-RateLimit-* for this minute and X-Allowance-* for the day or month. Pace from the headers and you never see a 429.
Errors say what to do
Every refusal carries a code, a sentence and a request_id. A 402 names the plan that reaches the endpoint.
Times are UTC
Dates are YYYY-MM-DD and timestamps end in Z. Fixture start times are UTC too.
Every answer is dated
meta.data_as_of says how fresh the archive was when it answered, so nothing passes for newer than it is.