# South Korea Rail Scraper - Seoul Metro, AREX, Korail Commuter (`jungle_synthesizer/south-korea-rail-transit-scraper`) Actor

Realtime Seoul Metro Lines 1-9, AREX airport express, and Korail commuter rail (Gyeongui-Jungang, Suin-Bundang, Gyeongchun, Seohae) plus Shinbundang and Ui-Sinseol. Two modes: live train position or station arrival board. Bilingual Korean/English names, KR Pass eligibility flag.

- **URL**: https://apify.com/jungle\_synthesizer/south-korea-rail-transit-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## South Korea Rail Transit Scraper

Scrape realtime South Korean rail and transit data from the [Seoul Open Data Plaza](https://data.seoul.go.kr/) 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

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

Realtime arrival board for one station, romaji input:

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

Realtime arrival board for multiple stations, Korean input:

```json
{
  "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`)

```json
{
  "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`)

```json
{
  "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.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

realtimePosition = where every train on the selected line(s) is right now (one record per running train). realtimeArrival = live departure board for one or more stations (one record per upcoming train).

## `operator` (type: `string`):

Which operator's lines to query. 'any' covers Seoul Metro 1-9 + AREX + all Korail commuter + Shinbundang + Ui-Sinseol. Use a specific value to narrow the run. For per-line position scrapes, set this to 'line\_1' through 'line\_9'.

## `station` (type: `string`):

Station name(s) for realtimeArrival mode. Korean (강남) or romaji (Gangnam, Seoul, Jamsil) both work. Comma-separated for multiple stations. Ignored in realtimePosition mode.

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

Maximum total records to save across the run. The Seoul Open Data sample tier returns up to 5 records per API call; we paginate across selected lines / stations until this cap is reached. Default: 15.

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

Proxy is NOT required — Seoul Open Data is publicly accessible from anywhere. Default: no proxy.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "realtimePosition",
  "operator": "any",
  "station": "강남",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "realtimePosition",
    "operator": "any",
    "station": "강남",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/south-korea-rail-transit-scraper").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "mode": "realtimePosition",
    "operator": "any",
    "station": "강남",
    "maxItems": 15,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/south-korea-rail-transit-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "mode": "realtimePosition",
  "operator": "any",
  "station": "강남",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/south-korea-rail-transit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/south-korea-rail-transit-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "South Korea Rail Scraper - Seoul Metro, AREX, Korail Commuter",
        "description": "Realtime Seoul Metro Lines 1-9, AREX airport express, and Korail commuter rail (Gyeongui-Jungang, Suin-Bundang, Gyeongchun, Seohae) plus Shinbundang and Ui-Sinseol. Two modes: live train position or station arrival board. Bilingual Korean/English names, KR Pass eligibility flag.",
        "version": "1.0",
        "x-build-id": "5vVYEyHIuExbkF6vM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~south-korea-rail-transit-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-south-korea-rail-transit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~south-korea-rail-transit-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-south-korea-rail-transit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~south-korea-rail-transit-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-south-korea-rail-transit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "mode": {
                        "title": "Scrape Mode",
                        "enum": [
                            "realtimePosition",
                            "realtimeArrival"
                        ],
                        "type": "string",
                        "description": "realtimePosition = where every train on the selected line(s) is right now (one record per running train). realtimeArrival = live departure board for one or more stations (one record per upcoming train).",
                        "default": "realtimePosition"
                    },
                    "operator": {
                        "title": "Operator / Line Filter",
                        "enum": [
                            "any",
                            "seoul_metro",
                            "arex",
                            "korail",
                            "korail_commuter",
                            "private_rail",
                            "shinbundang",
                            "ui_sinseol",
                            "line_1",
                            "line_2",
                            "line_3",
                            "line_4",
                            "line_5",
                            "line_6",
                            "line_7",
                            "line_8",
                            "line_9"
                        ],
                        "type": "string",
                        "description": "Which operator's lines to query. 'any' covers Seoul Metro 1-9 + AREX + all Korail commuter + Shinbundang + Ui-Sinseol. Use a specific value to narrow the run. For per-line position scrapes, set this to 'line_1' through 'line_9'.",
                        "default": "any"
                    },
                    "station": {
                        "title": "Station(s) — for Arrival Mode",
                        "type": "string",
                        "description": "Station name(s) for realtimeArrival mode. Korean (강남) or romaji (Gangnam, Seoul, Jamsil) both work. Comma-separated for multiple stations. Ignored in realtimePosition mode.",
                        "default": "강남"
                    },
                    "maxItems": {
                        "title": "Max Records",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum total records to save across the run. The Seoul Open Data sample tier returns up to 5 records per API call; we paginate across selected lines / stations until this cap is reached. Default: 15.",
                        "default": 15
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy is NOT required — Seoul Open Data is publicly accessible from anywhere. Default: no proxy.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
