Greyhound Bus Tickets, Megabus & Amtrak Scraper avatar

Greyhound Bus Tickets, Megabus & Amtrak Scraper

Pricing

from $1.00 / 1,000 trip results

Go to Apify Store
Greyhound Bus Tickets, Megabus & Amtrak Scraper

Greyhound Bus Tickets, Megabus & Amtrak Scraper

Compare Greyhound bus tickets and Megabus fares with the Amtrak schedule on any US route: times, stops, seats left and booking links. $3 per 1,000 trips.

Pricing

from $1.00 / 1,000 trip results

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

11 days ago

Last modified

Security

Limited permissions

Share

Greyhound Bus Tickets, Megabus & Amtrak Scraper returns live Greyhound bus ticket prices and Megabus fares plus the Amtrak schedule for any US route in one normalized dataset, with departure and arrival times, duration, transfers, stops, carrier, seats left and a booking link. It is built for travel comparison sites, US trip planners, mobility researchers and AI agents, and costs $3.00 per 1,000 trip records on the Apify Free plan plus a $0.10 start fee per run at the default 1 GB memory.

The Actor reads each carrier's public booking or timetable data, never buys tickets or uses accounts, and charges only for records it saves. Amtrak rows are timetable entries without fares.

What Greyhound, Megabus and Amtrak data does it return?

Each dataset row is one trip from one provider on one date.

FieldWhat it holds
id, provider, modeStable ID, amtrak, greyhound or megabus, and rail or bus
origin, destinationCity or station name, code, ID, stop name and stop ID
departureTime, arrivalTimeISO 8601 times (Greyhound with offset; Amtrak and Megabus in local time)
durationMinutes, transfersTrip length and number of changes
serviceName, serviceNumber, carrierTrain number or trip type, and the operating carrier
price, currencyLive bus fare (USD, or CAD for Greyhound on request); null for Amtrak
availability, seatsLeftGreyhound load level and seats left at that price, Megabus available/unavailable, Amtrak scheduled
amenitiesOn-board amenities when Greyhound lists them, for example WIFI
segmentsEach leg's carrier, mode, times and stops
bookingUrl, sourceUrl, queryDate, scrapedAtLink to the carrier's search, provenance, date searched and capture time

Each run also writes an OUTPUT record with status (DATA, EMPTY, BLOCKED or REJECTED), resultCount (rows actually saved), stopReason (COMPLETED, MAX_RESULTS or CHARGE_LIMIT), a count per provider, and warnings for any route or provider that failed.

When should you use it, and when not?

Use it when you need:

  • Greyhound bus tickets and Megabus fares for the same US route and date, side by side;
  • the Amtrak schedule next to bus departures, to compare times and durations;
  • several routes in one run, for example New York to Boston and New York to Washington;
  • a scheduled monitor of US intercity bus prices.

Do not use it when:

How do I compare Greyhound bus tickets and the Amtrak schedule on a route?

Add one or more routes. Each route has an origin, a destination and an optional date.

  • Bus origins work best as city names such as New York, NY. Amtrak stations work best as three-letter codes such as NYP, BOS, WAS, PHL, CHI or LAX; for those six cities the city name is mapped to the station automatically.
  • date is YYYY-MM-DD, for example "date": "2026-12-18". Without it, the Actor searches dateOffsetDays after the run day (default 7, range 1-60), which keeps scheduled runs evergreen. Words such as "tomorrow" are not accepted.
  • providers picks any of amtrak, greyhound and megabus (default: all three).
  • adults (1-9) sets the passengers for bus fares; currency is USD or CAD for Greyhound (Megabus prices are always USD).
  • maxResults (1-500, default 50) is a total cap shared fairly across routes and providers, so one carrier cannot fill the whole dataset.
  • requestTimeoutSecs (5-120, default 30) bounds each carrier request.
{
"routes": [
{ "origin": "New York, NY", "destination": "Boston, MA" },
{ "origin": "NYP", "destination": "WAS" }
],
"providers": ["amtrak", "greyhound", "megabus"],
"dateOffsetDays": 7,
"adults": 1,
"maxResults": 60
}

Use it from an AI assistant

Greyhound Bus Tickets, Megabus & Amtrak Scraper works from Claude, ChatGPT, Cursor or any other MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/us-intercity-rail-bus-scraper as a server, and the assistant can call the Actor as one tool. Example prompt: "Compare Greyhound and Megabus prices from Philadelphia to Washington next Saturday and show the Amtrak departures for the same day."

How do I run it from code?

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/us-intercity-rail-bus-scraper').call(
{ routes: [{ origin: 'New York, NY', destination: 'Boston, MA' }], maxResults: 50 },
{ maxTotalChargeUsd: 0.5 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((t) => `${t.provider} ${t.departureTime} ${t.price ?? 'schedule'} ${t.currency ?? ''}`));

Python (apify-client 3.x):

