redBus Scraper – Bus Schedules, Fares & Seat Availability avatar

redBus Scraper – Bus Schedules, Fares & Seat Availability

Pricing

from $1.00 / 1,000 bus service rows

Go to Apify Store
redBus Scraper – Bus Schedules, Fares & Seat Availability

redBus Scraper – Bus Schedules, Fares & Seat Availability

Search redBus for every bus between two cities on a date, in any of its 8 markets (India, Singapore, Malaysia, Indonesia, Vietnam, Cambodia, Colombia, Peru). One row per service: operator, bus type, departure and arrival, duration, fares in local currency, seats left, rating, boarding points.

Pricing

from $1.00 / 1,000 bus service rows

Rating

0.0

(0)

Developer

R.L.

R.L.

Maintained by Community

Actor stats

1

Bookmarked

15

Total users

9

Monthly active users

8 days ago

Last modified

Categories

Share

redBus Scraper — Bus Schedules, Fares & Seat Availability

redBus Scraper searches redBus for every bus service running between two cities on a given date and returns one clean row per service: operator, bus type, departure and arrival times, journey duration, fares in the market's own currency, seats left, rating and reviews, and boarding/dropping points. It reads redBus's own mobile API directly — no headless browser, no HTML parsing — and exports to JSON, CSV, Excel, XML or the Apify API.

It is read-only: it searches and reports. It never books, holds or pays for a seat.


Why use this redBus Scraper?

  • No code required — type two city names, click Start, download your data.
  • All eight redBus markets — India, Singapore, Malaysia, Indonesia, Vietnam, Cambodia, Colombia and Peru, each with its own cities, operators and currency.
  • Fast & accurate — reads redBus's own app API and returns structured JSON.
  • Rich, structured data — fares, seat counts by type, amenities, offers, ratings, boarding points.
  • Pagination with de-duplication — pages are collected to your maxItems cap and repeated services are dropped.
  • Pay per result — pay only for the rows you get.

What can you do with redBus data?

  • Fare monitoring — track how a route's fares move as the travel date approaches.
  • Route & capacity research — who runs a corridor, with what bus types, at what times.
  • Occupancy signals — watch availableSeats against totalSeats over repeated runs.
  • Travel apps & dashboards — feed timetables and fares into your own product.

Set country to the redBus market you want. City names are resolved through redBus's own autocomplete, so you type them the way a passenger would. Every pair below was verified against that autocomplete:

countryCurrencyExample route
indiaINRBengaluru → Chennai, Mumbai → Pune, Delhi → Jaipur, Hyderabad → Goa
singaporeSGDSingapore → Kuala Lumpur
malaysiaMYRKuala Lumpur → Penang, Johor Bahru → Kuala Lumpur
indonesiaIDRJakarta → Bandung, Surabaya → Jakarta
vietnamVNDHo Chi Minh → Da Lat, Hanoi → Ho Chi Minh
cambodiaUSDPhnom Penh → Siem Reap
colombiaCOPBogota → Medellin
peruPENLima → Arequipa, Lima → Cusco

City IDs are per-market, so the same name in two markets is two different places — the Actor keys its city cache by market to keep them apart. An unsupported country fails the run with a clear message instead of quietly searching India.


How do I scrape redBus? (3 steps)

  1. Enter the route — source and destination city names (both required).
  2. Pick the date and market — dateOfJourney and country; set a maxItems cap.
  3. Run & export — click Start, then download the dataset as JSON/CSV/Excel or fetch it via the API.

What input does it take?

FieldTypeDefaultDescription
sourcestringBengaluruCity you are travelling from. Resolved through redBus's own autocomplete. Required.
destinationstringChennaiCity you are travelling to. Required.
dateOfJourneystringtoday + 7 daysYYYY-MM-DD, or a relative value like 7 days / 2 weeks / 1 month. Empty, unparseable or past dates fall back to a week from today.
countryselectindiaWhich redBus market to search: india, singapore, malaysia, indonesia, vietnam, cambodia, colombia, peru.
pageSizeinteger20Services requested per API call (max 100).
maxItemsinteger100Maximum services to return (0 = every service on the route).
proxyConfigurationobjectApify ProxyRoute requests through a proxy.

Example input

{
"source": "Bengaluru",
"destination": "Chennai",
"dateOfJourney": "7 days",
"country": "india",
"pageSize": 20,
"maxItems": 100,
"proxyConfiguration": { "useApifyProxy": true }
}

What does each row contain?

One row is one bus service on the searched date.

{
"id": 47150520,
"routeId": 47150520,
"serviceId": "...",
"travelsName": "SABARI TRAVELS",
"busType": "Bharat Benz A/C Sleeper (2+1)",
"serviceName": "BGL - CHE ",
"isAc": true,
"isSleeper": true,
"isDirectBus": true,
"amenities": ["..."],
"departureTime": "2026-08-25 23:40:00",
"arrivalTime": "2026-08-26 06:00:00",
"journeyDurationMin": 380,
"dateOfJourney": "2026-08-25",
"boardingPoint": "Madiwala",
"droppingPoint": "Koyambedu",
"boardingPointCount": 12,
"droppingPointCount": 9,
"fareList": [2089.0, 2639.0],
"minFare": 2089.0,
"maxFare": 2639.0,
"vendorCurrency": "INR",
"availableSeats": 24,
"totalSeats": 37,
"availableWindowSeats": 6,
"rating": 4.9,
"numberOfReviews": "1275",
"offers": [{ "campaignCode": "...", "description": "...", "discount": "..." }],
"source": "Bengaluru",
"destination": "Chennai"
}

