South Korea Rail Scraper - Seoul Metro, AREX, Korail Commuter
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) andrealtimeArrival(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
- Pick a mode —
realtimePositionfor line-wide train positions, orrealtimeArrivalfor a station departure board. - 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.
- 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.
- 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.