# Google Flights Scraper — Fares, Routes, Booking Links (`khadinakbar/google-flights-scraper`) Actor

Scrape Google Flights for one-way and round-trip itineraries. Prices, airlines, stops, layovers, aircraft, carbon emissions, and direct booking deeplinks. MCP-ready.

- **URL**: https://apify.com/khadinakbar/google-flights-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Travel, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 flight itinerary returneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Google Flights Scraper — Real-Time Fares, Routes & Booking Links

**Scrape Google Flights at scale** for one-way and round-trip itineraries with **prices, airlines, stops, layovers, aircraft, carbon emissions, and direct booking deeplinks**. HTTP-only via a reverse-engineered protobuf URL parameter — no browser overhead, no Selenium, no JavaScript rendering. Built for travel apps, fare-monitoring pipelines, AI travel agents, and analysts who need real-time Google Flights data without a Skyscanner/Amadeus enterprise contract.

### What does Google Flights Scraper do?

This actor turns a single search query — origin, destination, dates, passengers — into a clean JSON dataset of every flight option Google Flights would show a human user. Each record includes the full route (with layovers), every segment's airline and flight number, aircraft type, cabin, total duration, current fare, carbon emissions, and a deeplink back into Google Flights so you can review the exact itinerary.

It supports **one-way and round-trip** searches in all four cabin classes (Economy, Premium Economy, Business, First), 9 adults + 8 children + lap and seated infants, 30+ currencies, 30+ countries, and 29+ languages. Behind the scenes it constructs the same protobuf-encoded `tfs` URL parameter Google's own frontend uses, fetches the response over Apify's residential proxy pool, and parses the embedded `AF_initDataCallback` payload — so a typical run finishes in well under 15 seconds and costs roughly  for a full LAX→JFK round-trip.

### Why use Google Flights Scraper?

- **AI-agent ready (MCP-first):** designed so Claude, ChatGPT, and Gemini can pick this tool and call it cleanly. The tool description, input fields, and output keys are all written for an LLM reader, not for a human PM. Typical agent run costs under .25 — well below the x402 default prepay.
- **Premium reliability target:** residential proxy pool, session-consistent cookies, exponential-backoff retries, and an automatic HTML snapshot saved to the Key-Value Store whenever the parser fails so we can diagnose Google-side drift fast.
- **No browser, no Playwright tax:** the protobuf URL approach is roughly 10–20x faster and far cheaper than headful-browser scrapers. Most runs finish in 5–15 seconds.
- **Richer defaults than the market:** carbon emissions, aircraft type, layover airport + duration, cabin per segment, and a stable `searchId` hash are all returned by default — never gated behind a "premium" flag.
- **Per-itinerary pay-per-event (PPE):** you pay only for flights actually returned to your dataset, not for failed pages, blocked requests, or empty responses. Predictable cost-per-search for production planning.

### How to use Google Flights Scraper

1. **Open the actor on Apify Store** and click **Try for free**.
2. **Fill the Input form:**
   - `origin` — 3-letter IATA code (e.g., `LAX`).
   - `destination` — 3-letter IATA code (e.g., `JFK`).
   - `departureDate` — `YYYY-MM-DD` (must be in the future).
   - `returnDate` — `YYYY-MM-DD` for round-trip, leave empty for one-way.
   - Optional: `adults`, `children`, `infantsInSeat`, `infantsOnLap`, `cabinClass`, `maxStops`, `currency`, `country`, `language`, `maxResults`.
3. **Start the run.** Cost is .005 per flight returned + .00005 start fee. Typical LAX→JFK round-trip returning 40 itineraries: about .20.
4. **Read the dataset** in the Output tab. Export as JSON, CSV, Excel, RSS, or HTML — or hit the Apify API directly for programmatic access.
5. **Schedule it** to run daily, hourly, or every 15 minutes via Apify Schedules to track fare changes over time.
6. **From Claude / ChatGPT / Gemini:** the actor is automatically exposed via Apify MCP as `apify--google-flights-scraper`. Tool description, input fields, and output shape are all LLM-tuned.

### Input

