# Flight Price Aggregator API 💰 — 5 Sources, One Query (`memo23/flights-aggregator-scraper`) Actor

Compare flight prices across Ryanair, Wizz Air, EasyJet, Google Flights & Skyscanner in one call. Fans out in parallel, merges by flight identity & cross-source price-matches — so you see who sells each flight cheapest. One-way & round-trip: fares, airlines, times, stops. Pure HTTP, JSON/CSV

- **URL**: https://apify.com/memo23/flights-aggregator-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, AI, Agents
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 flight offers

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Flight Price Aggregator API — 5 Sources, One Query 💰

**Compare flight prices across Ryanair, Wizz Air, EasyJet, Google Flights and Skyscanner in a single call.** One search fans out to all five sources in parallel, merges the results by flight identity, and cross-source price-matches — so for every flight you instantly see which source sells it cheapest.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-flights-aggregator.png)

### Why this actor

Most flight scrapers give you **one** source's view. Low-cost carriers are almost always cheaper booked **direct** than through a metasearch aggregator — but you only know that if you can see both prices side by side. This actor does exactly that:

- **Direct LCC fares** from Ryanair, Wizz Air and EasyJet — the real, bookable price, not a marked-up resale.
- **Broad coverage** from Google Flights and Skyscanner — every airline on the route, including the legacy carriers the LCCs don't show.
- **One merged view** — the same physical flight from multiple sources collapses into a single row with a per-source price map and the cheapest seller tagged.

The payoff is concrete: on a typical London→Paris search the same EasyJet flight comes back at **£14.99 direct** vs **$41 via Google Flights** — and the actor tags the direct fare as cheapest automatically.

### Use cases

- **Price comparison / fare monitoring** — find the cheapest seller for a route and date.
- **Travel meta-search & booking tools** — power a "compare all sources" feature without integrating five APIs.
- **Deal alerts** — schedule daily runs and watch the cheapest-per-direction price.
- **Market & pricing research** — see how direct LCC pricing compares to aggregator pricing at scale.
- **AI agents** — pair with the companion MCP server to give an assistant a `search_flights` tool.

### Input

| Field | Required | Description |
|---|---|---|
| `origin` | ✅ | Origin airport IATA code (e.g. `LGW`) |
| `destination` | ✅ | Destination airport IATA code (e.g. `CDG`) |
| `departDate` | ✅ | Outbound date `YYYY-MM-DD` |
| `returnDate` | | Return date `YYYY-MM-DD` (omit for one-way) |
| `adults` / `children` | | Passenger counts (defaults 1 / 0) |
| `currency` | | Preferred display currency, ISO 4217 (default `USD`) |
| `cabinClass` | | `ECONOMY` / `PREMIUM_ECONOMY` / `BUSINESS` / `FIRST` |
| `sources` | | Subset of the five sources; omit to query all |
| `maxPerSource` | | Cap on offers per source before merging (default 10) |

