# Google Flights Explore Scraper (`boncross/google-flights-explore`) Actor

Find everywhere you can fly from one airport and what each destination costs. Just add an origin and a date, and get the city, country, fare, airline, journey time and stops for every destination Google sells, sorted cheapest first.

- **URL**: https://apify.com/boncross/google-flights-explore.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 destination-listeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Google Flights Explore Scraper

### What is Google Flights Explore Scraper?

Where can you fly from here, and what does each place cost? Google Flights Explore Scraper takes one airport and a date and returns the destinations on Google's Explore map for it, cheapest first: about 50 from a large hub, each with its fare, airline, journey time, stops and coordinates.

Where it earns its keep:

- **One airport in, a priced map out.** London Heathrow on one date returned 47 to 48 destinations in 2 to 3 seconds.
- **You can shape the map.** Pick a theme (beaches, skiing, museums, history, the outdoors), a region such as Japan, a travel month and trip length, a list of countries, or a rectangle. A rectangle over Iberia turned a list that included Dublin and Cork into Bilbao, Seville, Madrid, Barcelona, Faro and Toulouse.
- **It's ready to plot.** City, country, airport code, fare, airline, stops, journey time, coordinates, dates and photo were filled on every row in measured runs.
- **Many airports at once.** 40 origins returned 1,960 to 2,000 destinations in 20 to 30 seconds.
- **$1.50 per 1,000 destinations** on the Free plan and $1.05 on Business. That's the full price, proxy usage and platform usage included.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 25 of 25 live checks on its inputs and filters passed on 8 October 2026
- 5 origins run on 7 October 2026, Dublin, Nagoya, Perth, Bogotá and Tromsø: 125 destinations, none empty
- Charges matched the rows: 1 start, 125 destinations

What people build with it:

- A "where can I go this weekend" page from a set of home airports
- A finder for the cheapest country to reach from your city on a given date
- A map of destinations and fares, plotted from the coordinates
- A comparison of how much further your money goes from a nearby airport
- A travel inspiration feed with live prices in place of static lists
- Research into which destinations an airport connects to, and how directly

