# Google Travel Scraper: Flights, Hotels & Vacation Rentals (`nextgensda/google-travel`) Actor

Scrape Google Flights, Google Hotels and vacation rentals in one run: every itinerary with price, stops, layovers, CO2 and return flights; hotels and rentals with nightly price, rating, class, bedrooms and every booking site's offer. Price insights included. Fast HTTP scraper, no browser.

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

## Pricing

from $0.20 / 1,000 flights

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Google Travel Scraper: Flights, Hotels & Vacation Rentals

![Google Travel Scraper: flights, hotels and vacation rentals in one run, on a map, with pay-per-event pricing shown as a receipt](https://api.apify.com/v2/key-value-stores/R5FD4ywTp9IQlvUsR/records/banner-2026-10-17.png?signature=1QYW6KjThOEGotbGTOtn6)

Scrape [Google Flights](https://www.google.com/travel/flights), [Google
Hotels](https://www.google.com/travel/hotels) and Google's vacation rentals
in one run. Flights come with every itinerary on the route, return flights
and Google's price insights; hotels and rentals with the nightly price for
your dates, rating, class, and (optionally) every booking site's offer.

### What it does

- **Flights**: one way or round trip, from airport or city codes. Every
  itinerary (~90-150 on busy routes, not just Google's first page) with
  price, airline, times, door-to-door duration, stops and layovers, each
  flight segment (flight number, aircraft, legroom), CO2 against the route's
  typical, and a Google Flights link.
- **Return flights**: for the cheapest outbounds of a round trip, their
  return flights, each priced as the round-trip total for that pair.
- **Price insights**: the route's lowest price, Google's typical range, the
  price level (low / typical / high) and the daily price history.
- **Filters**: passengers (adults, children, infants), cabin (economy to
  first), max stops, airlines to include or leave out.
- **Hotels and vacation rentals**: by city or area for your check-in and
  check-out dates. Nightly price, rating and review breakdown, hotel class,
  coordinates, photos; rentals with bedrooms, bathrooms and how many they
  sleep.
- **Hotel booking options** (optional): each property's page, with every
  booking site's offer (the official site, Booking.com, Expedia, Hotels.com,
  Agoda, ...), address, phone, nearby places and category ratings.
- **As many hotels as you need**: page after page (up to 1,000 per search).
- **Flight booking options** (optional): for the cheapest itineraries, where
  to book them: the airline's own fares (Basic, Main, Flex, ...) and the
  travel agencies Google lists (Expedia, Trip.com, CheapOair, ...), each
  with its price and booking link.
- **Price graph** (optional): Google's cheapest price for every departure
  date, up to 330 days, for the same trip length.
- Many searches per run, mixed freely: plan a trip in one go.
- HTTP: fast and light (256 MB). Flight booking options and the price graph
  start a Chrome once per run (1 GB of memory).

### Input examples

**A round trip, with return flights for the 2 cheapest outbounds:**

```json
{
    "flights": [
        { "origin": "JFK", "destination": "LAX", "departureDate": "2026-12-20", "returnDate": "2026-12-27" }
    ],
    "returnFlightsFor": 2
}
```

**Business class, nonstop, two adults:**

```json
{
    "flights": [{ "origin": "SFO", "destination": "LHR", "departureDate": "2026-11-05" }],
    "cabin": "business",
    "maxStops": 0,
    "adults": 2
}
```

**Where to book the 3 cheapest itineraries, and the cheapest dates over 6 months (1 GB):**

```json
{
    "flights": [{ "origin": "SFO", "destination": "ORD", "departureDate": "2026-12-05", "returnDate": "2026-12-12" }],
    "bookingOptionsFor": 3,
    "priceGraphDays": 180
}
```

**A whole trip: flights, hotels and rentals with every booking option:**

```json
{
    "flights": [{ "origin": "NYC", "destination": "PAR", "departureDate": "2026-12-09", "returnDate": "2026-12-13" }],
    "hotels": [{ "place": "Paris", "checkin": "2026-12-10", "checkout": "2026-12-13" }],
    "rentals": [{ "place": "Paris", "checkin": "2026-12-10", "checkout": "2026-12-13" }],
    "hotelDetails": true,
    "currency": "EUR"
}
```

### Output

One dataset; the `type` column tells the rows apart (`flight`, `hotel`,
`rental`, `price-insights`, `booking-options`, `price-graph`), and a view per
kind shows its columns.

**Flight** (`type: flight`; `kind`: `outbound`, `one-way` or `return`):

| Field | Example |
|---|---|
| `price`, `currency` | 489, USD (the total for all travellers) |
| `airline`, `airlines` | JetBlue |
| `origin`, `destination` | JFK, LAX |
| `departure_date`, `departure_time`, `arrival_date`, `arrival_time` | 2026-12-20 17:20, 2026-12-21 01:59 |
| `duration_minutes`, `stops`, `layovers` | 699, 1, \[{"airport": "BOS", "city": "Boston", "minutes": 226}] |
| `segments` | flight number, aircraft, legroom, times for each flight |
| `co2_grams`, `co2_typical_grams`, `co2_vs_typical_percent` | 495000, 343000, 44 |
| `best` | in Google's top flights |
| `outbound_id` | on return flights: the outbound they pair with |
| `google_flights_url` | the flight on Google Flights |

**Hotel / rental** (`type: hotel` or `rental`):

| Field | Example |
|---|---|
| `name`, `hotel_class` | Novotel Suites Paris Stade de France, 4 |
| `price_per_night`, `currency`, `checkin`, `checkout`, `nights` | 99, USD, 2026-12-10, 2026-12-12, 2 |
| `rating`, `review_count`, `rating_histogram` | 4.3, 1438, {"5": 817, …} |
| `latitude`, `longitude`, `photos`, `description` | |
| `bedrooms`, `bathrooms`, `sleeps`, `features` | rentals: 3, 2, 8, \["Entire apartment", …] |
| `booking_options` | with details: \[{"provider": "Booking.com", "price_per_night": 122.17, "url": …, "official_site": false}, …] |
| `address`, `phone`, `nearby_places`, `rating_categories` | with details |
| `url` | the property on Google Hotels, for your dates |

**Price insights** (`type: price-insights`, one per flight search, free):
`lowest_price`, `typical_low`, `typical_high`, `price_level`, `price_history`.

**Flight booking options** (`type: booking-options`, one per itinerary):
`itinerary_id`, `flights`, `airlines`, `lowest_price`, `option_count` and
`booking_options`: \[{"provider": "Frontier", "is_airline": true, "fare":
"Basic Fare", "price": 104, "site": "www.flyfrontier.com", "booking_url": …},
{"provider": "Expedia", "is_airline": false, "price": 104, …}, …]. Round
trips pair each outbound with its cheapest return on the same airline (one
ticket); otherwise the cheapest, booked as separate tickets (`tickets`).

**Price graph** (`type: price-graph`, one per flight search): `days`
\[{"departure_date", "return_date", "price"}, …], `lowest_price`,
`cheapest_departure_date`, `cheapest_return_date`, `trip_days`.

Plus `search` and `searchIndex`: the search a row came from.

### Pricing

Pay per event: platform usage is included in every price; you never pay
Apify compute, proxy or storage on top.

| Event | Price | When charged |
|---|---|---|
| Run start | $0.002 | every run (at the default 256 MB) |
| `flight` | $0.20 / 1,000 | each flight itinerary (outbound, one-way or return) |
| `hotel` / `rental` | $1.00 / 1,000 | each hotel or vacation rental from a search |
| `hotel-details` | $5.00 / 1,000 | each property with **Booking options and details** on, instead of `hotel` / `rental` |
| Price insights | free | one row per flight search |
| Chrome start | $0.03 | once per run, only with flight booking options or the price graph |
| `booking-options` | $3.00 / 1,000 | each itinerary's booking options (all its airlines and agencies) |
| `price-graph` | $0.005 | each flight search's price graph (up to 330 days) |

**Example:** 3 round trips (270 flights with return flights) and 20 hotels
with booking options = $0.002 + 270 × $0.0002 + 20 × $0.005 = **$0.156**.

Your **spending limit** (set in the run configuration) is always respected:
the actor stops before exceeding it.

### Proxy

Apify's US residential proxy is the default. Prices follow the `currency`
input; a few hotel prices can follow the exit's country.

### Limits

- Flight booking options and the price graph need **1 GB of memory** (set it
  in the run options); with less they're skipped with a warning.
- The price graph reaches ~11 months out: as far as airlines sell.
- Hotel lists are Google's order, page by page; prices change live, so a few
  hotels can move between pages (each is delivered once).

# Actor input Schema

## `flights` (type: `array`):

One search per entry: <code>{"origin": "JFK", "destination": "LAX", "departureDate": "2026-12-20", "returnDate": "2026-12-27"}</code>. Airport or city codes (JFK, LON, NYC); leave <code>returnDate</code> out for one way. Each entry can override the options below: <code>adults</code>, <code>children</code>, <code>infantsOnLap</code>, <code>infantsInSeat</code>, <code>cabin</code>, <code>maxStops</code>, <code>airlines</code>, <code>excludeAirlines</code>.

## `returnFlightsFor` (type: `integer`):

Round trips: Google lists outbound flights first, priced as round-trip totals. For the N cheapest outbounds, also fetch their return flights (each priced as the round-trip total for that pair). 0 = outbounds only.

## `fullFlightList` (type: `boolean`):

The whole list (~90-150 on busy routes) rather than Google's first ~35 (top flights + others).

## `bookingOptionsFor` (type: `integer`):

For the N cheapest itineraries of each flight search (round trips: each outbound with its cheapest return), where to book them: the airlines and travel agencies Google lists (Expedia, Trip.com, CheapOair, ...), each with its price, fare and booking link. Starts a Chrome once per run: needs at least 1 GB of memory (set it in the run options). 0 = off.

## `priceGraphDays` (type: `integer`):

Google's price graph: the cheapest price for each departure date over this many days around the search's date (round trips: same trip length). Up to 330 days. Starts a Chrome once per run, like booking options: needs at least 1 GB of memory. 0 = off.

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

Prices are totals for all travellers.

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

Aged 2-11.

## `infantsOnLap` (type: `integer`):

Under 2, one per adult.

## `infantsInSeat` (type: `integer`):

Under 2, with their own seat.

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

Seat class.

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

0 = nonstop only. Empty = any.

## `airlines` (type: `array`):

IATA codes, e.g. <code>B6</code>, <code>DL</code>.

## `excludeAirlines` (type: `array`):

IATA codes to leave out.

## `maxFlightsPerSearch` (type: `integer`):

Per list (outbounds, and each set of return flights).

## `hotels` (type: `array`):

One search per entry: <code>{"place": "Paris", "checkin": "2026-12-10", "checkout": "2026-12-12"}</code>. A city, area or address.

## `rentals` (type: `array`):

Same as hotel searches: <code>{"place": "Barcelona", "checkin": "2026-12-10", "checkout": "2026-12-12"}</code>.

## `hotelDetails` (type: `boolean`):

Open each hotel's or rental's page: every booking site's offer (official site, Booking.com, Expedia, ...), address, phone, nearby places and category ratings. One more request per property, charged as hotel-details instead of hotel / rental.

## `maxHotelsPerSearch` (type: `integer`):

Hotels or rentals per search, page after page (18 a page). Popular cities have thousands.

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

ISO code, e.g. USD, EUR, GBP.

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

e.g. en, de, fr.

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

The market Google prices for (ISO code).

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

Flights, hotels and rentals (price-insight rows don't count).

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

Apify's US residential proxy is the default. Hotel prices follow the currency above; a few can follow the exit's country.

## Actor input object example

```json
{
  "flights": [
    {
      "origin": "JFK",
      "destination": "LAX",
      "departureDate": "2026-12-20",
      "returnDate": "2026-12-27"
    }
  ],
  "returnFlightsFor": 1,
  "fullFlightList": true,
  "bookingOptionsFor": 0,
  "priceGraphDays": 0,
  "adults": 1,
  "children": 0,
  "infantsOnLap": 0,
  "infantsInSeat": 0,
  "cabin": "economy",
  "maxFlightsPerSearch": 200,
  "hotels": [
    {
      "place": "Paris",
      "checkin": "2026-12-10",
      "checkout": "2026-12-12"
    }
  ],
  "hotelDetails": false,
  "maxHotelsPerSearch": 20,
  "currency": "USD",
  "language": "en",
  "country": "US",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Every row: flights, hotels and rentals side by side.

## `flights` (type: `string`):

Flight rows (outbound, one-way, return).

## `hotels` (type: `string`):

Hotel and vacation-rental rows.

## `allFields` (type: `string`):

Every row with every field: segments, layovers, booking options, nearby places, price history.

# 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 = {
    "flights": [
        {
            "origin": "JFK",
            "destination": "LAX",
            "departureDate": "2026-12-20",
            "returnDate": "2026-12-27"
        }
    ],
    "hotels": [
        {
            "place": "Paris",
            "checkin": "2026-12-10",
            "checkout": "2026-12-12"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nextgensda/google-travel").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 = {
    "flights": [{
            "origin": "JFK",
            "destination": "LAX",
            "departureDate": "2026-12-20",
            "returnDate": "2026-12-27",
        }],
    "hotels": [{
            "place": "Paris",
            "checkin": "2026-12-10",
            "checkout": "2026-12-12",
        }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nextgensda/google-travel").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 '{
  "flights": [
    {
      "origin": "JFK",
      "destination": "LAX",
      "departureDate": "2026-12-20",
      "returnDate": "2026-12-27"
    }
  ],
  "hotels": [
    {
      "place": "Paris",
      "checkin": "2026-12-10",
      "checkout": "2026-12-12"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call nextgensda/google-travel --silent --output-dataset

```

## MCP server setup

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

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/0zL3PvV91qGUW8Vbm/builds/lNMME3uLbDnTZhY1y/openapi.json
