# flyadeal Flight Fares Scraper – Flights Tracker (`boring_internet_explorer/flyadeal-scraper`) Actor

Scrape flyadeal (طيران أديل) flight fares, schedules, seats left and fare bundles for Saudi Arabia domestic routes and international routes to Egypt, UAE, Turkey, Pakistan and more. One-way and round-trip searches with adults, children and infants.

- **URL**: https://apify.com/boring_internet_explorer/flyadeal-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Categories:** Travel
- **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

## ✈️ طيران أديل flyadeal Flight Fares Scraper — Saudi Arabia, Egypt, UAE & more

[flyadeal](https://www.flyadeal.com/) (طيران أديل) is Saudi Arabia's low-cost airline, flying domestic routes across the Kingdom and international routes to Egypt, the UAE, Turkey, Pakistan, India and Europe. This scraper turns a flyadeal flight search into clean, structured data: every bookable flight with its schedule, price in SAR, remaining seats, fare class and bundle prices, ready for fare tracking, price comparison and travel analytics.

### Why use this scraper?

- 📉 **Fare monitoring**: track flyadeal prices on a route day by day and spot drops early
- 🧭 **Competitor benchmarking**: compare low-cost fares against other Saudi and GCC carriers
- 🗓️ **Schedule intelligence**: see every departure, flight number, aircraft and duration for a route
- 🎟️ **Seat availability signals**: use remaining seats as a demand indicator
- 🧳 **Bundle pricing**: compare the basic fare with the FLY, FLYM and FLYP bundles
- 🤖 **Travel apps and alerts**: feed deal finders, price-alert bots and itinerary planners
- 🔁 **Round trips**: get outbound and return flights in a single run

### Supported searches

| Type                                | Example input                                                              |
| ----------------------------------- | -------------------------------------------------------------------------- |
| One-way                             | `origins: ["RUH"]`, `destinations: ["JED"]`, `departureDate: 2026-11-10`   |
| Round trip                          | adds `tripType: roundTrip` and `returnDate: 2026-11-17`                    |
| Family search                       | `adults: 2`, `children: 1`, `infants: 1`                                   |
| Several routes in one run           | `origins: ["RUH", "JED"]`, `destinations: ["DXB", "CAI"]` runs all 4 pairs |
| Relative dates (for scheduled runs) | `departureDate: 2 weeks`                                                   |
| International route                 | `origins: ["JED"]`, `destinations: ["CAI"]` (Cairo)                        |

Airports use 3-letter IATA codes, for example RUH (Riyadh), JED (Jeddah), DMM (Dammam), MED (Madinah), AHB (Abha), TUU (Tabuk), CAI (Cairo), DXB (Dubai), IST (Istanbul).

### Input fields

| Field                | Type    | Default                | Description                                                                                                        |
| -------------------- | ------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `tripType`           | string  | `oneWay`               | `oneWay` or `roundTrip`                                                                                            |
| `origins`            | array   | `["RUH"]`              | IATA codes of the departure airports                                                                               |
| `destinations`       | array   | `["JED"]`              | IATA codes of the arrival airports. Every origin is searched against every destination                             |
| `departureDate`      | string  | 2 weeks from today     | `YYYY-MM-DD` or relative (`3 days`, `2 weeks`, `1 month`)                                                          |
| `returnDate`         | string  | none                   | Required for round trips, same formats                                                                             |
| `adults`             | integer | `1`                    | Passengers aged 12+ (1-9)                                                                                          |
| `children`           | integer | `0`                    | Passengers aged 2-11 (adults + children max 9)                                                                     |
| `infants`            | integer | `0`                    | Passengers under 2 (not more than adults, infants are not priced in the search)                                    |
| `maxItems`           | integer | `50`                   | Maximum number of flights saved **per origin → destination pair** (round trips count outbound and return together) |
| `proxyConfiguration` | object  | Apify datacenter proxy | Proxy settings. flyadeal blocks many datacenter IPs when no proxy is used                                          |

### Example input

```json
{
  "tripType": "roundTrip",
  "origins": ["RUH"],
  "destinations": ["JED"],
  "departureDate": "2026-10-20",
  "returnDate": "2026-10-27",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "maxItems": 50,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Several routes in one run

List several airports in `origins` and `destinations`. The actor searches every origin → destination pair with the same dates and passengers, and every pair has its own `maxItems` limit. For example 2 origins and 3 destinations run 6 searches, and with `maxItems: 50` each pair can save up to 50 flights (up to 300 in total). Same-airport pairs are skipped, duplicate codes are ignored, and pairs flyadeal does not fly (for example JED → MED) are skipped with a log warning, so the run still succeeds and the other pairs finish.

```json
{
  "tripType": "oneWay",
  "origins": ["RUH", "JED"],
  "destinations": ["DXB", "CAI", "DMM"],
  "departureDate": "2 weeks",
  "maxItems": 50,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

Each bookable flight is stored as one record in the default dataset. Round trips produce records for both directions (`direction` is `outbound` or `return`). Flights without an available fare (sold out) are skipped.

### Example output

```json
{
  "scrapedAt": "2026-10-06T19:29:57.357Z",
  "url": "https://www.flyadeal.com/en",
  "title": "RUH → JED F3 161 (2026-10-20)",
  "price": 259,
  "currency": "SAR",
  "country": "Saudi Arabia",
  "market": "sa",
  "direction": "outbound",
  "origin": "RUH",
  "destination": "JED",
  "departureTime": "2026-10-20T00:15:00",
  "arrivalTime": "2026-10-20T01:55:00",
  "durationMinutes": 100,
  "stops": 0,
  "flightType": "NonStop",
  "flightNumber": "F3 161",
  "carrierCode": "F3",
  "aircraft": "Airbus A320",
  "departureTerminal": "3",
  "arrivalTerminal": "1",
  "seatsAvailable": 36,
  "fareClass": "YA",
  "fareBasisCode": "UOR9DL0X",
  "pricePerAdult": 259,
  "baseFarePerAdult": 90.22,
  "taxesAndFeesPerAdult": 168.78,
  "adults": 1,
  "children": 0,
  "infants": 0,
  "bundles": [
    {
      "code": "FLY",
      "price": 0
    },
    {
      "code": "FLYM",
      "price": 150
    },
    {
      "code": "FLYP",
      "price": 87
    }
  ],
  "segments": [
    {
      "flightNumber": "F3 161",
      "origin": "RUH",
      "destination": "JED",
      "departure": "2026-10-20T00:15:00",
      "arrival": "2026-10-20T01:55:00",
      "aircraft": "Airbus A320"
    }
  ]
}
```

### Field reference

| Field                                   | Type   | Description                                                                         |
| --------------------------------------- | ------ | ----------------------------------------------------------------------------------- |
| `scrapedAt`                             | string | ISO 8601 timestamp of the scrape                                                    |
| `url`                                   | string | flyadeal booking site URL                                                           |
| `title`                                 | string | Route, flight number and date                                                       |
| `price`                                 | number | Total fare for all paying passengers (adults and children) including taxes and fees |
| `currency`                              | string | Fare currency (SAR)                                                                 |
| `country`                               | string | Market country (Saudi Arabia)                                                       |
| `market`                                | string | Market code (`sa`)                                                                  |
| `direction`                             | string | `outbound` or `return`                                                              |
| `origin` / `destination`                | string | IATA airport codes of the journey                                                   |
| `departureTime` / `arrivalTime`         | string | Local departure and arrival time (ISO, no time zone)                                |
| `durationMinutes`                       | number | Total travel time including connections                                             |
| `stops`                                 | number | Number of stops (0 = non-stop)                                                      |
| `flightType`                            | string | `NonStop` or `Connect`                                                              |
| `flightNumber`                          | string | Flight number(s), joined with `+` for connections                                   |
| `carrierCode`                           | string | Operating carrier code of the first segment                                         |
| `aircraft`                              | string | Aircraft of the first segment                                                       |
| `departureTerminal` / `arrivalTerminal` | string | Terminals when published                                                            |
| `seatsAvailable`                        | number | Seats left in the lowest fare class                                                 |
| `fareClass` / `fareBasisCode`           | string | Fare product class and fare basis                                                   |
| `pricePerAdult`                         | number | Fare per adult including taxes and fees                                             |
| `baseFarePerAdult`                      | number | Base fare per adult before taxes and fees                                           |
| `taxesAndFeesPerAdult`                  | number | Taxes, surcharges and fees per adult                                                |
| `adults` / `children` / `infants`       | number | Passenger counts used for the search                                                |
| `bundles`                               | array  | Fare bundles with code (FLY, FLYM, FLYP) and per-passenger price                    |
| `segments`                              | array  | Flight number, airports, times and aircraft of each segment                         |

### ❓ FAQ

**How do I search for a different route?**
Change `origins` and `destinations` to any flyadeal airports using their IATA codes. If flyadeal does not fly a route, that pair is skipped with a warning in the log and the run still succeeds, just without data for it.

**Can I scrape several routes?**
Yes. Put several airports in `origins` and `destinations`; every pair is searched and counted separately against `maxItems`. One run covers one set of dates, so create a task per date, or schedule runs with relative dates such as `1 week` to monitor fares on a rolling basis.

**Are round trips supported?**
Yes. Set `tripType` to `roundTrip` and add `returnDate`. Outbound and return flights are saved separately.

**Why are some flights missing?**
Sold-out flights have no fare and are skipped. Searches for dates outside flyadeal's booking window return no flights.

**Which currency are prices in?**
Fares are returned in Saudi riyals (SAR) and include taxes and fees.

**Is Arabic supported?**
The data is language-independent: airport codes, flight numbers and prices are the same on the Arabic site.

**How fresh is the data?**
Every run reads live availability and prices from flyadeal at the time of the run.

### 🔗 Want More Data?

Check out more Saudi Arabia scrapers by boring_internet_explorer:

- [Riyadh Air Flights Scraper](https://apify.com/boring_internet_explorer/riyadh-air-scraper): fares for all Riyadh Air routes
- [flydubai Fare Radar](https://apify.com/boring_internet_explorer/flydubai-flights-scraper): compare and track daily flydubai flight prices
- [Jarir جرير Product Scraper](https://apify.com/boring_internet_explorer/jarir-scraper): electronics and books from jarir.com
- [eXtra - اكسترا Product Scraper](https://apify.com/boring_internet_explorer/extra-scraper): products from extra.com
- [Saudi Companies Scraper](https://apify.com/boring_internet_explorer/companies-scraper): 19K+ Saudi companies with emails and B2B leads

### 🛠️ 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

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

One-way or round-trip search. Round trips return outbound and return flights.

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

3-letter IATA codes of the departure airports, e.g. RUH (Riyadh), JED (Jeddah), DMM (Dammam). Every origin is searched against every destination.

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

3-letter IATA codes of the arrival airports, e.g. JED, MED (Madinah), CAI (Cairo), DXB (Dubai). Two origins and three destinations run 6 searches.

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

Departure date as YYYY-MM-DD, or a relative value such as '2 weeks'.

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

Return date as YYYY-MM-DD or relative (e.g. '3 weeks'). Required for round trips, ignored for one-way.

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

Passengers aged 12 and above (1-9).

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

Passengers aged 2 to 11. Adults and children together cannot exceed 9.

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

Passengers under 2. Cannot exceed the number of adults.

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

Maximum number of flights saved for each origin → destination pair. Round trips count outbound and return flights together.

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

Proxy settings. flyadeal blocks requests from many datacenter IPs, so the Apify datacenter proxy is enabled by default; switch to residential if you see blocks.

## Actor input object example

```json
{
  "tripType": "oneWay",
  "origins": [
    "RUH"
  ],
  "destinations": [
    "JED",
    "DXB"
  ],
  "departureDate": "2 weeks",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        "RUH"
    ],
    "destinations": [
        "JED",
        "DXB"
    ],
    "departureDate": "2 weeks",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/flyadeal-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": ["RUH"],
    "destinations": [
        "JED",
        "DXB",
    ],
    "departureDate": "2 weeks",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/flyadeal-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": [
    "RUH"
  ],
  "destinations": [
    "JED",
    "DXB"
  ],
  "departureDate": "2 weeks",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call boring_internet_explorer/flyadeal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boring_internet_explorer/flyadeal-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/PZuaNIeb3f3rFrWHd/builds/Vgw4LvDXau5E8FgtD/openapi.json