### How to scrape Google Flights destinations

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Google Flights Explore Scraper](https://apify.com/boncross/google-flights-explore) and enter your origin airport and roughly when you want to travel.
3. Narrow it if you like: a maximum price, a stop limit, a theme or a list of countries.
4. Click Start. A single airport takes 2 to 3 seconds.
5. Download the destinations as a spreadsheet (Excel or CSV), or as JSON, XML or HTML.

You don't write any code for this. It's a form with one required airport.

### What data comes with each destination?

| | |
|---|---|
| 🏙 Destination city | 🌍 Destination country |
| 🛬 Destination airport code | 💷 Fare for that destination |
| ✈️ Airline flying it | Number of stops |
| ⏱ Journey time in minutes | Layover length |
| 📍 Latitude and longitude | 📅 The outbound and return dates Google priced |
| 🖼 Destination photo | Distance from the origin, where Google gives it |
| 🔗 Link to that route on Google Flights | Google place id |
| 🛫 Origin airport | Currency |

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `destination-listed`, per destination returned | $0.0015 | $0.00135 | $0.0012 | $0.00105 |
| `origin-checked`, per origin with no destination for your date | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Enterprise plans pay the Business price.

It works out at **$1.50 per 1,000 destinations** on the Free plan and $1.05 on Business, with proxy usage and platform usage included.

Each destination you get is one `destination-listed`. `origin-checked` is charged only for an origin that returns no destination for your date, because none was offered or because your filters removed them all. An error isn't charged.

- One origin returning 49 destinations: $0.001 + 49 × $0.0015 = **$0.0745** ($0.0525 on Business).
- An origin with nothing for your date: $0.001 + $0.0005 = $0.0015, whatever your plan.

On Apify's Free plan you get $5 of credits a month, enough for about 67 airports mapped at 49 destinations each, roughly 3,300 destinations.

### ⬇️ Input

Give it an origin and a date. A city code such as `LON` covers the airports in that city, and several codes separated by commas search them together. You can type a place name such as "Heathrow" and it's resolved to airports for you. "More origins" searches further origins separately.

Each origin returns the map Google curates for it, about 50 destinations from a large hub. That's the per-origin limit, and there's no separate per-origin cap to set. "Maximum destinations" caps the whole run, and nothing past it is pushed or charged for.

**Everywhere from London**

```json
{
  "origin": "LHR",
  "departureDate": "2026-11-17",
  "currency": "GBP"
}
```

**Nonstop, under £100, Spain and Portugal only**

```json
{
  "origin": "LON",
  "departureDate": "2026-11-17",
  "nonstop": true,
  "maxPrice": 100,
  "countries": ["Spain", "Portugal"]
}
```

**Beaches in a particular month**

```json
{
  "origin": "LHR",
  "departureDate": "2026-11-17",
  "interest": "beaches",
  "travelMonth": 3,
  "tripLength": "week",
  "currency": "GBP"
}
```

**Only Japan**

```json
{
  "origin": "LHR",
  "departureDate": "2026-11-17",
  "destinationRegion": "Japan",
  "maxItems": 40
}
```

**Only inside a map rectangle**

```json
{
  "origin": "LHR",
  "departureDate": "2026-11-17",
  "boundingBox": [44.0, 3.5, 36.0, -9.5],
  "currency": "GBP"
}
```

The rectangle is four numbers: north, east, south, west. The one above covers Iberia.

**Several origins, at most one stop**

```json
{
  "origin": "LHR",
  "extraOrigins": ["MAN", "EDI"],
  "departureDate": "2026-11-17",
  "maxStops": 1,
  "maxItems": 150
}
```

| Setting | What it does |
|---|---|
| `maxPrice` | Only destinations at or under this fare |
| `maxStops` (0 to 3) | Keeps destinations whose quoted fare has at most this many stops |
| `nonstop` | Asks Google to price each destination on nonstop flights |
| `maxDurationMinutes` | Longest one-way journey, in minutes |
| `countries` | Only these countries, named as Google names them |
| `interest` | `outdoors`, `beaches`, `museums`, `history` or `skiing` |
| `destinationRegion` | One part of the world by name ("Japan", "Italy"), or a Google place id |
| `travelMonth` (1 to 12), `tripLength` | A month, and `weekend`, `week` or `two-weeks` (the default) |
| `boundingBox` | A rectangle on the map: north, east, south, west |
| `adults` (1 to 9), `currency` (default USD), `language` (default en) | Party size, the currency of the fares and the language of place names |

#### For developers

- `maxItems` is the run-wide cap. There's no per-origin key, because Google fixes the size of each origin's map.
- Setting `interest`, `destinationRegion`, `travelMonth` or `boundingBox` makes the search cover the whole month of `departureDate`, not that one day. The FAQ explains why.
- Several codes in `origin` are treated as one city. Each entry in `extraOrigins` is searched separately and returns its own destinations.
- `maxConcurrency` (default 16, 1 to 32) is how many origins are searched at once. Seven origins took 74-91 s one at a time and 4.5-6 s in parallel.
- Rows are saved as the run goes. A run the platform restarts carries on where it stopped, and nothing is saved or charged twice.

### ⬆️ Output

You get one record per destination, cheapest first within each origin.

```json
{
  "recordType": "destination",
  "id": "LHR-BCN-m01f62",
  "originCode": "LHR",
  "destinationCode": "BCN",
  "destinationCity": "Barcelona",
  "destinationCountry": "Spain",
  "lat": 41.3828939,
  "lng": 2.1774322,
  "price": 36,
  "currency": "GBP",
  "airlineCode": "VY",
  "airlineName": "Vueling",
  "stops": 0,
  "durationMinutes": 135,
  "layoverMinutes": null,
  "departureDate": "2026-11-17",
  "returnDate": "2026-11-24",
  "distanceText": "708 mi",
  "imageUrl": "https://…",
  "placeId": "/m/01f62",
  "url": "https://www.google.com/travel/flights/search?tfs=…",
  "scrapedAt": "2026-09-13T19:12:00.000Z"
}
```

`url` opens a Google Flights search for exactly that route and those dates. `distanceText` is null where Google gives no distance, and `layoverMinutes` is null unless Google states a layover. `price` is for all the adults in your request together, not per person.

### How many destinations can you get, and how fast?

| Search | Destinations | Time |
|---|---|---|
| London Heathrow, one date | 47-48 | 2-3 s |
| Seven origins, one date | 331 | 4.5-6 s |
| 32 origins, one date | 1,475 | 28 s |
| 40 origins, one date | 1,960-2,000 | 20-30 s |
| 60 origins, one date | 2,605 | 77 s |

Each time covers a whole run on Apify including start-up, measured 1 to 3 October 2026. All the origins in a run are worked on together.

Google publishes a curated map of destinations per origin, not every airport on earth. Around 50 is what you get from a large hub and fewer from a small one: in a run on 7 October 2026, Dublin returned 41 and Tromsø 4. To get more rows, add origins. Distance is rare: 5 of 49 rows in one run and none in others.

### Limitations worth knowing

- The destination list is the map Google curates for that origin, not every airport it could route you through. For a specific route, use [Google Flights Scraper](https://apify.com/boncross/google-flights-search).
- The dates on each row are Google's own suggestion for that destination and often differ from the date you entered. That's also why some fares are so low.
- Distance is supplied for only a small minority of destinations, and often for none.
- `layoverMinutes` is filled only where Google states a layover. It's null otherwise, including on every nonstop row.
- A city and its airport can differ, because Google names the place you'd visit and not the airport you land at.
- **Economy only.** The Explore map publishes the cheapest fare Google has for each destination, which is economy. Asking for another cabin returned the same figures, and the actor doesn't offer one. To price a specific route in a cabin, use [Google Flights Scraper](https://apify.com/boncross/google-flights-search).
- The fare on a row is what Google's map showed during the run. Treat it as a guide: it's not an airline quote, and it can change before you book.

### FAQ

#### Why did my exact departure date turn into a whole month?

Google's Explore map won't take an exact date and a destination filter at the same time. Ask for both and the filters quietly stop working. When you set an interest, a destination region, a travel month or a bounding box, the actor searches the **whole month** of the departure date you gave. Ask for 10 November with `interest: beaches` and you get November's beach destinations. Leave those filters out and your exact date is used as given.

#### Why do the dates on a row differ from the one I entered?

Google treats your date as roughly when you want to travel and then prices each destination on the days that suit it best. Each row shows the dates it priced.

#### What's the difference between "Nonstop only" and "Maximum stops"?

They're two different questions. "Nonstop only" asks Google to price each destination on nonstop flights. A stops limit keeps the destinations whose cheapest fare already has that few stops. If you want to check a row, its `url` opens a Google Flights search for exactly that route and those dates.

#### How do the interest and region filters work?

"Interest" narrows the map to destinations known for one thing (beaches, skiing, museums, history or the outdoors), exactly as the site's own filter does. "Only this region or country" restricts it to one part of the world and takes a name: "Japan", "Italy", or a Google place id if you have one.

#### I don't have a fixed date. Can Google pick one?

Set "Travel month" to a month number and "Trip length" to a weekend, a week or two weeks. Google then prices each destination on the best dates for that shape of trip, and each row shows the dates it priced.

#### How do I keep only certain countries?

List them in "Only these countries", named as Google names them. The rest are dropped.

#### Can I search more than one airport?

Put several codes in the origin, separated by commas, to treat them as one city. To run airports separately, add them under "More origins".

#### Do I need proxies or a Google account?

No to both. Nothing needs configuring, there's no proxy charge, and you don't need an account or an API key.

#### Is scraping Google Flights legal?

The Explore map is public: anyone can open it without an account, and reading public pages is legal in most jurisdictions. The actor gathers no personal data. What you do with the fares afterwards is your responsibility. Check the rules that apply to you before republishing them.

### Refresh it weekly, or call it from code

A destinations page goes stale as fares move. Put the run on an Apify schedule (weekly, say) and have a webhook, Google Sheets or Airbyte carry the rows to wherever your map reads them.

From code, a single request runs the actor and hands back the dataset. Use the JavaScript or Python client if you prefer.

```
POST https://api.apify.com/v2/acts/boncross~google-flights-explore/run-sync-get-dataset-items?token=YOUR_TOKEN
```

For AI agents, add the Apify MCP server (`mcp.apify.com`) to Claude, ChatGPT, Cursor or LibreChat and reference `boncross/google-flights-explore`. An agent can then answer "where can I fly from Manchester for under £100" with live fares.

### More from BonCross

- [Google Flights Booking Options Scraper](https://apify.com/boncross/google-flights-booking-options): See every airline and travel agency selling the same flight, each with its own price…
- [Google Flights Deals Scraper](https://apify.com/boncross/google-flights-deals): Describe a trip in plain English and let Google pick the destinations, or get the…
- [Google Flights Multi-City Scraper](https://apify.com/boncross/google-flights-multi-city): Google Flights multi-city trips of three legs or more, and quiet routes Google leaves…
- [Google Flights Scraper](https://apify.com/boncross/google-flights-search): Google Flights for any route and date and get every itinerary with price, airlines,…
- [Google Maps Directions Scraper](https://apify.com/boncross/google-maps-directions): Google Maps directions as JSON for driving, transit, walking and cycling.
- [Google Hotels Prices Scraper](https://apify.com/boncross/google-hotels-prices): Google Hotels price comparisons for any hotel and stay.

### Your feedback

Is a destination missing from an airport's map, or a fare off from what Google shows you? Report it on the Issues tab in Apify Console with the origin and date. We look at every issue and answer there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/google-flights-explore/changelog.md

# Actor input Schema

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

The airport you would fly from, such as LHR. A city code such as LON covers every airport in that city, and several codes separated by commas search them together. You can also type a place name such as "Barcelona" or "Heathrow" and it is resolved for you.

## `extraOrigins` (type: `array`):

Additional origins, one per line. Each is searched separately and returns its own destinations. You can also type a place name such as "Barcelona" or "Heathrow" and it is resolved for you.

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

Roughly when you want to travel, as YYYY-MM-DD. Leave it empty to search 30 days from today. Google suggests its own best dates per destination, so each row carries the dates it priced. Note: Google's Explore map cannot take an exact date and a destination filter at the same time. If you set Interest, Destination region, Travel month or a Bounding box, the actor searches the whole MONTH of your departure date instead of the exact day.

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

A ceiling on the whole run. Nothing past it is fetched or charged for.

## `maxPrice` (type: `integer`):

Only return destinations at or under this fare.

## `maxStops` (type: `integer`):

Keep only destinations whose quoted fare has at most this many stops. 0 keeps those whose cheapest fare is already nonstop: unlike Nonstop, which asks Google for nonstop prices.

## `nonstop` (type: `boolean`):

Ask Google to price every destination on nonstop flights. A destination whose cheapest fare has a stop can still come back, priced nonstop. Connecting results are removed here too.

## `maxDurationMinutes` (type: `integer`):

Longest acceptable one-way journey, in minutes.

## `countries` (type: `array`):

Keep only destinations in these countries, named as Google names them, such as Spain or Portugal. Leave empty for everywhere.

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

Number of adult passengers.

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

Three letter currency code, such as USD or GBP. Default USD.

## `language` (type: `string`):

Two letter language code for place names, such as en.

## `interest` (type: `string`):

Narrow the map to destinations known for one thing. Leave blank for the popular list. Using this makes the search cover the whole month of your departure date rather than that exact day.

## `destinationRegion` (type: `string`):

Restrict destinations to one part of the world, named however you like: "Japan", "Italy" or a Google place id. Leave blank for everywhere. Using this makes the search cover the whole month of your departure date rather than that exact day.

## `travelMonth` (type: `integer`):

Restrict to a month, 1 for January through 12 for December. Leave blank for any month in the coming window. Using this makes the search cover the whole month of your departure date rather than that exact day.

## `tripLength` (type: `string`):

How long the trip should be. Google prices each destination on the best dates for that length.

## `boundingBox` (type: `array`):

Restrict destinations to a rectangle on the map, as four numbers: north, east, south, west. For example \[49.23, 3.24, 48.48, 1.46] covers the area around Paris. Leave empty for everywhere. Using this makes the search cover the whole month of your departure date rather than that exact day.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `restartAttempt` (type: `integer`):

Set by the actor when it restarts itself in a fresh container after capturing nothing. Leave it alone.

## Actor input object example

```json
{
  "origin": "LHR",
  "extraOrigins": [],
  "nonstop": false,
  "countries": [],
  "adults": 1,
  "currency": "USD",
  "language": "en",
  "interest": "",
  "tripLength": "two-weeks",
  "boundingBox": [],
  "maxConcurrency": 16,
  "restartAttempt": 0
}
```

# Actor output Schema

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

Google Flights destinations: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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": "LHR",
    "extraOrigins": [],
    "countries": [],
    "boundingBox": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/google-flights-explore").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": "LHR",
    "extraOrigins": [],
    "countries": [],
    "boundingBox": [],
}

# Run the Actor and wait for it to finish
run = client.actor("boncross/google-flights-explore").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 '{
  "origin": "LHR",
  "extraOrigins": [],
  "countries": [],
  "boundingBox": []
}' |
apify call boncross/google-flights-explore --silent --output-dataset

```

## MCP server setup

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

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/ykCprAbNSryCh7PtU/builds/djia2bKesPRHKpgjn/openapi.json
