OrbTop

South Korea Rail Scraper - Seoul Metro, AREX, Korail Commuter

TRAVELBUSINESS

South Korea Rail Transit Scraper

Scrape realtime South Korean rail and transit data from the Seoul Open Data Plaza public feed. Covers Seoul Metro Lines 1-9, AREX airport express, Korail commuter lines (Gyeongui-Jungang, Suin-Bundang, Gyeongchun, Seohae), Shinbundang, and Ui-Sinseol — the rail network that moves roughly 8 million passengers a day.


South Korea Rail Transit Scraper Features

  • Returns realtime train positions across 16 lines. One record per running train, with current station and terminus.
  • Pulls live arrival boards for any station you can name. Korean (강남) or romaji (Gangnam) both resolve.
  • Two operating modes — realtimePosition (where every train is right now) and realtimeArrival (the departure board).
  • Bilingual output. Every station has both a Korean (current_station_ko) and romanised (current_station_en) field.
  • Flags Korea Rail Pass eligibility per line. KR Pass-curious tourists asked for this.
  • Distinguishes AREX Express vs All-Stop services automatically.
  • Surfaces direction (inbound/outbound, plus Line 2's outer/inner loop quirk), train status, last-train flag, and arrival countdown in seconds.
  • Pure JSON API — no browser, no proxies, no API key. The actor pays nothing in proxy budget.

Who Uses South Korea Rail Data?

  • Travel app developers — Build live transit views for K-tourism apps, KR Pass calculators, and Seoul itinerary tools.
  • Travel aggregators — Feed Klook, KKday, and Trip.com-style routing engines with live arrival data.
  • Tourism analysts — Track passenger flow patterns at major hubs (Seoul Station, Gangnam, Hongdae, Incheon Airport).
  • Logistics teams — Monitor airport express service health (AREX) for ground-transport coordination.
  • Researchers — Study urban transit dynamics across one of the densest metro networks in the world.

How South Korea Rail Transit Scraper Works

  1. Pick a mode — realtimePosition for line-wide train positions, or realtimeArrival for a station departure board.
  2. For position mode, choose an operator filter (any, seoul_metro, arex, korail_commuter, line_1 through line_9). For arrival mode, type the station name in Korean or romaji.
  3. The actor calls the Seoul Open Data sample endpoint for each selected line or station, transforms each row, and writes structured records to the dataset.
  4. The feed updates every few seconds. Two consecutive runs may share rows — the actor dedupes within a run by record_id.

Input

{
  "mode": "realtimePosition",
  "operator": "any",
  "maxItems": 15
}

Realtime arrival board for one station, romaji input:

{
  "mode": "realtimeArrival",
  "station": "Gangnam",
  "operator": "any",
  "maxItems": 5
}

Realtime arrival board for multiple stations, Korean input:

{
  "mode": "realtimeArrival",
  "station": "서울, 강남, 잠실",
  "maxItems": 15
}
Field Type Default Description
mode string realtimePosition realtimePosition (one record per running train) or realtimeArrival (one record per upcoming train at a station).
operator string any Filter by operator/line. Options: any, seoul_metro, arex, korail_commuter, private_rail, shinbundang, ui_sinseol, or line_1 through line_9.
station string 강남 Station name in Korean or romaji. Comma-separated for multiple. Used only by realtimeArrival.
maxItems integer 15 Cap on total records saved across the run. The Seoul feed returns 5 records per call; the actor paginates across selected lines/stations until the cap is hit.
proxyConfiguration object {useApifyProxy: false} Proxy not required. Seoul Open Data is publicly accessible from anywhere.

South Korea Rail Transit Scraper Output Fields

Position mode (realtimePosition)

{
  "record_id": "pos-1001-0492-2026-04-30 21:07:10",
  "mode": "realtimePosition",
  "operator": "Seoul Metro / Korail",
  "line_ko": "1호선",
  "line_en": "Line 1",
  "line_id": "1001",
  "service_type": "metro",
  "train_no": "0492",
  "train_status": "arrived",
  "direction": "inbound",
  "current_station_ko": "종로3가",
  "current_station_en": "Jongno 3-ga",
  "current_station_id": "1001000130",
  "target_station_ko": "청량리",
  "target_station_en": "Cheongnyangni",
  "is_express": false,
  "is_last_train": false,
  "korea_rail_pass_eligible": true,
  "observed_at": "2026-04-30 21:07:10",
  "source_url": "http://swopenAPI.seoul.go.kr/api/subway/sample/json/realtimePosition/0/5/1호선",
  "scraped_at": "2026-04-30T12:07:58.615Z"
}

Arrival mode (realtimeArrival)

{
  "record_id": "arr-1077-16-1077000687-2026-04-30 21:08:13",
  "mode": "realtimeArrival",
  "operator": "Shinbundang Railroad",
  "line_ko": "신분당선",
  "line_en": "Shinbundang Line",
  "line_id": "1077",
  "service_type": "metro",
  "train_no": "16",
  "train_status": "approaching",
  "direction": "inbound",
  "current_station_ko": "강남",
  "current_station_en": "Gangnam",
  "target_station_ko": "신사",
  "target_station_en": "Sinsa",
  "train_line_label": "신사행 - 신논현방면",
  "arrival_message": "강남 진입",
  "arrival_seconds": 0,
  "is_express": false,
  "is_last_train": false,
  "korea_rail_pass_eligible": false,
  "observed_at": "2026-04-30 21:08:13",
  "source_url": "http://swopenAPI.seoul.go.kr/api/subway/sample/json/realtimeStationArrival/0/5/강남",
  "scraped_at": "2026-04-30T12:08:17.802Z"
}
Field Type Description
record_id string Stable identifier built from mode, line ID, train number, station ID, and observation timestamp. Used for in-run deduplication.
mode string realtimePosition or realtimeArrival.
operator string Operator brand: Seoul Metro, Korail, AREX, Shinbundang Railroad, Ui Sinseol Light Rail, Gimpo Goldline, or shared "Seoul Metro / Korail" for Lines 1, 3, and 4.
line_ko string Line name in Korean (1호선, 공항철도, 수인분당선).
line_en string Line name in English (Line 1, AREX (Airport Railroad), Suin-Bundang Line).
line_id string Seoul Open Data subway code (1001-1009 for Lines 1-9, 1063 Gyeongui-Jungang, 1065 AREX, 1075 Suin-Bundang, 1077 Shinbundang, 1093 Seohae).
service_type string metro, commuter, or airport_express.
train_no string Train number assigned by the operator. Stable for the day.
train_status string Position mode: approaching, arrived, departed, previous_station_departed. Arrival mode adds in_transit, previous_station, transit_station_arrived.
direction string inbound, outbound. Line 2 (loop) uses outer_loop and inner_loop because that's how Seoul names them.
current_station_ko string Current station in Korean. Position mode: where the train is. Arrival mode: the station you queried.
current_station_en string Current station romanised.
current_station_id string Station ID (10-digit, line-prefixed).
target_station_ko string Train terminus in Korean.
target_station_en string Train terminus romanised.
train_line_label string Arrival mode only. Operator's free-text route label, e.g. "신사행 - 신논현방면" or "Express to Incheon Airport T2".
arrival_message string Arrival mode only. Operator's free-text status, e.g. "강남 진입" or "[2]번째 전역".
arrival_seconds integer Arrival mode only. Estimated seconds until the train reaches the queried station. 0 if it's already there.
is_express boolean True for Express (급행/직통) services. AREX uses this to mark the non-stop Express; Line 9 uses it for timetabled express trains.
is_last_train boolean True for the last service of the day on the line.
korea_rail_pass_eligible boolean True for Korail-operated services (Lines 1/3/4 outer sections, Gyeongui-Jungang, Suin-Bundang, Gyeongchun, Seohae, AREX). False for Seoul Metro Lines 2/5/6/7/8/9, Shinbundang, Ui-Sinseol, Gimpo Goldline.
observed_at string KST timestamp when the upstream feed recorded this position/arrival, format YYYY-MM-DD HH:MM:SS.
source_url string Seoul Open Data API URL that produced the row.
scraped_at string ISO-8601 UTC timestamp when the row was written to the dataset.

FAQ

How do I scrape Seoul Metro realtime data?

The South Korea Rail Transit Scraper queries the Seoul Open Data Plaza public feed for live train positions and station arrival boards. Pick realtimePosition mode for line-wide views or realtimeArrival for a station's departure board, set an operator filter, and run.

What lines does the South Korea Rail Transit Scraper cover?

The scraper covers Seoul Metro Lines 1-9, AREX (Airport Railroad), Korail commuter rail (Gyeongui-Jungang, Suin-Bundang, Gyeongchun, Seohae), Shinbundang, and Ui-Sinseol LRT. Sixteen lines total — the entire Seoul Metropolitan Subway and connected rail network.

Does the South Korea Rail Transit Scraper need proxies or an API key?

No. Seoul Open Data is publicly accessible from anywhere on the internet, no auth and no key. The actor consumes zero proxy budget.

Can I get KORAIL intercity (KTX) or SRT data?

Not in v1. KORAIL's reservation site (korail.com) returns an anti-automation challenge ("macro_err1") to direct HTTP requests. SRT's selectScheduleList.do endpoint returns an empty form shell instead of schedule rows. Both targets need a browser-automation bypass with a Korean residential proxy. Tracking as a v2 feature — file a request if you need it.

How fresh is the data?

The Seoul feed updates every few seconds. Two consecutive runs of the actor will return mostly the same trains; the actor dedupes within a run by record_id. For continuous monitoring, run the actor on a schedule and keep the last few minutes of records.

What's the Korea Rail Pass eligibility flag for?

The KR Pass is the Korean equivalent of the JR Pass — a tourist rail pass that covers Korail-operated services. The korea_rail_pass_eligible flag is set per line: true for Korail commuter lines and Lines 1/3/4 (which Korail co-operates with Seoul Metro), false for the rest. It does not cover SRT high-speed rail.


Need More Features?

Want KORAIL intercity (KTX/ITX/Mugunghwa), SRT, or one of the regional metros (Busan, Daegu, Incheon, Gwangju, Daejeon)? File an issue with what you need.

Why Use the South Korea Rail Transit Scraper?

  • Zero infrastructure cost — Pure JSON API, no proxy budget, no browser dependency. The cheapest possible Korean rail feed to run.
  • Bilingual output — Every station name comes in both Korean and romanised form. Saves you from rolling your own Revised Romanization engine.
  • KR Pass aware — Per-line eligibility flag. Few other rail feeds bother to surface this.
  • Sixteen lines, one actor — Seoul Metro 1-9, AREX, four Korail commuter lines, plus Shinbundang and Ui-Sinseol. One input, one output schema, no per-operator special-casing.