OrbTop

Thailand Transit Scraper — SRT, BTS Skytrain & ARL Red Line

TRAVELBUSINESS

Thailand Transit Scraper — SRT, BTS Skytrain & ARL Red Line

Scrapes transit data from three Thai public transport networks: the State Railway of Thailand (SRT), BTS Skytrain, and the SRT Red Line. Returns bilingual station catalogs (Thai + English), first/last service times, fare data in THB, and departure timetables — around 870 records per full run.


What Thailand Transit Scraper Extracts

  • SRT stations — ~750 stations across four lines (North, Northeast, East, South), with bilingual Thai and English names, station codes, and line assignments
  • BTS Skytrain stations — ~119 stations on the Sukhumvit, Silom, and Gold lines, with first and last train times per station, latitude/longitude, and line colors
  • ARL Red Line timetables — hourly departure schedules for the two Red Line routes (Bangkok Aphiwat to Rangsit and Bangkok Aphiwat to Taling Chan), stored as structured JSON
  • Operator filter — run all three sources together or target a single operator (SRT, BTS, or ARL)
  • Bilingual output — every station record includes both Thai script (station_name_th) and English romanization (station_name_en), which is more than you'll get from a Google search

Who Uses Thailand Transit Data?

  • Travel app developers — build station selectors, route planners, and schedule widgets for Bangkok tourism apps
  • SE Asia trip-planning platforms — populate stop data, transit options, and fare estimates for multi-modal itinerary builders
  • Thailand MaaS startups — seed the station database for mobility-as-a-service products integrating SRT, BTS, and urban rail
  • Data journalists and researchers — map transit access, coverage gaps, and service hours for urban mobility analyses
  • Expat and digital-nomad tools — help newcomers navigate Bangkok's overlapping rail networks with accurate bilingual data

How It Works

  1. Select your operator. Set operator to any, srt, bts, or arl. The default pulls all three sources in sequence.
  2. SRT station catalog. Posts to the D-Ticket API, receives all ~750 stations in one response, filters active entries, and emits srt_station records.
  3. BTS station list and service times. Posts to the EBM route-map API for all stations, then fetches first/last train times per station with bounded concurrency.
  4. ARL timetable. Fetches the SRTET fare-timetable page, parses the HTML departure tables, and returns structured hourly schedules as JSON strings.

Thailand Transit Scraper Input Fields

{
  "operator": "any",
  "includeFares": false,
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "TH"
  },
  "sp_intended_usage": "Transit data for Bangkok travel app",
  "sp_improvement_suggestions": "none"
}
Field Type Default Description
operator string "any" Which network to scrape: any, srt, bts, or arl
includeFares boolean false Reserved for future BTS fare-per-pair calculations
maxItems integer 15 Maximum total records to return; set higher for full datasets
proxyConfiguration object Thai residential Apify proxy config; Thai residential recommended for geographic consistency
sp_intended_usage string Required: describe your intended use of this data
sp_improvement_suggestions string Required: feedback or "none"

Thailand Transit Scraper Output Fields

Records come in three types, set by record_type. Each type populates a different subset of fields.

SRT Station (srt_station)

{
  "record_type": "srt_station",
  "operator": "SRT",
  "service_id": "1001",
  "station_name_en": "Hua Lamphong",
  "station_name_th": "หัวลำโพง",
  "station_code_en": "HLP",
  "station_code_th": "หลป",
  "line": "SRT South",
  "line_id": "4",
  "scraped_at": "2025-11-01T08:30:00.000Z"
}
Field Type Description
record_type string srt_station
operator string SRT
service_id string Internal station ID
station_name_en string Station name in English
station_name_th string Station name in Thai script
station_code_en string English station code (e.g. HLP)
station_code_th string Thai station code
line string Line name: SRT North, SRT Northeast, SRT East, or SRT South
line_id string Numeric line identifier as string
scraped_at string ISO 8601 timestamp

BTS Station (bts_station)