The full input schema is on the **Input** tab. Required fields are `origin`, `destination`, `departureDate`. Everything else has a sensible default.

Minimal JSON example:

```json
{
    "origin": "LAX",
    "destination": "JFK",
    "departureDate": "2026-08-15",
    "returnDate": "2026-08-22",
    "adults": 1,
    "cabinClass": "economy",
    "currency": "USD",
    "country": "us",
    "maxResults": 30
}
````

Multi-passenger business-class one-way example:

```json
{
    "origin": "SFO",
    "destination": "NRT",
    "departureDate": "2026-09-10",
    "adults": 2,
    "children": 1,
    "infantsOnLap": 1,
    "cabinClass": "business",
    "maxStops": 1,
    "currency": "USD",
    "country": "jp",
    "language": "en"
}
```

### Output

Each dataset row is a single flight itinerary. Multi-segment flights and layovers are nested inside `outbound` and `return`. Keys are stable across runs; nulls are explicit (we do not omit fields).

```json
{
    "searchId": "a1b2c3d4e5f6",
    "tripType": "round_trip",
    "origin": "LAX",
    "destination": "JFK",
    "departureDate": "2026-08-15",
    "returnDate": "2026-08-22",
    "price": 487,
    "currency": "USD",
    "isBestFlight": true,
    "cabinClass": "economy",
    "totalDurationMinutes": 720,
    "stops": 0,
    "airlines": ["Delta"],
    "outbound": {
        "origin": "LAX",
        "destination": "JFK",
        "departureTime": "2026-08-15T08:30:00",
        "arrivalTime": "2026-08-15T17:00:00",
        "durationMinutes": 330,
        "stops": 0,
        "segments": [
            {
                "airline": "Delta",
                "airlineCode": "DL",
                "flightNumber": "DL 423",
                "aircraft": "Boeing 767",
                "origin": "LAX",
                "destination": "JFK",
                "departureTime": "2026-08-15T08:30:00",
                "arrivalTime": "2026-08-15T17:00:00",
                "durationMinutes": 330,
                "cabin": null
            }
        ],
        "layovers": []
    },
    "return": {
        "origin": "JFK",
        "destination": "LAX",
        "stops": 0,
        "segments": [],
        "layovers": []
    },
    "carbonKg": 412,
    "carbonVsTypical": null,
    "bookingUrl": null,
    "googleFlightsUrl": "https://www.google.com/travel/flights/search?tfs=...",
    "scrapedAt": "2026-05-16T18:00:00.000Z"
}
```

Download the dataset as JSON, CSV, Excel, RSS, or HTML from the Output tab.

### Data table

| Field | Type | Description |
|---|---|---|
| `searchId` | string | Stable 12-char hash of search inputs — groups runs of the same query |
| `tripType` | enum | `one_way` or `round_trip` |
| `origin`, `destination` | string | IATA codes for the full trip |
| `departureDate`, `returnDate` | string|null | `YYYY-MM-DD`; `returnDate` is null on one-way |
| `price` | number | Total trip price for selected passengers |
| `currency` | string | ISO 4217 |
| `isBestFlight` | boolean | True if Google placed this in the Best Flights block |
| `cabinClass` | enum | `economy`, `premium_economy`, `business`, `first` |
| `totalDurationMinutes` | number | Sum of leg + layover durations |
| `stops` | number | Total stops across the itinerary |
| `airlines[]` | string\[] | Distinct airline names |
| `outbound`, `return` | object | Per-leg detail with segments + layovers |
| `outbound.segments[].flightNumber` | string | e.g., `DL 423` |
| `outbound.segments[].aircraft` | string | e.g., `Boeing 767` |
| `outbound.layovers[].airport` | string | IATA code |
| `outbound.layovers[].durationMinutes` | number | Layover duration |
| `outbound.layovers[].overnight` | boolean | True if the layover spans midnight |
| `carbonKg` | number | Estimated CO2 per passenger |
| `bookingUrl` | string|null | Direct booking deeplink (may be null on some runs) |
| `googleFlightsUrl` | string | Search URL — open in your browser to verify |
| `scrapedAt` | string | ISO 8601 UTC timestamp |

### Pricing — how much does it cost to scrape Google Flights?

Two pay-per-event line items, no monthly subscription, no rental tier:

| Event | Price | Triggered |
|---|---|---|
| `apify-actor-start` | **.00005** | Once per run |
| `flight-result` | **.005** | Per flight itinerary saved to the dataset |

**Typical run costs:**

- LAX→JFK round-trip, 40 itineraries: about **.20**
- SFO→NRT one-way business class, 20 itineraries: about **.10**
- 100 daily fare-tracking runs across 10 routes (≈30 itineraries each): about \*\* per day = /month\*\*

Failed pages, blocked requests, and empty responses are **not charged**. You pay only when flight data lands in your dataset.

The Pay-Per-Usage tier is also enabled alongside PPE — large jobs (millions of itineraries) can opt for compute + proxy passthrough billing if that fits better.

### Tips & advanced options

- **Lower `maxResults`** for cheaper, faster runs. The default 50 typically covers Google's "Best flights" plus the first page of "Other flights". Push 100–200 only if you need long-tail itineraries.
- **Country + currency matter.** Search market (`country`) affects which OTAs and airlines appear; `currency` affects display price (Google converts at its own rate). For local fares, match `country` and `currency` to the search market.
- **`maxStops=0`** for nonstop-only — typically halves the result set and the cost.
- **Run via Schedules** with a JSON template for fare-tracking pipelines. Each scheduled invocation gets its own dataset.
- **Webhook integration** — fire on completion to push fares into Slack, a database, or a downstream actor (for example pair with `email-address-validator` for outreach).
- **Multi-city** is on the v0.2 roadmap — for now use multiple one-way searches and join on `searchId`.

### FAQ, disclaimers, and support

**Is scraping Google Flights legal?**
This actor scrapes only public-facing flight pricing data. Public-data scraping has been upheld in U.S. courts (hiQ Labs v. LinkedIn, Meta v. Bright Data). You are responsible for complying with Google's Terms of Service and any local regulations in your jurisdiction. Do not use this actor for any purpose prohibited by Google's TOS or applicable law.

**Why are some runs returning fewer flights than I see in my browser?**
Google Flights occasionally A/B-tests result-set sizes by region and account. Try changing `country` and `currency` to widen the pool. If you see zero results, the most common cause is a past `departureDate`.

**Why is `bookingUrl` sometimes null?**
Direct booking links require an extra request per itinerary; for cost reasons v0.1 returns the search-level `googleFlightsUrl` and leaves `bookingUrl` for an opt-in event in v0.2.

**Does this work for multi-city trips?**
v0.1 supports one-way and round-trip. Multi-city is on the v0.2 roadmap.

**How reliable is it?**
Target is 95%+ success rate across diverse routes. We use Apify residential proxies, session-consistent cookies, exponential-backoff retries, and a circuit breaker. When Google updates its internal data structure, the parser returns zero results and saves a snapshot to the Key-Value Store — open an issue and we'll patch within 24–48 hours.

**Need help or have feedback?** Use the **Issues** tab on the actor page. Custom features, schema additions, or higher-volume contracts: reach out via Apify's contact form on the actor page.

# Actor input Schema

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

3-letter IATA airport code for departure (e.g., 'LAX', 'JFK', 'LHR'). Required. Use ALL CAPS. NOT a city name — for Tokyo, use 'HND' or 'NRT' explicitly; for London, use 'LHR'.

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

3-letter IATA airport code for arrival (e.g., 'JFK', 'CDG', 'HND'). Required. Use ALL CAPS. NOT a city name. For multi-airport cities, pick the specific airport you want results for.

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

Outbound departure date in YYYY-MM-DD format (e.g., '2026-08-15'). Required. Must be a future date; past dates return empty results. NOT a time or datetime — date only.

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

Return date in YYYY-MM-DD format for round-trip searches. Leave empty for one-way. Must be on or after departureDate. NOT used for multi-city — multi-city support is on the v0.2 roadmap.

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

Number of adult passengers (age 12+). Default: 1. Min 1, max 9. Most airlines cap total passengers per booking at 9.

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

Number of child passengers (age 2-11). Default: 0. Max 8. Children require an adult companion on most carriers.

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

Number of infants (under 2) with their own seat. Default: 0. Max 8. NOT 'lap infants' — those go in the infantsOnLap field.

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

Number of lap-held infants (under 2, no seat). Default: 0. Max equals number of adults — one lap infant per adult. NOT 'infants with their own seat' — those go in infantsInSeat.

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

Cabin class to search. Default 'economy'. Premium economy and business are not available on every route. NOT a price filter — for max-price use 'maxPrice' field.

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

Filter by maximum number of stops. 0=nonstop only, 1=up to one stop, 2=up to two stops. Leave empty for no limit. Applied to each leg of round-trips.

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

ISO 4217 currency code for prices (e.g., 'USD', 'EUR', 'GBP', 'JPY'). Default 'USD'. Google Flights converts at its own rate. NOT the country of search — that is the 'country' field.

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

Two-letter ISO country code for Google's search market (e.g., 'us', 'uk', 'de', 'jp'). Default 'us'. Affects which airlines/OTAs appear in booking links. NOT the currency — for currency use 'currency'.

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

Two-letter ISO 639-1 language code for response (e.g., 'en', 'es', 'fr', 'de', 'ja'). Default 'en'. Affects airline/airport name strings only — prices and codes are unchanged.

## `maxResults` (type: `integer`):

Maximum number of flight itineraries to return per run. Default 50, max 200. Lower numbers run faster and cost less (PPE is .005 per flight).

## Actor input object example

```json
{
  "origin": "LAX",
  "destination": "JFK",
  "departureDate": "2026-08-15",
  "returnDate": "2026-08-22",
  "adults": 1,
  "children": 0,
  "infantsInSeat": 0,
  "infantsOnLap": 0,
  "cabinClass": "economy",
  "currency": "USD",
  "country": "us",
  "language": "en",
  "maxResults": 50
}
```

# Actor output Schema

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

No description

## `csv` (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 = {
    "origin": "LAX",
    "destination": "JFK",
    "departureDate": "2026-08-15"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/google-flights-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "origin": "LAX",
    "destination": "JFK",
    "departureDate": "2026-08-15",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/google-flights-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": "LAX",
  "destination": "JFK",
  "departureDate": "2026-08-15"
}' |
apify call khadinakbar/google-flights-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Flights Scraper — Fares, Routes, Booking Links",
        "description": "Scrape Google Flights for one-way and round-trip itineraries. Prices, airlines, stops, layovers, aircraft, carbon emissions, and direct booking deeplinks. MCP-ready.",
        "version": "0.7",
        "x-build-id": "eoywbHf839N8A94mS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~google-flights-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-google-flights-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/khadinakbar~google-flights-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-google-flights-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/khadinakbar~google-flights-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-google-flights-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",
                    "departureDate"
                ],
                "properties": {
                    "origin": {
                        "title": "Origin Airport (IATA)",
                        "pattern": "^[A-Z]{3}$",
                        "type": "string",
                        "description": "3-letter IATA airport code for departure (e.g., 'LAX', 'JFK', 'LHR'). Required. Use ALL CAPS. NOT a city name — for Tokyo, use 'HND' or 'NRT' explicitly; for London, use 'LHR'."
                    },
                    "destination": {
                        "title": "Destination Airport (IATA)",
                        "pattern": "^[A-Z]{3}$",
                        "type": "string",
                        "description": "3-letter IATA airport code for arrival (e.g., 'JFK', 'CDG', 'HND'). Required. Use ALL CAPS. NOT a city name. For multi-airport cities, pick the specific airport you want results for."
                    },
                    "departureDate": {
                        "title": "Departure Date",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Outbound departure date in YYYY-MM-DD format (e.g., '2026-08-15'). Required. Must be a future date; past dates return empty results. NOT a time or datetime — date only."
                    },
                    "returnDate": {
                        "title": "Return Date (optional)",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Return date in YYYY-MM-DD format for round-trip searches. Leave empty for one-way. Must be on or after departureDate. NOT used for multi-city — multi-city support is on the v0.2 roadmap."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of adult passengers (age 12+). Default: 1. Min 1, max 9. Most airlines cap total passengers per booking at 9.",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of child passengers (age 2-11). Default: 0. Max 8. Children require an adult companion on most carriers.",
                        "default": 0
                    },
                    "infantsInSeat": {
                        "title": "Infants in seat",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of infants (under 2) with their own seat. Default: 0. Max 8. NOT 'lap infants' — those go in the infantsOnLap field.",
                        "default": 0
                    },
                    "infantsOnLap": {
                        "title": "Infants on lap",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of lap-held infants (under 2, no seat). Default: 0. Max equals number of adults — one lap infant per adult. NOT 'infants with their own seat' — those go in infantsInSeat.",
                        "default": 0
                    },
                    "cabinClass": {
                        "title": "Cabin Class",
                        "enum": [
                            "economy",
                            "premium_economy",
                            "business",
                            "first"
                        ],
                        "type": "string",
                        "description": "Cabin class to search. Default 'economy'. Premium economy and business are not available on every route. NOT a price filter — for max-price use 'maxPrice' field.",
                        "default": "economy"
                    },
                    "maxStops": {
                        "title": "Max Stops",
                        "minimum": 0,
                        "maximum": 2,
                        "type": "integer",
                        "description": "Filter by maximum number of stops. 0=nonstop only, 1=up to one stop, 2=up to two stops. Leave empty for no limit. Applied to each leg of round-trips."
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR",
                            "GBP",
                            "CAD",
                            "AUD",
                            "JPY",
                            "CHF",
                            "CNY",
                            "INR",
                            "MXN",
                            "BRL",
                            "ZAR",
                            "AED",
                            "SAR",
                            "SGD",
                            "HKD",
                            "KRW",
                            "THB",
                            "PHP",
                            "IDR",
                            "MYR",
                            "TRY",
                            "RUB",
                            "PLN",
                            "SEK",
                            "NOK",
                            "DKK",
                            "CZK",
                            "HUF",
                            "RON",
                            "NZD",
                            "ILS"
                        ],
                        "type": "string",
                        "description": "ISO 4217 currency code for prices (e.g., 'USD', 'EUR', 'GBP', 'JPY'). Default 'USD'. Google Flights converts at its own rate. NOT the country of search — that is the 'country' field.",
                        "default": "USD"
                    },
                    "country": {
                        "title": "Country (search market)",
                        "enum": [
                            "us",
                            "uk",
                            "ca",
                            "au",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "br",
                            "mx",
                            "jp",
                            "kr",
                            "in",
                            "sg",
                            "ae",
                            "za",
                            "ch",
                            "se",
                            "no",
                            "dk",
                            "pl",
                            "tr",
                            "id",
                            "ph",
                            "th",
                            "my",
                            "vn",
                            "nz",
                            "ie",
                            "be",
                            "at"
                        ],
                        "type": "string",
                        "description": "Two-letter ISO country code for Google's search market (e.g., 'us', 'uk', 'de', 'jp'). Default 'us'. Affects which airlines/OTAs appear in booking links. NOT the currency — for currency use 'currency'.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "ru",
                            "ja",
                            "ko",
                            "zh",
                            "ar",
                            "hi",
                            "tr",
                            "pl",
                            "nl",
                            "sv",
                            "da",
                            "no",
                            "fi",
                            "cs",
                            "hu",
                            "ro",
                            "el",
                            "th",
                            "vi",
                            "id",
                            "ms",
                            "he",
                            "uk"
                        ],
                        "type": "string",
                        "description": "Two-letter ISO 639-1 language code for response (e.g., 'en', 'es', 'fr', 'de', 'ja'). Default 'en'. Affects airline/airport name strings only — prices and codes are unchanged.",
                        "default": "en"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of flight itineraries to return per run. Default 50, max 200. Lower numbers run faster and cost less (PPE is .005 per flight).",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
