# Google Flights Scraper (`scrapapi/google-flights-scraper`) Actor

Extract flight data from Google Flights using the Google Flights Scraper. Collect airline names, departure and arrival times, prices, flight durations, and routes automatically. Ideal for travel research, price monitoring, and airline market analysis.

- **URL**: https://apify.com/scrapapi/google-flights-scraper.md
- **Developed by:** [ScrapAPI](https://apify.com/scrapapi) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 0 monthly users, 93.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$19.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

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

The Google Flights Scraper is a Playwright-powered web scraping tool that automatically collects structured flight data from Google Flights — including prices, durations, airline details, and route legs — to save hours of manual research. It solves the pain of monitoring fares and itineraries by turning live search results into clean, analytics-ready records, making it a practical Google Flights API alternative for teams that need to scrape Google Flights at scale. Built for marketers, developers, data analysts, and researchers, it enables price monitoring, itinerary comparison, and route intelligence across markets with repeatable workflows.

### What data / output can you get?

Below are real dataset fields and nested keys this Google Flights data scraper produces when it streams items to the Apify dataset. Example values are illustrative.

| Data type | Description | Example value |
| --- | --- | --- |
| is_best | Marks whether the result appears in the “Best” section | true |
| type | Trip type inferred from card content | "One way" |
| price | Parsed fare from the card | 329 |
| currency | Currency used in the run | "USD" |
| duration_minutes | Total duration extracted from the card (minutes) | 415 |
| airline | Carrier code from the first leg | "AA" |
| departure_airport | IATA of first leg departure | "LAX" |
| arrival_airport | IATA of last leg arrival | "JFK" |
| raw_flight_data.total_duration | Total duration in minutes (duplicate of duration_minutes) | 415 |
| raw_flight_data.carbon_emissions.this_flight | Emissions parsed from card text (grams) | 120000 |
| raw_flight_data.flights[0].flight_number | Airline code and flight number | "AA 100" |
| raw_flight_data.flights[0].airplane | Aircraft type detected from text | "Boeing 777" |
| raw_flight_data.airline_logo | Absolute URL to airline logo if available | "https://www.gstatic.com/flights/airline_logos/70px/AA.png" |
| raw_flight_data.departure_token | Stable token derived from card content | "TOKEN_18374652" |

Notes:
- The scraper pushes items in real time as it finds them; nested legs are available under raw_flight_data.flights[].  
- Export your dataset as JSON, CSV, or Excel from Apify for downstream analytics and automations.

### Key features

- 🚀 Real-time data streaming
  Each flight card is parsed and pushed instantly to the dataset with is_best, price, airline, duration_minutes, and more — perfect for dashboards and pipelines.

- 🧠 Playwright-based scraping engine
  Uses a headless Chromium session with a realistic user agent and viewport to power reliable Google Flights web scraping.

- 🌍 Localization controls
  Configure hl (language) and gl (country) plus currency for localized results — ideal for global price monitoring and regional analyses.

- 🗺️ Multi-city input support
  Accepts a multi_city_json string to describe complex itineraries across multiple legs for broader Google Flights itinerary data extraction.

- 📜 Smart scroll depth
  Control how many times to click “More flights” with max_pages to expand result coverage.

- 🛡️ Proxy-ready and retry logic
  Integrates with Apify Proxy (when enabled) and includes retry attempts to improve resilience on dynamic pages.

- 🔄 Google Flights price monitoring
  Capture current fares repeatedly to build your own google flights price scraper workflow and detect changes over time.

- 🔗 Integration-friendly output
  Structured JSON makes it easy to plug into BI tools, internal APIs, or automation platforms — a practical Google Flights API alternative.

### How to use Google Flights Scraper - step by step

1. Create an Apify account  
   Sign up or log in to Apify.

2. Open the actor in the Apify Store  
   Search for “Google Flights Scraper” and click Try for free.

3. Configure input parameters  
   - departureIATA (string): Single IATA or comma-separated codes (e.g., "LAX" or "LAX,SFO")  
   - arrivalIATA (string): Comma-separated IATA codes (e.g., "JFK,BOS")  
   - departureDate / arrivalDate (YYYY-MM-DD): Use ISO format  
   - multi_city_json (string): JSON like [{"departure_id":"LAX","arrival_id":"JFK","date":"2026-08-01"}, ...]  
   - currency (3 letters), hl (language), gl (country) for localization  
   - max_pages to control “More flights” expansion  
   - proxyConfiguration to enable Apify Proxy if needed

4. Start the run  
   Click Start. The scraper navigates to Google Flights, waits for results, scrolls, and clicks “More flights” based on max_pages.

5. Watch results stream live  
   Items appear in the Dataset with keys like is_best, price, currency, airline, duration_minutes, and raw_flight_data (full details).

6. Export your data  
   Download the dataset in JSON, CSV, or Excel for analysis or feed it into your internal tools.

Pro Tip: For complex itineraries, provide multi_city_json to model multi-leg routes and enrich your google flights data extraction workflows.

### Use cases

| Use case name | Description |
| --- | --- |
| Travel pricing teams — fare tracking | Monitor routes daily to detect price drops and build a google flights price monitoring dashboard with structured outputs. |
| Market research — airline benchmarking | Compare durations, stops, and carriers across origin–destination pairs to inform airline market analysis. |
| OTAs & startups — route discovery | Collect itineraries and durations to prioritize inventory and surface competitive options programmatically. |
| Data engineering — API pipeline | Treat the dataset as a Google Flights API alternative by exporting via Apify API into ETL jobs and warehouses. |
| Content & SEO — deal pages | Automate fresh deal content with current fares and flight details for destination pages and blogs. |
| Academic & policy — network studies | Extract route legs and durations to analyze connectivity, emissions mentions, and travel patterns at scale. |

### Why choose Google Flights Scraper?

Built for precision and reliability, this Google Flights scraping tool combines a headless browser with structured parsing to deliver consistent, production-ready outputs.

- ✅ Accurate, structured results: Extracts price, airline, duration_minutes, airports, and nested legs for analysis-ready records.
- 🌐 Multilingual & regional: Control hl and gl for localized SERPs and set currency to match your reporting.
- 📈 Scalable runs: Expand coverage with max_pages for deeper result sets in a single execution.
- 💻 Developer-friendly: JSON-first design simplifies integration into pipelines and supports automated google flights web scraping workflows.
- 🛡️ Safe & robust: Optional Apify Proxy and retries help mitigate volatility and soft blocks on dynamic pages.
- 💸 Cost-effective automation: Replace manual checks with a repeatable google flights scraping tool that scales with your needs.
- 🔁 Better than brittle extensions: Avoid flaky browser add-ons; run consistent, server-side jobs on Apify infrastructure.

In short, it’s a dependable google flights scraping bot designed for teams that value clean data and repeatable processes.

### Is it legal / ethical to use Google Flights Scraper?

Yes — when used responsibly. This tool collects information from publicly available Google Flights pages without logging into accounts.

Guidelines for responsible use:
- Scrape only public data and respect platform policies.
- Configure reasonable run frequency and concurrency.
- Comply with applicable regulations (e.g., GDPR, CCPA) and your organization’s legal guidelines.
- Do not attempt to access private or authenticated content.

Always verify your specific use case with your legal team.

### Input parameters & output format

Example input (JSON)
```json
{
  "departureIATA": "LAX",
  "arrivalIATA": "JFK",
  "departureDate": "2026-07-28",
  "arrivalDate": "",
  "multi_city_json": "",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "seatclass": "1",
  "stops": "0",
  "alliances": "ALL",
  "airlines": "ALL",
  "maxPrice": 0,
  "currency": "USD",
  "hl": "en",
  "gl": "us",
  "max_pages": 1,
  "maximum": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

Parameters

- departureIATA (string) — 3-letter IATA code(s) (e.g., LAX, JFK). Multiple codes supported. Default: "LAX". Required: No.
- arrivalIATA (string) — List of IATA codes separated by commas (supports bulk input). Use 'london' for LHR, LGW, STN, LTN, LCY. Default: "JFK". Required: No.
- departureDate (string) — Pick your travel date. Format: YYYY-MM-DD. Default: "2026-07-28". Required: No.
- departureDateRng (string) — Optional range for departure (e.g., +1, -1). Default: "". Required: No.
- arrivalDate (string) — Pick your return date (leave empty for one-way). Format: YYYY-MM-DD (optional). Default: "". Required: No.
- arrivalDateRng (string) — Optional range for return (e.g., +1, -1). Default: "". Required: No.
- multi\_city\_json (string) — JSON string for multi-city trips. Format: \[{"departure\_id":"...","arrival\_id":"...","date":"..."}]. Default: "". Required: No.
- adults (integer) — Number of adult passengers (12+ years). Default: 1. Min: 1, Max: 9. Required: No.
- children (integer) — Number of children (2-12 years). Default: 0. Min: 0, Max: 9. Required: No.
- infants (integer) — Number of infants (under 2 years, on lap). Default: 0. Min: 0, Max: 9. Required: No.
- seatclass (string) — Choose your comfort level. One of "1","2","3","4". Default: "1". Required: No.
- stops (string) — Filter by number of layovers. One of "0","1","2". Default: "0". Required: No.
- alliances (string) — Filter by (STAR, SKYTEAM, ONEWORLD). Default: "ALL". Required: No.
- airlines (string) — Comma-separated airline codes (e.g., AA, DL). Default: "ALL". Required: No.
- maxPrice (integer) — Set a maximum price (0 for no limit). Default: 0. Required: No.
- currency (string) — Preferred currency (USD, EUR, BDT, etc.). 3 letters. Default: "USD". Required: No.
- hl (string) — Language code for results (e.g., 'en', 'fr', 'de', 'es'). Default: "en". Required: No.
- gl (string) — Country code for results (e.g., 'us', 'uk', 'fr', 'de'). Default: "us". Required: No.
- max\_pages (integer) — How many “More flights” buttons to click. Default: 1 (min 1). Required: No.
- maximum (integer) — Total number of flights to collect. Default: 20 (min 1, max 100). Required: No.
- proxyConfiguration (object) — Keep your requests safe and undetected. Default: {"useApifyProxy": false}. Required: No.

Output format

The actor streams each result to the dataset with the following structure:

```json
{
  "is_best": true,
  "type": "One way",
  "price": 329,
  "currency": "USD",
  "duration_minutes": 415,
  "airline": "AA",
  "departure_airport": "LAX",
  "arrival_airport": "JFK",
  "raw_flight_data": {
    "flights": [
      {
        "departure_airport": { "name": "Los Angeles", "id": "LAX", "time": "2026-07-28 07:00" },
        "arrival_airport": { "name": "New York", "id": "JFK", "time": "2026-07-28 15:55" },
        "airline": "AA",
        "flight_number": "AA 100",
        "duration": 0,
        "airplane": "Boeing 777",
        "airline_logo": "https://www.gstatic.com/flights/airline_logos/70px/AA.png",
        "travel_class": "Economy",
        "legroom": "31 in",
        "extensions": ["Nonstop", "Wi-Fi"]
      }
    ],
    "total_duration": 415,
    "carbon_emissions": {
      "this_flight": 120000,
      "typical_for_this_route": 0,
      "difference_percent": 0
    },
    "price": 329,
    "type": "One way",
    "airline_logo": "https://www.gstatic.com/flights/airline_logos/70px/AA.png",
    "extensions": ["Checked baggage for a fee"],
    "departure_token": "TOKEN_18374652"
  }
}
```

Notes:

- Some nested fields depend on what’s visible in the card (e.g., airplane, extensions). If unavailable, they may be empty or defaulted.

### FAQ

#### Is there a free trial or pricing plan?

Yes. You can run the actor on Apify and take advantage of the platform’s free trial minutes to evaluate the scraper before upgrading.

#### Do I need to log in to Google?

No. The scraper navigates public Google Flights pages without account authentication, using a headless browser session to extract data.

#### Can I use this as a Google Flights API alternative?

Yes. Treat the Apify dataset and API as your google flights scraping tool endpoint — results stream in JSON and can be fetched programmatically.

#### Does it support Python integrations?

Yes. While the actor runs on Apify, the output is standard JSON. You can pull results into Python scripts for analysis or automation.

#### How many results can it collect per run?

Coverage depends on the page and max\_pages setting, which controls how many times the scraper clicks “More flights.” Larger values expand the result set.

#### Which data points are included?

Top-level fields include is\_best, type, price, currency, duration\_minutes, airline, departure\_airport, arrival\_airport, plus raw\_flight\_data with legs, emissions, airline\_logo, and a departure\_token.

#### Can I monitor prices over time?

Yes. Schedule runs and compare price values between datasets to implement your own google flights price monitoring workflow.

#### Is it legal to scrape Google Flights?

Yes — when you collect public data responsibly and comply with relevant laws and platform terms. Avoid private/authenticated content and consult your legal team for specific use cases.

### Final thoughts

The Google Flights Scraper is built to turn live Google Flights pages into structured, analysis-ready data for pricing, research, and travel products. With real-time streaming, localization controls, and integration-friendly JSON, it’s a practical choice for marketers, developers, analysts, and researchers. Use it as a Google Flights API alternative, automate exports via the Apify API, and start extracting smarter itinerary and fare insights at scale.

# Actor input Schema

## `departureIATA` (type: `string`):

3-letter IATA code(s) (e.g., LAX, JFK). Multiple codes supported.

## `arrivalIATA` (type: `string`):

List of IATA codes separated by commas (supports bulk input). Use 'london' for LHR, LGW, STN, LTN, LCY.

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

Pick your travel date.

## `departureDateRng` (type: `string`):

Optional range for departure (e.g., +1, -1).

## `arrivalDate` (type: `string`):

Pick your return date (leave empty for one-way).

## `arrivalDateRng` (type: `string`):

Optional range for return (e.g., +1, -1).

## `multi_city_json` (type: `string`):

JSON string for multi-city trips. Format: \[{"departure\_id":"...","arrival\_id":"...","date":"..."}]. When provided, departure\_id, arrival\_id, and outbound\_date are not required.

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

Number of adult passengers (12+ years).

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

Number of children (2-12 years).

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

Number of infants (under 2 years, on lap).

## `seatclass` (type: `string`):

Choose your comfort level.

## `stops` (type: `string`):

Filter by number of layovers.

## `alliances` (type: `string`):

Filter by (STAR, SKYTEAM, ONEWORLD).

## `airlines` (type: `string`):

Comma-separated airline codes (e.g., AA, DL).

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

Set a maximum price (0 for no limit).

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

Preferred currency (USD, EUR, BDT, etc.).

## `hl` (type: `string`):

Language code for results (e.g., 'en', 'fr', 'de', 'es'). Default: 'en'

## `gl` (type: `string`):

Country code for results (e.g., 'us', 'uk', 'fr', 'de'). Default: 'us'

## `max_pages` (type: `integer`):

How many 'More flights' buttons to click.

## `maximum` (type: `integer`):

Total number of flights to collect.

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

Keep your requests safe and undetected.

## Actor input object example

```json
{
  "departureIATA": "LAX",
  "arrivalIATA": "JFK",
  "departureDate": "2026-07-28",
  "departureDateRng": "",
  "arrivalDate": "",
  "arrivalDateRng": "",
  "multi_city_json": "",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "seatclass": "1",
  "stops": "0",
  "alliances": "ALL",
  "airlines": "ALL",
  "maxPrice": 0,
  "currency": "USD",
  "hl": "en",
  "gl": "us",
  "max_pages": 1,
  "maximum": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapapi/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 = { "proxyConfiguration": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("scrapapi/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 '{
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scrapapi/google-flights-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Flights Scraper",
        "description": "Extract flight data from Google Flights using the Google Flights Scraper. Collect airline names, departure and arrival times, prices, flight durations, and routes automatically. Ideal for travel research, price monitoring, and airline market analysis.",
        "version": "0.1",
        "x-build-id": "u6wRgZuccXW8MGxKu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapapi~google-flights-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapapi-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/scrapapi~google-flights-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapapi-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/scrapapi~google-flights-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapapi-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",
                "properties": {
                    "departureIATA": {
                        "title": "🛫 Departure Airport(s)",
                        "type": "string",
                        "description": "3-letter IATA code(s) (e.g., LAX, JFK). Multiple codes supported.",
                        "default": "LAX"
                    },
                    "arrivalIATA": {
                        "title": "🛬 Destination Airport(s)",
                        "type": "string",
                        "description": "List of IATA codes separated by commas (supports bulk input). Use 'london' for LHR, LGW, STN, LTN, LCY.",
                        "default": "JFK"
                    },
                    "departureDate": {
                        "title": "📅 Departure Date",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Pick your travel date.",
                        "default": "2026-07-28"
                    },
                    "departureDateRng": {
                        "title": "🗓️ Departure Flex Days",
                        "type": "string",
                        "description": "Optional range for departure (e.g., +1, -1).",
                        "default": ""
                    },
                    "arrivalDate": {
                        "title": "🔙 Return Date",
                        "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
                        "type": "string",
                        "description": "Pick your return date (leave empty for one-way).",
                        "default": ""
                    },
                    "arrivalDateRng": {
                        "title": "🗓️ Return Flex Days",
                        "type": "string",
                        "description": "Optional range for return (e.g., +1, -1).",
                        "default": ""
                    },
                    "multi_city_json": {
                        "title": "🗺️ Multi-City JSON",
                        "type": "string",
                        "description": "JSON string for multi-city trips. Format: [{\"departure_id\":\"...\",\"arrival_id\":\"...\",\"date\":\"...\"}]. When provided, departure_id, arrival_id, and outbound_date are not required.",
                        "default": ""
                    },
                    "adults": {
                        "title": "🧔 Adults",
                        "minimum": 1,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of adult passengers (12+ years).",
                        "default": 1
                    },
                    "children": {
                        "title": "👦 Children",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of children (2-12 years).",
                        "default": 0
                    },
                    "infants": {
                        "title": "👶 Infants",
                        "minimum": 0,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of infants (under 2 years, on lap).",
                        "default": 0
                    },
                    "seatclass": {
                        "title": "💺 Cabin Class",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4"
                        ],
                        "type": "string",
                        "description": "Choose your comfort level.",
                        "default": "1"
                    },
                    "stops": {
                        "title": "🛑 Max Stops",
                        "enum": [
                            "0",
                            "1",
                            "2"
                        ],
                        "type": "string",
                        "description": "Filter by number of layovers.",
                        "default": "0"
                    },
                    "alliances": {
                        "title": "🤝 Alliances",
                        "type": "string",
                        "description": "Filter by (STAR, SKYTEAM, ONEWORLD).",
                        "default": "ALL"
                    },
                    "airlines": {
                        "title": "✈️ Specific Airlines",
                        "type": "string",
                        "description": "Comma-separated airline codes (e.g., AA, DL).",
                        "default": "ALL"
                    },
                    "maxPrice": {
                        "title": "💰 Budget Limit",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Set a maximum price (0 for no limit).",
                        "default": 0
                    },
                    "currency": {
                        "title": "💵 Currency",
                        "minLength": 3,
                        "maxLength": 3,
                        "type": "string",
                        "description": "Preferred currency (USD, EUR, BDT, etc.).",
                        "default": "USD"
                    },
                    "hl": {
                        "title": "🌐 Language Code",
                        "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": "Language code for results (e.g., 'en', 'fr', 'de', 'es'). Default: 'en'",
                        "default": "en"
                    },
                    "gl": {
                        "title": "🌍 Country Code",
                        "enum": [
                            "us",
                            "uk",
                            "ca",
                            "au",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "pl",
                            "br",
                            "ru",
                            "jp",
                            "kr",
                            "cn",
                            "tw",
                            "in",
                            "sa",
                            "tr",
                            "se",
                            "dk",
                            "no",
                            "fi",
                            "cz",
                            "hu",
                            "ro",
                            "mx",
                            "ar",
                            "ch",
                            "at",
                            "be",
                            "ie",
                            "nz",
                            "sg",
                            "my",
                            "th",
                            "ph",
                            "id",
                            "vn"
                        ],
                        "type": "string",
                        "description": "Country code for results (e.g., 'us', 'uk', 'fr', 'de'). Default: 'us'",
                        "default": "us"
                    },
                    "max_pages": {
                        "title": "📜 Scroll Depth",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many 'More flights' buttons to click.",
                        "default": 1
                    },
                    "maximum": {
                        "title": "🔢 Max Results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Total number of flights to collect.",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "🛡️ Proxy Settings",
                        "type": "object",
                        "description": "Keep your requests safe and undetected."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
