horseracingapi.co.uk

Latest results

Every plan, free key included

The latest settled UK races your plan can read. British and Northern Irish racing only.

GEThttps://api.horseracingapi.co.uk/v1/results/latest
Try itruns against the real API with your key
Get a free key
GET /v1/results/latest
Examplea real answer from 2026-10-29, trimmed to a few rows
{
    "data": [
        {
            "race_id": "rc_s5e9rgr6",
            "meeting_id": "mt_24p8en3d",
            "course": "Newmarket",
            "time": "12:05",
            "off_time": "12:05:57",
            "name": "German G1 Racecourses Thank World Pool British EBF Novice Stakes (C & G) (Div 1)",
            "run_type": null,
            "class": "3",
            "distance": "7f",
            "going": "Good to Soft",
            "surface": "TURF",
            "handicap": false,
            "runners": 12,
            "result_available": true,
            "date": "2026-10-30",
            "winning_time": "1m 26.21s",
            "book_percentage": 122.14
        },
        {
            "race_id": "rc_syd1hjrz",
            "meeting_id": "mt_b05v6sym",
            "course": "Lyon-Parilly",
            "time": "11:50",
            "off_time": "11:53:48",
            "name": "Prix De Lacroix-laval Handicap",
            "run_type": null,
            "class": "3",
            "distance": "1m 3f 204y",
            "going": "Very Soft",
            "surface": "TURF",
            "handicap": true,
            "runners": 9,
            "result_available": true,
            "date": "2026-10-30",
            "winning_time": null,
            "book_percentage": 126.96
        }
    ],
    "meta": {
        "request_id": "3e33473236a03abd",
        "plan": "complete",
        "window": "January 2017 to the next 3 days",
        "data_as_of": "2026-10-30T12:41:32+00:00",
        "count": 5
    }
}
  

Parameters

NameInTypeRequiredWhat it does
limitqueryintegernoHow many rows in one answer, 1 to 100. Default 25.

Returns

A list in data, one row each, with meta.count. 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.
coursestringThe course name.
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_typenull or valueFlat, Hurdle, Chase or NH Flat.
classstringThe race class.
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.
runnersintegerThe runners, or how many there were.
result_availablebooleanWhether the race is settled.
datestringThe UK racing day, YYYY-MM-DD.
winning_timestringThe winner's time.
book_percentagenumberThe total of the market's implied chances. Null on the free key.

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.
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.