{
  "openapi": "3.0.1",
  "info": {
    "title": "Flight Price Drop Monitor",
    "description": "Watch flight routes and departure dates on a schedule and get a row only when a fare actually moves — old price, new price, how far it fell, and whether it is a new low. It keeps the price history for you, so you never build one.",
    "version": "0.0",
    "x-build-id": "haHSbeWmkxQm3q7aU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/apt_marble~flight-price-drop-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-apt_marble-flight-price-drop-monitor",
        "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/apt_marble~flight-price-drop-monitor/runs": {
      "post": {
        "operationId": "runs-sync-apt_marble-flight-price-drop-monitor",
        "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/apt_marble~flight-price-drop-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-apt_marble-flight-price-drop-monitor",
        "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"
        ],
        "properties": {
          "routes": {
            "title": "Routes to watch",
            "type": "array",
            "description": "The routes you want watched, written as from-to airport or city codes, for example JFK-LHR. Up to 25 routes in one run.",
            "default": [
              "JFK-LHR"
            ],
            "items": {
              "type": "string"
            }
          },
          "fareSource": {
            "title": "Where the fares come from",
            "enum": [
              "kiwi",
              "skyscanner",
              "ryanair",
              "google"
            ],
            "type": "string",
            "description": "Which travel site's published fares you want to watch. Each one sells a different mix of airlines, so pick the one your buyers actually book on. Kiwi.com and Skyscanner cover many airlines; Ryanair covers its own network only; Google Flights is checked one departure date at a time and gives you the exact flight behind the price.",
            "default": "kiwi"
          },
          "market": {
            "title": "Market",
            "enum": [
              "US",
              "GB",
              "DE",
              "FR",
              "ES",
              "IT",
              "NL",
              "CA",
              "AU",
              "IN",
              "AE",
              "SG",
              "JP",
              "BR",
              "MX",
              "PL",
              "SE",
              "CH",
              "IE",
              "ZA"
            ],
            "type": "string",
            "description": "The country you are selling into. Fares and availability genuinely differ by market, so this is part of what makes a price comparable from one run to the next.",
            "default": "US"
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "GBP",
              "EUR",
              "CAD",
              "AUD",
              "INR",
              "AED",
              "SGD",
              "JPY",
              "BRL",
              "MXN",
              "PLN",
              "SEK",
              "CHF",
              "ZAR",
              "CZK",
              "DKK",
              "NOK",
              "HUF",
              "MAD"
            ],
            "type": "string",
            "description": "The currency you would like fares in. Every row is labelled with the currency the source actually returned, which is not always the one requested, and prices are never converted between currencies. Ryanair files its fares only in EUR, GBP, USD, PLN, CZK, SEK, DKK, NOK, HUF, CHF and MAD — ask it for any other and the run is refused rather than answered with euro prices or an empty month.",
            "default": "USD"
          },
          "cabinClass": {
            "title": "Cabin",
            "enum": [
              "economy",
              "premium_economy",
              "business",
              "first"
            ],
            "type": "string",
            "description": "Which cabin to watch. Ryanair and Skyscanner publish economy day prices only; choose economy for those two.",
            "default": "economy"
          },
          "startDate": {
            "title": "First departure date to watch",
            "type": "string",
            "description": "The earliest departure date you care about, as 2026-11-03. Leave empty to start from tomorrow."
          },
          "windowDays": {
            "title": "How many days ahead to watch",
            "minimum": 1,
            "maximum": 330,
            "type": "integer",
            "description": "The size of the departure window, counted from the first date. A wider window watches more dates and produces more alerts.",
            "default": 60
          },
          "maxDatesPerRoute": {
            "title": "Most departure dates to watch per route",
            "minimum": 1,
            "maximum": 360,
            "type": "integer",
            "description": "An upper limit on how many departure dates are tracked for each route, counted from the earliest. Keeps a wide window from turning into a very large watchlist.",
            "default": 60
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Names the saved price history this run compares against. Use one name per watchlist and keep it the same between runs, so each schedule builds its own history. Separate names never mix.",
            "default": "default"
          },
          "alertOn": {
            "title": "Report which moves",
            "enum": [
              "drop",
              "rise",
              "any"
            ],
            "type": "string",
            "description": "Report only fares that fell, only fares that rose, or every move.",
            "default": "drop"
          },
          "minChangePct": {
            "title": "Smallest move worth reporting (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Moves smaller than this are counted but not reported, so small day-to-day noise does not fill your dataset. Set 0 to report every move.",
            "default": 5
          },
          "minChangeAbs": {
            "title": "Smallest move worth reporting (amount)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "An extra floor in the fare's own currency. A move must clear both this and the percentage to be reported. Set 0 to use the percentage alone.",
            "default": 0
          },
          "alertOnNewLow": {
            "title": "Always report a new lowest price",
            "type": "boolean",
            "description": "Report a fare that is the cheapest ever recorded for that route and date, even when the move is smaller than your threshold.",
            "default": true
          },
          "emitNewDates": {
            "title": "Report newly watched dates",
            "type": "boolean",
            "description": "Report a starting price for a departure date the watchlist has not seen before. Turn this off to receive changes only.",
            "default": true
          },
          "emitBaselineOnFirstRun": {
            "title": "Report starting prices on the very first run",
            "type": "boolean",
            "description": "The first run for a watchlist has nothing to compare against, so it records a starting price for every watched date — routes × dates rows, which is far more than a normal run returns and is what your first run is billed for. Leave this on to receive those starting prices, or turn it off to receive nothing until something actually moves.",
            "default": true
          },
          "emitUnchanged": {
            "title": "Report dates whose fare did not move",
            "type": "boolean",
            "description": "Also return a row for every watched date that stayed exactly the same. Useful for building a full price table; it produces many more rows.",
            "default": false
          },
          "emitDisappeared": {
            "title": "Report fares that were withdrawn",
            "type": "boolean",
            "description": "Report a watched date whose fare is no longer published. Only dates the source was actually able to answer for are ever reported this way.",
            "default": false
          },
          "resetHistory": {
            "title": "Start the price history again",
            "type": "boolean",
            "description": "Forget everything recorded for this watchlist and treat this run as a fresh starting point. Use it after changing routes, market or cabin.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}