horseracingapi.co.uk

One race

Every plan, free key includedMCP: race_details

One race: conditions, the market and every runner.

GEThttps://api.horseracingapi.co.uk/v1/races/{race_id}
Try itruns against the real API with your key
Get a free key
GET /v1/races/{race_id}
Examplea real answer from 2026-10-29, trimmed to a few rows
{
    "data": {
        "race_id": "rc_0aa1c4st",
        "meeting_id": "mt_yzs5rm2b",
        "course_id": "cr_239y20yw",
        "course": "Abu Dhabi",
        "country": "UAE",
        "region": "UAE",
        "date": "2026-10-29",
        "time": "13:00",
        "off_time": "13:01:21",
        "name": "Race 1 - Al Ghadeer Handicap",
        "run_type": "Flat",
        "class": null,
        "age": "3YO plus",
        "distance": "6f",
        "going": "Good",
        "surface": "TURF",
        "handicap": true,
        "winning_time": "1m 16.55s",
        "book_percentage": 133.36,
        "runners": [
            {
                "cloth": 6,
                "draw": 4,
                "horse_id": "hs_x73ps4xh",
                "horse": "Af Saqara",
                "age": 5,
                "weight": "8-11",
                "official_rating": null,
                "form": "11-30",
                "headgear": "Blinkers",
                "owner": "Khalid Khalifa Al Nabooda",
                "owner_id": "ow_neh55z1b",
                "trainer_id": "tr_j3qtz590",
                "trainer": "Ernst Oertel",
                "jockey_id": "jk_xr618k8m",
                "jockey": "Bernardo Pinheiro",
                "silk": "Black, white star, black sleeves, white cap",
                "sp": "7/1",
                "sp_decimal": 8,
                "price_path": {
                    "opening": null,
                    "opening_decimal": null,
                    "touched": null,
                    "sp": "7/1",
                    "sp_decimal": 8,
                    "drift": null,
                    "source": "starting_price_only"
                },
                "favourite": false,
                "market_position": 3,
                "position": 1,
                "beaten_distance": null,
                "casualty": null,
                "run_status": "ran",
                "last_run_days": 201,
                "speed_figure": null,
                "breeding": null,
                "handicap_mark": null
            },
            {
                "cloth": 11,
                "draw": 7,
                "horse_id": "hs_des8z34q",
                "horse": "Af Marmuq",
                "age": 8,
                "weight": "8-6",
                "official_rating": null,
                "form": "011506",
                "headgear": null,
                "owner": "Khalid Khalifa Al Nabooda",
                "owner_id": "ow_neh55z1b",
                "trainer_id": "tr_j3qtz590",
                "trainer": "Ernst Oertel",
                "jockey_id": "jk_bvfc3660",
                "jockey": "M Rodrigues",
                "silk": "Black, white star, black sleeves, blue cap",
                "sp": "10/1",
                "sp_decimal": 11,
                "price_path": {
                    "opening": null,
                    "opening_decimal": null,
                    "touched": null,
                    "sp": "10/1",
                    "sp_decimal": 11,
                    "drift": null,
                    "source": "starting_price_only"
                },
                "favourite": false,
                "market_position": 7,
                "position": 2,
                "beaten_distance": "3/4 length",
                "casualty": null,
                "run_status": "ran",
                "last_run_days": 208,
                "speed_figure": null,
                "breeding": null,
                "handicap_mark": null
            },
            {
                "cloth": 5,
                "draw": 8,
                "horse_id": "hs_5nzbfr73",
                "horse": "Ezzah",
                "age": 4,
                "weight": "8-13",
                "official_rating": null,
                "form": "15",
                "headgear": null,
                "owner": "Royal Cavalry Oman",
                "owner_id": "ow_2d8nknyk",
                "trainer_id": "tr_t473p4q2",
                "trainer": "I Hadhrami",
                "jockey_id": "jk_yrn5hzfm",
                "jockey": "Ray Dawson",
                "silk": "Yellow, green stripe, red sleeves, red cap",
                "sp": "8/1",
                "sp_decimal": 9,
                "price_path": {
                    "opening": null,
                    "opening_decimal": null,
                    "touched": null,
                    "sp": "8/1",
                    "sp_decimal": 9,
                    "drift": null,
                    "source": "starting_price_only"
                },
                "favourite": false,
                "market_position": 4,
                "position": 3,
                "beaten_distance": "1 3/4 length",
                "casualty": null,
                "run_status": "ran",
                "last_run_days": 201,
                "speed_figure": null,
                "breeding": null,
                "handicap_mark": null
            }
        ],
        "placed": 3,
        "stage": "WEIGHEDIN",
        "result_available": true,
        "weather": null,
        "class_figure": null,
        "speed_figure": null
    },
    "meta": {
        "request_id": "1c558294fbb3ce0b",
        "plan": "complete",
        "window": "January 2017 to the next 3 days",
        "data_as_of": "2026-10-30T10:58:35+00:00"
    }
}
  

