---
title: Horse Racing API
description: UK and Ireland racing — tracks, meetings, races, runners with multi-bookmaker odds, horses, jockeys and trainers.
badge: pro
---

# Horse Racing API

The Horse Racing API covers UK and Ireland racing: tracks, daily meetings,
races with runners, multi-bookmaker decimal odds per runner, plus horse,
jockey and trainer profiles.

Base URL: `https://sports.bzzoiro.com/horseracing/api/v2/`

## Access

Requires the **Sports Addon** ($5/month) — it unlocks the tennis, CS2, darts,
hockey, basketball and horse racing APIs plus their MCP servers. Get it at
[/addons/](/addons/). You also need a free account token from
[/register/](/register/).

```bash
Authorization: Token YOUR_API_KEY
```

Without a token you get **401**:

```json
{"error": "authentication required", "code": "authentication_required",
 "detail": "Send Authorization: Token <YOUR_TOKEN> on every request.",
 "register": "https://sports.bzzoiro.com/register/"}
```

With a token but no addon you get **402**:

```json
{"error": "Sports Addon required", "code": "addon_required",
 "detail": "Tennis, CS:GO, darts, hockey, basketball and horse racing APIs require the Sports Addon ($5/mo).",
 "pricing_url": "https://sports.bzzoiro.com/pricing/"}
```

List endpoints paginate with `limit` (default 50, max 200) and `offset`, and
return `{count, next, previous, results}`.

## Endpoints

| Endpoint | Description |
|---|---|
| `GET /horseracing/api/v2/tracks/` | List race tracks |
| `GET /horseracing/api/v2/tracks/{id}/` | Track detail |
| `GET /horseracing/api/v2/meetings/` | List meetings (a day of racing at a track) |
| `GET /horseracing/api/v2/meetings/{id}/` | Meeting detail with its races |
| `GET /horseracing/api/v2/races/` | List races |
| `GET /horseracing/api/v2/races/live/` | Races currently in progress |
| `GET /horseracing/api/v2/races/next-to-jump/` | Races starting in the next 30 minutes |
| `GET /horseracing/api/v2/races/{id}/` | Race detail with runners |
| `GET /horseracing/api/v2/runners/` | List runners |
| `GET /horseracing/api/v2/runners/{id}/` | Runner detail |
| `GET /horseracing/api/v2/runners/{id}/odds/` | All bookmaker odds for a runner |
| `GET /horseracing/api/v2/horses/` | Search horses |
| `GET /horseracing/api/v2/horses/{id}/` | Horse profile |
| `GET /horseracing/api/v2/jockeys/` | Search jockeys |
| `GET /horseracing/api/v2/jockeys/{id}/` | Jockey profile |
| `GET /horseracing/api/v2/trainers/` | Search trainers |
| `GET /horseracing/api/v2/trainers/{id}/` | Trainer profile |

## Tracks and meetings

**Tracks query parameters:** `search`, `country`, `limit`, `offset`.

**Meetings query parameters**

| Param | Type | Description |
|---|---|---|
| `date` | date | One day (`YYYY-MM-DD`) |
| `date_from` / `date_to` | date | Date range |
| `country` | string | ISO country code (`GB`, `IE`) |
| `track` | int | Filter by track id |
| `limit` / `offset` | int | Pagination |

```bash
curl -H "Authorization: Token YOUR_API_KEY" \
  "https://sports.bzzoiro.com/horseracing/api/v2/meetings/?date=2026-08-02&country=GB"
```

```json
{"count": 5, "results": [
  {"id": 1207, "track": {"id": 31, "name": "Goodwood", "country": "GB"},
   "date": "2026-08-02", "races_count": 7, "going": "Good"}
]}
```

## Races

**Query parameters**

| Param | Type | Description |
|---|---|---|
| `meeting` | int | Filter by meeting id |
| `track` | int | Filter by track id |
| `status` | string | `upcoming`, `live`, `finished` |
| `surface` | string | e.g. `turf`, `all-weather` |
| `date_from` / `date_to` | date | `YYYY-MM-DD` |
| `limit` / `offset` | int | Pagination |

`GET /races/next-to-jump/` is the quickest way to build a "next races" widget
— it returns races going off within 30 minutes, soonest first.
`GET /races/live/` is cached 30 seconds.

`GET /races/{id}/` includes the runner list:

```json
{"id": 88412, "meeting_id": 1207, "name": "Sussex Stakes",
 "off_time": "2026-08-02T14:35:00+00:00", "status": "upcoming",
 "distance": "1m", "surface": "turf", "runners_count": 9,
 "runners": [
   {"id": 774201, "number": 1, "horse": {"id": 55310, "name": "Field Of Gold"},
    "jockey": {"id": 2210, "name": "K. Stott"},
    "trainer": {"id": 981, "name": "J. & T. Gosden"},
    "best_odds": 2.10}
 ]}
```

## Runners and odds

**Runners query parameters:** `race`, `horse`, `jockey`, `trainer`, `limit`,
`offset`.

`GET /runners/{id}/odds/` returns every bookmaker's current decimal price for
that runner:

```json
{"runner_id": 774201, "odds": [
  {"bookmaker": "bet365", "decimal_odds": 2.10, "updated_at": "2026-08-02T13:58:12+00:00"},
  {"bookmaker": "williamhill", "decimal_odds": 2.05, "updated_at": "2026-08-02T13:57:40+00:00"}
]}
```

## Horses, jockeys and trainers

All three follow the same pattern: a search list (`query`, `limit`, `offset`)
plus a detail endpoint with career form.

```bash
curl -H "Authorization: Token YOUR_API_KEY" \
  "https://sports.bzzoiro.com/horseracing/api/v2/jockeys/?query=stott"
```

```json
{"count": 1, "results": [
  {"id": 2210, "name": "K. Stott", "wins_this_season": 61, "win_rate": 0.19}
]}
```
