# redBus Scraper (`maximedupre/redbus`) Actor

Search public redBus bus services for one route and travel date. Get structured schedules, fares, seat availability, boarding points, operators, and bus types in your dataset. Filter services by market, fare, time, operator, bus type, or seat availability.

- **URL**: https://apify.com/maximedupre/redbus.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 bus services

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🚌 Compare redBus routes with structured service data

For travel teams, route planners, and developers, redBus Scraper searches public redBus services for one origin, destination, market, and travel date. It saves structured rows with operators, service names, bus types, times, fares and currency, seat availability, boarding and dropping locations, ratings, and source-provided details. Use the rows to compare route options or build a travel view.

- Check one route for a travel date with **[Redbus Ticket](https://apify.com/maximedupre/redbus/examples/redbus-ticket)**.
- Review sleeper options on a route with **[Sleeper Bus Booking](https://apify.com/maximedupre/redbus/examples/sleeper-bus-booking)**.
- Compare fares and departure times with **[Bus Ticket Prices and Schedules](https://apify.com/maximedupre/redbus/examples/bus-ticket-prices-and-schedules)**.
- Filter a route by fare for **[Cheap Last Minute Bus Tickets](https://apify.com/maximedupre/redbus/examples/cheap-last-minute-bus-tickets)**.
- Find lower-fare one-way options with **[Cheap One Way Bus Tickets](https://apify.com/maximedupre/redbus/examples/cheap-one-way-bus-tickets)**.

#### 📦 RedBus service rows at a glance

Each dataset item is one public redBus bus service for the selected market, route, and travel date. Optional fields are present when the source provides them.

#### ▶️ Run a redBus route search

This Actor searches one origin, one destination, and one travel date per run. It does not book, reserve, pay for, cancel, or change a ticket.

1. Choose a market and enter the origin and destination city or bus station.
2. Choose a calendar date such as `2026-10-01`, or enter a relative interval such as `1 day from now`. Relative dates are resolved in UTC.
3. Add optional filters for operators, bus types, fares, departure time, arrival time, or seat availability.
4. Run the Actor and open the dataset to read or export the service rows.

#### ⚙️ Input

Choose one market, origin, destination, and travel date. Optional filters use the selected market's fare currency and local times.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `market` | string | Chooses `co`, `id`, `in`, `my`, `pe`, or `sg` for Colombia, Indonesia, India, Malaysia, Peru, or Singapore and sets the fare currency. |
| `origin` | string | Sets the departure city or bus station. |
| `destination` | string | Sets the arrival city or bus station. |
| `travelDate` | string | Accepts a calendar date such as `2026-10-01` or a relative interval such as `1 day from now`. Relative dates are resolved in UTC. |
| `operators` | string\[] | Keeps services run by the listed operators. Leave it empty to include all operators. |
| `busTypes` | string\[] | Keeps services with the listed bus types. Leave it empty to include all bus types. |
| `minFare` | number | Keeps services with a fare at or above this amount in the selected market's currency. |
| `maxFare` | number | Keeps services with a fare at or below this amount in the selected market's currency. |
| `departureWindow` | object | Keeps services that depart within a selected local-time window. Set `from`, `to`, or both. |
| `departureWindow.from` | string | Sets the earliest departure time in `HH:MM`. |
| `departureWindow.to` | string | Sets the latest departure time in `HH:MM`. |
| `arrivalWindow` | object | Keeps services that arrive within a selected local-time window. Set `from`, `to`, or both. |
| `arrivalWindow.from` | string | Sets the earliest arrival time in `HH:MM`. |
| `arrivalWindow.to` | string | Sets the latest arrival time in `HH:MM`. |
| `onlyAvailableSeats` | boolean | When on, keeps only services with seats available. When off, includes all matching services. |

**Example input**

This is the public input from a successful current-beta default-input run.

```json
{
  "market": "in",
  "origin": "Delhi",
  "destination": "Mumbai",
  "travelDate": "1 day from now",
  "onlyAvailableSeats": false
}
```

#### 🧾 Output

The Output tab exposes `dataset`, a link to the run dataset. Each dataset item uses one bus-service shape.

**Output fields**

| Field | Type | What it does |
| --- | --- | --- |
| `route` | object | Holds the service origin and destination. |
| `route.origin` | string | Gives the departure city or bus station shown by the source. |
| `route.destination` | string | Gives the arrival city or bus station shown by the source. |
| `service` | object | Holds the operator and service identity. |
| `service.operator` | string | Gives the bus operator shown by the source. |
| `service.serviceName` | string, optional | Gives the source service name when available. |
| `service.serviceId` | string, optional | Gives the source identifier when available. |
| `service.busType` | string | Gives the bus type shown by the source. |
| `travelDate` | string | Gives the service date in `YYYY-MM-DD` form. |
| `schedule` | object | Holds the departure and arrival times. |
| `schedule.departureTime` | string | Gives the local departure time shown by the source. |
| `schedule.arrivalTime` | string | Gives the local arrival time shown by the source. |
| `durationMinutes` | integer | Gives the journey duration in minutes. |
| `fare` | object | Holds the fare amount and currency. |
| `fare.amount` | number | Gives the ticket fare amount. |
| `fare.currency` | string | Gives the currency used for the fare. |
| `seatAvailability` | object | Holds the source seat status and available-seat details. |
| `seatAvailability.status` | string | Gives the seat availability status. |
| `seatAvailability.count` | integer, optional | Gives the available seat count when provided. |
| `seatAvailability.seatLayoutAvailable` | boolean, optional | Says whether a seat layout is available. |
| `boardingLocations` | string\[] | Lists places where passengers can board. |
| `droppingLocations` | string\[] | Lists places where passengers can leave the service. |
| `ratings` | object | Holds the rating and review count. |
| `ratings.rating` | number, optional | Gives the service rating when provided. |
| `ratings.reviewCount` | integer, optional | Gives the number of reviews when provided. |
| `amenities` | string\[], optional | Lists source-provided amenities. |
| `cancellationStatus` | string, optional | Gives the source cancellation status. |
| `reschedulingStatus` | string, optional | Gives the source rescheduling status. |
| `liveTrackingAvailable` | boolean, optional | Says whether live tracking is available according to the source. |
| `mTicketAvailable` | boolean, optional | Says whether an m-ticket is available according to the source. |
| `offers` | string\[], optional | Lists source-provided offers. |

**Example row**

This unshortened row comes from a successful current-beta run for Lima to Ica.

```json
{
  "route": {
    "origin": "Lima",
    "destination": "Ica"
  },
  "service": {
    "operator": "Jaksa",
    "serviceName": "VIP ICA",
    "serviceId": "43",
    "busType": "VIP"
  },
  "travelDate": "2026-09-22",
  "schedule": {
    "departureTime": "2026-09-22 22:35:00",
    "arrivalTime": "2026-09-23 03:25:00"
  },
  "durationMinutes": 290,
  "fare": {
    "amount": 60,
    "currency": "PEN"
  },
  "seatAvailability": {
    "status": "available",
    "count": 36,
    "seatLayoutAvailable": true
  },
  "boardingLocations": [
    "Paradero Atocongo"
  ],
  "droppingLocations": [
    "Terminal Ica"
  ],
  "ratings": {
    "rating": 3.2,
    "reviewCount": 0
  },
  "amenities": [
    "52",
    "41",
    "49",
    "37",
    "33",
    "32",
    "24",
    "23",
    "22",
    "9",
    "7",
    "47"
  ],
  "reschedulingStatus": "4",
  "offers": [
    "Descuento 10 hasta 10 %",
    "Prueba lo nuevo"
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The `Bus service` event costs `$0.0009` for each bus service saved to the dataset.

#### 🔌 Integrations

Read the dataset through the Apify API or export it from the run.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I search more than one route in one run?

No. Each run uses one origin, one destination, and one travel date. Start another run for another route or date.

##### Can I use a relative travel date?

Yes. Use a value such as `1 day from now` or `2 weeks`. Relative dates are resolved in UTC.

##### Can I filter services by operator, bus type, fare, or time?

Yes. Use the operator and bus-type lists, fare limits, or departure and arrival windows. You can also keep only services with available seats.

##### Does this Actor book or change a ticket?

No. It reads public service listings and saves route, schedule, fare, seat, location, and source-provided detail. It does not book, reserve, pay for, cancel, or change tickets.

##### What happens when no service matches my search?

The dataset contains only services exposed for the selected market, route, date, and filters. A search with no matching service has no service row to review.

##### Why can a field be missing from a row?

Some fields are optional because the source may not provide them for every service. Check the field table and use the values that are present.

##### Can I compare fares from different markets?

Choose the same market when comparing fare amounts. Each market returns fares in its own currency.

##### Do I need a redBus account or API key?

No. The Actor reads public route listings without a buyer-supplied redBus account, API key, or credential.

### 📝 Changelog

**v0.0** (21-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~redbus/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Flight Scraper](https://apify.com/maximedupre/flight-scraper) compares public flight route prices, schedules, airlines, stops, and durations for trips that continue by air.
- [Flightpoints & Roame Award Flights Scraper](https://apify.com/maximedupre/award-flights-scraper) finds public award itineraries with dates, fares, seats, and cabin details for points-based travel.
- [redBus API Scraper](https://apify.com/rl1987/redbus-api-scraper) searches redBus services between two cities for a date and returns route, fare, schedule, and seat details.
- [12go.asia Scraper - Train, Bus, Ferry, Flight Schedules (Asia)](https://apify.com/jungle_synthesizer/12go-asia-multimodal-scraper) compares public train, bus, ferry, and flight schedules and fares across Asian routes.
- [Rome2Rio API Scraper](https://apify.com/rl1987/rome2rio-api-scraper) finds public transport route options with modes, durations, prices, operators, and segments.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `market` (type: `string`):

Choose the redBus market to search. This sets the route source and fare currency.

## `origin` (type: `string`):

Enter the departure city or bus station.

## `destination` (type: `string`):

Enter the arrival city or bus station.

## `travelDate` (type: `string`):

Enter a calendar date such as 2026-10-01 or a relative interval such as 1 day from now. Relative dates are resolved in UTC.

## `operators` (type: `array`):

Keep services run by these operators. Enter one or more names, or leave this empty to include all operators.

## `busTypes` (type: `array`):

Keep services with these bus types. Enter one or more types, or leave this empty to include all bus types.

## `minFare` (type: `number`):

Keep services with a fare at or above this amount in the selected market's currency.

## `maxFare` (type: `number`):

Keep services with a fare at or below this amount in the selected market's currency.

## `departureWindow` (type: `object`):

Keep services that depart within this window. Set the start, end, or both times in the selected market's local time.

## `arrivalWindow` (type: `object`):

Keep services that arrive within this window. Set the start, end, or both times in the selected market's local time.

## `onlyAvailableSeats` (type: `boolean`):

Turn this on to keep only services with seats available. Leave it off to include all matching services.

## Actor input object example

```json
{
  "market": "in",
  "origin": "Delhi",
  "destination": "Mumbai",
  "travelDate": "1 day from now",
  "onlyAvailableSeats": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the bus service results.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "market": "in",
    "origin": "Delhi",
    "destination": "Mumbai",
    "travelDate": "1 day from now"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/redbus").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "market": "in",
    "origin": "Delhi",
    "destination": "Mumbai",
    "travelDate": "1 day from now",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/redbus").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "market": "in",
  "origin": "Delhi",
  "destination": "Mumbai",
  "travelDate": "1 day from now"
}' |
apify call maximedupre/redbus --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/redbus"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zsGqxxdUGKw60EhHv/builds/74J6ObKTyu1MXshOC/openapi.json
