netkeiba Race Cards Scraper (JRA entries) avatar

netkeiba Race Cards Scraper (JRA entries)

Pricing

from $2.10 / 1,000 entry scrapeds

Go to Apify Store
netkeiba Race Cards Scraper (JRA entries)

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

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 days ago

Last modified

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

fieldmeaning
datesJRA 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
raceIdsOptional 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
maxItemsStop after this many entry rows in total, across every race
proxyConfigurationApify datacenter proxy by default - see Proxy below

How it works

  1. 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.
  2. 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:

fieldmeaning
race_id, race_urlnetkeiba's race id and the race card it was read from
race_dateYYYY-MM-DD, read off the race card
venueRacecourse as printed, in Japanese (中山, 東京, 京都 ...)
race_numberRace number on the day (11 for 11R)
race_namee.g. スプリンターズS
race_gradeGrade printed after the name, e.g. G1; null for an ungraded race
post_timePost time in Japan time, HH:MM
surfaceturf (芝), dirt (ダ) or jump (障)
distance_mDistance in metres
course_detailDirection and course variant as printed, e.g. 右 外 C
weather, track_conditionAs printed on the race header (曇, 稍 ...), once announced
field_sizeRunner count the race header prints
race_conditionsAge/class/weight conditions as printed, e.g. サラ系3歳以上 オープン (国際)(指) 定量

Runner columns:

fieldmeaning
bracket枠番, 1-8
horse_number馬番
horse_name, horse_id, horse_urlHorse, and its netkeiba database page
sex, age牡 / 牝 / セ and age in years
weight_carried_kg斤量
jockey, jockey_idJockey as printed, and netkeiba's jockey id
trainer, trainer_id, trainer_stableTrainer, netkeiba's trainer id, and training centre (美浦 / 栗東)
body_weight_kg, body_weight_change_kg馬体重 and its change from the previous run
odds, popularitySee 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.

  • odds and popularity are 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 reports null rather than inventing one. They would be filled automatically if netkeiba ever printed a number in the HTML.
  • body_weight_kg / body_weight_change_kg are only published about an hour before post time, so a card read earlier has none. The change is also null when the page says the previous weight was not measured (前計不).
  • bracket / horse_number are null on a card published before the draw.
  • weather / track_condition appear once the day's going is announced.
  • race_grade is 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.