# Google Flights Scraper API 💰$1/1k — Fares & Multi-City (`memo23/google-flights-scraper`) Actor

\[💰$1/1K] Google Flights scraper for fare monitoring and price comparison. One-way, round-trip and multi-city, with full result sets — not just the top picks. Returns price, airline, stops, times, aircraft and legroom, plus bookable OTA/airline options per fare. Stops, airlines and max-price filters

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

## Pricing

from $1.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

## Google Flights Scraper API — Fares, Itineraries & Multi-City

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/google-flights-card.png" alt="Google Flights Scraper" width="760">
</p>

### How It Works

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

1. **Your input** — origin, destination, dates, passengers, cabin, multi-city legs, market/currency/language.
2. **Shopping RPC** — the Actor pulls session tokens from the flights page, POSTs the `GetShoppingResults` gRPC-web search, and decodes Google's **full** sorted result set (~150 itineraries on busy routes) plus price insights. Pure HTTP, no browser.
3. **Your dataset** — flat rows or nested JSON with price, carrier, stops, duration, per-segment aircraft/flight-number/legroom/times, a booking token, and optional booking options — CSV-ready or JSON.

**Scrape flight itineraries, fares, schedules and routes from Google Flights — by route + dates — at $1 per 1,000 results.** One-way, round-trip and multi-city all supported. Each itinerary carries price, airline, stops, duration, exact times, **aircraft type, flight number, legroom**, full airport names, and a booking token — plus, optionally, **the airlines/OTAs selling each fare with their prices, fare names and booking links**. Pure HTTP — no browser, no CAPTCHA solver (a residential proxy is recommended and on by default, since Google serves empty results to datacenter IPs). Output is CSV-ready flat rows or nested JSON, straight into your Apify dataset.

### Why Use This Scraper?

- **$1 / 1,000 results** — flat, simple pricing. No opaque per-page math.
- **No browser, no CAPTCHA solver** — pure HTTP. A residential proxy (on by default) is used because Google returns empty results to datacenter IPs; responses are small so bandwidth cost is minimal.
- **Full trip coverage** — one-way, round-trip, and multi-city (each leg searched and returned).
- **Deep itinerary data** — per-segment airport codes + full names, departure/arrival timestamps, duration, **aircraft model, flight number, legroom**, plus carrier and booking token.
- **Booking options (who sells it & for how much)** — optionally resolve, per itinerary, the airlines/OTAs selling the fare with **per-option price, fare name (e.g. "Blue Basic"), baggage fee, booking domain and a click-through URL**. Pure HTTP — no login, no browser.
- **Price insights** — current vs typical price and the delta, straight from Google.
- **Best & other flights** — every row is tagged `best` or `other` so you can rank instantly.
- **Global** — any market, currency and language (`gl` / `curr` / `hl`).
- **Spreadsheet or JSON** — flat dashed columns (`price-usd`, `segments-0-aircraft`…) for Excel/Sheets, or nested objects for pipelines.

### Overview

This Actor calls Google Flights' internal `GetShoppingResults` search service to harvest structured itineraries for a route, date and passenger mix. It pulls the session tokens from the flights page, posts the search, and parses the sorted result set (best + other flights) plus price insights.

Output is **one row per itinerary**. Each itinerary nests its flight segments (with per-segment aircraft, flight number, legroom and times). For multi-city, every leg is searched and its rows are tagged with `multi-city-leg`.

### Supported Inputs

| Input | What it does |
|---|---|
| **Route + dates** | `origin`, `destination`, `departDate` (+ optional `returnDate`). IATA codes, e.g. `LAX`, `JFK`. **Comma-separate for multi-airport / metro search**, e.g. `LAX,BUR` → `JFK,EWR`. |
| **Stops filter** | `maxStops`: `0` = nonstop only, `1` = ≤1 stop, `2` = ≤2 stops. |
| **Airlines filter** | `airlines`: include only these carrier codes, e.g. `["DL"]` (Delta) or `["DL","AA"]`. |
| **Max price** | `maxPrice`: only itineraries at or below this price (in the selected currency). |
| **Booking options** | `resolveBookingOptions`: for each itinerary, fetch who sells the fare (airline/OTA) with price, fare name, baggage fee and a booking URL. Capped by `maxBookingItineraries`. One-way, round-trip & multi-city. |
| **Multi-city** | `multiCityLegs`: one row per leg as `ORIGIN-DEST-DATE` (e.g. `LAX-JFK-2026-08-04`). Each leg is searched and tagged by leg index. |
| **Passengers & cabin** | `adults`, `children`, `infantsInSeat`, `infantsOnLap`, `cabinClass`. |
| **Locale** | `market` (gl), `currency` (curr), `language` (hl). |

