---
name: dartsapi
description: Darts results, fixtures, live scores, player statistics, ratings and match probabilities from the Darts API (dartsapi.com). Use when a question needs real darts data: a player's record or form, a head-to-head, results or fixtures, live scores, or the chance of a win.
---

# Darts API

One REST API over professional darts since 1994: results with each player's statistics, fixtures and live scores, ratings and a probability model. JSON over HTTPS, operated by DeveloperData.net.

## When to use it

- A darts question that needs facts: who won, a player's record, form or averages, a head-to-head, what is on today, the score now.
- A preview or a model that needs history, ratings or a probability for a pairing.
- Not for betting advice: the data is factual, and probabilities are a model's estimate, not a tip.

## Getting access

- A free key: https://dartsapi.com/free-api-key (sign in, the key is made at once).
- Paid plans: https://dartsapi.com/pricing
- Send the key as `Authorization: Bearer da_live_...` or `X-API-Key: da_live_...`. Never in the address: a key in the query string is refused.
- Base address: `https://api.dartsapi.com/v1`. Start with `GET /v1/usage`, which shows the plan, its limits and today's counters.

## Common calls

Every answer has the same envelope: `data`, then `meta` with `request_id`, `data_as_of` and, on lists, `next_cursor`.

### Check the key and its plan

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/usage"
```

### Find a player by name (accents and particles folded)

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/players?q=van%20gerwen"
```

### A rivalry between two players

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/head-to-head?player_id=pl_...&opponent_id=pl_..."
```

### Everything settled yesterday (UTC)

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/results/yesterday"
```

