horseracingapi.co.uk

A race's runners

Every plan, free key included

The field alone.

GEThttps://api.horseracingapi.co.uk/v1/races/{race_id}/runners
Try itruns against the real API with your key
Get a free key
GET /v1/races/{race_id}/runners
Examplea real answer from 2026-10-29, trimmed to a few rows
{
    "data": [
        {
            "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
        }
    ],
    "meta": {
        "request_id": "84ef039c0c69f830",
        "plan": "complete",
        "window": "January 2017 to the next 3 days",
        "data_as_of": "2026-10-30T11:11:03+00:00",
        "count": 12
    }
}
  

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
clothintegerThe saddle cloth number.
drawintegerThe stall, on the Flat.
horse_idstringOur id for the horse.
horsestringThe horse's name.
ageintegerAge conditions of the race, or the horse's age in years.
weightstringThe weight carried, as published, for example 11-4.
official_ratingnull or valueThe official handicap mark.
formstringRecent form figures, newest last.
headgearstringHeadgear worn, if any.
ownerstringThe owner's name.
owner_idstringOur id for the owner.
trainer_idstringOur id for the trainer.
trainerstringThe trainer's name.
jockey_idstringOur id for the jockey.
jockeystringThe jockey's name.
silkstringThe owner's colours, in words.
spstringStarting price, fractional. Null on the free key.
sp_decimalintegerStarting price, decimal. Null on the free key.
price_pathobjectHow the price moved: opening, touched and drift. Null on the free key.
price_path.openingnull or valueThe first price shown. Null on the free key.
price_path.opening_decimalnull or value
price_path.touchednull or value
price_path.spstringStarting price, fractional. Null on the free key.
price_path.sp_decimalintegerStarting price, decimal. Null on the free key.
price_path.driftnull or value
price_path.sourcestring
favouritebooleanWhether it started favourite. Null on the free key.
market_positionintegerIts place in the betting. Null on the free key.
positionintegerWhere it finished; null for a non-finisher.
beaten_distancenull or valueHow far behind the winner, in lengths.
casualtynull or valueWhy it did not finish, if it did not.
run_statusstringran, or why not.
last_run_daysintegerDays since its previous run.
speed_figurenull or valueA speed figure, where held.
breedingnull or value
handicap_marknull or value

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.