Data table

GroupFields
Identityid / routeId (same value), serviceId, operatorId, travelsName (operator), serviceName, operatorLogoUrl
BusbusType, busTypeId, isAc, isSleeper, isDirectBus, viaRoute, amenities, isLiveTrackingAvailable, isMTicketEnabled, isPartialCancellationAllowed, maxSeatsPerTransaction, serviceNotes, inventoryTags, busImageCount
ScheduledepartureTime, arrivalTime, journeyDurationMin, dateOfJourney, firstBpTime
Boarding / droppingboardingPoint, boardingPointId, droppingPoint, droppingPointId, boardingPointCount, droppingPointCount
FaresfareList (every fare on the bus), minFare, maxFare, vendorCurrency, fareDetailsBySeatType
AvailabilityavailableSeats, totalSeats, availableWindowSeats, availableSingleSeats, availableAisleSeats, availableUpperSeats, availableLowerSeats, isSeatLayoutAvailable
Ratingsrating, numberOfReviews, busScore, perzScore
Offers & statusoffers (campaign code, description, discount), campaignType, programList, isRescheduled, rescheduleTime
Route contextsource, destination (as redBus labels the parent cities)

What do these bus terms mean?

  • Service — one departure by one operator on the searched date. A route run three times a day is three rows.
  • routeId — redBus's identifier for that service on that route; the Actor also copies it to id and de-duplicates pages by it, so a service never appears twice in one run.
  • minFare / maxFare — the cheapest and dearest seat currently offered on that bus, taken from fareList. A sleeper bus with seater and berth classes will show a spread.
  • vendorCurrency — the currency the fares are quoted in, which follows the country you searched (INR, SGD, MYR, IDR, VND, USD, COP, PEN).
  • availableSeats / totalSeats — seats still bookable versus the bus's capacity at the moment of the search. The available*Seats fields break the free seats down by window, aisle, single, upper and lower berths.
  • Boarding / dropping point — where the bus picks up and drops off within each city. boardingPoint is the operator's standard pickup; boardingPointCount says how many alternatives that service offers.
  • busScore / perzScore — redBus's own internal quality and personalisation scores, passed through unchanged.

How much does it cost?

Pay per event: $1.00 per 1,000 bus service rows ($0.001 per row), charged as rows are pushed. Apify platform usage (compute and proxy) is billed on top; it stays small, because a run is a handful of JSON API calls with no browser. Use maxItems to cap a run — a busy Indian corridor can return well over a hundred services for one date.


How do I run it from my own code?

curl -X POST "https://api.apify.com/v2/acts/rl1987~redbus-api-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"source": "Bengaluru",
"destination": "Chennai",
"dateOfJourney": "7 days",
"country": "india",
"maxItems": 100
}'

Or with the Apify CLI: apify call rl1987/redbus-api-scraper -i input.json -o. You can also schedule it on Apify — for example the same route every morning, to watch fares move.


FAQ

Do I need a redBus account or API key? No. The Actor calls redBus's own app API with the app's fixed header set, so there is no login, no cookie and no key to obtain. You only need an Apify account.

Which countries and currencies does it cover? All eight redBus markets: India (INR), Singapore (SGD), Malaysia (MYR), Indonesia (IDR), Vietnam (VND), Cambodia (USD), Colombia (COP) and Peru (PEN). Fares come back in that market's own currency, and cities must be named as that market knows them.

How do I search a date without editing the input every day? Give dateOfJourney a relative value such as 7 days or 2 weeks, and a scheduled run will always look that far ahead. An empty, unreadable or already-past date is treated as a week from today rather than returning nothing.

What happens if no buses run on that route and date? redBus answers "no buses available" with an HTTP 200 body rather than an error, and the Actor treats it as a normal zero-result search: the run finishes successfully with no rows, so you are not charged for a route that has no service.

Can it book a seat or return the seat map? No. It is read-only: it searches and reports availability. It never books, blocks or pays for a seat. isSeatLayoutAvailable tells you whether redBus has a seat map for that service, but the map itself is not part of the output.

Do I need a proxy? Apify Proxy is on by default and is enough for normal use. Residential proxies are the safer choice for large or repeated runs.

How many rows will one search return? One per bus service on that date, typically a handful on a thin route and over a hundred on a busy corridor. Pages are fetched until redBus runs out of services or your maxItems cap is reached, and services repeated between pages are dropped rather than pushed twice.

Is scraping this legal? You are responsible for how you use the data. Scrape public information only and comply with redBus's Terms and applicable law.


How does it work?

The Actor talks to redBus's Android app API the way the app does: it resolves both city names through redBus's pathfinder autocomplete (per market), then requests the bus inventory for source → destination → date and pages through it. Requests that fail with a rate-limit or server error are retried with exponential backoff, and each raw service record is flattened into the row above.


Good to know

  • Fares, seat counts and offers are a snapshot at the time of the run; re-run to see them move.
  • Fields can be null when redBus does not expose them for a given service.
  • City names are market-specific — searching Kuala Lumpur in the India market will not find the Malaysian city.
  • You are the data controller for whatever you collect; comply with applicable law.

Found this useful?

Rate the redBus Scraper on Apify — it helps other people find it and helps us keep improving it.