### Settled matches for a player in a date range

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/results?player_id=pl_...&from=2026-01-01&to=2026-03-31"
```

### What is coming up

```
curl -H "Authorization: Bearer $DARTS_API_KEY" "https://api.dartsapi.com/v1/fixtures"
```

```json
{
  "data": [ { "id": "mt_...", "...": "..." } ],
  "meta": { "request_id": "...", "data_as_of": "2026-10-06T20:00:00Z", "next_cursor": "..." }
}
```

Ids carry their type: `pl_` a player, `mt_` a match, `cp_` a competition, `ev_` an edition. Lists page with `meta.next_cursor`, passed back as `cursor`.

## All endpoints

### Reference and coverage

- `GET /v1/coverage`: Measured coverage, with close seasons told apart from real gaps. (Free key and up)
- `GET /v1/organisers`: Tour bodies and what each runs. (Live plan and up)
- `GET /v1/competitions`: Every competition with its tier and format. (Free key and up)
- `GET /v1/competitions/{id}`: One competition, its editions and how its market behaves. (Live plan and up)
- `GET /v1/calendar`: Editions across a date range with status. (Free key and up)
- `GET /v1/major-editions`: Every edition of the main tournaments since 1994: dates, venue, town and country, organiser, sponsor, field size and prize pool, with our edition ids. major= for one. (Free key and up)
- `GET /v1/major-editions/{year}`: Each edition of that year in full, with the prize for each stage reached (champion, runner-up, semi finals and on). major= for one. (Live plan and up)

### Editions

- `GET /v1/editions/{id}`: One staging: field, winner and completeness. Matches are grouped by round where the draw is complete, by day otherwise. (Live plan and up)
- `GET /v1/editions/{id}/standings`: League and group tables, Premier League nights included. (Live plan and up)
- `GET /v1/editions/{id}/outrights`: Exact title and round-reaching probabilities over the known draw. (Analyst plan and up)
- `POST /v1/simulate/bracket`: The same calculation over a draw the caller supplies, so outrights exist before a draw reaches the archive. (Analyst plan and up)

### Players

- `GET /v1/players`: Search and list, with accents and particles folded. (Free key and up)
- `GET /v1/players/{id}`: Profile. (Free key and up)
- `GET /v1/players/{id}/matches`: Match log with the market and rating beside every result. (Live plan and up)
- `GET /v1/players/{id}/form`: Recent form measured against expectation. (Live plan and up)
- `GET /v1/players/{id}/splits`: Record split by tier, format length, year, price band or competition. Every row carries A/E and level-stakes P/L at best price. (Live plan and up)
- `GET /v1/players/{id}/scoring`: Scoring and finishing profile. (Live plan and up)
- `GET /v1/players/{id}/ratings`: Rating history. (Live plan and up)
- `GET /v1/head-to-head`: A full rivalry. (Free key and up)

### Matches

- `GET /v1/fixtures`: Upcoming matches, with the best price only where one was held: no live prices are held since 20 March 2026. (Free key and up)
- `GET /v1/results`: Settled matches. (Free key and up)
- `GET /v1/results/yesterday`: Every match settled yesterday, UTC, on every plan including the free key. (Free key and up)
- `GET /v1/live`: Matches in play, with freshness reported explicitly. (Live plan and up)
- `GET /v1/matches/{id}`: The full record. (Live plan and up)
- `GET /v1/matches/{id}/preview`: The one call a preview writer needs. (Live plan and up)
- `GET /v1/matches/{id}/statistics`: Per-player statistics, on the detail route only, never on lists. (Live plan and up)
- `GET /v1/matches/{id}/prices`: Every reading held, for every market held. Prices are history: held from 2016 to 20 March 2026, with no live prices since. (Live plan and up)

### Ratings

- `GET /v1/ratings`: The current table. (Live plan and up)
- `GET /v1/ratings/snapshot`: The table exactly as it stood on a date, built only from matches that started before it. (Analyst plan and up)
- `GET /v1/ratings/movers`: Biggest risers and fallers. (Live plan and up)

### Markets

- `GET /v1/prices/bulk`: Priced history in bulk for model builders. Prices are history: held from 2016 to 20 March 2026, with no live prices since. (Live plan and up)
- `GET /v1/markets/calibration`: Implied probability against what actually happened, by price band. Prices are history: held from 2016 to 20 March 2026, with no live prices since. (Live plan and up)
- `GET /v1/markets/favourites`: Favourite win rate and level-stakes return by price and format. Prices are history: held from 2016 to 20 March 2026, with no live prices since. (Live plan and up)
- `GET /v1/markets/upsets`: The longest-priced winners and upset rates. Prices are history: held from 2016 to 20 March 2026, with no live prices since. (Live plan and up)
- `GET /v1/markets/value`: Fixtures where model and market disagree past a threshold. Empty while no live prices are held (none since 20 March 2026). (Analyst plan and up)
- `GET /v1/markets/formats`: How match length changes volatility. (Live plan and up)

### Probability and props

- `GET /v1/probability`: Any pairing in any format. (Analyst plan and up)
- `GET /v1/matches/{id}/probability`: The same for a real fixture, with the format taken from the match and the market placed beside it. (Analyst plan and up)
- `GET /v1/props/180s`: 180s pricing. (Analyst plan and up)
- `GET /v1/props/finishing`: Checkout and nine-darter pricing. (Analyst plan and up)

### Leaders, sync and usage

- `GET /v1/leaders`: Leaderboards. (Live plan and up)
- `GET /v1/changes`: Everything added or changed since a cursor, so a customer can sync without polling every list. (Live plan and up)
- `GET /v1/usage`: Plan, window, limits and today's counters. Lab tools check this before doing any work. (Free key and up)

### History

- `GET /v1/history/world-championships`: The world championships the match archive does not hold, the BDO's from 1978 to 2020 and the WDF's of 2023 and 2024: champion, runner-up and what is held for each. (Free key and up)
- `GET /v1/history/world-championships/{year}`: One of those championships in full: every round, both players, the sets each won and their averages where published. (Live plan and up)
- `GET /v1/history/majors`: The televised majors of 2004 to 2017 the match archive does not hold, from published draws: each event, its dates and how many matches are held. major= for one. (Free key and up)
- `GET /v1/history/majors/{year}`: Every major of that year the archive does not hold, in full: round, both players, the score and their averages where published. major= for one. (Live plan and up)

### Rankings

- `GET /v1/order-of-merit`: The PDC Order of Merit as it stood on a day: position, places moved, player and ranking prize money. Today's, or date= for another day held. (Free key and up)
- `GET /v1/order-of-merit/seasons`: The seasons whose start-of-season Order of Merit is held (2017 on), with how many players each lists. (Free key and up)
- `GET /v1/order-of-merit/seasons/{season}`: One season's start list in full: every Tour Card holder in order, country, ranking prize money and how the card was won. (Live plan and up)

## MCP server

- Address: `https://dartsapi.com/mcp` (streamable HTTP, POST), with the key as a bearer token.
- Tools:
  - `find_player`: Find a player by name, however it is spelt (accents and particles are folded). Returns ids for the other tools. On every plan, including the free key.
  - `get_player`: One player's profile: country, career span and matches. On every plan, including the free key.
  - `head_to_head`: Every meeting between two players, with the overall record. On every plan, including the free key.
  - `find_results`: Settled matches, filtered by player, competition or dates, newest first. On every plan, including the free key.
  - `upcoming_fixtures`: Matches coming up, with the best price where one is held. On every plan, including the free key.
  - `player_form`: A player's recent form, measured against what was expected of them. Needs the Live plan or above.
  - `player_splits`: A player's record split by tier, format length or year. Needs the Live plan or above.
  - `player_scoring`: A player's scoring and finishing: averages, checkout rate, 180s. Needs the Live plan or above.
  - `match_preview`: Everything about one match before it starts: form, rating, meetings, price. Needs the Live plan or above.
  - `live_scores`: Matches in play right now, leg by leg. Needs the Live plan or above.
  - `ratings_table`: The current rating, top to bottom. Needs the Live plan or above.
  - `rating_movers`: The players rising and falling most in the rating. Needs the Live plan or above.
  - `win_probability`: The chance of each result for any pairing, in any format. Needs the Analyst plan or above.
  - `tournament_odds`: Title and round-reaching chances for an event, simulated from its draw. Needs the Analyst plan or above.

