{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Flights Scraper - Airfare, Price Calendar & Alerts",
    "description": "Get Google Flights prices by origin, destination and date: fares with a booking link per flight, cheapest price for every date up to 10 months ahead, typical price range and alerts below your target or cheaper than the last run. Airline, stops and cabin filters. No login. Free input checks.",
    "version": "0.2",
    "x-build-id": "P4qhsJduqmt26Zgm8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~google-flights-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-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/scrapewise~google-flights-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-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/scrapewise~google-flights-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-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": {
          "origins": {
            "title": "From",
            "type": "array",
            "description": "Departure airports or cities as 3-letter IATA codes, one per line, for example JFK (one airport) or NYC (every New York airport). Several are allowed: every origin is combined with every destination and every date, and each combination is one search. Also accepts 'origin' and 'from'.",
            "items": {
              "type": "string"
            }
          },
          "destinations": {
            "title": "To",
            "type": "array",
            "description": "Arrival airports or cities as 3-letter IATA codes, one per line, for example LHR, LON (all London airports), LIS or TYO. Also accepts 'destination' and 'to'.",
            "items": {
              "type": "string"
            }
          },
          "departureDates": {
            "title": "Departure dates",
            "type": "array",
            "description": "Departure dates, one per line, as YYYY-MM-DD (2026-12-15) or a number of days from today (30 = in 30 days, handy for saved Tasks that run every day). Each date is a separate flight search. Also accepts 'departureDate' and 'outboundDate'.",
            "items": {
              "type": "string"
            }
          },
          "tripLengthDays": {
            "title": "Round trip: days until return",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "0 (default) = one way. Any other number makes it a round trip returning that many days after departure, for example 7, from 1 to 60. Also used by the price calendar, so each calendar date is priced as a round trip of this length.",
            "default": 0
          },
          "returnDate": {
            "title": "Round trip: fixed return date (optional)",
            "type": "string",
            "description": "Optional fixed return date for a round trip, as YYYY-MM-DD, for example 2026-12-22. Overrides 'Round trip: days until return' for the flight search; the price calendar keeps using the trip length."
          },
          "scrapeFlights": {
            "title": "Scrape flights",
            "type": "boolean",
            "description": "On (default): one row per flight for each route and date, with price, airlines, flight numbers, stops, legs, times, duration and emissions, charged as 'Flight delivered'. Turn off to get only the price calendar.",
            "default": true
          },
          "includePriceCalendar": {
            "title": "Price calendar",
            "type": "boolean",
            "description": "Off (default). On: adds the cheapest price for every departure date, as in the Google Flights date grid, up to about 10 months ahead. One row per date, charged as 'Calendar date delivered'. Useful to find the cheapest day to fly.",
            "default": false
          },
          "calendarDays": {
            "title": "Calendar length (days)",
            "minimum": 7,
            "maximum": 330,
            "type": "integer",
            "description": "How many departure dates the price calendar covers, starting from the earliest departure date, from 7 to 330 (default 90). Google shows prices up to about 324 days from today. Each date is one charged row.",
            "default": 90
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 9,
            "type": "integer",
            "description": "Number of adult passengers, from 1 (default) to 9. Prices are the total for all passengers.",
            "default": 1
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Number of children aged 2 to 11, from 0 (default) to 8. Prices include them.",
            "default": 0
          },
          "cabinClass": {
            "title": "Cabin",
            "enum": [
              "economy",
              "premium_economy",
              "business",
              "first"
            ],
            "type": "string",
            "description": "Cabin class to price: Economy (default), Premium economy, Business or First.",
            "default": "economy"
          },
          "maxStops": {
            "title": "Stops",
            "enum": [
              "any",
              "0",
              "1",
              "2"
            ],
            "type": "string",
            "description": "Maximum number of stops: Any (default), Nonstop only, 1 stop or fewer, or 2 stops or fewer. Applies to the flights and to the calendar.",
            "default": "any"
          },
          "airlines": {
            "title": "Airlines (optional)",
            "type": "array",
            "description": "Only flights where every leg is flown by one of these airlines, as 2-letter IATA codes, for example BA, AA or LH. Leave empty for all airlines. Applies to flight rows; the price calendar always covers all airlines.",
            "items": {
              "type": "string"
            }
          },
          "maxFlightsPerSearch": {
            "title": "Max flights per search",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum flights per route and date, default 50. Google shows up to about 40 flights per search, so the default returns all of them. Lower it, for example to 5, to get only the best and cheapest options and pay less.",
            "default": 50
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter currency code for every price, for example USD (default), EUR, GBP, BRL, INR or JPY.",
            "default": "USD"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "2-letter country code of the Google Flights site, for example us (default), gb, de or br. It can change availability and some prices, as fares sold in different markets differ.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code for airport and airline names, for example en (default), de, es or pt-BR.",
            "default": "en"
          },
          "alertBelowPrice": {
            "title": "Price alert: only fares below",
            "minimum": 1,
            "type": "integer",
            "description": "Optional target price in the chosen currency, for example 400. Only flights and calendar dates priced below it are saved and charged; the rest are checked for free. A search with nothing below the target returns one free row with errorCode NO_PRICE_ALERT and the cheapest price seen. Leave empty to get every fare."
          },
          "compareWithPreviousRun": {
            "title": "Compare prices with the previous run",
            "type": "boolean",
            "description": "Keeps the last price of every flight and calendar date in a key-value store on your account ('google-flights-scraper-price-history', one record per search: route, dates, cabin, passengers, stops and currency) and adds to each row: previousPrice, priceChange, priceChangePct, isNew, isNewLowest (lowest price ever seen), lowestSeenPrice, firstSeenAt and previousSeenAt. On the first run everything is new. Save the input as a Task with fixed dates and schedule it daily to get a price monitor.",
            "default": false
          },
          "onlyChanged": {
            "title": "Deliver only new items and price changes",
            "type": "boolean",
            "description": "With 'Compare prices with the previous run' on: rows whose price did not move since the previous run are not saved and not charged, and the maximum still counts the flights checked per search, so a daily run costs the same and you pay only for the rows you get. A search where nothing changed returns one free row with errorCode NO_PRICE_CHANGES.",
            "default": false
          },
          "onlyPriceDrops": {
            "title": "Deliver only price drops",
            "type": "boolean",
            "description": "Turns on 'Compare prices with the previous run' and delivers, and charges, only flights and calendar dates that got cheaper since the previous run, plus new flights cheaper than anything that search had before. The first run of a search is the baseline and delivers everything (or everything below your price alert). With a price alert, a fare is delivered once when it goes below the target and again only if it drops further. Each row says why in alertReason.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy (datacenter) is the default and recommended. When Google keeps blocking a session, the Actor switches to Apify residential proxies on its own, with no extra charge. Change it only to use your own proxies.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}