# Racing TV Racecards Scraper (`parseforge/racing-tv-racecards-scraper`) Actor

Scrape Racing TV racecards for Britain and Ireland: every declared runner with its Timeform rating, form, draw, weight, jockey, trainer and starting price, plus analyst verdicts, smart stats and non-runners.

- **URL**: https://apify.com/parseforge/racing-tv-racecards-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.45 / 1,000 runners

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Racecards Scraper - UK & Irish Horse Racing Cards

**Every declared runner on today's British and Irish cards, with its Timeform rating, form, draw, weight, jockey, trainer and price.** Plus the race analyst's verdict, the pace read, the trainer and jockey angles behind each race, and the day's non-runners. No login, no browser, no proxy. Export to CSV, JSON, Excel, or XML.

Racing TV publishes the full card to anonymous visitors through the same API its own site calls. This Actor reads that API, flattens meetings, races and runners into one schema, and lets you filter by track, country, code, time or connections before a single card is opened.

| Who uses it | What they use racecards for |
|---|---|
| Bettors and tipsters | Ratings, form and prices for every runner, with the analyst verdict on the race |
| Trading and model builders | A clean daily card feed with draw, weight, days since last run and Timeform figures |
| Racing media and bloggers | Cards, verdicts and non-runners for previews without copying them by hand |
| Bloodstock and breeding | Sire, dam and damsire on every runner, filtered by track or race code |
| Odds comparison and apps | A structured card to hang prices on, refreshed as the day goes |

### What it does

Three row shapes off the same feed:

- 🐎 **Runners** (default): one row per declared horse. Cloth number, draw, horse with age, sex and country of breeding, weight carried, jockey with apprentice claim, trainer, owner, recent form figures, days since last run, **Timeform rating and star rating**, the analyst's comment on that horse, headgear, starting price in decimal and fractional, plus withdrawn and reserve flags, all with the race and meeting attached.
- 🏁 **Races**: one row per race with title, off time, going, distance, class, eligibility, rating band, prize, surface, code and declared runner count.
- 📍 **Meetings**: one row per fixture with track, country, going, weather, TV channel, status, race count and the first and last race times.

And four blocks you can switch on:

- 📝 **Analyst verdict and pace:** the written verdict for the race, the draw comment and the pace read.
- 📊 **Smart stats:** Racing TV's trainer and jockey angles for the race, each with the level-stake profit behind it, for example "Jim Goldie's profit to a £1 level stake with favourites: £18.65".
- ⭐ **Timeform tips:** the horses Timeform tips in the race, with tipped place and star rating.
- 🧬 **Pedigree:** sire, dam, damsire, colour and exact age in days.
- 🚫 **Non-runner check:** each runner marked against the day's declared non-runner list.

Coverage is Britain and Ireland plus the international fixtures Racing TV broadcasts. A typical day carries ten meetings across GBR, IRE, FRA, USA and SAF.

Every runner row contains: `rowType`, `meetingDate`, `track`, `country`, `going`, `raceId`, `raceTitle`, `startTime`, `raceType`, `surface`, `distance`, `raceClass`, `prize`, `clothNumber`, `drawNumber`, `horse`, `horseId`, `horseCountry`, `horseAge`, `horseSex`, `weight`, `jockey`, `jockeyId`, `apprenticeClaim`, `trainer`, `trainerId`, `owner`, `form`, `daysSinceLastRun`, `timeformRating`, `timeformStarRating`, `timeformTippedPlace`, `analystComment`, `equipment`, `badges`, `startingPriceDecimal`, `startingPriceFractional`, `isFavourite`, `isWithdrawn`, `isReserve`, `runnerStatus`, `raceUrl` and `scrapedAt`.

### What you can do with racecard data

**Build tomorrow's card into a model.**

Runners mode with a date gives every declared horse with rating, form, draw and weight, ready to join to your own odds or speed figures.

**Follow a trainer or a jockey.**

`trainerNameContains` or `jockeyNameContains` keeps only their rides across every meeting of the day, with the analyst's comment on each horse.

