redBus Scraper – Bus Schedules, Fares & Seat Availability
Pricing
from $1.00 / 1,000 bus service rows
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.
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
maxItemscap 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
availableSeatsagainsttotalSeatsover repeated runs. - Travel apps & dashboards — feed timetables and fares into your own product.
Which countries, cities and routes can I search?
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:
country | Currency | Example route |
|---|---|---|
india | INR | Bengaluru → Chennai, Mumbai → Pune, Delhi → Jaipur, Hyderabad → Goa |
singapore | SGD | Singapore → Kuala Lumpur |
malaysia | MYR | Kuala Lumpur → Penang, Johor Bahru → Kuala Lumpur |
indonesia | IDR | Jakarta → Bandung, Surabaya → Jakarta |
vietnam | VND | Ho Chi Minh → Da Lat, Hanoi → Ho Chi Minh |
cambodia | USD | Phnom Penh → Siem Reap |
colombia | COP | Bogota → Medellin |
peru | PEN | Lima → 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)
- Enter the route —
sourceanddestinationcity names (both required). - Pick the date and market —
dateOfJourneyandcountry; set amaxItemscap. - Run & export — click Start, then download the dataset as JSON/CSV/Excel or fetch it via the API.
What input does it take?
| Field | Type | Default | Description |
|---|---|---|---|
source | string | Bengaluru | City you are travelling from. Resolved through redBus's own autocomplete. Required. |
destination | string | Chennai | City you are travelling to. Required. |
dateOfJourney | string | today + 7 days | YYYY-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. |
country | select | india | Which redBus market to search: india, singapore, malaysia, indonesia, vietnam, cambodia, colombia, peru. |
pageSize | integer | 20 | Services requested per API call (max 100). |
maxItems | integer | 100 | Maximum services to return (0 = every service on the route). |
proxyConfiguration | object | Apify Proxy | Route 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
| Group | Fields |
|---|---|
| Identity | id / routeId (same value), serviceId, operatorId, travelsName (operator), serviceName, operatorLogoUrl |
| Bus | busType, busTypeId, isAc, isSleeper, isDirectBus, viaRoute, amenities, isLiveTrackingAvailable, isMTicketEnabled, isPartialCancellationAllowed, maxSeatsPerTransaction, serviceNotes, inventoryTags, busImageCount |
| Schedule | departureTime, arrivalTime, journeyDurationMin, dateOfJourney, firstBpTime |
| Boarding / dropping | boardingPoint, boardingPointId, droppingPoint, droppingPointId, boardingPointCount, droppingPointCount |
| Fares | fareList (every fare on the bus), minFare, maxFare, vendorCurrency, fareDetailsBySeatType |
| Availability | availableSeats, totalSeats, availableWindowSeats, availableSingleSeats, availableAisleSeats, availableUpperSeats, availableLowerSeats, isSeatLayoutAvailable |
| Ratings | rating, numberOfReviews, busScore, perzScore |
| Offers & status | offers (campaign code, description, discount), campaignType, programList, isRescheduled, rescheduleTime |
| Route context | source, 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 toidand 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 fromfareList. A sleeper bus with seater and berth classes will show a spread.vendorCurrency— the currency the fares are quoted in, which follows thecountryyou 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. Theavailable*Seatsfields 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.
boardingPointis the operator's standard pickup;boardingPointCountsays 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
nullwhen redBus does not expose them for a given service. - City names are market-specific — searching
Kuala Lumpurin 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.