import os
from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("muhammadafzal/us-intercity-rail-bus-scraper").call(
run_input={"routes": [{"origin": "New York, NY", "destination": "Boston, MA"}], "maxResults": 50},
max_total_charge_usd=Decimal("0.50"),
)
for trip in client.dataset(run.default_dataset_id).iterate_items():
print(trip["provider"], trip["departureTime"], trip["durationMinutes"], trip["price"])

Both examples raise the maximum cost per run so that all 50 rows fit (see pricing below).

What does the output look like?

Two rows from a default run (New York to Boston, searched 2026-10-26 for 2026-11-02), shortened: IDs and segments are trimmed.

[
{
"provider": "greyhound",
"mode": "bus",
"origin": { "name": "New York, NY", "code": "US-NY", "stopName": "New York Port Authority" },
"destination": { "name": "Boston, MA", "code": "US-MA", "stopName": "Boston (South Station)" },
"departureTime": "2026-11-02T05:00:00-05:00",
"arrivalTime": "2026-11-02T11:00:00-05:00",
"durationMinutes": 360,
"transfers": 0,
"serviceName": "Direct",
"carrier": "grey",
"price": 37.99,
"currency": "USD",
"availability": "high",
"amenities": ["WIFI", "POWER_SOCKETS"],
"queryDate": "2026-11-02"
},
{
"provider": "amtrak",
"mode": "rail",
"origin": { "name": "Ny Moynihan Train Hall At Penn Station", "code": "NYP" },
"destination": { "name": "Boston", "code": "BOS" },
"departureTime": "2026-11-02T06:53:00",
"arrivalTime": "2026-11-02T11:37:00",
"durationMinutes": 284,
"transfers": 0,
"serviceNumber": "1150",
"carrier": "Amtrak",
"price": null,
"currency": null,
"availability": "scheduled",
"bookingUrl": "https://www.amtrak.com/tickets/departure.html",
"queryDate": "2026-11-02"
}
]

Pricing: how much does a US intercity search cost?

You pay per trip record saved, plus a start fee. Platform usage is included in these prices.

EventFREEBRONZESILVERGOLD
Trip result (primary event, per saved row)$0.003$0.0025$0.002$0.001
Actor start (per started GB of allocated memory)$0.10$0.10$0.10$0.10

PLATINUM and DIAMOND plans pay the GOLD price. The default memory is 1,024 MB, so a normal run pays one start event ($0.10); a 2 GB run pays two.

Worked totals on the Free plan:

  • New York to Boston default search that returned 43 rows: $0.10 + 43 × $0.003 = $0.229.
  • 500 rows, the maximum: $0.10 + 500 × $0.003 = $1.60 (GOLD: $0.60).

The Actor's default run options set a maximum cost per run of $0.255, enough for the $0.10 start fee plus the default 50 rows at Free-plan prices. If you set a lower maximum cost per run, the run stops cleanly when it is reached: OUTPUT.stopReason is CHARGE_LIMIT, and OUTPUT.resultCount and the status message count only the rows actually saved and charged.

How reliable is it, and what are its limits?

  • The default New York to Boston run finished in about 9 seconds on 2026-10-26 and saved 43 rows: 11 Amtrak, 17 Greyhound and 15 Megabus.
  • Amtrak rows come from Amtrak's public timetable feed: no fares, seats or live delays.
  • Greyhound rows include only trips on sale. Greyhound's search can include partner-operated trips; carrier holds the operator code, for example grey.
  • Each provider is searched separately with bounded retries. If one provider fails, the others still return rows and the failure appears in OUTPUT.warnings.
  • Fares and seats change quickly. Each row is a snapshot at scrapedAt; confirm on the carrier's site before you buy.

FAQ

Does it return Amtrak ticket prices?

No. Amtrak rows are timetable entries with price: null and availability: "scheduled". Bus rows from Greyhound and Megabus carry live prices.

Can it compare Amtrak vs Greyhound on a route?

Yes for departure times, durations and transfers, because both appear in one dataset. Fare comparison covers Greyhound and Megabus only.

The route's date when set; otherwise the run day plus dateOffsetDays (default 7). Set dateOffsetDays: 1 to always search tomorrow.

Which cities and stations work?

US cities served by Greyhound or Megabus, and any station in Amtrak's timetable. Use Amtrak station codes for rail when the city name is ambiguous.

Does it buy or reserve tickets?

No. It reads public trip data only. Open bookingUrl to continue on the carrier's site.

Why did I get fewer rows than maxResults?

Either the carriers had fewer trips that day, maxResults was split fairly across providers, or the maximum cost per run was reached. OUTPUT.byProvider shows the split.

Use the data for research, comparison and planning at a reasonable volume, and respect each carrier's terms and applicable law. Do not present scraped fares as guaranteed or as a booking. This Actor is independent and not affiliated with or endorsed by Amtrak, Greyhound or Megabus.

Last verified: 2026-10-27