## Limits

- **Free key**: 60 calls a minute; 500 a day; every free endpoint, on results at least seven days old.
- **Live**: 120 calls a minute; 250,000 a month; in-play and the last thirty days.
- **Archive**: 120 calls a minute; 250,000 a month; the whole archive, but nothing in play.
- **Complete**: 180 calls a minute; 600,000 a month; in-play and the whole archive.
- **Analyst**: 240 calls a minute; 1,000,000 a month; everything, including the model endpoints.
- The free key reaches 15 endpoints, on results at least 7 days old. A call outside the plan's window or endpoints is refused with 402 and names the plan that reaches it.
- Every answer carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`; plans with an allowance add `X-Allowance-Limit`, `X-Allowance-Remaining`, `X-Allowance-Reset` and `X-Allowance-Period`.
- Use `GET /v1/changes` with a cursor to stay in sync instead of polling every list.

## Errors

```json
{ "error": { "code": "bad_parameter", "message": "...", "detail": { }, "request_id": "..." } }
```

- 400 `key_in_query`, `bad_id`: the key was sent in the address, or an id is not one of ours.
- 401 `no_key`, `bad_key`, `unknown_key`: send a valid key in the header.
- 402 `upgrade_required`, `outside_window`: the plan does not reach this endpoint or date; `detail` names the plan that does.
- 404 `not_found`, `no_such_endpoint`.
- 422 `bad_parameter`, `missing_parameter`, `unknown_parameter`, `bad_body`: `message` says which and why.
- 429: over the rate or the allowance; wait `Retry-After` seconds (`detail.retry_after`).
- 503: a part is briefly unavailable (`archive_unavailable`, `ratings_building`); try again shortly.

## A typical workflow

1. `GET /v1/usage` to confirm the key and see what the plan reaches.
2. Turn names into ids with `GET /v1/players?q=...`.
3. Ask the question with those ids: `/v1/head-to-head`, `/v1/players/{id}/form`, `/v1/results`, `/v1/fixtures`.
4. Page with `cursor` only as far as the answer needs; respect `Retry-After` on a 429.
5. Report times in UTC, as the API gives them, and present probabilities as estimates.

Documentation: https://dartsapi.com/documentation. Support: https://dartsapi.com/support.
