Vietnam Transit Scraper - VNR Trains & Intercity Bus
Pricing
Pay per event
Vietnam Transit Scraper - VNR Trains & Intercity Bus
Vietnam transit via Vexere: Vietnam Railways (Reunification Express, Hà Nội-Sa Pa sleeper) with train numbers, seat-class fares in VND, bilingual VI/EN station names, plus intercity buses with sleeper-bed/cabin types and pickup/dropoff points.
Pricing
Pay per event
Rating
0.0
(0)
Developer
BowTiedRaccoon
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Share
Vietnam Transit Scraper — VNR Trains & Intercity Bus
Scrape Vietnam transit data from the Vexere aggregator, the largest Vietnamese ticket platform. Returns Vietnam Railways (VNR) train schedules — including the Reunification Express Hà Nội ↔ HCMC and the Hà Nội ↔ Sa Pa sleeper — alongside intercity bus services across major operators, with bilingual Vietnamese / English station names and fares in Vietnamese đồng.
Vietnam Transit Scraper Features
- Returns Vietnam Railways (VNR) services with train numbers (SE1, SE3, SE5, SNT2, ...) and seat-class information.
- Surfaces intercity buses across major Vietnamese carriers (Phương Trang/Futa, Hoàng Long, The Sinh Tourist, Mai Linh) with bus-type detail — Sleeper Bed, Sleeper Cabin, Seat 45, Limousine 9.
- Three modes —
daily_summaryfor aggregate counts and fare ranges,train_searchfor per-train listings,bus_searchfor per-trip listings. Pick what you need, skip what you don't. - Bilingual fields: every station carries a Vietnamese name with diacritics and an English fallback. The data isn't useful if half your team can't read it.
- Sleeper detection — flags overnight services so you can filter to the trains and cabin buses people actually book for the journey.
- Bus pickup and dropoff points include district names and lat/lon coordinates. Geocoded out of the box.
- No browser, no proxy required. Pure JSON API, fast and cheap.
- Pay-per-event pricing: $0.10 per actor start + $0.001 per record.
What Can You Do With Vietnam Transit Data?
- Travel apps & itinerary planners — Power Hà Nội ↔ Sa Pa sleeper bookings or Reunification Express search without scraping the official VNR site, which is gated behind login plus an obfuscated payload cipher.
- Tourism platforms — Track inventory, fare ranges, and seat-class availability for popular backpacker corridors (Hà Nội–HCMC, Đà Nẵng–Huế, HCMC–Đà Lạt).
- MaaS startups — Index intercity bus operators across Vietnam in one schema. Vexere covers ~500 carriers; you'd otherwise need to scrape each operator's site.
- Price-tracking dashboards — Daily summary mode emits min/max/avg fares per A→B/date. Run it nightly, plot the curve.
- SE Asia rail enthusiasts — Pull the full SE1–SE10 + SNT timetable on any date. The dataset includes carriage types and distances.
How Vietnam Transit Scraper Works
- Pick a mode —
daily_summary,train_search, orbus_search. - Provide an origin and destination by city name (English, Vietnamese, with or without diacritics) or numeric Vexere city ID. The scraper resolves Hà Nội, HCMC, Đà Nẵng, Sa Pa, Đà Lạt, Nha Trang, Huế, Hội An, and 20+ other cities out of the box.
- The scraper hits Vexere's
internal-vroute.vexere.comAPI with a static FE Bearer token and polls until inventory populates (a few seconds for fresh queries). It handles the polling for you. - Records flow into the dataset with a stable schema, ready for export to CSV, JSON, or Excel.
Input
{"mode": "train_search","origin": "Hanoi","destination": "Ho Chi Minh City","date": "","sleeperOnly": false,"maxItems": 15}
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | train_search | One of daily_summary, train_search, bus_search. |
origin | string | Hanoi | Origin city. English, Vietnamese with or without diacritics. |
destination | string | Ho Chi Minh City | Destination city, same format as origin. |
originCityId | integer | (none) | Override: numeric Vexere city ID. Use when the city isn't in the lookup table. |
destinationCityId | integer | (none) | Override: numeric Vexere city ID. |
date | string | today + 7 (ICT) | Travel date, YYYY-MM-DD. Empty defaults to a week out. |
sleeperOnly | boolean | false | Filter to overnight sleeper trains and sleeper-cabin buses. |
maxItems | integer | 15 | Maximum records returned. Tester runs the default; raise for production. |
proxyConfiguration | object | { "useApifyProxy": false } | Proxy not required. |
Bus search example (Hà Nội → Sa Pa):
{"mode": "bus_search","origin": "Hanoi","destination": "Sapa","maxItems": 50}
Daily summary example (HCMC → Nha Trang):
{"mode": "daily_summary","origin": "Ho Chi Minh City","destination": "Nha Trang","date": "2026-06-15"}
Vietnam Transit Scraper Output Fields
Train search (mode: "train_search")
{"record_type": "train","service_id": "VNR|SE7|2026-05-08|06:00|HNO|SGO","operator": "Vietnam Railways Corporation","operator_code": "VNR","service_type": "rail","origin_station": "Hà Nội","origin_station_en": "Ha Noi","origin_station_code": "HNO","destination_station": "Sài Gòn","destination_station_en": "Saigon","destination_station_code": "SGO","departure_date": "2026-05-08","departure_time": "06:00","arrival_date": "2026-05-09","arrival_time": "17:35","duration_minutes": 2495,"train_number": "SE7","seats_available": 117,"distance_km": 1726,"is_sleeper": true,"route_url": "https://vexere.com/","scraped_at": "2026-05-01T16:38:29.217Z"}
| Field | Type | Description |
|---|---|---|
record_type | string | train. |
service_id | string | Vexere idIndex — VNR|<train>|<date>|<time>|<from-code>|<to-code>. |
operator | string | Vietnam Railways Corporation. |
operator_code | string | VNR. |
service_type | string | rail. |
origin_station | string | Vietnamese name with diacritics. |
origin_station_en | string | English / diacritic-stripped fallback. |
origin_station_code | string | 3-letter VNR code (HNO, SGO, DNA, ...). |
destination_station | string | Vietnamese destination. |
destination_station_en | string | English destination. |
destination_station_code | string | 3-letter VNR code. |
departure_date | string | YYYY-MM-DD (ICT). |
departure_time | string | HH:MM (ICT). |
arrival_date | string | YYYY-MM-DD (ICT). |
arrival_time | string | HH:MM (ICT). |
duration_minutes | number | Total journey duration. |
train_number | string | SE1, SE3, SE5, SNT2, ... |
seats_available | number | Total available seats across carriages. |
distance_km | number | Route distance in km. |
is_sleeper | boolean | True for SE-class and SNT night trains. |
route_url | string | Vexere homepage for verification. |
scraped_at | string | ISO-8601 extraction timestamp. |
Bus search (mode: "bus_search")
{"record_type": "bus","service_id": "473571045_2026-05-08_23:46_178500_178508","operator": "HK BUSLINES","service_type": "bus_intercity","origin_station": "Văn phòng 70 Nguyễn Hữu Huân","origin_station_en": "Van phong 70 Nguyen Huu Huan","destination_station": "Văn phòng 732 Điện Biên Phủ","destination_station_en": "Van phong 732 Dien Bien Phu","departure_date": "2026-05-08","departure_time": "23:46","arrival_date": "2026-05-09","arrival_time": "05:31","duration_minutes": 345,"distance_km": 318,"bus_type": "Sleeper Cabin","is_sleeper": true,"pickup_points": ["Trạm Buýt Bầu | Đông Anh | 21.12936,105.77987","Sân bay Nội Bài (Ga Quốc Tế) | Sóc Sơn | 21.21702,105.79323"],"dropoff_points": ["Văn phòng 732 Điện Biên Phủ | Sa Pa | 22.34064,103.84035","Trả tại thị trấn Sapa | Sa Pa | 22.33831,103.83642"],"scraped_at": "2026-05-01T16:40:29.327Z"}
| Field | Type | Description |
|---|---|---|
record_type | string | bus. |
service_id | string | Vexere internal trip ID. |
operator | string | Bus company name (Phương Trang, Hoàng Long, The Sinh Tourist, ...). |
service_type | string | bus_intercity. |
bus_type | string | Sleeper Bed, Sleeper Cabin, Seat, Limousine, ... |
origin_station / _en | string | Pickup-area name (Vietnamese / English). |
destination_station / _en | string | Dropoff-area name. |
departure_date / _time | string | Scheduled departure (ICT). |
arrival_date / _time | string | Scheduled arrival (ICT). |
duration_minutes | number | Journey duration. |
distance_km | number | Route distance. |
is_sleeper | boolean | True for sleeper-bed and sleeper-cabin buses. |
pickup_points | array | Up to 10 pickup points; each entry is name | district | lat,lon. |
dropoff_points | array | Up to 10 dropoff points; same format. |
scraped_at | string | ISO-8601 timestamp. |
Daily summary (mode: "daily_summary")
{"record_type": "daily_summary","service_id": "vnr-summary-92-77-2026-05-08","operator": "Vietnam Railways Corporation","operator_code": "VNR","service_type": "rail","origin_station": "Ga Sài Gòn","origin_station_en": "Sai Gon Railway Station","destination_station": "Ga Nha Trang","destination_station_en": "Nha Trang Railway Station","departure_date": "2026-05-08","departure_time": "06:00","duration_minutes": 428,"min_fare_vnd": 403000,"max_fare_vnd": 1973000,"avg_fare_vnd": 836571,"distance_km": 411,"service_count": 7,"train_types_available": ["SE10", "SE2", "SE22", "SE4", "SE6", "SE8", "SNT2"],"seat_classes": ["NAM:Soft seat AC (Ngồi Mềm)","NGM:Soft sleeper AC 4-berth (Nằm Giường Mềm)","NAC:Hard seat (Ngồi Cứng)"],"is_sleeper": true,"scraped_at": "2026-05-01T16:38:51.812Z"}
| Field | Type | Description |
|---|---|---|
record_type | string | daily_summary. |
service_count | number | Number of trains running on the date. |
min_fare_vnd / max_fare_vnd / avg_fare_vnd | number | Daily fare range and mean in VND. |
train_types_available | array | Train numbers running that day. |
seat_classes | array | Available carriage codes with bilingual labels. |
duration_minutes | number | Aggregate route duration. |
distance_km | number | Route distance. |
FAQ
How do I scrape Vietnam Railways train schedules?
Vietnam Transit Scraper hits Vexere's aggregator API, which republishes the official VNR (dsvn.vn) inventory. The official site requires login plus a custom encryption layer for search; Vexere is the cleaner path. Set mode: "train_search", pick origin and destination, and you get train numbers, times, durations, and seat counts.
Does this scraper need a proxy?
Vietnam Transit Scraper does not need a proxy. Vexere is publicly reachable from anywhere; the static FE Bearer token authenticates the call. If you opt in via proxyConfiguration for high-volume runs, the scraper handles the LIMITED_PERMISSIONS proxy flow correctly.
How much does it cost to run?
Vietnam Transit Scraper costs $0.10 per actor start + $0.001 per record. A typical Hà Nội → HCMC train search returns 5–10 records, so a single run is well under a cent of record cost. Bus searches on popular corridors return 30–100+ records, still in the fraction-of-a-dollar range.
Can I search by Vietnamese station names with diacritics?
Vietnam Transit Scraper resolves Hà Nội, Đà Nẵng, Hồ Chí Minh, Sài Gòn, Sa Pa, and similar Vietnamese forms with or without tone marks. The English fallback works too — Hanoi, Da Nang, HCMC, Saigon, Sapa. If you need a city not in the built-in lookup, pass the numeric Vexere ID via originCityId / destinationCityId.
What's the difference between the three modes?
daily_summary returns one aggregate record per A→B/date — fare range, train types, count. Fast and lightweight. train_search returns one record per running train, with departure times and seat availability. bus_search does the same for intercity buses, plus pickup/dropoff geocodes. Pick train_search for booking-class detail; pick daily_summary for price-tracking dashboards.
Need More Features?
Need additional fields, bus operators, or a different target site? File an issue or get in touch.
Why Use Vietnam Transit Scraper?
- No bot war required — Vexere ships a static client-side Bearer token; we capture once and replay. No CAPTCHAs, no proxy gymnastics.
- Bilingual data out of the box — every station carries a Vietnamese name with diacritics and an English fallback. The data is usable downstream without a second extraction pass.
- Cheaper than building it yourself — $0.001 per record on Apify's pay-per-event pricing beats the time cost of reverse-engineering
dsvn.vn's payload cipher and OAuth dance.