# Horse Racing API > Horse racing results, racecards, starting prices, form and computed statistics across eleven jurisdictions since 2017. A REST API with 63 endpoints, plus an MCP server so an assistant can query it directly. Race data only: no predictions, no tips, and no view on any future race. ## What this is, and is not - Factual records of races that have already run. Every statistic describes the past. - NOT a betting service, a tipping service or an odds comparison site. Nothing here is advice, and no figure should be presented as a prediction. - Coverage varies by jurisdiction and by field, and is counted rather than claimed. Some things do not exist in this dataset at all: sectional times are the clearest example, in any jurisdiction, at any point in its history. - Access is by API key. A free key reads a delayed window; paid plans reach the full archive, and one plan adds computed statistics. ## For an assistant An MCP server exposes 14 curated tools over JSON-RPC 2.0 at https://apihorseracing.com/mcp-server. Send the key as `Authorization: Bearer` or `X-API-Key`; both are accepted. - `describe_coverage` (free key): What this archive holds and what the current key can read: jurisdictions, date range, totals, and the window this plan reaches. - `search_racing` (free key): Find a horse, trainer, jockey, owner or course by name and get its identifier. - `get_race` (free key): One race in full: conditions, going, distance, class, every runner, and the market. - `get_results` (free key): Every result for one calendar date, grouped by meeting. - `get_todays_racing` (free key): Today's cards across every jurisdiction, grouped by meeting. - `find_races` (free key): Search past races by date range, course, distance, going, class or field size. - `get_horse_form` (free key): A horse's recent runs: date, course, distance, going, finishing position, starting price and beaten distance. - `get_trainer_form` (free key): A trainer's recent runners and how they finished. - `get_jockey_form` (free key): A jockey's recent rides and how they finished.. - `compare_horses` (free key): Every race two or more horses have both contested, and how each finished. - `get_course_draw_bias` (Complete + Analyst): Whether the stall matters at a course and distance, scored against the market rather than against winning. - `get_course_favourites` (Complete + Analyst): What backing the market leader actually returned at a course, by field size and going. - `get_trainer_stats` (Complete + Analyst): A trainer's record split by course, distance, going, class or month, with strike rate, A/E against the market and level-stakes return. - `get_horse_stats` (Complete + Analyst): A horse's record split by course, distance, going and class, with A/E and level stakes. Identifiers are opaque and come from `search_racing`. A model should not guess them. ## Documentation - [THE COMPLETE MANUAL](https://apihorseracing.com/documentation/manual.md): every endpoint, every parameter, every guide and every limitation in ONE markdown file. If you are a model reading this, fetch that file rather than crawling the pages below — it is the whole surface in one request and it is generated from the same registry the API routes on. - [Documentation](https://apihorseracing.com/documentation): every endpoint, with parameters, errors and a live console. - [OpenAPI 3.1 spec](https://apihorseracing.com/openapi.json): generated from the same registry as the documentation, with plan restrictions in the spec. - [Postman collection](https://apihorseracing.com/postman-collection.json): the same surface, importable. - [Data coverage](https://apihorseracing.com/data-coverage): what each jurisdiction publishes, counted from the archive. - [Pricing](https://apihorseracing.com/pricing): plans, limits and what each reaches. - [Status](https://apihorseracing.com/status): counts and timings. Machine readable at https://apihorseracing.com/status.json. ## Guides - [Getting started](https://apihorseracing.com/documentation/getting-started): From nothing to a working request in about two minutes. - [Authentication](https://apihorseracing.com/documentation/authentication): One key, two ways to send it, and what a refusal looks like. - [Your first four calls](https://apihorseracing.com/documentation/first-four-calls): What is running, one race, yesterday read back, and a real question. - [Coverage by country](https://apihorseracing.com/documentation/coverage): Which jurisdictions publish what, counted rather than claimed. - [What a race carries](https://apihorseracing.com/documentation/what-a-race-carries): Forty four fields, in the order they become known. - [Identifiers](https://apihorseracing.com/documentation/identifiers): Why ids look the way they do, and why they are safe to store. - [Data freshness](https://apihorseracing.com/documentation/data-freshness): What data_as_of means and when the archive moves. - [The envelope](https://apihorseracing.com/documentation/the-envelope): meta and data, and what is always in meta. - [Pagination](https://apihorseracing.com/documentation/pagination): Cursors, not offsets, and why that matters mid-sync. - [Errors](https://apihorseracing.com/documentation/errors): Every code, what causes it, and what to do about it. - [Timezones and dates](https://apihorseracing.com/documentation/timezones): Everything is UTC except a race time, which is local to the course. - [Prices and price movement](https://apihorseracing.com/documentation/prices): Fractional, decimal, opening, touched, and what source tells you. - [Understanding A/E](https://apihorseracing.com/documentation/understanding-ae): The number the Analyst tier exists for, and how to read its interval. - [Level stakes and return](https://apihorseracing.com/documentation/level-stakes): Why backing everything loses more than the book margin. - [Breakdown dimensions](https://apihorseracing.com/documentation/breakdowns): Seventeen ways to slice the same block. - [Rate limits and quotas](https://apihorseracing.com/documentation/rate-limits): Per minute, per month, and the headers that tell you. - [Race reports](https://apihorseracing.com/documentation/reports): A written account of every race, and the one line per runner behind it. - [OpenAPI spec](https://apihorseracing.com/documentation/openapi): Generate a client, or import the whole API into your tooling. - [Postman collection](https://apihorseracing.com/documentation/postman): Import it, set one variable, and every request is ready to send. - [Using it from an assistant](https://apihorseracing.com/documentation/mcp-server): Connect Claude, ChatGPT or any MCP client and ask in plain English. - [Webhooks](https://apihorseracing.com/documentation/webhooks): Four events, signed deliveries, and no quota cost. - [Bulk and backfilling](https://apihorseracing.com/documentation/bulk): How to walk nine years without being refused. ## Endpoints Base URL `https://api.apihorseracing.com/v1`. Key in the `X-API-Key` header. Every response is a `meta` and `data` envelope; `meta.data_as_of` says how current the answer is and `meta.plan` says what the key read it on. ### Reference & coverage - `GET /v1/countries` — Every country in the archive with its race count and which fields it publishes. - `GET /v1/courses` — Every course, with first and last meeting and how many races we hold. - `GET /v1/meta/coverage` — Totals, the full-order split, and what your own plan can read. - `GET /v1/search` — One lookup across horses, trainers, jockeys and courses. - `GET /v1/courses/{course_id}` — Run types, surfaces and distances actually raced there. - `GET /v1/reference` — Valid goings, classes and run types, counted from the data. - `GET /v1/meta/reports` — How many race reports exist, from when, and for which jurisdictions. ### Race reports - `GET /v1/reports` [paid plan] — Search written race reports by date, course or jurisdiction. - `GET /v1/reports/{race_id}` [paid plan] — The written account of a single race, with a line for every runner. ### Racecards & meetings - `GET /v1/racecards/today` — Every meeting and race today, grouped by course. - `GET /v1/racecards/upcoming` — Declarations for the next few days. - `GET /v1/meetings/{date}` — One row per course on that day, with going and race count. - `GET /v1/results/latest` — The most recently settled races your plan can read. - `GET /v1/racecards/{date}` — The full card for any date, grouped into meetings. - `GET /v1/meetings/{meeting_id}` — A meeting and every race on it. - `GET /v1/results/{date}` — Settled races for a date, grouped into meetings. ### Races & markets - `GET /v1/races/search` — Filter by date, region, run type, going, class, field size. Cursor paginated. - `GET /v1/races/{race_id}/result` — Finishing order, casualties, dividends and prize money. - `GET /v1/races/{race_id}/market` — Book percentage, every price, and what moved before the off. - `GET /v1/races/{race_id}/dividends` — Tote returns and prizes, where the jurisdiction published them. - `GET /v1/races/{race_id}` — Conditions, the market, and every runner with its price and position. - `GET /v1/races/{race_id}/runners` — The field alone, without the race conditions. - `GET /v1/races/{race_id}/analysis` — Market shape, movers, and what this course and distance usually produces. ### Horses & pedigree - `GET /v1/horses/{horse_id}/form` — Recent runs, newest first, clipped to your window. - `GET /v1/horses/{horse_id}/pedigree` — Sire, dam and damsire, plus others by the same sire. - `GET /v1/horses/{horse_id}/layoff` [Complete + Analyst] — Performance split by days since the last run. - `GET /v1/horses/compare` — Every race these horses have both run in, and who finished ahead. - `GET /v1/horses/search` — By name, with career totals attached. - `GET /v1/horses/{horse_id}` — Career record and breeding where it has been fetched. - `GET /v1/horses/{horse_id}/trend` [Complete + Analyst] — Each run measured against what the market expected of it. - `GET /v1/horses/{horse_id}/stats` [Complete + Analyst] — The standard block, sliceable seventeen ways. ### Trainers - `GET /v1/trainers/search` — By name. - `GET /v1/trainers/{trainer_id}/form` — Newest first, with the price and the finish. - `GET /v1/trainers/{trainer_id}/jockeys` [Complete + Analyst] — Which riders have paid for this yard. - `GET /v1/trainers/{trainer_id}/courses` [Complete + Analyst] — The slice that finds where a yard actually wins. - `GET /v1/trainers/{trainer_id}` — Runs, wins and the horses sent out. - `GET /v1/trainers/{trainer_id}/stats` [Complete + Analyst] — Strike rate, A/E and level stakes, by any dimension. - `GET /v1/trainers/{trainer_id}/owners` [Complete + Analyst] — Split by who owns the horse. ### Jockeys & owners - `GET /v1/jockeys/{jockey_id}/form` — Newest first. - `GET /v1/jockeys/{jockey_id}/trainers` [Complete + Analyst] — Which yards a rider does well for. - `GET /v1/owners/{owner_id}/jockeys` [Complete + Analyst] — Riders used, and how they paid. - `GET /v1/owners/{owner_id}/courses` [Complete + Analyst] — Where the colours have done well. - `GET /v1/jockeys/search` — By name. - `GET /v1/jockeys/{jockey_id}` — Rides, wins and the span of them. - `GET /v1/jockeys/{jockey_id}/stats` [Complete + Analyst] — The standard block for a rider. - `GET /v1/owners/search` — By name. Owners are identified by name; the source publishes no id. - `GET /v1/owners/{owner_id}` — Runs, wins and horses. - `GET /v1/owners/{owner_id}/stats` [Complete + Analyst] — The standard block for an owner. ### Webhooks & account - `POST /v1/webhooks/subscribe` — Point a URL at an event and we sign every delivery. - `GET /v1/webhooks/deliveries` — What we sent, when, and whether it landed. - `GET /v1/account/usage` — Requests, errors and every refusal, by endpoint. ### Courses & bias - `GET /v1/courses/{course_id}/draw-bias` [Complete + Analyst] — Low, middle and high thirds of the field, per distance. - `GET /v1/courses/{course_id}/standard-times` [Complete + Analyst] — Median winning time per distance, with the implausible ones counted. - `GET /v1/courses/{course_id}/favourites` [Complete + Analyst] — How the market leader holds up here. - `GET /v1/courses/{course_id}/casualties` [Complete + Analyst] — Non-completion rates by run type. - `GET /v1/courses/{course_id}/stats` [Complete + Analyst] — The standard block for everything run there. - `GET /v1/courses/{course_id}/going-record` [Complete + Analyst] — How the ground changes what wins. ### Market & analysis - `GET /v1/market/sp-performance` [Complete + Analyst] — What each price band has actually returned. - `GET /v1/market/movers` [Complete + Analyst] — Whether money moving tells you anything. - `GET /v1/market/overround` [Complete + Analyst] — How fat the books have been, by field size and course. - `GET /v1/analysis/angles` [Complete + Analyst] — Every filter combined freely, returning the standard block. - `GET /v1/analysis/layoff` [Complete + Analyst] — Performance by days since the last run, across everything. - `GET /v1/analysis/precedents` [Complete + Analyst] — Races that ran under matching conditions. ## Terms - [Terms of service](https://apihorseracing.com/terms) - [Privacy](https://apihorseracing.com/privacy) - [Acceptable use](https://apihorseracing.com/acceptable-use) Generated 2026-09-22 from the same registry the API and the documentation share. Not hand maintained.