```json
{
  "origin": "LGW",
  "destination": "CDG",
  "departDate": "2026-08-12",
  "returnDate": "2026-08-19",
  "maxPerSource": 8
}
````

### Output

One row per merged offer:

```json
{
  "source": "easyjet",
  "direction": "outbound",
  "origin": "LGW",
  "destination": "CDG",
  "date": "2026-08-12",
  "price": 14.99,
  "currency": "GBP",
  "carrier": "easyJet",
  "flightNumber": "U28405",
  "departTime": "16:10",
  "arriveTime": "18:25",
  "stops": 0,
  "prices": { "easyjet": 14.99, "googleflights": 41 },
  "cheapestSource": "easyjet",
  "isCheapest": true
}
```

`prices` holds every source's price for that flight; `cheapestSource` names the cheapest; `isCheapest` marks the cheapest offer for its direction.

### Notes & FAQ

- **Which routes do the LCCs cover?** Ryanair, Wizz Air and EasyJet only return flights on **their own** (mostly European) routes. For a route they don't fly they simply return nothing — Google Flights and Skyscanner still cover it. A source that has no data for a route never fails the run.
- **Currencies.** Sources that accept a currency use yours; a couple price in the departure-country currency, so cross-currency comparison is best-effort. Each row carries its own `currency`.
- **Skyscanner rows.** Skyscanner returns one combined round-trip price rather than a per-leg fare, so its rows are marked as price-only and kept out of the per-flight cross-source match (to avoid comparing a round-trip total against a one-way fare).
- **Proxies.** Residential proxy is recommended (and the default) for the broadest, most stable coverage.

### ⚠️ Disclaimer

This actor collects only publicly available flight pricing and schedule information. It does not access any private, authenticated, or personal data. You are responsible for ensuring your use complies with the applicable websites' terms and with all relevant laws (including data-protection regulations). Prices and availability are provided as-is and change constantly — always confirm the final price on the airline's or seller's own site before booking.

### SEO Keywords

flight price comparison API, cheap flights scraper, Ryanair scraper, Wizz Air scraper, EasyJet scraper, Google Flights API, Skyscanner scraper, flight fare aggregator, airfare comparison, low-cost carrier prices, flight deals API, metasearch flights, one-way and round-trip fares, flight price monitoring, travel data API, MCP flight search

# Actor input Schema

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

Origin as a city name (e.g. London, Barcelona) or an airport IATA code (e.g. LHR, JFK). A city resolves to its primary airport — pass an exact IATA to target another (e.g. STN).

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

Destination as a city name (e.g. Barcelona) or an airport IATA code (e.g. BCN, CDG).

## `departDate` (type: `string`):

Outbound date.

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

Return date for a round trip. Leave empty for one-way.

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

Number of adult passengers.

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

Number of child passengers.

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

Preferred display currency (ISO 4217, e.g. USD, GBP, EUR). Some sources price in the departure-country currency; cross-currency comparison is best-effort.

## `cabinClass` (type: `string`):

Preferred cabin class.

## `sources` (type: `array`):

Which flight sources to fan out to. Leave empty to query all five. Note: Ryanair, Wizz Air and EasyJet only fly their own (mostly European) routes.

## `maxPerSource` (type: `integer`):

Cap on the number of offers returned by each source before merging.

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

Proxy for the rate-limit-sensitive sources (Skyscanner, Google Flights). Residential is recommended.

## Actor input object example

```json
{
  "origin": "London",
  "destination": "Barcelona",
  "departDate": "2026-08-12",
  "returnDate": "2026-08-19",
  "adults": 1,
  "children": 0,
  "currency": "USD",
  "cabinClass": "ECONOMY",
  "sources": [],
  "maxPerSource": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "origin": "London",
    "destination": "Barcelona",
    "departDate": "2026-08-12"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/flights-aggregator-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 = {
    "origin": "London",
    "destination": "Barcelona",
    "departDate": "2026-08-12",
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/flights-aggregator-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "origin": "London",
  "destination": "Barcelona",
  "departDate": "2026-08-12"
}' |
apify call memo23/flights-aggregator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/flights-aggregator-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Flight Price Aggregator API 💰 — 5 Sources, One Query",
        "description": "Compare flight prices across Ryanair, Wizz Air, EasyJet, Google Flights & Skyscanner in one call. Fans out in parallel, merges by flight identity & cross-source price-matches — so you see who sells each flight cheapest. One-way & round-trip: fares, airlines, times, stops. Pure HTTP, JSON/CSV",
        "version": "0.0",
        "x-build-id": "UTnsqvAwRCSlrCQUA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~flights-aggregator-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-flights-aggregator-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~flights-aggregator-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-flights-aggregator-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~flights-aggregator-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-flights-aggregator-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "origin",
                    "destination",
                    "departDate"
                ],
                "properties": {
                    "origin": {
                        "title": "Origin (city or airport)",
                        "type": "string",
                        "description": "Origin as a city name (e.g. London, Barcelona) or an airport IATA code (e.g. LHR, JFK). A city resolves to its primary airport — pass an exact IATA to target another (e.g. STN)."
                    },
                    "destination": {
                        "title": "Destination (city or airport)",
                        "type": "string",
                        "description": "Destination as a city name (e.g. Barcelona) or an airport IATA code (e.g. BCN, CDG)."
                    },
                    "departDate": {
                        "title": "Departure date",
                        "type": "string",
                        "description": "Outbound date."
                    },
                    "returnDate": {
                        "title": "Return date (optional)",
                        "type": "string",
                        "description": "Return date for a round trip. Leave empty for one-way."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of adult passengers.",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of child passengers.",
                        "default": 0
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Preferred display currency (ISO 4217, e.g. USD, GBP, EUR). Some sources price in the departure-country currency; cross-currency comparison is best-effort.",
                        "default": "USD"
                    },
                    "cabinClass": {
                        "title": "Cabin class",
                        "enum": [
                            "ECONOMY",
                            "PREMIUM_ECONOMY",
                            "BUSINESS",
                            "FIRST"
                        ],
                        "type": "string",
                        "description": "Preferred cabin class.",
                        "default": "ECONOMY"
                    },
                    "sources": {
                        "title": "Sources to query",
                        "type": "array",
                        "description": "Which flight sources to fan out to. Leave empty to query all five. Note: Ryanair, Wizz Air and EasyJet only fly their own (mostly European) routes.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ryanair",
                                "wizzair",
                                "easyjet",
                                "googleflights",
                                "skyscanner",
                                "kiwi"
                            ]
                        },
                        "default": []
                    },
                    "maxPerSource": {
                        "title": "Max offers per source",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Cap on the number of offers returned by each source before merging.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy for the rate-limit-sensitive sources (Skyscanner, Google Flights). Residential is recommended.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
