# Rehlat Flights Scraper – Egypt, KSA, UAE, Qatar, USA, AU (`boring_internet_explorer/rehlat-flights-scraper`) Actor

Scrape Rehlat (رحلات) flight fares for Egypt, Saudi Arabia, UAE, Qatar, USA and Australia: prices in any currency, airlines, stops, durations, flight segments, seats left and booking links. Multi-route, one-way and round-trip searches.

- **URL**: https://apify.com/boring_internet_explorer/rehlat-flights-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## ✈️ Rehlat رحلات Flights Scraper — Egypt, Saudi Arabia, UAE, Qatar, USA & Australia

### ❓ What is this scraper?

This scraper extracts live flight fares from **Rehlat (رحلات)**, one of the largest online travel agencies in the Middle East. Pick a storefront (Egypt, Saudi Arabia, the UAE, Qatar, the USA or Australia), add one or more origins and destinations, and get every fare Rehlat shows for that trip: price, airlines, stops, durations, flight-by-flight segments, seats left and a direct booking link.

Prices come back in the currency you choose (any 3-letter code, for example EGP, SAR, AED, QAR, KWD, BHD, USD or EUR), so you can compare the same trip across markets and currencies.

The extracted data is normalized into a structured format, making it easy to use for analysis, integrations, or storage.

***

### ⚡ Why this scraper?

Rehlat compares dozens of airlines and fare sources, and this scraper allows you to:

- 💸 Track and compare flight prices on the Egypt, Saudi Arabia, UAE, Qatar, USA and Australia storefronts
- 🌍 Search many routes in one run: every origin is searched against every destination
- 🔢 Limit results per route: `maxItems` applies to each origin × destination search, cheapest first
- 💱 Price the same trip in any currency (EGP, SAR, AED, QAR, KWD, BHD, USD, EUR...)
- 🔁 Cover one-way and round-trip fares with multi-leg itineraries, stops and durations
- 👨‍👩‍👧 Price trips for adults, children and infants in economy, business or first class

Perfect for:

- Travel agencies and fare-comparison websites
- Airline and route revenue analysts
- Price-alert and deal-hunting tools
- Market researchers studying GCC and Egypt air travel

***

### 📥 Input

| Field                             | Type     | Default            | Description                                                                                             |
| --------------------------------- | -------- | ------------------ | ------------------------------------------------------------------------------------------------------- |
| `country`                         | string   | `EG`               | Storefront: `EG` Egypt, `SA` Saudi Arabia, `AE` UAE, `QA` Qatar.                                        |
| `currency`                        | string   | storefront default | 3-letter currency code for prices. Empty uses the storefront's own (EGP / SAR / AED / QAR / USD / AUD). |
| `tripType`                        | string   | `OneWay`           | `OneWay` or `RoundTrip`.                                                                                |
| `origins`                         | string\[] | —                  | Departure airports or cities (IATA code such as `CAI`, or a name such as `Cairo`).                      |
| `destinations`                    | string\[] | —                  | Arrival airports or cities. Every origin is searched against every destination.                         |
| `departureDate`                   | string   | —                  | `YYYY-MM-DD`, not in the past.                                                                          |
| `returnDate`                      | string   | —                  | `YYYY-MM-DD`, required for round trips, on or after the departure date.                                 |
| `adults` / `children` / `infants` | integer  | `1` / `0` / `0`    | Passengers (up to 9 in total, one adult per infant). Prices are totals for all passengers.              |
| `cabin`                           | string   | `ECONOMY`          | `ECONOMY`, `BUSINESS` or `FIRST`. Business and first fares exist on only some routes.                   |
| `nonStopOnly`                     | boolean  | `false`            | Keep only direct outbound flights.                                                                      |
| `maxItems`                        | integer  | `5`                | Maximum fares saved for **each** origin × destination search, cheapest first.                           |
| `proxyConfiguration`              | object   | no proxy           | Apify proxy settings.                                                                                   |

Example input, two origins and two destinations, 10 fares per route:

