{
  "openapi": "3.0.1",
  "info": {
    "title": "Expedia Hotels Scraper & Price Tracker",
    "description": "Expedia hotels scraper and Expedia price tracker: search results for any destination and dates — nightly and total stay price, guest rating, reviews, class, location, photos. Schedule it for hotel price tracking: price drops and rises flagged between runs. One flat row per hotel, no personal data.",
    "version": "0.1",
    "x-build-id": "koqOHt2zwLhpdsNYV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~expedia-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-expedia-hotels-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/myth84~expedia-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-expedia-hotels-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/myth84~expedia-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-expedia-hotels-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": {
          "locations": {
            "title": "Destinations",
            "maxItems": 50,
            "type": "array",
            "description": "One or more destinations, one per line, as typed in the Expedia search box with their country, e.g. <code>Lisbon, Portugal</code>, <code>Rome, Italy</code>. Each is its own search with the same dates, adults, currency and sort, and <b>maxResults applies to each destination</b> (and to each search URL). Always searched, also with startUrls: clear the list to search URLs only. Up to 50. Default empty; with no destination at all, the Actor searches Lisbon, Portugal.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "startUrls": {
            "title": "Expedia search URLs",
            "type": "array",
            "description": "Expedia hotel search URLs from your browser (<code>https://www.expedia.com/Hotel-Search?destination=…</code>), one search each: their destination, dates, adults, sort and site win over the form (expedia.com in USD, expedia.fr in EUR; another Expedia site only with the advanced pointOfSale input). Filters of the Expedia page (stars, price, rating, amenities) are ignored: the run log lists the parameters left out. location is then ignored. Default empty: search by destination.",
            "items": {
              "type": "string",
              "pattern": "^https?://([a-z0-9-]+\\.)*expedia\\.[a-z.]+/"
            },
            "default": []
          },
          "location": {
            "title": "Single destination",
            "type": "string",
            "description": "Single destination (kept for compatibility; prefer <code>locations</code>), as typed in the Expedia search box with its country, e.g. <code>Paris, France</code>: the text before the first comma fills <code>city</code>, the text after the last comma <code>country</code>. Searched before the destinations of <code>locations</code> (up to 50 together); ignored when startUrls is filled. Leave empty when you use locations."
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-in date, YYYY-MM-DD, e.g. <code>2026-12-01</code>, given with checkOut. Leave both empty for a stay relative to today (checkInDaysFromNow and nights), better for schedules: fixed dates expire."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-out date, YYYY-MM-DD, after checkIn, e.g. <code>2026-12-04</code>. Required when checkIn is set."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Without fixed dates: check-in this many days after today (UTC), e.g. <code>7</code> for next week. Default 30: a month ahead, a typical booking window, and the stay moves with each scheduled run so it never expires.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 28,
            "type": "integer",
            "description": "Without fixed dates: length of the stay in nights, 1 to 28. Default 3: a typical city break.",
            "default": 3
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 14,
            "type": "integer",
            "description": "Number of adults in one room, 1 to 14; prices depend on it. Default 2: the most searched occupancy.",
            "default": 2
          },
          "maxResults": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of properties saved and charged, 1 to 1,000 (Expedia lists about 500 per destination; one request returns 50 or 100). With <code>locations</code> it applies to each destination; with price monitoring it is the number compared. Default 100: enough to compare a city, about $0.20 on the Free plan. The form prefills 20 for a quick first run (our daily check).",
            "default": 100
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "RECOMMENDED",
              "PRICE_LOW_TO_HIGH",
              "REVIEW",
              "PRICE_HIGH_TO_LOW",
              "PROPERTY_CLASS",
              "DISTANCE"
            ],
            "type": "string",
            "description": "Order of the results: <code>RECOMMENDED</code> (Expedia's default) and <code>PRICE_LOW_TO_HIGH</code> are validated; guest rating, highest price, property class and distance are passed as they are. Default RECOMMENDED: the order visitors see first.",
            "default": "RECOMMENDED"
          },
          "resultsPerPage": {
            "title": "Properties per request",
            "enum": [
              "50",
              "100"
            ],
            "type": "string",
            "description": "Properties fetched by one request: <code>50</code> (Expedia's page size) or <code>100</code> (fewer requests), both validated. Default 50: the page size of the site.",
            "default": "50"
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR"
            ],
            "type": "string",
            "description": "Currency of every price, which picks the Expedia site: <code>USD</code> reads expedia.com (English), <code>EUR</code> reads expedia.fr (French texts: type the destinations in French). Other currencies need pointOfSale. Default USD: expedia.com, the most visited site.",
            "default": "USD"
          },
          "pointOfSale": {
            "title": "Point of sale (advanced)",
            "type": "object",
            "description": "Advanced: another Expedia site, overriding currency, as JSON with domain, siteId, tpid, locale and currency, e.g. <code>{\"domain\":\"www.expedia.co.uk\",\"siteId\":3,\"tpid\":3,\"locale\":\"en_GB\",\"currency\":\"GBP\"}</code>; siteId and tpid are in the source of any page of that site. Not verified beyond expedia.com and expedia.fr. Leave empty to follow currency."
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Compare the total price of each property (the price per night when Expedia shows no total) with the one recorded by your previous run of the same search, and fill changeType, previousPrice and priceDelta. maxResults is then the number of properties compared. Default off: a plain search.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Key-value store of your account that keeps the previous prices, one record per search (each destination and each search URL has its own), e.g. <code>expedia-paris-daily</code>. Letters, digits and dashes, up to 63 characters. Default expedia-price-monitor: one store for all your monitoring runs.",
            "default": "expedia-price-monitor"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With monitorPrices: save and charge only the new properties and the price changes (price drop alerts); a run without any change succeeds with an empty dataset. Default off: every compared property is saved with its changeType.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies of the requests. Default: Apify proxies of the RESIDENTIAL group in the United States, the configuration validated for Expedia, included in the price: keep it. Your own proxy URLs of the same kind are accepted.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Safety cap on API requests for the whole run, retries included (about one request in ten is retried). Default 100: the default search needs 2 requests, which leaves room for retries or about 40 destinations of 100 properties.",
            "default": 100
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two page requests of the same search, in milliseconds (retries have their own growing pause); 0 disables it. Default 1000: one second, the pacing of our tests.",
            "default": 1000
          },
          "clientInfo": {
            "title": "client-info header",
            "pattern": "^[A-Za-z0-9_.-]+,[A-Za-z0-9_.-]+,[A-Za-z0-9_.-]+$",
            "type": "string",
            "description": "Advanced, keep the default: the <code>client-info</code> header Expedia's API requires. If a run fails with <i>client-info header</i>, copy the current value from any Expedia search in your browser (Network tab, request to /graphql). Default <code>shopping-pwa,7287debfc51fab933e63d3f59245f3c1316560e2,us-west-2</code>: the value observed at build time.",
            "default": "shopping-pwa,7287debfc51fab933e63d3f59245f3c1316560e2,us-west-2"
          },
          "debugStoreHtml": {
            "title": "Store raw API responses",
            "type": "boolean",
            "description": "Debugging only: save every API response (JSON, refused attempts included) in the run's key-value store. Default off: it uses storage.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}