netkeiba Race Cards Scraper (JRA entries)
Pricing
from $2.10 / 1,000 entry scrapeds
netkeiba Race Cards Scraper (JRA entries)
Scrape JRA race cards (出馬表) from netkeiba for any race day or list of race ids: one flat row per horse per race - bracket, horse number, horse name and id, sex/age, weight carried, jockey, trainer, body weight, plus the race's name, grade, course, distance, surface and post time.
Pricing
from $2.10 / 1,000 entry scrapeds
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
Scrape JRA race cards (出馬表) from netkeiba and get one flat row per horse per race - no nested objects, no HTML to strip. Built for a handicapping table: give it race days (or specific race ids) and get back every runner's bracket, horse number, horse, sex and age, weight carried, jockey, trainer and body weight, with the race's own name, grade, course, distance, surface and post time on every row.
Input
| field | meaning |
|---|---|
dates | JRA race days as YYYYMMDD (or YYYY-MM-DD). Every JRA race netkeiba lists for each day is read, at every racecourse running that day. Empty = the upcoming weekend in Japan time: Saturday and Sunday, or just today when run on a Sunday. Monday holiday meetings are not guessed - add those dates yourself |
raceIds | Optional 12-digit netkeiba race ids (the race_id= value in a race card URL). When given, the day list is skipped and dates is ignored |
maxItems | Stop after this many entry rows in total, across every race |
proxyConfiguration | Apify datacenter proxy by default - see Proxy below |
How it works
- For each date,
race.netkeiba.com/top/race_list_sub.html?kaisai_date=<date>lists that day's JRA races. Each race appears there twice (its race card and a hidden replay link); every race is read once. - For each race,
race.netkeiba.com/race/shutuba.html?race_id=<id>is read and every runner row of its entries table becomes one dataset row.
A date with no JRA meeting is reported in the log and costs nothing beyond the actor-start event. The same horse in the same race is never pushed or charged twice, even if a race id is given twice.
Output
Race columns, repeated on every runner row:
| field | meaning |
|---|---|
race_id, race_url | netkeiba's race id and the race card it was read from |
race_date | YYYY-MM-DD, read off the race card |
venue | Racecourse as printed, in Japanese (中山, 東京, 京都 ...) |
race_number | Race number on the day (11 for 11R) |
race_name | e.g. スプリンターズS |
race_grade | Grade printed after the name, e.g. G1; null for an ungraded race |
post_time | Post time in Japan time, HH:MM |
surface | turf (芝), dirt (ダ) or jump (障) |
distance_m | Distance in metres |
course_detail | Direction and course variant as printed, e.g. 右 外 C |
weather, track_condition | As printed on the race header (曇, 稍 ...), once announced |
field_size | Runner count the race header prints |
race_conditions | Age/class/weight conditions as printed, e.g. サラ系3歳以上 オープン (国際)(指) 定量 |
Runner columns:
| field | meaning |
|---|---|
bracket | 枠番, 1-8 |
horse_number | 馬番 |
horse_name, horse_id, horse_url | Horse, and its netkeiba database page |
sex, age | 牡 / 牝 / セ and age in years |
weight_carried_kg | 斤量 |
jockey, jockey_id | Jockey as printed, and netkeiba's jockey id |
trainer, trainer_id, trainer_stable | Trainer, netkeiba's trainer id, and training centre (美浦 / 栗東) |
body_weight_kg, body_weight_change_kg | 馬体重 and its change from the previous run |
odds, popularity | See below - null in practice |
null is not zero
A column is null when netkeiba's page did not print the value, never a zero
standing in for it. A 0 would read as a measurement ("no weight change",
"weight carried 0") when the page said nothing.
oddsandpopularityare null on every row seen. netkeiba prints these cells as placeholders (---.-,**) and fills them in with JavaScript from a separate odds feed after the page loads. This actor reads the page's HTML, which carries no number, so it reportsnullrather than inventing one. They would be filled automatically if netkeiba ever printed a number in the HTML.body_weight_kg/body_weight_change_kgare only published about an hour before post time, so a card read earlier has none. The change is alsonullwhen the page says the previous weight was not measured (前計不).bracket/horse_numberare null on a card published before the draw.weather/track_conditionappear once the day's going is announced.race_gradeis null for every ungraded race.
Encoding
netkeiba served its race pages as EUC-JP for years; on 2026-10-04 they were
UTF-8. This actor decodes each page by the charset it declares (HTTP header,
then the page's own <meta charset>), so horse and jockey names come out as
Japanese text either way.
Proxy
Apify datacenter proxy is the default: netkeiba served both pages normally to a datacenter address when probed on 2026-10-04. If a run's log shows refusals (HTTP 403/429) it rotates the exit address and retries; switch to residential only if refusals persist.
Billing
Pay per event: $0.0021 per entry (one horse in one race), plus a small actor-start fee per run. Platform usage - compute, bandwidth, proxy - is included. An 18-runner G1 and a 9-runner maiden are charged by the rows they actually produce.