```json
{
  "country": "EG",
  "currency": "USD",
  "tripType": "RoundTrip",
  "origins": ["CAI", "HBE"],
  "destinations": ["JED", "DXB"],
  "departureDate": "2026-11-10",
  "returnDate": "2026-11-17",
  "adults": 1,
  "cabin": "ECONOMY",
  "maxItems": 10,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

***

### 📤 Output

Each item is one fare, returned as a structured JSON object (long links shortened below):

```json
{
  "scrapedAt": "2026-10-09T16:21:36.624Z",
  "url": "https://www.rehlat.com.sa/en/cheap-flight/searchresults?searchVal=%5B%7B%22searc...",
  "title": "Riyadh (RUH) → Cairo (CAI)",
  "price": 650.67,
  "currency": "SAR",
  "country": "Saudi Arabia",
  "market": "sa",
  "tripType": "RoundTrip",
  "origin": "RUH",
  "originCity": "Riyadh",
  "destination": "CAI",
  "destinationCity": "Cairo",
  "departureDate": "2026-11-10",
  "returnDate": "2026-11-17",
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "cabin": "ECONOMY",
  "airlines": ["Flyadeal"],
  "stops": 0,
  "inboundStops": 0,
  "outboundDurationMinutes": 185,
  "inboundDurationMinutes": 150,
  "outbound": [
    {
      "airline": "Flyadeal",
      "airlineCode": "F3",
      "flightNumber": "F3607",
      "from": "RUH",
      "fromName": "King Khaled Intl",
      "fromCity": "Riyadh",
      "to": "CAI",
      "toName": "Cairo Intl Arpt",
      "toCity": "Cairo",
      "departureTime": "2026-11-10T12:00:00",
      "arrivalTime": "2026-11-10T14:05:00",
      "durationMinutes": 185,
      "cabinClass": "Y",
      "seatsLeft": 6
    }
  ],
  "inbound": [
    {
      "airline": "Flyadeal",
      "airlineCode": "F3",
      "flightNumber": "F3608",
      "from": "CAI",
      "fromName": "Cairo Intl Arpt",
      "fromCity": "Cairo",
      "to": "RUH",
      "toName": "King Khaled Intl",
      "toCity": "Riyadh",
      "departureTime": "2026-11-17T15:05:00",
      "arrivalTime": "2026-11-17T18:35:00",
      "durationMinutes": 150,
      "cabinClass": "Y",
      "seatsLeft": 9
    }
  ],
  "basePrice": 534.71,
  "taxesAndFees": 115.96,
  "refundable": "Non-Refundable",
  "seatsLeft": 6,
  "baggage": null,
  "bookingUrl": "https://www.rehlat.com.sa/en/cheap-flights/booking/riyadh-to-cairo/roundtrip?search=R4NbGU..."
}
```

| Field                                               | Description                                                                                            |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `url`                                               | Rehlat results page for the search.                                                                    |
| `title`, `origin`, `destination`                    | Route, with city names.                                                                                |
| `price`, `currency`                                 | Total price for all passengers, as a number.                                                           |
| `country`, `market`                                 | Storefront searched.                                                                                   |
| `airlines`, `stops`, `inboundStops`                 | Airlines on the fare and number of stops each way.                                                     |
| `outboundDurationMinutes`, `inboundDurationMinutes` | Total journey time, layovers included.                                                                 |
| `outbound`, `inbound`                               | Flight segments with flight number, airports, local departure/arrival time, duration, cabin and seats. |
| `basePrice`, `taxesAndFees`                         | Price split.                                                                                           |
| `refundable`, `seatsLeft`, `baggage`                | Fare conditions when Rehlat provides them.                                                             |
| `bookingUrl`                                        | Direct Rehlat booking link for the fare.                                                               |

***

### ❓ FAQ

**Which countries are supported?** Egypt, Saudi Arabia, the UAE, Qatar, the United States and Australia. Rehlat's other storefronts (Kuwait, Bahrain, Oman, Jordan, Morocco, Tunisia, Algeria, Brazil and the European ones) return no fares today. For travellers in other countries, pick the nearest storefront and set `currency` (for example `KWD` or `BHD`).

**Is `maxItems` a total limit?** No, it is per search. Two origins and three destinations make six searches, each saving up to `maxItems` fares.

**Can I use city names?** Yes. IATA codes are the most precise; city names are matched against Rehlat's airport list. Unknown codes are skipped with a warning.

**Why do I get no results for a route?** Rehlat has no fares for some routes and dates, and business or first class is sold on few routes. The scraper logs a warning and continues with the other searches.

**Why is the currency different from what I asked for?** If Rehlat does not support a currency code it prices in the storefront default; the `currency` field always shows the real currency.

**How fresh is the data?** Fares are read live on every run.

***

### 🔗 Want More Data?

Check our other flight scrapers:

- [Wego Flights Scraper](https://apify.com/boring_internet_explorer/wego-flights-scraper)
- [Almosafer Flights Scraper](https://apify.com/boring_internet_explorer/almosafer-flights-scraper)
- [flynas Flight Fares Scraper](https://apify.com/boring_internet_explorer/flynas-scraper)
- [flyadeal Flight Fares Scraper](https://apify.com/boring_internet_explorer/flyadeal-scraper)
- [flydubai Fare Radar](https://apify.com/boring_internet_explorer/flydubai-flights-scraper)

### 🛠️ Need a custom scraper?

Need this scraper adapted to your use case — extra fields, additional filters, a different output format, or a new website? Reach out at boringinternetexplorer@gmail.com and we'll make it happen.

# Actor input Schema

## `country` (type: `string`):

Rehlat storefront to search. It decides which market prices and fares you see.

## `currency` (type: `string`):

3-letter currency code for prices (for example EGP, SAR, AED, QAR, KWD, BHD, USD, EUR, AUD). Leave empty to use the storefront's default currency (EGP, SAR, AED, QAR, USD or AUD).

## `tripType` (type: `string`):

One way or round trip. Round trips need a return date.

## `origins` (type: `array`):

Departure airports or cities: IATA codes (CAI, RUH, DXB) or names (Cairo). Add several to search each of them.

## `destinations` (type: `array`):

Arrival airports or cities: IATA codes (JED, DXB, LHR) or names (Dubai). Every origin is searched against every destination.

## `departureDate` (type: `string`):

Departure date in YYYY-MM-DD format. Cannot be in the past. Leave empty to search 30 days from today.

## `returnDate` (type: `string`):

Return date in YYYY-MM-DD format. Only used for round trips and must be on or after the departure date. Leave empty for 7 days after departure.

## `adults` (type: `integer`):

Number of adults (12+). Prices are totals for all passengers.

## `children` (type: `integer`):

Number of children (2-11).

## `infants` (type: `integer`):

Number of infants (under 2). Each infant needs an adult.

## `cabin` (type: `string`):

Cabin class to search. Business and first fares are only available on some routes.

## `nonStopOnly` (type: `boolean`):

Keep only direct outbound flights.

## `maxItems` (type: `integer`):

Maximum number of fares to save for each origin × destination search, cheapest first.

## `proxyConfiguration` (type: `object`):

Your proxy configuration from Apify

## Actor input object example

```json
{
  "country": "EG",
  "tripType": "OneWay",
  "origins": [
    "CAI"
  ],
  "destinations": [
    "JED",
    "DXB"
  ],
  "adults": 1,
  "children": 0,
  "infants": 0,
  "cabin": "ECONOMY",
  "nonStopOnly": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "origins": [
        "CAI"
    ],
    "destinations": [
        "JED",
        "DXB"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/rehlat-flights-scraper").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 = {
    "origins": ["CAI"],
    "destinations": [
        "JED",
        "DXB",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/rehlat-flights-scraper").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 '{
  "origins": [
    "CAI"
  ],
  "destinations": [
    "JED",
    "DXB"
  ]
}' |
apify call boring_internet_explorer/rehlat-flights-scraper --silent --output-dataset

```

## MCP server setup

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

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/trU9tY83qy4aflmqG/builds/lUUYZxxRlr19QJncI/openapi.json
