# Japan Horse Racing Data (netkeiba.com) (`jpopendata/japan-keiba-netkeiba`) Actor

JRA & NAR race results, race cards and horse profiles from netkeiba.com — payouts, lap times, odds, career histories, English schema. Unofficial; not affiliated with Net Dreamers Co., Ltd.

- **URL**: https://apify.com/jpopendata/japan-keiba-netkeiba.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Japan Horse Racing Data (netkeiba.com)

**JRA and NAR race results, race cards (shutuba) and horse profiles from netkeiba.com — Japan's largest horse-racing database — in a clean English schema built for betting analytics and prediction models.**

Three modes, one Actor:

- **`race_results`** — every race of a given day (JRA + NAR local racing) or specific race ids: full finishing order with times, margins, corner positions, last-3F, win odds, popularity, horse weights, jockey, trainer and prize money — plus all 8 pari-mutuel payout types (win/place/bracket/quinella/wide/exacta/trio/trifecta), corner passing orders and lap times.
- **`race_card`** — upcoming JRA races: declared runners with barrier draw, carried weight, jockey, trainer, horse weight and current odds. JRA publishes cards ~2 days ahead.
- **`horse_db`** — horse profiles by id: birth date, sex, coat, trainer, career earnings (central + NAR), career record — and optionally the horse's **entire race history** (every start with odds, finish, time, going, weight...), the raw material for form-based prediction features.

Race ids returned by `race_results`/`race_card` link straight into `horse_db` (`entries[].horseId`), so the three modes chain into a full training dataset.

> **Unofficial tool.** Not affiliated with or endorsed by Net Dreamers Co., Ltd. or netkeiba.com. It collects **publicly available data only** (no login, no premium/paywalled content), politely (strictly serial requests, ≥1.2 s apart, hard per-run budget, no block evasion), and extracts **factual race data only**. Jockey and trainer names are JRA-published professional information; horse **owner and breeder names are deliberately never extracted**, and neither are bulletin-board posts, stable comments or tipster columns — no personal data of any kind (relevant e.g. under GDPR: no personal data is collected or processed). Users are responsible for ensuring their own use of the data complies with the source site's terms and applicable law.

***

### Who is this for?

