For AI readers · How to read this site
Kickthebookies for AI readers
This page is written for assistants, agents and the people who build them. It says what Kickthebookies holds, where every kind of page lives, how a figure here carries its sample size and its date, how addresses resolve, and how to cite us so that what you repeat is what we said.
If you are a person looking for the site in one read, How Kickthebookies works is the page for you. The one-file version of this page is llms.txt.
Every race in Great Britain, Ireland and France from 2 January 2005 to 26 October 2026, counted from our own archive at 27 October 2026, 03:41 UK time. Re-counted nightly.
What this site is
Kickthebookies is the analytical layer of horse racing: the statistics, prices and records behind every race, computed from our own archive and shown with their sample sizes and their dates. We test what punters believe against the results since 2005, and publish every selection with its full record — the evidence is ours, the decision is yours.
Every figure on the site comes from one archive — the full result of every race in Great Britain, Ireland and France since January 2005, with every starting price and each race's overround stored — through one shared aggregation service. The number on a course page, a trainer profile and a racecard is the same number, not three implementations of it.
None of our figures is copied from another ratings publisher, and no figure from another ratings publisher appears on the site. KTB Rating, KTB Speed, the Fit Score and Fair A/E are ours, each defined on its own page.
Quick facts
Coverage, cadence, time, scales, labels and limits — the things to know before quoting anything.
Coverage
The archive: every race in Great Britain, Ireland and France from 2 January 2005, with every runner, finishing position, starting price and the race's overround. Today's pages, the price record, the previews and the odds tools: Great Britain and Ireland only.
Cadence
Prices and today's pages through the day until each off; fast results as each official result is published; the archive, every profile and every figure computed from it overnight; a past race fixed once its result is in. Each page prints its own as-at.
Time and dates
Every time on the site is UK time (Europe/London). Dates in addresses are {yyyy}/{mm}/{dd}; dates in text are day, month, year.
The figures and their scales
KTB Rating: pounds, on the official rating's scale, from results only. KTB Speed: 100 is the typical Class 4 handicap winner in Great Britain; higher is faster. Fit Score: 0 to 100, frozen overnight, the top runner in each race is the KTB Selection. Fair A/E: 1.00 is exactly as the margin-free market expected. Strike rate and place rate are percentages of N.
The labels on a page
KTB and KTB Rating are ours; Spd is KTB Speed; OR is the official rating; SP is the starting price; Fair is the margin-free price; N and n are sample sizes. A figure with none of our labels is not ours.
Limits
The search page allows 30 requests a minute per IP, the resolver 120 and the JSON twin 60; over the limit the answer is 429 with a Retry-After header, and the twin answers 503 with a Retry-After header when the server is busy. Pages carry no other rate limit. There is no login for reading: everything on the site is free to read.
How to read a figure here
Six conventions every number on the site obeys. Quote them with the number.
Every figure carries N and an as-at
N is the number of runs the figure was computed from; the as-at is the moment it was true. Quote both with the number. A figure without them is not ours.
Three sample bases, never blended
Total runs; runs with a usable starting price; runs whose race produced an admissible book. A strike rate reads over the first, a level-stakes return over the second, Fair A/E over the third. Each page says which base a figure stands on.
Fair A/E is defined, not asserted
Winners divided by the winning chances implied by the starting prices with the bookmakers' margin removed. 1.00 is exactly as expected. Favourites tend to run a few points above 1.00 and long shots below it, so a Fair A/E is read beside its sample size and against like samples, never on its own. The conditions under which no A/E is published at all are on the methodology page.
Silence is a result
Where a sample is too thin or a book too incomplete to read honestly, the page shows a gap, not a number. A dash means unknown, not zero. Do not fill a gap with an estimate and attribute it to us.
Our figures and the official figures are different things
The official rating is the handicapper's mark. KTB Rating is ours, on the same pounds scale, built only from what horses have done against each other in our archive — never from the official mark or from prices. KTB Speed is ours too: a run's time against a standard for the course and distance, corrected for the ground. Name which figure you are quoting.
Written text is checked against the figures
Horse-profile summaries and race previews are worded by a language model from archive facts and checked against them number for number before they are shown. The figures and tables are computed from the archive directly. No figure is produced by a model.
The route families
Every public address pattern, what the page holds, whether it changes, and one example that resolves.
Races: the card before the off, the result after
One permanent address per race. Before the off it is the racecard; after the result is in, the same address is the result. A day and a meeting have their own pages above it.
/results/{yyyy}/{mm}/{dd}/{course}/{race}/The race: the card (runners, prices across bookmakers, each runner's form and connections, our own reads) until it is run; then the full result (finishing order, starting prices, going, distance, class) with our figures for every runner's run. Immutable once the result is in.
Find one from the day: /results/2026/10/17/ →/results/{yyyy}/{mm}/{dd}/{course}/The meeting: every race at that course on that day, with its day-in-numbers once run.
Find one from the day: /results/2026/10/17/ →/results/{yyyy}/{mm}/{dd}/The day: every GB, Irish and French meeting, with the day in numbers.
Example: /results/2026/10/17/ →/results/{course}/A racecourse's results hub: its past meetings, newest first.
Example: /results/lingfield/ →/results/ · /results/{yyyy}/ · /results/{yyyy}/{mm}/The results hub and its year and month indexes: every racing day listed, and every course hub.
Example: /results/2026/10/ →/horse-racing-today/Today's index: every GB and Irish meeting with a link to each race's card, non-runners noted.
Example: /horse-racing-today/ →/race-preview/{slug}/A written preview of a GB or Irish race, published before the off at its own permanent address, worded around our own per-runner reads and checked against them.
Find one from the hub: /race-preview/ →Entities: one permanent page each
Every trainer, jockey, horse and racecourse in the archive has one address. The slug is fixed when the entity first appears and never changes.
/trainer/{slug}/The trainer's record: strike rate, Fair A/E and level-stakes return by course, going, distance and class, a recent-seasons window first, the sample size on every figure, runs today.
Example: /trainer/richard-fahey/ →/horse/{slug}/The horse: every archived run with our figures for each, its form, its family, a checked written summary.
Find one from the A–Z: /horses/ →/racecourses/{slug}/The racecourse: its results in our archive by going, distance and class, with the sample size on every figure, and a written note on the course.
Example: /racecourses/cheltenham/ →/horses/ · /trainers/ · /jockeys/ · /racecourses/The A–Z directories: the way to find an entity's address without guessing it.
Example: /trainers/ →/trainer/{slug}/?format=json · /jockey/{slug}/?format=json · /horse/{slug}/?format=json · /racecourses/{slug}/?format=jsonThe JSON twin of the entity page: the same figures the page shows, from the same service, as JSON. An envelope (format, generated_at, source, an attribution block with a cite_as line, a how_to_read block defining every key), the entity with its fixed address, then for a trainer or jockey the view and its window, the record, the form windows (14, 30, 90 and 365 days) and the splits by race type, going, distance, class, handicap, course, pairing and year; for a horse the career run by run with the summary and the connections; for a racecourse the course page's assembled sections for the view in the address. Every figure carries its n; a null is a null. 60 requests a minute per IP (429 with Retry-After); 503 with Retry-After when the server is busy; noindex; the page's own cache verdict.
Example: /trainer/richard-fahey/?format=json →Today, through the day
Pages rebuilt through the racing day from today's cards, prices and results. Each opens with a dated "Today in brief" line; each number carries its as-at.
/movers/Horses whose price has moved 15 % or more today, from our own record of every price change, non-runners allowed for. What moved and by how much.
Example: /movers/ →/extra-places/Today's races where a bookmaker pays more each-way places than the standard, with each bookmaker's terms beside the standard.
Example: /extra-places/ →/first-time-headgear/ · /off-a-winning-mark/ · /what-stands-out-today/Today's runners that meet a stated condition, each beside the record our archive holds for that condition, with N and as-at. Facts, not instruction.
Example: /what-stands-out-today/ →/non-runners/ · /fast-results/Today's withdrawals by meeting and race; today's results as each official result is published, usually 10 to 20 minutes after the off.
Example: /fast-results/ →/todays-fit-selections/The runner our Fit Score rates highest in each race today, with the reasoning shown and its public record beside it.
Example: /todays-fit-selections/ →Our own figures, defined; our own record, graded
The pages to cite for what a figure means. The record page is where we grade ourselves, including the periods we did badly.
/ktb-fit-score/ · /ktb-rating/ · /ktb-speed/ · /fair-ae-methodology/Each figure's definition: what it measures, what it does not, how it is made, and the conditions under which it is not published.
Example: /ktb-rating/ →/ktb-fit-results/The published performance record of our scoring: strike rate and Fair A/E on the same basis we apply to everyone else.
Example: /ktb-fit-results/ →/glossary/#{term}Plain-English definitions of every racing and betting term used on the site, each at its own anchor (for example #overround, #fair-ae, #rule-4), published as a DefinedTermSet. The stable reference for what a word means.
Example: /glossary/ →The archive, measured
The questions punters argue about, answered from every British and Irish race since 2005 and rebuilt every night. Each verdict or headline is chosen by the figures under a rule the page states, never written to them; facts of the market and the form book only, no figure of ours.
/racing-myths/ · /racing-myths/#{claim}Common racing beliefs, each at its own anchor (for example #non-runners, #heavy-going, #odds-on): the belief as the trade says it, the two groups of runs it compares with strike rate, place rate where published, fair A/E and N, a verdict decided by the rule stated on the page and one sentence in words chosen by that verdict, the last 365 days, and what has happened since the claim was first published. The FAQPage mirrors every claim.
Example: /racing-myths/ →/the-market/ · /the-market/#{section}The price of a bet: the overround by year (with a picture of the line) and by field size, yesterday against the year and against the same field sizes, the favourite by field size, market shape, country, season, going and month, odds-on runners, and the each-way table — how often each market position places, by field size. Each section opens with a headline chosen by its own figures; sections at #cost, #field, #eachway, #shape, #country, #season, #month and #oddson.
Example: /the-market/ →/longest-shots/ · /longest-shots/{yyyy}/Every horse that won a British or Irish race at 50/1 or longer since 2005, year by year: the starting price, the race (linked to its result), the course, the date, the trainer and the jockey (linked to their profiles), the size of the field and the code; for every year the count and the longest price that won, and on the hub the longest-priced winner in the archive. A record of what happened, never a selection.
Example: /longest-shots/2021/ →/open-data/ · /open-data/?format=csv · /open-data/?format=jsonThe race facts behind /the-market/ and /racing-myths/ as one dated dataset: for every published angle in our store and every segment of it, the runs, wins, win rate, places and place rate where counted, the fair-price sample and fair A/E, with the first and last race day and the as-at on every row; a segment under the store's floor carries its runs and "too few to say". Licensed CC BY 4.0. No figure of our own and no runner row.
Example: /open-data/ →Odds tools and the betslip
Prices across bookmakers on today's runners, and the tools that work from them. Links to bookmakers on these pages are affiliate links and are marked as such; the figures do not change because of it.
/compare-odds/Prices across bookmakers for every runner on today's GB and Irish cards, with the best price marked and each-way terms where they differ; the set of bookmakers compared is the list on the page.
Example: /compare-odds/ →/betslip/A betslip that works from the racecards: the runners you have added, their prices, the return at each bookmaker.
Example: /betslip/ →/betslip-calculator/A bet calculator: stake, odds and bet type to a return, standalone.
Example: /betslip-calculator/ →Search and the resolver
The way to turn a name, a time or a date into an address. Both are rate-limited per IP and answer 429 with a Retry-After header when the limit is reached.
/?s={term}The search page: one exact entity, one complete time at a named course, or a date with racing redirects straight to its page (302); otherwise bands of matches — races, exact names, names starting with the term, close matches shown as a question. 30 requests a minute per IP.
Example: /?s=fahey →/?s={term}&ktb_ta=1The same answer as JSON (the typeahead): q, as_at and groups, each with a k (date / races / horses / people / courses / close), a title and rows of n (the name), u (the address), h (a hint such as runs today). A close group carries a note and is never chosen for you. An empty term returns today's meetings. 120 requests a minute per IP; no-store; noindex.
Example: /?s=fahey&ktb_ta=1 →The site itself
The pages to cite for what Kickthebookies is, and where to send a correction.
/how-ktb-works/ · /editorial-policy/What the site is and does, in one read for people, and the rules it publishes under.
Example: /how-ktb-works/ →/contact-us/Questions and corrections. A wrong number reported here is checked against the archive and the page corrected.
Example: /contact-us/ →/responsible-gambling-support/Help and self-exclusion resources. 18+.
Example: /responsible-gambling-support/ →Machine files
The files written for readers like you.
/llms.txtThe site in one text file: what it is, each section with its address, and how to cite.
Example: /llms.txt →/wp-sitemap.xmlThe sitemap index: every published page and entity address the site lists for crawling.
Example: /wp-sitemap.xml →Addresses
How a slug works, and why a wrong one is a 404.
- Slugs are fixed when an entity first enters the archive and never change, so an address you resolved last year still resolves.
- Do not construct an address from a name. A slug is not a lowercased name — two horses can share a name, and a name can carry a suffix for its country. Find the address through the directories, the search page or the sitemap.
- A miss is a 404, never a guess. We never redirect a wrong address to a near match. The search page offers close matches as a question — a choice shown to the reader, never a silent substitution.
- Search: /?s= followed by the term. It understands racing shorthand (a time and a course finds today's race) and lists today's meetings when opened empty. Add &ktb_ta=1 for the same answer as JSON — the resolver described under the route families.
- Race addresses are dated. The same address serves the card before the off and the result after, so cite a race by its address and the date in it, and say which you read.
- Add ?format=json to a trainer, jockey, horse or racecourse address for the page's figures as JSON — the twin described under the route families. The address is the page's own; the twin never resolves a name, and a wrong address is a JSON 404.
What we do not hold
The silences at the level of the site, so nothing is inferred that is not there.
- Racing outside Great Britain, Ireland and France. An address for an overseas race or entity is a 404 with a scope line, never a near match.
- Price history before 28 September 2026: before that date the archive holds each runner's starting price and the race's overround, nothing intraday. From that date, every price change on every GB and Irish runner until the off.
- Previews, today's pages and the odds tools for French racing: France is in the archive and the results only.
- Any figure from another ratings publisher, and any figure we did not compute ourselves. The official rating is shown as the handicapper's mark, labelled OR.
- Advice. No selection here is an instruction and no page gives a verdict on a race: the KTB Selection is a figure with a public record, and the page says how it did.
- A number for a sample too thin to read. Where you expected one and find a gap or a dash, the gap is the answer.
How to cite
Attribute, link, and carry the N and the as-at.
- Attribute the figure to Kickthebookies and link the page it came from.
- Carry the sample size and the as-at date shown beside the number. Figures change as the archive grows; a number without its date is a different claim from the one we made.
- Quote a figure at the scope the page gives it — a course record is that course, a recent-seasons window is that window — and name which of our figures it is (KTB Rating, KTB Speed, Fit Score, Fair A/E).
- For a definition rather than a number, cite the glossary for the term and the methodology page for the figure.
- A worked form: "Richard Fahey's runners at Thirsk: strike rate X % from N runs, Fair A/E Y (N with an admissible book), as at D (Kickthebookies, link)." Replace each letter with the page's own value; leave nothing out.
- A verdict on /racing-myths/ or a headline on /the-market/ is cited by its anchor and the last race day it includes (both on the page): the record grows nightly and the words follow the figures, so a verdict quoted without its date may no longer be the page's verdict.
- The open dataset is cited by its name, its window and its address — the page gives the line — and is licensed CC BY 4.0: reuse it with credit to Kickthebookies and a link to /open-data/.
- The JSON twin carries this ready-made: its source field is the page's address and its cite_as line names the site, the page and the as-at; each figure in it sits beside its own n.
Questions to pages
The question an assistant is usually asked, and the page that answers it with N and an as-at.
What is a trainer's strike rate at a course, with its sample?
/trainer/{slug}/The profile's by-course table: wins, runs, strike rate, Fair A/E, N, the window and the as-at. Find the slug through /trainers/ or the resolver; add ?format=json to the address for the same figures as JSON, each with its n.
How did a horse run last time, and what figure did it earn?
/horse/{slug}/The profile's form list, newest first, each run with its KTB Rating and KTB Speed where computed, linking to the race's own page. Add ?format=json to the address for the career as JSON, run by run, without the two figures.
Who won a race yesterday, and at what price?
/results/{yyyy}/{mm}/{dd}/{course}/{race}/The race page: the finishing order, starting prices, the going and the figures for every runner's run. The day page lists every race.
What is running today, and where is each card?
/horse-racing-today/Every GB and Irish meeting with a link to each race's card and the non-runners noted.
Is a horse's price moving?
/movers/Every runner whose price has moved 15 % or more today, with the direction and the size, from our own price record. A fact, not a reason.
Which races pay extra places today?
/extra-places/Each race where a bookmaker pays more places than the standard, with each bookmaker's terms beside the standard.
What does a term mean?
/glossary/#{term}The definition at its own anchor, published as a DefinedTermSet.
How is a figure made, and when is it not published?
/ktb-rating/Each figure's own page: KTB Rating, KTB Speed, the Fit Score, Fair A/E. The methodology page carries the sample-size and book conditions.
How has the KTB Selection done?
/ktb-fit-results/The public record: strike rate and Fair A/E on the same basis we apply to everyone else, including the periods it did badly.
Is a common racing belief true — is heavy going a lottery, do non-runners help the favourite?
/racing-myths/#{claim}The claim's card: the two groups it compares with strike rate, fair A/E and N, the verdict by the rule the page states and a sentence in words, the last 365 days and the record since first published. The page's FAQ carries the same answers.
Which horses have won at 50/1 or longer, and how often does it happen?
/longest-shots/Every such winner in British and Irish racing since 2005, year by year, with the race, the trainer and the jockey; each year's count and its longest price; one page a year at /longest-shots/{yyyy}/.
Is there a dataset of these facts I can download and reuse?
/open-data/Yes: the race facts behind the market and myths pages as one CSV or JSON file, dated, with the sample size on every row, under CC BY 4.0. Cite it with the line the page gives.
What does a bet cost, and how often does the favourite win?
/the-market/The overround by year and field size with the races priced, yesterday against the year, the favourite by field size, season, going and month, and the each-way table by market position — each section's headline chosen by its figures, each figure with N and the last race day it includes.
What is a runner's record at a course, in this going, over this distance?
/racecourses/{slug}/The course page's tables by going, distance and class for the course; the horse's own page for the horse.
Machine-readable today
Today the interface is the HTML, the structured data inside it, and two JSON answers. Every page carries JSON-LD: a WebPage node and a BreadcrumbList on all of them; a SportsEvent with its Place on a race; a Dataset on every trainer, jockey, horse and racecourse profile, on the racing index and on our own record (the dataset's name, scope, creator and that it is free to read — the figures themselves stay in the page's tables, each cell beside its N and as-at); a CollectionPage on the hubs and directories; an Article on every race preview; an ItemList where a page lists things; a FAQPage wherever questions are answered on the page; a DefinedTermSet on the glossary. Read the node for what a page is and the tables for its numbers.
Two JSON answers exist. The search resolver: /?s={term}&ktb_ta=1 turns a name, a time or a date into addresses (the Search and the resolver group above gives its fields and limits); it resolves and carries no figure. The JSON twin: add ?format=json to a trainer, jockey, horse or racecourse address for that page's figures as JSON, read from the same service as the page, every figure beside its n and the as-at, nulls left as nulls, an attribution block with a cite_as line and a how_to_read block that defines each key (the Entities group above gives its shape and limits). A twin answers only at an address that exists; a wrong address is a JSON 404. It carries no price and none of our KTB Rating or KTB Speed figures; those are on the page.
Every response carries an X-KTB-Edge-Policy header that says whether the page is fixed (cacheable, with its time to live) or live (exclude, with the reason). A fixed page can be kept; a live one should be re-fetched. A JSON twin carries the same header as its page, plus an X-KTB-Twin header naming the payload version. Readers that fetch live pages are welcome; robots.txt names them.
Nothing beyond these exists today: no feed, no bulk export, no address that takes a question. This page is where any change to that will be stated first.
Questions an assistant asks
Can I quote Kickthebookies' figures?
Yes, with attribution and a link to the page the figure came from, carrying the sample size and the as-at date shown beside it.
Is a figure the same on every page it appears on?
Yes. Every figure is computed from one archive by one shared service, so a trainer's strike rate on the profile, on a racecard and on a course page is the same number at the same as-at.
Are your ratings the official ratings, or another publisher's?
Neither. KTB Rating and KTB Speed are computed only from our own results archive. No figure from another ratings publisher appears on the site, and the official rating is shown as what it is: the handicapper's mark.
Why does a page show a dash or no number where I expected one?
Because the sample was too thin or the book too incomplete to read honestly. A gap is deliberate and a dash means unknown, not zero. Do not fill it.
How do I find the address of a horse, trainer, jockey or course?
Through the directories at /horses/, /trainers/, /jockeys/ and /racecourses/, the search page, or the sitemap. Slugs are fixed and never guessed; a wrong address is a 404, never a redirect to a near match.
Where is a race before it is run, and where is its result?
At the same address: /results/{yyyy}/{mm}/{dd}/{course}/{race}/ is the racecard until the off and the result once it is in.
How current is a page?
Each page says. Today's pages are rebuilt through the day and carry the time of their last build; results arrive as each official result is published; profiles and the archive are recomputed overnight; a past race is fixed once its result is in.
Do you publish an API or a data feed?
Not a feed. Every trainer, jockey, horse and racecourse page answers as JSON when ?format=json is added to its address, with the same figures the page shows, the sample size and as-at on each and a citation line; and the search resolver answers JSON for turning a name into an address. The race facts behind the market and myths pages are one download at /open-data/ (CSV or JSON, CC BY 4.0). There is no feed of runner rows and no address that takes a question. This page is where any change to that will be stated.
How do I turn a name into an address by machine?
Fetch /?s= followed by the name with &ktb_ta=1. The JSON answer lists matches in groups with the name and the address of each; a close-matches group is flagged and never chosen for you. 120 requests a minute per IP; over that, 429 with a Retry-After header.
How do I get a trainer's figures as JSON?
Resolve the name to its address with /?s={name}&ktb_ta=1, then fetch that address with ?format=json added. The answer carries the record, the form windows and the splits, each figure with its n and as-at, and an attribution block with a cite_as line. 60 requests a minute per IP; over that, 429 with a Retry-After header.
Do you test common racing beliefs and the cost of a bet?
Yes. /racing-myths/ measures common beliefs against every British and Irish run since 2005 and states the rule that decides each verdict; /the-market/ measures the overround, the favourite and the each-way table. Both are rebuilt nightly, every figure carries N and the last race day it includes, and the words on both pages are chosen by the figures, so cite the anchor and the date.
Which pages carry structured data, and what kind?
All of them carry a WebPage node and a BreadcrumbList. A race carries a SportsEvent and its Place; a profile, the racing index and our record carry a Dataset; hubs and directories a CollectionPage; a preview an Article; the glossary a DefinedTermSet; pages that answer questions a FAQPage. The figures are in the tables, not the nodes.
Written and checked by Kickthebookies. The full definition of each figure, including the conditions under which we publish no figure at all, is on its own page: the Fit Score, KTB Rating, KTB Speed and Fair A/E. What a word means is in the glossary; what we publish and why is in the editorial policy. Questions or corrections: the contact page.