**Watch the non-runners.**

The non-runner check flags every horse that has come out today, which is what changes a market before the off.

**Study the pace.**

The verdict block carries the pace read and the draw comment for each race, so you can filter to the races where the shape favours a hold-up horse.

### Why choose this scraper

|  | What you get |
|---|---|
| **The full card, not a summary** | 43 fields on a runner row, including Timeform figures and the analyst's comment on the horse |
| **Race intelligence** | Verdict, pace, draw comment, trainer and jockey angles, and Timeform tips |
| **Non-runners** | The day's declared non-runners as a flag on each runner |
| **Filters before the fetch** | Country, track and time are applied to the fixture list, so a narrow run opens fewer cards and costs less |
| **Verified vocabularies** | Country, race code and surface lists were read off the live feed, not guessed |
| **No key to bring** | The public key Racing TV's own site ships is the default; your own can be pasted if you have one |

### How it compares

Racing TV is a different feed from the Press Association and Timeform cards our [Sporting Life Racing Scraper](https://apify.com/parseforge/sporting-life-racing-scraper?fpr=vmoqkp) reads. This one adds the analyst verdict, the pace read, the smart stats and the non-runner list; that one covers results and horse form history going back two decades. Between them you get the card twice, from two houses.

| Feature | ParseForge Racing TV | ParseForge Sporting Life | Other racing actors |
|---|---|---|---|
| UK and Irish cards | Yes | Yes | Mostly US, Japan or Hong Kong |
| Timeform rating per runner | Yes | Yes | Rarely |
| Analyst verdict and pace | Yes | No | No |
| Trainer and jockey angles | Yes | No | No |
| Non-runner list | Yes | No | No |
| Results and long form history | No | Yes | Some |
| Price per runner | $0.005 | $0.007 | $0.001 to $0.015 |

### What a runner looks like

```json
{
  "rowType": "runner",
  "meetingDate": "2026-08-27",
  "track": "Navan",
  "country": "IRE",
  "going": "Good (Good To Firm In Places)",
  "raceId": 715536,
  "raceTitle": "Navan Racecourse Nursery Handicap",
  "startTime": "13:44",
  "raceType": "Flat",
  "surface": "Turf",
  "distance": "5f 180y",
  "prize": "Winner: €9,000.00",
  "clothNumber": 2,
  "drawNumber": 8,
  "horse": "Howlin Wolf",
  "horseId": 569163,
  "horseCountry": "IE",
  "horseAge": 2,
  "horseSex": "Gelding",
  "weight": "9-6",
  "jockey": "J. J. G. Ryan",
  "trainer": "Jack W. Davison, Ireland",
  "owner": "Mrs Paula Davison",
  "form": "7741",
  "daysSinceLastRun": 11,
  "timeformRating": "79",
  "timeformStarRating": 5,
  "analystComment": "Improved with each run and took a sizeable step forward to get off the mark switched to nurseries in 8-runner event at the Curragh 11 days ago, benefiting as expected from the return to 6f and probably helped by bagging the stand side rail. 7 lb higher mark to defy but should go close.",
  "startingPriceDecimal": "5.50",
  "startingPriceFractional": "9/2",
  "isWithdrawn": "No",
  "raceUrl": "https://www.racingtv.com/racecards/navan/navan-racecourse-nursery-handicap/715536"
}
```

### Configure the run

Run it with no input for today's runners. Add a date range for the days ahead, or switch the row shape to races or meetings.

Today's full card:

```json
{ "outputMode": "runners", "maxItems": 500 }
```

Tomorrow's British and Irish jumps runners with the verdict and pedigree:

```json
{
  "outputMode": "runners",
  "dateFrom": "2026-08-28",
  "countries": ["GBR", "IRE"],
  "raceTypes": ["Hurdle", "Chase"],
  "includeRaceVerdict": true,
  "includePedigree": true,
  "maxItems": 300
}
```

Every race of the week with the tips and the angles:

```json
{
  "outputMode": "races",
  "dateFrom": "2026-08-28",
  "dateTo": "2026-09-03",
  "includeRaceVerdict": true,
  "includeSmartStats": true,
  "includeRaceTips": true,
  "maxItems": 400
}
```

One trainer's runners across the day:

```json
{ "trainerNameContains": "Gordon Elliott", "includeRaceVerdict": true, "maxItems": 60 }
```

### Pricing

Pay-per-event. **$5 per 1,000 runners**, plus $0.02 per run start and $0.004 per Racing TV request. Race and meeting rows are priced higher because one request produces far fewer of them.

| Event | Price | When |
|---|---|---|
| `runner-row` | $0.005 | Every runner written |
| `race-row` | $0.01 | Every race written |
| `meeting-row` | $0.008 | Every meeting written |
| `racecard-fetch` | $0.004 | Each fixture list or racecard read, never more than the rows written |
| `race-verdict` | $0.004 | The race carries a verdict or a pace read |
| `smart-stats` | $0.004 | The race has trainer or jockey angles |
| `race-tips` | $0.005 | Timeform tips came back for the race |
| `pedigree` | $0.003 | The breeding is published for the horse |
| `non-runner-check` | $0.003 | Each runner checked against the day's non-runner list |

| Run | Approximate cost |
|---|---|
| Today's card, about 400 runners | $2.62 |
| 400 runners with verdict and pedigree | $5.42 |
| A week of races with tips and angles (about 350) | $10.17 |
| One trainer's runners for a day (about 20) | $0.20 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 rows as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to pull whole cards.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Racing TV Racecards Scraper](https://apify.com/parseforge/racing-tv-racecards-scraper?fpr=vmoqkp).
3. Pick the row shape, the date and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab, or schedule it each morning.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent today's cards through the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/racing-tv-racecards-scraper"
```

Then ask: *"Which horses does Timeform rate highest at Ascot today?"*, *"Show me Gordon Elliott's runners and the analyst's verdict on each race"* or *"Which races today have a weak pace?"*

### Troubleshooting

**Why is a runner missing a starting price?**

Prices appear as the market forms, so a card pulled days ahead has no price yet. The field says `N/A` rather than guessing one.

**Why did my country filter return nothing?**

Racing TV uses three-letter racing codes: GBR, IRE, FRA, USA, SAF. Two-letter codes like GB do not match.

**Why are there fewer runners than the card shows?**

Withdrawn horses are dropped by default so the rows match what will run. Switch on "include withdrawn runners" to keep them.

**Why is the verdict empty on some races?**

Not every race is previewed, especially minor cards abroad. The block is charged only when the race carries a verdict or a pace read.

**Why is the run slower with races mode and tips?**

Runners come from the racecard the run already opens; tips are a separate request per race. A day of races with tips is roughly two requests per race.

### FAQ

| Question | Answer |
|---|---|
| Where does the data come from? | The public Racing TV API, the same one its own website calls, using the public key its web app ships. |
| Do I need an API key or a subscription? | No. The public key is the default; you can paste your own if you have one. |
| How far ahead are cards published? | A few days, and the fixture list for a date is one request. Past days stay available for a while. |
| Does it cover Ireland? | Yes, Irish fixtures come in the same feed as the British ones, and international cards Racing TV broadcasts appear too. |
| Are the Timeform ratings included? | Yes, the rating and the star rating on each runner, plus the analyst's comment on the horse. |
| What are smart stats? | Racing TV's trainer and jockey angles for a race, each with the profit to a level stake behind it. |
| Does it include results? | No. This Actor covers cards. For results and long form history use the Sporting Life Racing Scraper. |
| Can I get one row per race instead of per runner? | Yes, set the row shape to races, or to meetings for one row per fixture. |
| How many rows per run? | Free plan: 10. Paid: a full British and Irish day is about 400 runners. |
| Is this an official Racing TV product? | No. It is unofficial and reads only publicly available data. |

### Related actors

- [Sporting Life Racing Scraper](https://apify.com/parseforge/sporting-life-racing-scraper?fpr=vmoqkp): racecards, results and horse form history from Sporting Life.
- [Equibase Scraper](https://apify.com/parseforge/equibase-scraper?fpr=vmoqkp): North American racing charts and entries.
- [Covers Scraper](https://apify.com/parseforge/covers-scraper?fpr=vmoqkp): odds, matchups and consensus by sportsbook.
- [SportyTrader Scraper](https://apify.com/parseforge/sportytrader-scraper?fpr=vmoqkp): tips and odds across sports and bookmakers.
- [TeamRankings Scraper](https://apify.com/parseforge/teamrankings-scraper?fpr=vmoqkp): team ratings and betting trends.

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Racing TV, Timeform or any racecourse. It reads only publicly available data. Betting involves risk; nothing here is advice.

# Actor input Schema

## `outputMode` (type: `string`):

Runners is one row per declared horse with its rating, form and price. Races is one row per race. Meetings is one row per fixture with its going and race count.

## `dateFrom` (type: `string`):

First racing day, as YYYY-MM-DD. Leave empty for today. Racing TV publishes cards a few days ahead and keeps the recent past.

## `dateTo` (type: `string`):

Last racing day, as YYYY-MM-DD. Leave empty to use the same day as the start.

## `maxItems` (type: `integer`):

Free users: limited to 10 items (preview). Paid users: up to 1,000,000.

## `countries` (type: `array`):

Keep only meetings in these racing countries, using Racing TV's own codes. A typical day carries Britain and Ireland plus the international cards it broadcasts.

## `trackNameContains` (type: `string`):

Keep only meetings at a track whose name contains this text, for example "Ascot" or "Curragh".

## `raceTypes` (type: `array`):

The four codes Racing TV labels races with. A few races carry no code and are kept unless you filter.

## `surfaces` (type: `array`):

Turf or an all-weather surface.

## `horseNameContains` (type: `string`):

Runners mode. Keep only horses whose name contains this text.

## `jockeyNameContains` (type: `string`):

Runners mode. Keep only rides by a jockey whose name contains this text.

## `trainerNameContains` (type: `string`):

Runners mode. Keep only runners from a trainer whose name contains this text.

## `minRunners` (type: `integer`):

Skip races with fewer declared runners than this.

## `timeFrom` (type: `string`):

Local race time in 24 hour form, for example 14:00.

## `timeTo` (type: `string`):

Local race time in 24 hour form, for example 17:30.

## `includeWithdrawn` (type: `boolean`):

Keep horses marked withdrawn. They are dropped by default so the card matches what will actually run.

## `apiKey` (type: `string`):

Optional. The public key Racing TV's own web app ships is used by default; set this only if you have your own.

## `includeRaceVerdict` (type: `boolean`):

Add the race analyst's written verdict, the draw comment and the pace read for the race.

## `includeSmartStats` (type: `boolean`):

Add Racing TV's trainer and jockey angles for the race, with the level-stake profit figure behind each one.

## `includeRaceTips` (type: `boolean`):

Races mode. Add the horses Timeform tips in the race with their tipped place and star rating. One extra request per race.

## `includePedigree` (type: `boolean`):

Runners mode. Add the sire, dam, damsire, colour and exact age in days for each horse.

## `includeNonRunnerCheck` (type: `boolean`):

Mark each runner against today's declared non-runner list. One request for the whole run.

## Actor input object example

```json
{
  "outputMode": "runners",
  "maxItems": 10,
  "includeWithdrawn": false,
  "apiKey": "936fdbdf-1e46-4f82-9d18-d81b4803537d",
  "includeRaceVerdict": false,
  "includeSmartStats": false,
  "includeRaceTips": false,
  "includePedigree": false,
  "includeNonRunnerCheck": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `rows` (type: `string`):

No description

## `csv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/racing-tv-racecards-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parseforge/racing-tv-racecards-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call parseforge/racing-tv-racecards-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/racing-tv-racecards-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/72sel99qfODcnYXej/builds/sZLDf9Az7XCkVgNtr/openapi.json