- **Prediction-model / betting-AI developers** — structured historical results, laps, going and payouts; horse-level career histories as feature sources. Japanese racing has deep, liquid pari-mutuel pools and famously rich public data — but almost none of it is accessible in English.
- **Sports-data platforms & odds services** — Japanese racing coverage (JRA's ~3,400 races/year plus NAR local racing) in a stable English schema.
- **Quant & market-efficiency researchers** — payout data across all 8 bet types enables overround and market-bias studies of one of the world's largest betting markets.
- **Data teams** — a clean schema over an EUC-JP, Japanese-only source with two different page architectures.

### Sample output (race\_results, abridged)

```json
{
  "recordType": "race_result",
  "raceId": "202601020211",
  "raceName": "第21回キーンランドカップ(GIII)",
  "raceDate": "2026-08-23",
  "raceNumber": 11,
  "track": "札幌",
  "trackEn": "Sapporo",
  "meeting": "2回札幌2日目",
  "raceClass": "3歳以上オープン (国際)(指)(別定)",
  "surface": "turf",
  "distanceM": 1200,
  "direction": "right",
  "weather": "sunny",
  "going": "good",
  "goingJa": "良",
  "startTime": "15:45",
  "fieldSize": 16,
  "entries": [
    {
      "finishPosition": 1, "bracket": 7, "horseNumber": 14,
      "horseName": "サウンドモリアーナ", "horseId": "2022102057",
      "sex": "female", "age": 4, "carriedWeightKg": 55,
      "jockeyName": "武豊", "trainerName": "武英智", "trainerRegion": "Ritto (West)",
      "time": "1:07.7", "timeSec": 67.7, "margin": null, "cornerPassing": "2-2",
      "last3fSec": 33.6, "winOdds": 12.9, "popularity": 5,
      "horseWeightKg": 454, "horseWeightDiffKg": 4, "prizeJpy": 43560000
    }
  ],
  "payouts": [
    { "betType": "tan", "combinations": ["14"], "payoutsJpy": [1290], "popularity": [5] },
    { "betType": "santan", "combinations": ["14 → 3 → 8"], "payoutsJpy": [36780], "popularity": [113] }
  ],
  "cornerPassings": [{ "corner": "3コーナー", "order": "(*8,14)15(2,9)..." }],
  "lapTimesSec": [12.1, 10.8, 11.1, 11.2, 11.1, 11.4],
  "pace": "12.1 - 22.9 - 34.0 - 45.2 - 56.3 - 67.7 (34.0-33.7)",
  "url": "https://db.netkeiba.com/race/202601020211/",
  "source": "netkeiba.com (ネット競馬)",
  "sourceUrl": "https://www.netkeiba.com/",
  "license": "Publicly available data — unofficial tool; users are responsible for compliance with the source site's terms",
  "retrievedAt": "2026-08-25T09:12:44Z"
}
```

### Input examples

All races of a past day (JRA + NAR), one record per race:

```json
{ "mode": "race_results", "date": "2026-08-23" }
```

One specific race:

```json
{ "mode": "race_results", "raceId": "202601020211" }
```

Sunday's JRA cards at one track:

```json
{ "mode": "race_card", "date": "2026-08-30", "track": "Sapporo" }
```

Horse profiles with full race history:

```json
{ "mode": "horse_db", "horseId": "2022102057, 2017101429" }
```

`track` accepts a netkeiba 2-digit code (`"01"`), Japanese (`"札幌"`) or English (`"Sapporo"`) — all 10 JRA tracks and the major NAR tracks (Oi, Kawasaki, Funabashi, Urawa, Monbetsu, Kochi, Saga, Obihiro...).

### Pricing

Pay per result — see the pricing tab. **1 record = 1 complete race (with all runners and payouts) or 1 horse (with full history)**, so a full JRA race day at one track is ~12 records.

### FAQ

**Where does the data come from?**
Live from netkeiba.com's public, login-free pages at run time (db.netkeiba.com for results and horses, race.netkeiba.com for race cards). Every record embeds the source, source URL, a license note, and the retrieval timestamp.

**Is this an official netkeiba / JRA service?**
No. **Unofficial**, independently built and maintained, and **not affiliated with or endorsed by Net Dreamers Co., Ltd., netkeiba.com or the JRA.** It reads only publicly available pages.

**Are premium (paid) netkeiba features included?**
No. Time indices, speed figures and other premium columns require a netkeiba subscription; this Actor never logs in and never touches paywalled content.

**Why are owner and breeder names missing?**
Deliberately. Owner (馬主) names are private individuals' personal data, and breeder entries cannot be reliably distinguished from personal names — so both are excluded wholesale. Jockey and trainer names are professional, JRA-published public information and are included, as they're indispensable for racing analysis. Bulletin-board posts, stable comments and prediction columns (copyrighted prose) are never extracted either.

**Does it cover NAR (local) racing?**
`race_results` yes — the daily race list includes NAR meetings (Oi, Kawasaki, Banei Obihiro...). `race_card` covers JRA only (NAR cards live on a different netkeiba subdomain not served by this Actor).

**What about server load?**
Strictly serial requests, ≥1.2 s apart, one page per race (results/cards) and 1–2 pages per horse, hard per-run request budget (max 60), exponential backoff, no CAPTCHA/login/block evasion. If netkeiba.com changes its page format, the Actor stops with a clear error instead of silently mis-parsing; if it blocks persistently, the run fails visibly.

### Search terms this Actor answers

netkeiba scraper · netkeiba.com scraper · japan horse racing data · JRA race results api · keiba data english · japanese horse racing dataset · JRA data scraper · horse racing prediction data japan · shutuba race card data · NAR local racing results · japan racing odds payout data · 競馬データ 英語

### More Japan data Actors by the same developer

- **Japan Government Tenders & Awards** — tender notices and award results from the kkj.go.jp portal.
- **Japan Medical Facilities** — every registered hospital, clinic, dental clinic, and pharmacy (MHLW open data).
- **Japan Care Facilities** — long-term care providers across 35 service types (MHLW open data, CC BY).
- **Japan Government Subsidies & Grants** — open subsidy calls from the official jGrants API.
- **Japan Renewable Energy FIT/FIP Facilities** — METI-certified renewable installations, privacy-safe schema.
- **Japan Financial Licenses & Registrations** — FSA-licensed banks, securities firms, crypto exchanges and more.
- **Japan Construction & Real-Estate Licenses** — licensed contractors and brokers from MLIT's official register.
- **Japan Trade Statistics** — monthly import/export flows by HS code and partner country, from Japan Customs.

***

*Unofficial tool; not affiliated with Net Dreamers Co., Ltd., netkeiba.com or the JRA. Publicly available data only; users are responsible for compliance with the source site's terms and applicable law. No personal data is collected.*

# Actor input Schema

## `mode` (type: `string`):

What to fetch: race\_results (finished races with full result, payouts, laps — JRA and NAR), race\_card (upcoming-race entry lists with declared runners and morning odds — JRA), or horse\_db (horse profiles with career record and optional full race history).

## `date` (type: `string`):

ISO date YYYY-MM-DD. race\_results: a past race day (all races of that day, JRA + NAR). race\_card: an upcoming race day (JRA cards appear ~2 days ahead). Ignored when raceId is set; not used by horse\_db.

## `raceId` (type: `string`):

One or more 12-digit netkeiba race ids, comma-separated (e.g. "202601020211"). Takes precedence over date. The id encodes year + track + meeting + day + race number and appears in every netkeiba race URL.

## `horseId` (type: `string`):

REQUIRED for horse\_db: one or more 10-digit netkeiba horse ids, comma-separated (e.g. "2022102057"). Horse ids are included in race\_results output (entries\[].horseId), so a results run feeds a horse\_db run.

## `track` (type: `string`):

Optional: restrict a date-driven run to one track — netkeiba 2-digit code ("01"), Japanese ("札幌") or English ("Sapporo"). Supports all 10 JRA tracks and major NAR tracks.

## `includeRaceHistory` (type: `boolean`):

horse\_db only. When true (default) each horse costs one extra request and includes every career start (date, race, odds, finish, time, going, weight...). When false, profile only.

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

Stop after this many dataset records (1 record = 1 race or 1 horse).

## `maxApiRequests` (type: `integer`):

Hard budget of HTTP requests to netkeiba.com for this run (1 listing page + 1 per race, or 1-2 per horse). Requests are strictly serial with >= 1.2 s spacing. When the budget runs out the run completes with complete=false in RUN\_SUMMARY.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Default: no proxy. Never used for rotation/evasion — one client identity per run.

## Actor input object example

```json
{
  "mode": "race_results",
  "date": "2026-08-23",
  "raceId": "202601020211",
  "horseId": "2022102057",
  "track": "Sapporo",
  "includeRaceHistory": true,
  "maxItems": 12,
  "maxApiRequests": 30
}
```

# Actor output Schema

## `records` (type: `string`):

Structured race-result, race-card or horse records with source attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "raceId": "202601020211",
    "maxItems": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/japan-keiba-netkeiba").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 = {
    "raceId": "202601020211",
    "maxItems": 12,
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/japan-keiba-netkeiba").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 '{
  "raceId": "202601020211",
  "maxItems": 12
}' |
apify call jpopendata/japan-keiba-netkeiba --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/japan-keiba-netkeiba"
        }
    }
}

```

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/owhOAO0drs2H0MZr8/builds/R961iVrsc1HXbko8R/openapi.json
