The agent skill
One SKILL.md that teaches an agent what the Darts API holds and how to call it well.
An agent that has read the skill knows when darts data is the answer, how to get and send a key, which call answers which question, and what to do with a 402 or a 429. It writes its own calls against the API, so it reaches every endpoint your plan reaches. Use it on its own, or beside the MCP server.
The file
Markdown, 13.7 KB, updated with the APIWhat it teaches
When to reach for it
A player's record or form, head to heads, today's matches, live scores, a win probability. And that probabilities are estimates, never advice.
The key
Where a free one comes from, that it goes in a header and never the address, and to call /v1/usage first.
The common calls
The call that answers each everyday question, written out in full and ready to send.
Every endpoint
All 53 in their 10 groups, each with the plan that reaches it, so the agent never calls past your plan blind.
Plans and refusals
What each plan reaches, what a 402 and a 429 mean, and what to tell the person instead of retrying.
How to work
Names to ids first, page only as far as needed, times in UTC, probabilities said as estimates.
Add it to your agent
The MCP server- Download the file and keep its name,
SKILL.md, in a folder calleddartsapi. - Zip the folder and add it as a skill in Claude's settings.
- Ask about a player. Claude reads the skill and makes the calls with your key.
https://dartsapi.com/skill.md
- Put it in your skills folder once and it is there in every project.
- Keep your key in
DARTS_API_KEY; the skill's calls read it from there. - Ask a darts question and Claude Code picks the skill up.
mkdir -p ~/.claude/skills/dartsapi curl -so ~/.claude/skills/dartsapi/SKILL.md https://dartsapi.com/skill.md
- Save it as a rule in the project.
- Keep your key in
DARTS_API_KEY. - Ask for code that reads darts data and Cursor writes the calls the skill describes.
mkdir -p .cursor/rules curl -so .cursor/rules/dartsapi.md https://dartsapi.com/skill.md
- Fetch the file when the agent starts and put it in its instructions.
- Give the agent an HTTP tool and your key.
- Fetch it again when the changelog says the API changed.
import requests skill = requests.get("https://dartsapi.com/skill.md").text system = skill + "\n\nAnswer darts questions with the Darts API."
Read it here
The file as an agent sees it--- 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. ## 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 where one is held. Live prices are not collected at present, so price is empty on most fixtures. (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/upsets`: The biggest upsets on a day or over a range, biggest first, each with the winner's chance before the match and the reasons it was an upset. Without dates, the newest day held. (Analyst plan 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 from 2016; meta.odds_archive gives the span held, counted on each call. (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 from 2016; meta.odds_archive gives the span held, counted on each call. (Live plan and up) - `GET /v1/markets/calibration`: Implied probability against what actually happened, by price band. Prices are history from 2016; meta.odds_archive gives the span held. (Live plan and up) - `GET /v1/markets/favourites`: Favourite win rate and level-stakes return by price and format. Prices are history from 2016; meta.odds_archive gives the span held. (Live plan and up) - `GET /v1/markets/upsets`: The longest-priced winners and upset rates. Prices are history from 2016; meta.odds_archive gives the span held. (Live plan and up) - `GET /v1/markets/value`: Past priced matches where the model and the market disagreed past a threshold, and which side was right. meta.odds_archive gives the span held. (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) - `GET /v1/order-of-merit/lists`: Every other ranking table held, with its seasons: the Order of Merit after each World Championship and year to date, the qualification races for the majors, the Players Championship and European Tour tables, the Challenge Tour, Development Tour, Women's Series, Asian Tour and Nordic & Baltic, from 2019. (Free key and up) - `GET /v1/order-of-merit/lists/{list}`: One ranking table in full for a season: position, player and ranking prize money (or points). season= for one season, the newest held without it. (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 16 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. This skill, explained: https://dartsapi.com/documentation/agent-skill. Support: https://dartsapi.com/support.
Skill or MCP server
Many agents use both| Agent skill | MCP server | |
|---|---|---|
| How the agent calls | Writes its own HTTP calls | Calls named tools |
| Endpoints reached | All 53, within your plan | The 14 most asked for |
| Needs an HTTP tool or code | Yes | No |
| Best for | Coding agents, scripts, research runs | Chat assistants: Claude, ChatGPT |
| Setup | One file in the skills folder | One address in the connector settings |
Keeping it current
Built from the API itself
The file is written from the registry that runs the API, so an endpoint is in it the day it goes live and never after it is gone.
When to fetch it again
When the changelog lists a new or changed endpoint. Agents that fetch it at start-up are always current.