# Google Flights Scraper - Fares, Routes & Price Monitoring (`thirdwatch/google-flights-scraper`) Actor

Scrape live Google Flights fares without a browser. Compare one-way and round-trip quotes across multi-route and flexible-date matrices with segments, aircraft, emissions, stable IDs, and price-change monitoring.

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

## Pricing

from $0.12 / 1,000 flight itineraries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 — fares, flexible dates, and price monitoring

Search live Google Flights results without running a browser. Compare one-way and round-trip quotes; scan up to 120 route/date combinations in one run; and publish only new or price-changed fares on a schedule.

The Actor returns one structured row per unique priced flight choice with price, airline, airports, exact times, stops, duration, aircraft, layovers, carbon emissions, a stable ID, and the matching Google Flights URL.

### Why use this Actor?

- **Fast request-only extraction:** starts with direct HTTP and uses residential fallback only after a block.
- **Route matrix:** compare many routes against the same date or date window in one run.
- **Flexible-date fare calendar:** search every day or week across a date range.
- **Real fare monitoring:** stable itinerary IDs let scheduled runs emit only new itineraries or changed prices.
- **Failure-safe batches:** one failed route/date fails the run by default instead of quietly returning an incomplete comparison.
- **Very low pricing:** $0.25 per 1,000 results on FREE and $0.12 per 1,000 on GOLD—more than 8× below the established $1/1K Google Flights Actor.

In a four-search sandbox benchmark, the Actor returned 81 complete, unique rows for $0.000656 with no residential bandwidth: about $0.0081 per 1,000 results in infrastructure cost and roughly 91.6% contribution margin even at the $0.12/1K GOLD price after Apify's 20% fee.

### Quick start

#### One-way search