**Not supported:** hotels or car hire, live booking/checkout, seat selection. This Actor is flights-only.

### Use Cases

| Audience | What they do with it |
|---|---|
| **Travel aggregators / OTAs** | Power a fare-comparison page across many routes and dates. |
| **Fare-alert products** | Track a route + date daily and notify when the cheapest fare drops. |
| **Revenue / pricing teams** | Snapshot competitor fares and price bands over time. |
| **Data & ML pipelines** | Ingest multi-route fare data daily to model price movement. |
| **Travel agencies** | Export structured itineraries for clients on demand. |
| **Researchers** | Build open fare/route datasets for connectivity analysis. |

### Input Configuration

| Field | Type | Required | Notes |
|---|---|---|---|
| `origin` | string | — | Origin IATA code, e.g. `LAX`. Defaults to `LAX`. |
| `destination` | string | — | Destination IATA code, e.g. `JFK`. Defaults to `JFK`. |
| `departDate` | string | — | `YYYY-MM-DD`. Defaults to ~30 days out if empty. |
| `returnDate` | string | — | Omit for one-way; set for round-trip. |
| `multiCityLegs` | array | — | List of `ORIGIN-DEST-DATE` strings, e.g. `["LAX-JFK-2026-08-04","JFK-MIA-2026-08-10"]`. Overrides the single-route fields. |
| `adults` | integer | — | Default 1. |
| `children` / `infantsInSeat` / `infantsOnLap` | integer | — | Default 0. |
| `cabinClass` | enum | — | `economy` · `premium_economy` · `business` · `first`. |
| `maxStops` | integer | — | `0` = nonstop only, `1` = ≤1 stop, `2` = ≤2 stops. Empty = any. |
| `airlines` | array | — | Include only these airline IATA codes, e.g. `["DL","AA"]`. Empty = all. |
| `maxPrice` | integer | — | Only itineraries at or below this price, in the selected currency. Empty = no cap. |
| `resolveBookingOptions` | boolean | — | Resolve per-itinerary booking options (airlines/OTAs + price, fare name, baggage, URL). Default `false`. One-way, round-trip & multi-city. |
| `maxBookingItineraries` | integer | — | When the above is on, how many top itineraries to resolve (one extra request each). Default `10`. |
| `currency` | string | — | ISO 4217, e.g. `USD`, `EUR`. Default `USD`. |
| `market` | string | — | Country code, e.g. `US`, `GB`. Default `US`. |
| `language` | string | — | e.g. `en`, `de`. Default `en`. |
| `maxItems` | integer | — | Max itineraries to return. Default 100. |
| `proxy` | object | — | Residential proxy, **on by default**. Google serves empty results to datacenter IPs, so residential is needed. |

Everything is optional — run it with no input at all and it searches **LAX → JFK ~30 days out** as a sane default. Provide `origin`/`destination`/`departDate` (+ optional `returnDate`) for a normal search, or `multiCityLegs` for multi-city.

#### Example input