Parameters

NameInTypeRequiredWhat it does
race_idpathidyesOur id for the race, as other answers give it (rc_ and eight characters).

Returns

One record in data. Every answer carries meta: request_id, plan, window and data_as_of.

FieldTypeHolds
race_idstringOur id for the race.
meeting_idstringOur id for the meeting.
course_idstringOur id for the course.
coursestringThe course name.
countrystringENG, Scot, Wale or Nort.
regionstringGB, or NORT for Northern Ireland.
datestringThe UK racing day, YYYY-MM-DD.
timestringThe advertised off time by the racecourse clock, HH:MM.
off_timestringWhen the race actually went off, by the racecourse clock; null until it has.
namestringThe name, as raced: the race title on a race.
run_typestringFlat, Hurdle, Chase or NH Flat.
classnull or valueThe race class.
agestringAge conditions of the race, or the horse's age in years.
distancestringThe race distance as published, for example 2m 87y.
goingstringThe going as declared; null until it is.
surfacestringTurf or the all-weather surface.
handicapbooleanWhether the race is a handicap.
winning_timestringThe winner's time.
book_percentagenumberThe total of the market's implied chances. Null on the free key.
runnersarrayThe runners, or how many there were.
runners[].clothintegerThe saddle cloth number.
runners[].drawintegerThe stall, on the Flat.
runners[].horse_idstringOur id for the horse.
runners[].horsestringThe horse's name.
runners[].ageintegerAge conditions of the race, or the horse's age in years.
runners[].weightstringThe weight carried, as published, for example 11-4.
runners[].official_ratingnull or valueThe official handicap mark.
runners[].formstringRecent form figures, newest last.
runners[].headgearstringHeadgear worn, if any.
runners[].ownerstringThe owner's name.
runners[].owner_idstringOur id for the owner.
runners[].trainer_idstringOur id for the trainer.
runners[].trainerstringThe trainer's name.
runners[].jockey_idstringOur id for the jockey.
runners[].jockeystringThe jockey's name.
runners[].silkstringThe owner's colours, in words.
runners[].spstringStarting price, fractional. Null on the free key.
runners[].sp_decimalintegerStarting price, decimal. Null on the free key.
runners[].price_pathobjectHow the price moved: opening, touched and drift. Null on the free key.
runners[].favouritebooleanWhether it started favourite. Null on the free key.
runners[].market_positionintegerIts place in the betting. Null on the free key.
runners[].positionintegerWhere it finished; null for a non-finisher.
runners[].beaten_distancenull or valueHow far behind the winner, in lengths.
runners[].casualtynull or valueWhy it did not finish, if it did not.
runners[].run_statusstringran, or why not.
runners[].last_run_daysintegerDays since its previous run.
runners[].speed_figurenull or valueA speed figure, where held.
runners[].breedingnull or value
runners[].handicap_marknull or value
placedintegerHow many places the race pays.
stagestringWhere the race is: dormant, off, weighed in and so on.
result_availablebooleanWhether the race is settled.
weathernull or valueThe weather on the day, where published.
class_figurenull or valueA figure for the class of the race, where held.
speed_figurenull or valueA speed figure, where held.

Errors

CodeStatusWhen
unauthorized401No key was sent, or the key is not one of ours.
outside_plan_window403The day asked for is outside what your plan reads. The answer gives your window and the day you asked for.
bad_request400A value is the wrong shape: a date that is not YYYY-MM-DD, a cursor that is not ours, or a key sent in the address.
unknown_parameter422A parameter this endpoint does not take. The answer lists the ones it does.
not_found404No record has that id, or it is not British or Northern Irish racing.
rate_limited429Too many calls this minute for your plan.
quota_exceeded429Your plan's calls for the month are used. The answer says when they reset.