{
  "openapi": "3.0.1",
  "info": {
    "title": "Cheap Flight Destinations — Google Explore as data",
    "description": "[$0.20/1K rows] Where can I fly cheaply from here: the cheapest destinations from any airport with city, country, price, airline, stops, duration and the dates behind the price. Google Flights Explore as rows. No run fee, no search fee.",
    "version": "0.1",
    "x-build-id": "MGewTXOjNJrLzswu7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lergassy~cheap-flight-destinations/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lergassy-cheap-flight-destinations",
        "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/lergassy~cheap-flight-destinations/runs": {
      "post": {
        "operationId": "runs-sync-lergassy-cheap-flight-destinations",
        "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/lergassy~cheap-flight-destinations/run-sync": {
      "post": {
        "operationId": "run-sync-lergassy-cheap-flight-destinations",
        "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 (IATA)",
            "type": "string",
            "description": "Departure airport code, e.g. <code>DPS</code> (Bali), <code>CGK</code> (Jakarta), <code>SIN</code> (Singapore), <code>LHR</code> (London)",
            "default": "DPS"
          },
          "destination": {
            "title": "🛬 Destination airport (IATA)",
            "type": "string",
            "description": "Arrival airport code, e.g. <code>SIN</code> (Singapore), <code>BKK</code> (Bangkok), <code>SYD</code> (Sydney). Ignored when <b>Explore</b> is on."
          },
          "departureDate": {
            "title": "📅 Departure date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Format <code>YYYY-MM-DD</code> Leave the whole route empty and the Actor runs a demo search so a first run always returns rows."
          },
          "returnDate": {
            "title": "Return date (optional)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Leave empty for one-way. Format <code>YYYY-MM-DD</code>. Round-trip prices are the total for both directions."
          },
          "adults": {
            "title": "👤 Adults",
            "minimum": 1,
            "maximum": 9,
            "type": "integer",
            "description": "Passengers aged 12 and over (1–9). Prices are the total for all passengers.",
            "default": 1
          },
          "children": {
            "title": "Children (2–11)",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Passengers aged 2 to 11. Google applies child fares where the airline offers them.",
            "default": 0
          },
          "infantsInSeat": {
            "title": "Infants in seat",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Under 2 years old, with their own seat (charged as a child fare on most airlines).",
            "default": 0
          },
          "infantsOnLap": {
            "title": "Infants on lap",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Under 2 years old, travelling on an adult's lap (usually ~10% of the adult fare).",
            "default": 0
          },
          "cabinClass": {
            "title": "💺 Cabin class",
            "enum": [
              "economy",
              "premium_economy",
              "business",
              "first"
            ],
            "type": "string",
            "description": "Economy, premium economy, business or first",
            "default": "economy"
          },
          "maxStops": {
            "title": "🔀 Max stops",
            "enum": [
              "any",
              "0",
              "1",
              "2"
            ],
            "type": "string",
            "description": "<code>any</code>, <code>0</code> nonstop only, <code>1</code> up to one stop, <code>2</code> up to two stops",
            "default": "any"
          },
          "currency": {
            "title": "💱 Currency",
            "type": "string",
            "description": "ISO code for prices: <code>USD</code>, <code>IDR</code>, <code>EUR</code>, <code>SGD</code>, <code>AUD</code>…",
            "default": "USD"
          },
          "market": {
            "title": "🌐 Market (country of sale)",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code of the point of sale, e.g. <code>US</code>, <code>ID</code>, <code>GB</code>, <code>DE</code>, <code>AU</code>. Google returns the fares, sellers and booking links available to buyers in that country — prices differ by market. Leave empty for Google's default."
          },
          "maxResults": {
            "title": "💯 Max flights per route",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Google returns up to ~150 itineraries per search",
            "default": 100
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "best",
              "price",
              "duration",
              "departure"
            ],
            "type": "string",
            "description": "Google's own ranking (best), or by price, duration or departure time",
            "default": "best"
          },
          "calendarDays": {
            "title": "📆 Price calendar (days)",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Lowest fare for each departure date over this many days starting at the departure date — Google's date grid as data. <code>0</code> = off, <code>60</code> = two months, up to <code>365</code>. One request per 90 days. Adds <code>calendar_day</code> items and a <code>calendar.cheapestDates</code> summary to the search item. For round trips the trip length (return minus departure) is kept fixed.",
            "default": 0
          },
          "resolveBookingOptions": {
            "title": "🎫 Booking options (who sells it, at what price, with a link)",
            "type": "boolean",
            "description": "For the top flights of each search, fetch Google's booking options: airline and travel agencies (Trip.com, Expedia, Kiwi…), their prices, fees, and a deep link to book. Round trips need <b>Return flights</b> on — options are fetched for the outbound plus its cheapest return. One extra request per flight — cap it with the field below.",
            "default": false
          },
          "resolveReturnFlights": {
            "title": "🔁 Return flights for round trips",
            "type": "boolean",
            "description": "For the top outbound itineraries of a round trip, fetch Google's list of return flights — each with the total price for both directions — so you get complete outbound + return combinations. One extra request per outbound itinerary.",
            "default": false
          },
          "exploreAnywhere": {
            "title": "🌍 Explore: cheapest destinations from the origin",
            "type": "boolean",
            "description": "Instead of a fixed route, list the cheapest destinations Google suggests from <b>Origin</b> — city, country, price, airline, stops, duration and suggested dates. Uses <b>Departure/Return date</b> when set, otherwise Google's flexible one-week trips over the coming months.",
            "default": true
          },
          "routes": {
            "title": "🗺️ More routes (batch)",
            "type": "array",
            "description": "Search many routes in one run. Each item: <code>{\"origin\": \"DPS\", \"destination\": \"BKK\", \"departureDate\": \"2026-10-15\", \"returnDate\": \"2026-10-22\"}</code> (returnDate optional). Passengers, cabin and filters below apply to every route."
          },
          "multiCityLegs": {
            "title": "🧭 Multi-city legs",
            "type": "array",
            "description": "A multi-city trip as a list of legs: <code>{\"origin\": \"SIN\", \"destination\": \"BKK\", \"date\": \"2026-10-15\"}</code>, <code>{\"origin\": \"BKK\", \"destination\": \"HKT\", \"date\": \"2026-10-19\"}</code>, <code>{\"origin\": \"HKT\", \"destination\": \"SIN\", \"date\": \"2026-10-23\"}</code>. Google prices the trip leg by leg; the Actor resolves complete itineraries for the top first-leg options. The total is shown when Google can sell all legs as one ticket."
          },
          "airlines": {
            "title": "Only these airlines",
            "type": "array",
            "description": "IATA airline codes to keep, e.g. <code>SQ</code>, <code>GA</code>, <code>QZ</code>. Leave empty for all.",
            "items": {
              "type": "string"
            }
          },
          "excludeAirlines": {
            "title": "Exclude airlines",
            "type": "array",
            "description": "IATA airline codes to drop, e.g. <code>TR</code> (Scoot)",
            "items": {
              "type": "string"
            }
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 1,
            "type": "integer",
            "description": "Drop flights above this price (in the selected currency)"
          },
          "maxDurationMinutes": {
            "title": "Max total duration (minutes)",
            "minimum": 30,
            "type": "integer",
            "description": "Drop itineraries longer than this, e.g. <code>720</code> for 12 hours"
          },
          "maxLayoverMinutes": {
            "title": "Max layover (minutes)",
            "minimum": 30,
            "type": "integer",
            "description": "Drop itineraries with any layover longer than this, e.g. <code>180</code>"
          },
          "departureTimeFrom": {
            "title": "Depart after (HH:MM)",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Earliest departure time, local, e.g. <code>06:00</code>"
          },
          "departureTimeTo": {
            "title": "Depart before (HH:MM)",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Latest departure time, local, e.g. <code>12:00</code>"
          },
          "arrivalTimeFrom": {
            "title": "Arrive after (HH:MM)",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Earliest arrival time, local, e.g. <code>08:00</code>"
          },
          "arrivalTimeTo": {
            "title": "Arrive before (HH:MM)",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Latest arrival time, local, e.g. <code>22:00</code>"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of airport and airline names, e.g. <code>en</code>, <code>id</code>, <code>de</code>",
            "default": "en"
          },
          "calendarOnly": {
            "title": "Calendar only (skip the flight list)",
            "type": "boolean",
            "description": "Return just the price calendar and the search summary — the cheapest way to sweep dates or routes.",
            "default": false
          },
          "includePriceInsights": {
            "title": "Price insights",
            "type": "boolean",
            "description": "Add Google's price level (low / typical / high), typical price range and 60-day price history to the search summary and to every flight",
            "default": true
          },
          "includeSearchSummary": {
            "title": "🧾 Add the search summary row",
            "type": "boolean",
            "description": "Adds one <code>type: \"search\"</code> row per search with how many itineraries Google had, its own lowest price, the price level and the price history. It is not a flight, so it is off by default and the table stays flights only — the same summary is always saved as the run's <b>SEARCH_SUMMARY</b> record in the key-value store.",
            "default": false
          },
          "maxDestinations": {
            "title": "Max destinations (explore)",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many destinations to return in Explore mode, cheapest first.",
            "default": 60
          },
          "maxBookingResolutions": {
            "title": "Flights to resolve booking options for",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Per search, counted from the top of the sorted list",
            "default": 10
          },
          "maxReturnResolutions": {
            "title": "Outbound itineraries to resolve returns for",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Per round-trip search, counted from the top of the sorted list",
            "default": 10
          },
          "maxReturnOptions": {
            "title": "Return flights to keep per outbound",
            "minimum": 1,
            "maximum": 150,
            "type": "integer",
            "description": "How many return flights to keep for each outbound itinerary, cheapest first.",
            "default": 20
          },
          "maxMultiCityResolutions": {
            "title": "Multi-city itineraries to resolve",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many first-leg options to follow through all legs (one request per leg each)",
            "default": 5
          },
          "dataSource": {
            "title": "Data source",
            "enum": [
              "auto",
              "api",
              "page"
            ],
            "type": "string",
            "description": "<b>Auto</b>: Google's results API (full list of 100–150 itineraries, needs a residential proxy) with automatic fallback to the results page (first ~15 itineraries, works from any IP). Force one source for debugging.",
            "default": "auto"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Google serves the full results API only to residential IPs — keep <b>Residential</b> proxies for complete results (a search transfers ~250 KB, a fraction of a cent). Datacenter proxies still work through the page fallback with the first ~15 itineraries.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}