```json
{
  "origin": "LAX",
  "destination": "JFK",
  "departDate": "2026-08-04",
  "adults": 1,
  "cabinClass": "economy",
  "currency": "USD",
  "market": "US",
  "maxItems": 50
}
````

Multi-city:

```json
{
  "multiCityLegs": ["LAX-JFK-2026-08-04", "JFK-MIA-2026-08-10"],
  "adults": 1,
  "maxItems": 40
}
```

### Output Overview

One row per **itinerary**, tagged `best` or `other`. Each itinerary nests its **segments** (dashed columns like `segments-0-aircraft`). A nonstop itinerary has one segment; connections have more. Multi-city rows also carry `multi-city-leg`.

### Output Samples

Real smoke-test row (LAX→JFK, abbreviated):

```jsonc
{
  "index": 0,
  "price-usd": 154,
  "currency": "USD",
  "bucket": "best",
  "carrier-code": "B6",
  "carrier-name": "JetBlue",
  "from-code": "LAX",
  "to-code": "JFK",
  "depart-date": "2026-08-04",
  "depart-time": "16:20",
  "arrive-date": "2026-08-05",
  "arrive-time": "00:56",
  "stops": 0,
  "duration-minutes": 336,
  "booking-token": "CjRITUo3WF8xWkxNRVVB…",
  "segments-0-from-code": "LAX",
  "segments-0-from-name": "Los Angeles International Airport",
  "segments-0-to-code": "JFK",
  "segments-0-to-name": "John F. Kennedy International Airport",
  "segments-0-depart": "2026-08-04T16:20",
  "segments-0-arrive": "2026-08-05T00:56",
  "segments-0-duration-minutes": 336,
  "segments-0-airline": "JetBlue",
  "segments-0-flight-number": "B6824",
  "segments-0-aircraft": "Airbus A320",
  "segments-0-legroom": "33 in"
}
```

### Key Output Fields

**Itinerary**

- `price-usd`, `currency`, `bucket` (`best` / `other`)
- `carrier-code`, `carrier-name`
- `from-code`, `to-code`, `stops`, `duration-minutes`
- `depart-date` / `depart-time` / `arrive-date` / `arrive-time`
- `booking-token` — Google's booking-handoff token
- `multi-city-leg` — present only on multi-city runs

**Segments** (`segments-{n}-…`)

- `from-code` / `from-name` / `to-code` / `to-name`
- `depart` / `arrive` — ISO timestamps
- `duration-minutes`, `airline`, `flight-number`
- `aircraft`, `legroom`

**Booking options** (only when `resolveBookingOptions` is on)

- `booking-options-count` — number of bookable options found
- `cheapest-booking-price-usd` / `cheapest-booking-provider` — the cheapest option at a glance
- `booking-option-{n}-…` — per option: `provider`, `price-usd`, `fare-name` (e.g. "Blue Basic"), `domain`, `url` (click-through booking link)

### FAQ

**Is this an official Google API?**
No. It's an independent scraper that reads publicly available Google Flights search results. Not affiliated with or endorsed by Google.

**Do I need a proxy?**
Yes — a residential proxy is on by default and recommended. Google Flights has no CAPTCHA, but it returns **empty results to datacenter IPs**, so a residential IP is needed for reliable data. Responses are small, so the bandwidth cost is minimal. If you run from your own residential IP you can disable it.

**Does it do multi-city?**
Yes. Set `multiCityLegs` to a list of `ORIGIN-DEST-DATE` strings (e.g. `["LAX-JFK-2026-08-04","JFK-MIA-2026-08-10"]`); each leg is searched and its rows are tagged with `multi-city-leg`. `maxItems` is split evenly across legs.

**One-way vs round-trip?**
Omit `returnDate` for one-way; include it for round-trip (round-trip rows show the priced round-trip itinerary).

**What currency / market?**
`currency` (ISO 4217), `market` (country), `language`. Defaults USD / US / en.

**How many results per search?**
The Actor requests Google's **full** result set (the same as clicking "View more flights") — typically **~100–150 itineraries** across best + other on a busy route, controlled by `maxItems`. Run many route×date searches to build an even larger dataset.

**Why are some itineraries `best` and others `other`?**
Google groups its top recommendations as "best" and the rest as "other". Both are returned and tagged.

**Can I get who sells the ticket and for how much?**
Yes — set `resolveBookingOptions: true`. For each itinerary (up to `maxBookingItineraries`), the Actor resolves the bookable options — the airline and/or OTAs selling that fare — with each option's price, fare name (e.g. "Blue Basic"), first checked-bag fee, booking domain and a click-through URL. It adds extra requests per itinerary (one for one-way/multi-city; round-trip does a select-outbound → pick-return → book flow), so it's capped and off by default. Supported for one-way, round-trip and multi-city.

### Support

Found a bug or need a field that isn't exposed? Open an issue on the Actor's **Issues** tab on Apify, or reach out via the Apify Store profile. Include your input JSON and the run ID.

### Additional Services

Need a custom flight or travel data pipeline — a different source, a bespoke schema, scheduled delivery to S3/BigQuery, or fare monitoring with alerts? Custom scraping and data-engineering work is available via the Apify Store profile.

### Explore More Scrapers

- **Skyscanner Flight Scraper** — `memo23/skyscanner-scraper` — 180+ fields per itinerary, Best/Cheapest/Fastest tags, OTA aggregation.
- **Expedia.com & Hotels.com Scraper** — `memo23/expedia-scraper`
- **140+ other scrapers** — see the developer's Apify Store profile.

### ⚠️ Disclaimer

This Actor accesses publicly available flight search data on Google Flights for legitimate research, market-intelligence and business-analysis purposes. It is **not affiliated with, endorsed by, or sponsored by Google LLC.** "Google Flights" is a trademark of Google LLC; it is used here only to describe the data source. Use of this Actor must comply with Google's Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading Google's infrastructure
- Not use scraped data to violate user privacy or terms
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

### SEO Keywords

google flights scraper, google flights api, google flights data, flight price scraper, airfare scraper, flight scraper, flight itinerary scraper, multi-city flight scraper, round-trip flight scraper, cheapest flight finder, flight price monitoring, fare alert data, travel data api, airline schedule scraper, flight comparison data, google flights json export, google flights csv export, flight deals scraper, apify flight scraper, flight price tracker, airfare monitoring api, flight route scraper, booking token scraper, flight segment data

# Actor input Schema

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

Origin airport IATA code, e.g. LAX. Comma-separate for multi-airport / metro search, e.g. LAX,BUR,LGB. Defaults to LAX if left empty.

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

Destination airport IATA code, e.g. JFK. Comma-separate for multi-airport, e.g. JFK,EWR,LGA. Defaults to JFK if left empty.

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

Departure date. Leave empty to default to ~30 days from today (so the Actor always runs out of the box).

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

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

## `multiCityLegs` (type: `array`):

For multi-city trips only. Add one row per leg as ORIGIN-DESTINATION-DATE, e.g. LAX-JFK-2026-08-04. When set, this overrides the From / To / dates above. Leave empty for one-way or round-trip.

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

Number of adult passengers (12+).

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

Number of child passengers (2-11).

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

Infants with their own seat.

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

Infants on an adult's lap.

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

Cabin class for the search.

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

Filter by number of stops: 0 = nonstop only, 1 = up to 1 stop, 2 = up to 2 stops. Leave empty for any number of stops.

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

Limit results to these airline IATA codes, e.g. \["DL"] for Delta only, or \["DL","AA"] for Delta or American. Leave empty for all airlines.

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

Only return itineraries at or below this price, in the selected currency. Leave empty for no price cap.

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

ISO 4217 currency code for prices, e.g. USD, EUR, GBP.

## `market` (type: `string`):

Country/market code, e.g. US, GB, DE. Affects pricing and availability.

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

Language code, e.g. en, de, fr.

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

Maximum number of itineraries to return.

## `resolveBookingOptions` (type: `boolean`):

For each itinerary, fetch the bookable options — online travel agencies and airlines selling the fare, with per-option price, fare name (e.g. "Blue Basic"), booking domain and a booking URL. Adds extra requests per itinerary (more for round-trip), so it's capped by 'Max itineraries to resolve'. Works for one-way, round-trip and multi-city.

## `maxBookingItineraries` (type: `integer`):

When 'Resolve booking options' is on, only the first N itineraries get their booking options resolved (each is an extra request). Default 10.

## `bookingConcurrency` (type: `integer`):

How many booking-option lookups to run in parallel when 'Resolve booking options' is on. Higher is faster but sends more concurrent requests through one IP; 1 = the old one-at-a-time behaviour. Default 6.

## `proxy` (type: `object`):

Residential proxy is recommended (and on by default). Google returns empty results to datacenter IPs, so a residential IP is needed for reliable results. Responses are small, so bandwidth cost is minimal.

## Actor input object example

```json
{
  "origin": "LAX",
  "destination": "JFK",
  "departDate": "2026-08-04",
  "multiCityLegs": [
    "LAX-JFK-2026-08-04",
    "JFK-MIA-2026-08-10"
  ],
  "adults": 1,
  "children": 0,
  "infantsInSeat": 0,
  "infantsOnLap": 0,
  "cabinClass": "economy",
  "airlines": [
    "DL",
    "AA"
  ],
  "currency": "USD",
  "market": "US",
  "language": "en",
  "maxItems": 100,
  "resolveBookingOptions": false,
  "maxBookingItineraries": 10,
  "bookingConcurrency": 6,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "origin": "LAX",
    "destination": "JFK"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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",
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Flights Scraper API 💰$1/1k — Fares & Multi-City",
        "description": "[💰$1/1K] Google Flights scraper for fare monitoring and price comparison. One-way, round-trip and multi-city, with full result sets — not just the top picks. Returns price, airline, stops, times, aircraft and legroom, plus bookable OTA/airline options per fare. Stops, airlines and max-price filters",
        "version": "0.0",
        "x-build-id": "NprQm8vd6kUhaK3vE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~google-flights-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-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/memo23~google-flights-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-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/memo23~google-flights-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-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": {
                    "origin": {
                        "title": "From (origin airport)",
                        "type": "string",
                        "description": "Origin airport IATA code, e.g. LAX. Comma-separate for multi-airport / metro search, e.g. LAX,BUR,LGB. Defaults to LAX if left empty."
                    },
                    "destination": {
                        "title": "To (destination airport)",
                        "type": "string",
                        "description": "Destination airport IATA code, e.g. JFK. Comma-separate for multi-airport, e.g. JFK,EWR,LGA. Defaults to JFK if left empty."
                    },
                    "departDate": {
                        "title": "Departure date",
                        "type": "string",
                        "description": "Departure date. Leave empty to default to ~30 days from today (so the Actor always runs out of the box)."
                    },
                    "returnDate": {
                        "title": "Return date (optional)",
                        "type": "string",
                        "description": "Return date for a round trip. Leave empty for one-way."
                    },
                    "multiCityLegs": {
                        "title": "Multi-city legs (advanced)",
                        "type": "array",
                        "description": "For multi-city trips only. Add one row per leg as ORIGIN-DESTINATION-DATE, e.g. LAX-JFK-2026-08-04. When set, this overrides the From / To / dates above. Leave empty for one-way or round-trip.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of adult passengers (12+).",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "type": "integer",
                        "description": "Number of child passengers (2-11).",
                        "default": 0
                    },
                    "infantsInSeat": {
                        "title": "Infants (in seat)",
                        "type": "integer",
                        "description": "Infants with their own seat.",
                        "default": 0
                    },
                    "infantsOnLap": {
                        "title": "Infants (on lap)",
                        "type": "integer",
                        "description": "Infants on an adult's lap.",
                        "default": 0
                    },
                    "cabinClass": {
                        "title": "Cabin class",
                        "enum": [
                            "economy",
                            "premium_economy",
                            "business",
                            "first"
                        ],
                        "type": "string",
                        "description": "Cabin class for the search.",
                        "default": "economy"
                    },
                    "maxStops": {
                        "title": "Max stops",
                        "minimum": 0,
                        "maximum": 2,
                        "type": "integer",
                        "description": "Filter by number of stops: 0 = nonstop only, 1 = up to 1 stop, 2 = up to 2 stops. Leave empty for any number of stops."
                    },
                    "airlines": {
                        "title": "Airlines (include only)",
                        "type": "array",
                        "description": "Limit results to these airline IATA codes, e.g. [\"DL\"] for Delta only, or [\"DL\",\"AA\"] for Delta or American. Leave empty for all airlines.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPrice": {
                        "title": "Max price",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only return itineraries at or below this price, in the selected currency. Leave empty for no price cap."
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO 4217 currency code for prices, e.g. USD, EUR, GBP.",
                        "default": "USD"
                    },
                    "market": {
                        "title": "Market (country)",
                        "type": "string",
                        "description": "Country/market code, e.g. US, GB, DE. Affects pricing and availability.",
                        "default": "US"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code, e.g. en, de, fr.",
                        "default": "en"
                    },
                    "maxItems": {
                        "title": "Max results",
                        "type": "integer",
                        "description": "Maximum number of itineraries to return.",
                        "default": 100
                    },
                    "resolveBookingOptions": {
                        "title": "Resolve booking options (OTAs + fares)",
                        "type": "boolean",
                        "description": "For each itinerary, fetch the bookable options — online travel agencies and airlines selling the fare, with per-option price, fare name (e.g. \"Blue Basic\"), booking domain and a booking URL. Adds extra requests per itinerary (more for round-trip), so it's capped by 'Max itineraries to resolve'. Works for one-way, round-trip and multi-city.",
                        "default": false
                    },
                    "maxBookingItineraries": {
                        "title": "Max itineraries to resolve booking options for",
                        "minimum": 0,
                        "type": "integer",
                        "description": "When 'Resolve booking options' is on, only the first N itineraries get their booking options resolved (each is an extra request). Default 10.",
                        "default": 10
                    },
                    "bookingConcurrency": {
                        "title": "Booking-options concurrency",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "How many booking-option lookups to run in parallel when 'Resolve booking options' is on. Higher is faster but sends more concurrent requests through one IP; 1 = the old one-at-a-time behaviour. Default 6.",
                        "default": 6
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy is recommended (and on by default). Google returns empty results to datacenter IPs, so a residential IP is needed for reliable results. Responses are small, so bandwidth cost is minimal.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