{
  "record_type": "bts_station",
  "operator": "BTS",
  "service_id": "42",
  "station_name_en": "Asok",
  "station_name_th": "อโศก",
  "line": "Sukhumvit Line",
  "line_color": "#009C3B",
  "station_key": "E4",
  "station_order": "4",
  "latitude": 13.7363,
  "longitude": 100.5606,
  "first_train_to_end": "05:56",
  "first_train_to_start": "06:10",
  "last_train_to_end": "24:00",
  "last_train_to_start": "23:48",
  "scraped_at": "2025-11-01T08:30:00.000Z"
}
Field Type Description
record_type string bts_station
operator string BTS
service_id string BTS internal station ID
station_name_en string Station name in English
station_name_th string Station name in Thai script
line string Sukhumvit Line, Silom Line, or Gold Line
line_color string Hex color code for the line
station_key string BTS line key (e.g. N8, S6, G1)
station_order string Sequence number on the line
latitude number Station latitude
longitude number Station longitude
first_train_to_end string First train toward end of line (HH:MM)
first_train_to_start string First train toward start of line (HH:MM)
last_train_to_end string Last train toward end of line (HH:MM)
last_train_to_start string Last train toward start of line (HH:MM)
scraped_at string ISO 8601 timestamp

ARL Schedule (arl_schedule)

{
  "record_type": "arl_schedule",
  "operator": "ARL",
  "service_id": "arl_Bangkok_Aphiwat_Rangsit",
  "station_name_en": "Bangkok Aphiwat",
  "line": "ARL Red Line",
  "line_color": "#FF0000",
  "direction_from": "Bangkok Aphiwat",
  "direction_to": "Rangsit",
  "first_train_to_end": "05:43",
  "last_train_to_end": "23:30",
  "schedule_json": "[{\"hour\":5,\"minutes\":[43]},{\"hour\":6,\"minutes\":[0,15,30,45]},...]",
  "scraped_at": "2025-11-01T08:30:00.000Z"
}
Field Type Description
record_type string arl_schedule
operator string ARL
service_id string Route identifier string
direction_from string Departure origin station
direction_to string Departure destination station
first_train_to_end string First departure time (HH:MM)
last_train_to_end string Last departure time (HH:MM)
schedule_json string Full hourly schedule as JSON string
scraped_at string ISO 8601 timestamp

🔍 FAQ

How do I scrape Thailand transit station data?

Thailand Transit Scraper handles it in one run. Set operator to any to pull all three networks simultaneously, or target a single one (srt, bts, or arl) if you only need a subset. Full datasets return in under 2 minutes.

What data can I get from the BTS Skytrain API?

Thailand Transit Scraper returns all ~119 BTS stations across the Sukhumvit, Silom, and Gold lines, with bilingual names, GPS coordinates, line colors, station keys (e.g. N8, S6), and first/last service times per direction. That covers everything you need to build a station selector or schedule widget.

How much does Thailand Transit Scraper cost to run?

At the default pay-per-event rate, a full run costs roughly $0.001 per record — around $0.87 for all ~870 records. Test runs with maxItems: 15 are negligible.

Does Thailand Transit Scraper need proxies?

Thailand Transit Scraper uses Thai residential proxies by default. The BTS API performs geographic checks, so a Thai IP is recommended. The SRT and ARL sources work without proxies, but the default configuration keeps everything consistent.

Why is MRT Bangkok not included?

The MRT Bangkok site (metro.bemplc.co.th) is behind an Imperva WAF that requires full browser rendering to bypass. It's out of scope for this actor.


Need More Features?

Need MRT Bangkok, fare pair calculations, or a different operator? File an issue on the actor page or contact us through the Apify console.

Why Use Thailand Transit Scraper?

  • Bilingual by default — every SRT and BTS record includes both Thai script and English romanization, saving the translation step that other sources skip
  • Three networks, one run — SRT station catalog, BTS schedule data, and ARL timetables in a single actor with a single operator filter, which is more efficient than maintaining three separate scrapers
  • Structured schedule output — ARL departures come as parseable JSON arrays, not raw strings scraped from a timetable page