Amtrak Scraper avatar

Amtrak Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Amtrak Scraper

Amtrak Scraper

Scrape Amtrak - America's intercity passenger rail network. Get the full station list, every train route, station-to-station schedules, and per-train service details (train number, route stops, service type).

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Scrape Amtrak — America's intercity passenger rail network. Get the complete station list (1,000+ stations), every train route, per-train service details with route stop orders, and station-to-station schedule searches.

What this actor does

  • Five modes: stationsList (all Amtrak stations), popularRoutes (Amtrak's featured origin→destination pairs), routesList (all train routes), byTrainNumber (train number → service + route stops), search (station-to-station schedule search)
  • Station records: 3-letter station code, full name, facility name (short + long), city, state, country, timezone (+ friendly IANA name), daily departures (+ count), autocomplete label, popular-station flag, popular destinations
  • Route records: route code, route name, cities served
  • Train records: train number → service type (e.g. 2150 → Acela), ordered stop list, origin/terminus stations, stop count
  • Schedule records: train number, origin/destination, departure/arrival times, duration, service type, days of operation
  • Empty fields are omitted

Data source

Amtrak (amtrak.com) publishes its network reference data as public JSON/XML resources on its own site, and the schedule search runs in the public web app. This actor loads the site in a full browser (Playwright) — plain HTTP clients are blocked by Amtrak's CDN (verified) — and reads:

  • https://www.amtrak.com/services/data.stations.json — the complete station list (1,000+ stations)
  • https://www.amtrak.com/services/data.popularstations.json — popular-station flags
  • https://www.amtrak.com/services/routes-list.json — every train route
  • .../config/TrainCodesResource.xml — train number → service name map
  • .../config/stopslist.json — route → ordered station stops
  • https://www.amtrak.com/tickets/schedule-results.html — the schedule search flow
  • https://www.amtrak.com/dotcom/travel-service/schedules — the schedules JSON API the timetable widget calls (primary search path)

If the datacenter IP is blocked, the optional Apify proxy is engaged automatically with rotating sessions.

Schedule search: mode=search calls Amtrak's own schedules JSON API (/dotcom/travel-service/schedules) from inside the browser session — the same request the timetable widget makes (verified live, 40+ trains per corridor). The API returns the full schedule: train number, service name, departure/arrival times, duration, days of operation, status, and the ordered stop list. If that API is ever unavailable, the actor falls back to driving the timetable widget (typing the station codes, picking the date, submitting) — which requires dismissing Amtrak's cookie-consent overlay first. The station, route and train modes read Amtrak's public data resources directly and are fully reliable.

Output per record

Per station (mode = stationsList)

  • stationCode — 3-letter code (NYP, CHI, BOS, …)
  • name, stationName, city, state, alias, autoFillName
  • facilityName, facilityNameLong — station facility names (short + long forms)
  • timezone — Amtrak zone code (E / C / M / MS / P / PS), timezoneName — IANA-style name (America/New_York, America/Phoenix, …)
  • dailyDepartures — e.g. 3 daily departures, dailyDepartureCount — the parsed number
  • isPopular, popularDestinations — Amtrak's featured origin stations and their top destinations
  • countryUS (from upstream; CA for Amtrak's Canadian stations)
  • sourceUrl, recordType: "station", scrapedAt
  • originStation — featured origin code (e.g. NYP)
  • destinationStations[] — its top destinations (e.g. ["WAS", "PHL", "BOS", …]), destinationCount
  • sourceUrl, recordType: "popularRoute", scrapedAt

Per route (mode = routesList)

  • routeCode (e.g. ACEX, NERG, COAS), routeName (Acela, Northeast Regional, Coast Starlight, …), citiesServed
  • sourceUrl, recordType: "route", scrapedAt

Per train (mode = byTrainNumber)

  • trainNumber (e.g. 2150), serviceType (e.g. Acela)
  • routeName, stops[] — ordered station codes, stopCount, originStation, terminusStation
  • sourceUrl, recordType: "train", scrapedAt

Per schedule (mode = search)

  • trainId / trainNumber, origin, destination
  • departureTime, arrivalTime, duration, durationMinutes
  • travelDate, status, originFacility, destinationFacility
  • serviceType, serviceNameShort (e.g. "NE Regional"), frequency[] (days of operation)
  • trainType (e.g. "Intercity Train"), tripId, distanceMiles, directionCode
  • operator (e.g. "Amtrak"), operatorCode (e.g. "AMTK")
  • nightTrain, isSelfTransfer, restricted (booleans), amenities[] (Cafe, Quiet Car, Free WiFi, Seat Selection)
  • stops[] — ordered station codes, stopCount
  • sourceUrl, recordType: "schedule", scrapedAt

Input

FieldTypeDefaultDescription
modestringstationsListstationsList / popularRoutes / routesList / byTrainNumber / search
originstringNYPOrigin station code (mode=search)
destinationstringWASDestination station code (mode=search)
travelDatestringDeparture date YYYY-MM-DD (mode=search)
departAfterstringEarliest departure HH:MM 24h (mode=search)
trainNumberstring2150Train number (mode=byTrainNumber)
maxItemsint100Hard cap (1–1000)
proxyConfigurationobjectApify proxyOptional; auto-engaged on CDN block
{
"mode": "popularRoutes"
}

Example: full station list

{
"mode": "stationsList",
"maxItems": 500
}

Example: lookup a train

{
"mode": "byTrainNumber",
"trainNumber": "2150"
}
{
"mode": "search",
"origin": "NYP",
"destination": "WAS",
"travelDate": "2026-09-15",
"departAfter": "06:00"
}

Example: all routes

{
"mode": "routesList"
}

Use cases

  • Travel apps — power station autocomplete with the full official station catalog
  • Transit analytics — map every route, its corridor and stop sequence
  • Trip planning tools — train-number lookups and station-to-station schedules
  • Rail research — network topology data for the US intercity rail system

Limitations

  • Browser required — Amtrak's CDN blocks plain HTTP clients (verified); the actor loads the public pages in a real browser (Playwright). The optional Apify proxy is auto-engaged on a CDN block.
  • search can fall back to a widget path — the primary path uses Amtrak's own schedules API; if Amtrak blocks or changes it, the in-browser timetable flow may return 0 rows when Amtrak serves results without an established booking session. The station, route and train modes always work because they read the public data resources directly.
  • Stop-order data covers 33 named routes — trains whose service is not in stopslist.json (or has a section suffix, e.g. "Lake Shore Limited - Boston") emit the train number and service type without a stop list.
  • Station codes are Amtrak's 3-letter codes — the same codes shown on tickets (NYP, CHI, BOS), not IATA codes.
  • Schedules require a valid future date — past departure dates are not served by Amtrak's schedule API.

FAQ

What is the data source? Amtrak's own website (amtrak.com), which publishes the station catalog, route list, train-code map and stop lists as public data resources.

Why does the actor need a browser? Amtrak's CDN blocks plain HTTP clients (verified). The actor loads the public pages in a real browser, which is the only reliable way to read the data.

Where do station codes come from? stationCode is Amtrak's official 3-letter code used in the booking system — the same codes shown on tickets (e.g. NYP = New York Penn Station).

Why do some trains have no stops? The stop-order data (stopslist.json) covers 33 named routes. Trains whose service is not in that file (or whose name has a section suffix, e.g. "Lake Shore Limited - Boston") emit the train number and service type without a stop list. This is an upstream data limitation, not an omission.

Why might search return no records? The primary path uses Amtrak's own schedules API, which returns full schedules for any station pair and date. If Amtrak blocks or changes that API, the actor falls back to the in-browser timetable flow; the widget path can return 0 rows if Amtrak serves the results without an established booking session. The station, route and train modes always work because they read the public data resources directly.

How fresh is the data? Every run reads Amtrak live; scrapedAt records exactly when each record was captured.

What does frequency mean? The days of operation for a schedule, as 3-letter codes (MON, TUE, …). Some schedules run only on certain days.

Is this affiliated with Amtrak? No. This is an independent third-party actor using Amtrak's public website.