```json
{
  "origin": "JFK",
  "destination": "LAX",
  "departureDate": "2026-08-15",
  "maxResults": 50
}
````

#### Round trip

```json
{
  "origin": "LHR",
  "destination": "JFK",
  "departureDate": "2026-09-10",
  "returnDate": "2026-09-17",
  "cabinClass": "business",
  "currency": "GBP"
}
```

#### Compare routes across flexible dates

```json
{
  "routes": ["JFK-LAX", "EWR-LAX", "JFK-SFO"],
  "dateRangeStart": "2026-08-15",
  "dateRangeEnd": "2026-08-21",
  "dateStepDays": 1,
  "maxStops": 1,
  "maxResults": 1000
}
```

That input performs 21 searches: three routes × seven departure dates. The hard safety limit is 120 searches per run.

### Output example

```json
{
  "itinerary_id": "807951432bf709130c623a56",
  "search_label": "JFK-LAX 2026-08-15",
  "trip_type": "one-way",
  "primary_airline_code": "AA",
  "price": 234,
  "currency": "USD",
  "airlines": ["American"],
  "stops": 1,
  "total_duration_minutes": 422,
  "departure": "2026-08-15T08:04",
  "arrival": "2026-08-15T15:16",
  "origin": "JFK",
  "destination": "LAX",
  "segments": [
    {
      "origin": "JFK",
      "origin_name": "John F. Kennedy International Airport",
      "destination": "CLT",
      "destination_name": "Charlotte Douglas International Airport",
      "departure": "2026-08-15T08:04",
      "arrival": "2026-08-15T10:10",
      "duration_minutes": 126,
      "aircraft": "Boeing 737"
    }
  ],
  "carbon_emissions_grams": 384000,
  "typical_carbon_emissions_grams": 324000,
  "google_flights_url": "https://www.google.com/travel/flights/search?...",
  "observed_at": "2026-07-19T12:00:00+00:00"
}
```

### Fare monitoring

Use an Apify Schedule with the same input. The Actor derives a stable store from every fare-affecting input, so cabin, currency, passenger, and filter combinations cannot overwrite one another. Set `monitorStoreName` when you want an explicit human-readable watch key.

```json
{
  "origin": "DEL",
  "destination": "DXB",
  "departureDate": "2026-09-10",
  "monitorMode": "price-changes",
  "monitorStoreName": "del-dxb-september"
}
```

The first run emits every newly observed itinerary. Later runs emit only:

- `change_type: "new"` for a new itinerary;
- `change_type: "price_changed"` with `previous_price` when a known itinerary moves.

Unchanged scheduled runs write no dataset items and therefore incur no result charge.

### Input reference

| Input | What it controls |
| --- | --- |
| `origin`, `destination` | One route using three-letter IATA airport codes |
| `departureDate`, `returnDate` | Explicit one-way or round-trip dates |
| `departureInDays`, `tripLengthDays` | Relative dates for reusable saved Tasks |
| `routes` | Many `ORIGIN-DESTINATION` pairs searched as a matrix |
| `dateRangeStart`, `dateRangeEnd`, `dateRangeDays`, `dateStepDays` | Explicit or relative flexible-date searches |
| `adults`, `children`, `infantsInSeat`, `infantsOnLap` | Up to nine passengers |
| `cabinClass` | Economy, premium economy, business, or first |
| `maxStops`, `airlines` | Google-side stop and airline filters |
| `currency`, `language`, `market` | Result localization and fallback proxy country |
| `maxResultsPerSearch`, `maxResults` | Per-search and whole-run output limits |
| `monitorMode`, `monitorStoreName` | Incremental new-fare and price-change output |
| `proxyMode` | Direct, residential, or direct-first automatic fallback |
| `failOnPartialError` | Prevent incomplete route/date matrices from looking successful |

### Pricing

You pay only for itinerary rows written to the default dataset.

| Apify plan | Price per 1,000 itineraries |
| --- | ---: |
| FREE | $0.25 |
| BRONZE | $0.18 |
| SILVER | $0.15 |
| GOLD | $0.12 |

Retries, failed searches, duplicates, and unchanged monitoring runs are not result events.

### What is intentionally not claimed

Google changes the public response contract over time. This Actor currently returns the fields listed above. It does **not** claim to expose airline/OTA checkout URLs, baggage allowances, seat inventory, fare rules, or a guaranteed ticket price. `google_flights_url` reopens the same search; availability and prices can change before booking.

For round trips, Google first returns priced **outbound choices** for the requested return date. The record therefore has `trip_type: "round-trip"`, `return_date`, and both requested `search_legs`, while `segments` describes the outbound choice and `segments_scope` is `outbound_selection`. The return flight is selected on Google Flights after choosing an outbound option. Multi-city extraction is not advertised because Google's current public response does not provide the same stable itinerary list.

An empty result is treated as an error by default because blocks can look like empty markets. Set `allowEmptyResults: true` only when zero flights is an acceptable business outcome.

### Common workflows

1. **Daily fare alert:** one route, `monitorMode: price-changes`, daily Schedule, webhook on successful dataset items.
2. **Travel-agency comparison:** several origin airports in `routes`, one date, CSV export for a client shortlist.
3. **Flexible-date deal finder:** 14–30 day range, daily step, sort the dataset by price.
4. **Corporate route watch:** weekly route matrix with `maxStops: 0` and approved airline codes.

### Support

For a reproducible issue, include the Actor run ID, airport codes, dates, and the field or behavior you expected. Never post an Apify token or private booking information.

# Actor input Schema

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

Three-letter IATA airport code, for example JFK, LHR, or DEL. Ignored when Routes are provided.

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

Three-letter IATA airport code, for example LAX, CDG, or DXB.

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

Outbound date in YYYY-MM-DD. Leave empty to search 30 days from the run date.

## `departureInDays` (type: `integer`):

Used when Departure date is empty. Makes saved Tasks reusable; the default searches 30 days from each run date.

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

Optional return date in YYYY-MM-DD. Omit for a one-way search.

## `tripLengthDays` (type: `integer`):

Optional nights/days between outbound and return when Return date is empty. Useful in reusable saved Tasks.

## `routes` (type: `array`):

Optional route list such as JFK-LAX and BOS-SFO. Every route is searched across every selected date.

## `dateRangeStart` (type: `string`):

Optional first outbound date in a fare calendar. Use together with Flexible-date end.

## `dateRangeEnd` (type: `string`):

Optional last outbound date in a fare calendar. The Actor searches every selected step in the range.

## `dateRangeDays` (type: `integer`):

Optional number of outbound dates starting at Departure date or Relative departure. Use instead of explicit range dates for reusable Tasks.

## `dateStepDays` (type: `integer`):

Days between flexible-date searches. Use 1 for a daily fare calendar or 7 for weekly sampling.

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

Number of adult passengers. Total passengers cannot exceed nine.

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

Number of child passengers.

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

Number of infants travelling in their own seat.

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

Number of lap infants. Cannot exceed the adult count.

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

Cabin used for all legs.

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

Optional stop filter applied to every leg: 0 for nonstop, 1 for up to one stop, or 2 for up to two stops.

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

Optional airline IATA codes such as DL, AA, BA, or EK.

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

ISO 4217 currency code used by Google Flights, for example USD, EUR, GBP, or INR.

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

Google Flights language code, for example en, de, fr, es, or hi.

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

Two-letter country code used for the residential fallback location and regional availability, for example US, GB, DE, or IN.

## `maxResultsPerSearch` (type: `integer`):

Per-route/date output cap after Google returns its itinerary list.

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

Hard cap across every route and date in this run.

## `monitorMode` (type: `string`):

Off returns every itinerary. New returns newly seen itineraries. Price changes returns new itineraries plus changed prices and previous\_price.

## `monitorStoreName` (type: `string`):

Optional stable key-value store name. Use the same name for every scheduled run of one fare watch.

## `proxyMode` (type: `string`):

Auto tries direct HTTP first and rotates to residential only after a block. Direct is cheapest. Residential is the most defensive.

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

Optional custom Apify proxy settings for fallback or residential mode.

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

Parallel route/date searches. Keep this low for reliable direct HTTP access.

## `maxRetries` (type: `integer`):

Total request/parser attempts per route and date, including direct attempts and any residential fallback.

## `directRetries` (type: `integer`):

In Auto mode, exhaust this many low-cost direct HTTP attempts before using residential bandwidth.

## `failOnPartialError` (type: `boolean`):

Recommended. Prevents a multi-route/date run from silently publishing an incomplete dataset.

## `allowEmptyResults` (type: `boolean`):

Keep off unless an empty route/date is expected. Otherwise zero itineraries fail loudly so schedules and webhooks can alert you.

## Actor input object example

```json
{
  "origin": "JFK",
  "destination": "LAX",
  "departureInDays": 30,
  "routes": [],
  "dateStepDays": 1,
  "adults": 1,
  "children": 0,
  "infantsInSeat": 0,
  "infantsOnLap": 0,
  "cabinClass": "economy",
  "airlines": [],
  "currency": "USD",
  "language": "en",
  "market": "US",
  "maxResultsPerSearch": 100,
  "maxResults": 1000,
  "monitorMode": "off",
  "proxyMode": "auto",
  "maxConcurrency": 2,
  "maxRetries": 5,
  "directRetries": 3,
  "failOnPartialError": true,
  "allowEmptyResults": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Flights Scraper - Fares, Routes & Price Monitoring",
        "description": "Scrape live Google Flights fares without a browser. Compare one-way and round-trip quotes across multi-route and flexible-date matrices with segments, aircraft, emissions, stable IDs, and price-change monitoring.",
        "version": "1.0",
        "x-build-id": "E3cOW40YIHDeTHAuw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/thirdwatch~google-flights-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-thirdwatch-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/thirdwatch~google-flights-scraper/runs": {
            "post": {
                "operationId": "runs-sync-thirdwatch-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/thirdwatch~google-flights-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-thirdwatch-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": "Origin airport",
                        "pattern": "^[A-Za-z]{3}$",
                        "type": "string",
                        "description": "Three-letter IATA airport code, for example JFK, LHR, or DEL. Ignored when Routes are provided.",
                        "default": "JFK"
                    },
                    "destination": {
                        "title": "Destination airport",
                        "pattern": "^[A-Za-z]{3}$",
                        "type": "string",
                        "description": "Three-letter IATA airport code, for example LAX, CDG, or DXB.",
                        "default": "LAX"
                    },
                    "departureDate": {
                        "title": "Departure date",
                        "type": "string",
                        "description": "Outbound date in YYYY-MM-DD. Leave empty to search 30 days from the run date."
                    },
                    "departureInDays": {
                        "title": "Relative departure (days from run)",
                        "minimum": 1,
                        "maximum": 366,
                        "type": "integer",
                        "description": "Used when Departure date is empty. Makes saved Tasks reusable; the default searches 30 days from each run date.",
                        "default": 30
                    },
                    "returnDate": {
                        "title": "Return date",
                        "type": "string",
                        "description": "Optional return date in YYYY-MM-DD. Omit for a one-way search."
                    },
                    "tripLengthDays": {
                        "title": "Relative trip length",
                        "minimum": 1,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Optional nights/days between outbound and return when Return date is empty. Useful in reusable saved Tasks."
                    },
                    "routes": {
                        "title": "Routes to compare",
                        "type": "array",
                        "description": "Optional route list such as JFK-LAX and BOS-SFO. Every route is searched across every selected date.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "dateRangeStart": {
                        "title": "Flexible-date start",
                        "type": "string",
                        "description": "Optional first outbound date in a fare calendar. Use together with Flexible-date end."
                    },
                    "dateRangeEnd": {
                        "title": "Flexible-date end",
                        "type": "string",
                        "description": "Optional last outbound date in a fare calendar. The Actor searches every selected step in the range."
                    },
                    "dateRangeDays": {
                        "title": "Relative flexible-date window",
                        "minimum": 1,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Optional number of outbound dates starting at Departure date or Relative departure. Use instead of explicit range dates for reusable Tasks."
                    },
                    "dateStepDays": {
                        "title": "Date step",
                        "minimum": 1,
                        "maximum": 31,
                        "type": "integer",
                        "description": "Days between flexible-date searches. Use 1 for a daily fare calendar or 7 for weekly sampling.",
                        "default": 1
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 9,
                        "type": "integer",
                        "description": "Number of adult passengers. Total passengers cannot exceed nine.",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of child passengers.",
                        "default": 0
                    },
                    "infantsInSeat": {
                        "title": "Infants in seat",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of infants travelling in their own seat.",
                        "default": 0
                    },
                    "infantsOnLap": {
                        "title": "Infants on lap",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of lap infants. Cannot exceed the adult count.",
                        "default": 0
                    },
                    "cabinClass": {
                        "title": "Cabin class",
                        "enum": [
                            "economy",
                            "premium-economy",
                            "business",
                            "first"
                        ],
                        "type": "string",
                        "description": "Cabin used for all legs.",
                        "default": "economy"
                    },
                    "maxStops": {
                        "title": "Maximum stops",
                        "minimum": 0,
                        "maximum": 2,
                        "type": "integer",
                        "description": "Optional stop filter applied to every leg: 0 for nonstop, 1 for up to one stop, or 2 for up to two stops."
                    },
                    "airlines": {
                        "title": "Airlines to include",
                        "type": "array",
                        "description": "Optional airline IATA codes such as DL, AA, BA, or EK.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "currency": {
                        "title": "Currency",
                        "pattern": "^[A-Za-z]{3}$",
                        "type": "string",
                        "description": "ISO 4217 currency code used by Google Flights, for example USD, EUR, GBP, or INR.",
                        "default": "USD"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Google Flights language code, for example en, de, fr, es, or hi.",
                        "default": "en"
                    },
                    "market": {
                        "title": "Market country",
                        "pattern": "^[A-Za-z]{2}$",
                        "type": "string",
                        "description": "Two-letter country code used for the residential fallback location and regional availability, for example US, GB, DE, or IN.",
                        "default": "US"
                    },
                    "maxResultsPerSearch": {
                        "title": "Max itineraries per search",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Per-route/date output cap after Google returns its itinerary list.",
                        "default": 100
                    },
                    "maxResults": {
                        "title": "Max total itineraries",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Hard cap across every route and date in this run.",
                        "default": 1000
                    },
                    "monitorMode": {
                        "title": "Fare monitoring",
                        "enum": [
                            "off",
                            "new",
                            "price-changes"
                        ],
                        "type": "string",
                        "description": "Off returns every itinerary. New returns newly seen itineraries. Price changes returns new itineraries plus changed prices and previous_price.",
                        "default": "off"
                    },
                    "monitorStoreName": {
                        "title": "Monitoring store name",
                        "type": "string",
                        "description": "Optional stable key-value store name. Use the same name for every scheduled run of one fare watch."
                    },
                    "proxyMode": {
                        "title": "Network mode",
                        "enum": [
                            "auto",
                            "direct",
                            "residential"
                        ],
                        "type": "string",
                        "description": "Auto tries direct HTTP first and rotates to residential only after a block. Direct is cheapest. Residential is the most defensive.",
                        "default": "auto"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional custom Apify proxy settings for fallback or residential mode."
                    },
                    "maxConcurrency": {
                        "title": "Search concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Parallel route/date searches. Keep this low for reliable direct HTTP access.",
                        "default": 2
                    },
                    "maxRetries": {
                        "title": "Max attempts per search",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Total request/parser attempts per route and date, including direct attempts and any residential fallback.",
                        "default": 5
                    },
                    "directRetries": {
                        "title": "Direct attempts before proxy fallback",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "In Auto mode, exhaust this many low-cost direct HTTP attempts before using residential bandwidth.",
                        "default": 3
                    },
                    "failOnPartialError": {
                        "title": "Fail on any search error",
                        "type": "boolean",
                        "description": "Recommended. Prevents a multi-route/date run from silently publishing an incomplete dataset.",
                        "default": true
                    },
                    "allowEmptyResults": {
                        "title": "Allow a successful empty run",
                        "type": "boolean",
                        "description": "Keep off unless an empty route/date is expected. Otherwise zero itineraries fail loudly so schedules and webhooks can alert you.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
