{
  "openapi": "3.0.1",
  "info": {
    "title": "Flight Price Tracker — Cheapest Day to Fly & Airfare Alerts",
    "description": "Google Flights price tracker: the cheapest fare per departure day on a route, 1–60 days. One row per route and day: price, airline, stops, rank (1 = cheapest day). Cheapest flights, fare calendar, round trips, nonstop. maxPrice alerts filter before billing; track daily for flight price history.",
    "version": "1.1",
    "x-build-id": "IKUh2V7aqc6TWu9D9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kestrel~flight-price-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kestrel-flight-price-tracker",
        "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/kestrel~flight-price-tracker/runs": {
      "post": {
        "operationId": "runs-sync-kestrel-flight-price-tracker",
        "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/kestrel~flight-price-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-kestrel-flight-price-tracker",
        "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",
        "required": [
          "routes",
          "departDate"
        ],
        "properties": {
          "routes": {
            "title": "Routes",
            "uniqueItems": true,
            "type": "array",
            "description": "Routes as airport codes, e.g. [\"JFK-LHR\", \"LIS-CDG\"]; written \"LIS-LHR\", \"lis > lhr\" or \"JFK to LAX\". Google city codes work too: \"NYC-LON\" searches every New York and London airport. Required. Each route is searched once per day of the window and returns at most one billed row per day. Same origin and destination, or a code that is not three letters, is refused before anything is charged.",
            "items": {
              "type": "string"
            }
          },
          "departDate": {
            "title": "First departure day",
            "type": "string",
            "description": "First departure day of the window: \"2026-11-20\" (YYYY-MM-DD), or relative to the day the run starts: \"30 days\", \"6 weeks\", \"tomorrow\". Use relative dates for a scheduled run (\"track this route daily\"): it always looks the same distance ahead and never needs editing. Required. A past date is refused before anything is charged."
          },
          "days": {
            "title": "Days in the window",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "Consecutive departure days to price from departDate, 1 to 60, e.g. 30 = a month of fares (default 14). One search and at most one billed row per route and day, so days is the bill: 30 days × 2 routes = at most 60 rows at $0.004. Use the user's flexibility: \"any day in the next two weeks\" = 14.",
            "default": 14
          },
          "tripLengthDays": {
            "title": "Trip length (round trips)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "0 (default) = one-way fares. N = every day is priced as a round trip returning N days after departure, e.g. 7 for week-long trips; price is then the total for both legs (round_trip_total true). Use for \"cheapest week to fly round trip\". Maximum 60.",
            "default": 0
          },
          "maxPrice": {
            "title": "Max price (alert mode)",
            "minimum": 0,
            "type": "number",
            "description": "0 (default) = every day is delivered. N = alert mode: only days whose cheapest fare is at or under N in `currency` are delivered, e.g. 400; days over the line are dropped BEFORE billing, so a run that finds nothing costs nothing. The status row still reports the window's cheapest fare and date, and rank_in_window is computed over all days before the filter. Use for \"tell me when JFK-LHR drops under 400\".",
            "default": 0
          },
          "maxStops": {
            "title": "Stops",
            "enum": [
              "any",
              "nonstop",
              "one_or_fewer",
              "two_or_fewer"
            ],
            "type": "string",
            "description": "\"any\" (default) = the cheapest of everything Google lists. \"nonstop\" = the cheapest nonstop that day; \"one_or_fewer\"; \"two_or_fewer\". Applied by Google before the day's cheapest is picked. Use \"nonstop\" for \"cheapest direct flight\".",
            "default": "any"
          },
          "seat": {
            "title": "Cabin",
            "enum": [
              "economy",
              "premium_economy",
              "business",
              "first"
            ],
            "type": "string",
            "description": "Cabin: \"economy\" (default), \"premium_economy\", \"business\" or \"first\". The day's cheapest fare is picked within this cabin. Use \"business\" for \"cheapest day to fly business class\".",
            "default": "economy"
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 9,
            "type": "integer",
            "description": "Adult passengers, 1 to 9, e.g. 2 (default 1). Every price is the total for all of them, not per person. There is no children or infant input on this actor: for a family with children use kestrel/google-flights-prices.",
            "default": 1
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO 4217 code for every price, e.g. \"EUR\" (default \"USD\"). When the user names no currency, pass the one their market uses. A day Google prices in another currency (some markets ignore the request) counts as an error on the status row and is never billed in the wrong currency.",
            "default": "USD"
          },
          "market": {
            "title": "Market (country)",
            "type": "string",
            "description": "Google market (gl) as a 2-letter country code, e.g. \"de\", \"gb\", \"in\" (default \"us\"). It is the country of the person searching, not the destination: fares, airlines and the currency Google accepts differ by market. Keep \"us\" unless the user wants fares as seen from a country. Results are read in English whatever the market (there is no language input).",
            "default": "us"
          },
          "sessions": {
            "title": "Parallel sessions",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel proxy sessions (one egress IP each), 1 to 16, e.g. 4 (default 4). More = faster; each is paced separately. Leave at 4 unless a run is throttled.",
            "default": 4
          },
          "perIp": {
            "title": "Requests per second per IP",
            "minimum": 0.1,
            "maximum": 2,
            "type": "number",
            "description": "Requests per second per session, 0.1 to 2, e.g. 0.5 (default 0.5). Google tolerates about 0.5 per second per IP; raising it causes retries, not speed.",
            "default": 0.5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy, required: Google blocks datacentre traffic that is not rotated. The default (Apify Proxy, automatic group) works; leave it.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}