{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Scraper: Price Tracker & OTA Comparison",
    "description": "Scrape worldwide hotel prices, OTA offers and room details. Save watchlists, track price changes automatically, flag budget matches and export accommodation audit data to JSON or CSV.",
    "version": "1.5",
    "x-build-id": "I7itTiVQQmE4gR3ES"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dig_stays~google-hotels-rates-ota-offers/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dig_stays-google-hotels-rates-ota-offers",
        "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/dig_stays~google-hotels-rates-ota-offers/runs": {
      "post": {
        "operationId": "runs-sync-dig_stays-google-hotels-rates-ota-offers",
        "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/dig_stays~google-hotels-rates-ota-offers/run-sync": {
      "post": {
        "operationId": "run-sync-dig_stays-google-hotels-rates-ota-offers",
        "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": {
          "searchQueries": {
            "title": "Destinations or hotel names",
            "maxItems": 10,
            "type": "array",
            "description": "Up to 10 destination or hotel-name searches. Use maxPages for deeper coverage, or hotelUrls for exact-property monitoring.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Exact check-in date (optional)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "YYYY-MM-DD. Leave blank to use the relative date below."
          },
          "checkOut": {
            "title": "Exact check-out date (optional)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "YYYY-MM-DD. Supply both exact dates, or leave both blank."
          },
          "checkInDaysFromToday": {
            "title": "Check in this many days from today",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Keeps saved tasks evergreen. Ignored when exact dates are supplied.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay when relative dates are used.",
            "default": 2
          },
          "currency": {
            "title": "Preferred currency",
            "enum": [
              "USD",
              "GBP",
              "SGD",
              "EUR",
              "AUD",
              "CAD",
              "JPY",
              "INR"
            ],
            "type": "string",
            "description": "The Actor requests this currency and reports the currency actually returned by Google.",
            "default": "USD"
          },
          "countryCode": {
            "title": "Search market",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter market code used by Google, such as us, sg or gb.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "pattern": "^[A-Za-z-]{2,10}$",
            "type": "string",
            "description": "Output is normalized to English for reliable parsing. Kept for compatibility; other values are normalized to en. Destination searches can still use local names.",
            "default": "en"
          },
          "maxResultsPerQuery": {
            "title": "Maximum results per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Up to 200 unique hotels per query and stay. Set maxPages above 1 to go beyond the first page. Pagination deduplicates overlapping results.",
            "default": 20
          },
          "includeOffers": {
            "title": "Include booking-provider offers",
            "type": "boolean",
            "description": "Visits the price comparison page for the first hotels and adds Booking.com, Expedia, Hotels.com and other available offers.",
            "default": true
          },
          "maxOfferHotelsPerQuery": {
            "title": "Hotels to enrich with provider offers",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Enrich this many unique hotels across all collected pages of each query. More detail takes longer. Direct URLs always collect offers.",
            "default": 5
          },
          "hotelUrls": {
            "title": "Exact Google Hotels property URLs",
            "maxItems": 20,
            "type": "array",
            "description": "Optional, up to 20 URLs copied from googleHotelsUrl in a previous run. Use https://www.google.com/travel/hotels/entity/ENTITY_ID/prices. Always collects provider offers for these properties; requested dates replace the URL dates.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Maximum hotel results for the whole run",
            "minimum": 1,
            "maximum": 2200,
            "type": "integer",
            "description": "Total saved hotel/stay results across all dates, queries and URLs. Each unique hotel/stay/party/currency is billed once per run. Default 200. Also respects the run charge and time limits.",
            "default": 200
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Adults in one room. The returned page must confirm the requested party before rates are saved.",
            "default": 2
          },
          "childrenAges": {
            "title": "Child ages",
            "type": "array",
            "description": "Ages 0–17, e.g. [7,12]. Up to 4 children and 6 total guests in one room. Ages 0–1 use Google’s 0–1 band.",
            "default": []
          },
          "stays": {
            "title": "Multiple exact stays",
            "type": "array",
            "description": "Optional, up to 10 objects such as [{\"checkIn\":\"2026-12-10\",\"checkOut\":\"2026-12-12\"}]. Do not combine with exact single dates or checkInOffsets. Each saved hotel per stay is one billable result.",
            "default": []
          },
          "checkInOffsets": {
            "title": "Rolling check-in offsets",
            "type": "array",
            "description": "Optional, up to 10 day offsets, e.g. [7,30,90]. Uses nights for each stay. Do not combine with stays or exact single dates. Multiplies the possible result count.",
            "default": []
          },
          "baseline": {
            "title": "Previous SNAPSHOT for price changes",
            "type": "object",
            "description": "Optional manual SNAPSHOT comparison. Leave blank when automatic watchlist history is enabled. Matches exact property, dates, occupancy, market, currency and price metric."
          },
          "maxPages": {
            "title": "Maximum search pages",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Follow Google’s next-page tokens, up to 10 pages per query/stay/room configuration. Also raise maxResultsPerQuery above 20. Stops on missing/repeated tokens, time limits or errors; see searchCoverage.",
            "default": 1
          },
          "roomRequests": {
            "title": "Room plan — separate room requirements",
            "type": "array",
            "description": "Optional, up to 5 different configurations and 10 total rooms. Example: [{\"adults\":2,\"childrenAges\":[],\"quantity\":2,\"label\":\"Couples\"},{\"adults\":1,\"childrenAges\":[7],\"quantity\":1,\"label\":\"Parent and child\"}]. Overrides top-level adults/childrenAges. Collects independent single-room quotes and estimates combined costs; does NOT verify joint stock or a multi-room checkout. Each hotel/stay/configuration is one billable result; quantity multiplies the estimate, not the bill.",
            "default": []
          },
          "monitorHistory": {
            "title": "Remember this watchlist between runs",
            "type": "boolean",
            "description": "Automatically compare with this account’s previous watchlist observations. Keeps the last 30 run snapshots in a named store. First run establishes history. Exact dates must match; rolling stays are different trips.",
            "default": false
          },
          "watchlistName": {
            "title": "Watchlist name (optional)",
            "maxLength": 100,
            "type": "string",
            "description": "Use a distinct name per project, e.g. london-crew. Reuse it to share history between your tasks. Defaults to this saved task, or default for runs without a task. Do not overlap runs of one watchlist."
          },
          "minimumChangePercent": {
            "title": "Minimum price change (%)",
            "minimum": 0,
            "type": "number",
            "description": "Price-drop and price-rise events require this percentage AND the amount threshold. Set 0 to disable this threshold. All price comparisons remain in CHANGES.csv.",
            "default": 5
          },
          "minimumChangeAmount": {
            "title": "Minimum nightly price change",
            "minimum": 0,
            "type": "number",
            "description": "Absolute nightly change in your preferred currency. Used together with the percentage threshold.",
            "default": 0
          },
          "budgetPerNight": {
            "title": "Nightly budget per room (optional)",
            "minimum": 0,
            "type": "number",
            "description": "Flag displayed quotes at or below this amount in the requested currency. Budget events fire on first match and re-entry, not every unchanged run with history enabled. Taxes and checkout stock are unverified."
          },
          "auditReferences": {
            "title": "Your audit row references (optional)",
            "type": "object",
            "description": "Map Google entity IDs to your spreadsheet IDs, e.g. {\"GOOGLE_ENTITY_ID\":\"row-12\"}. AUDIT output includes price_check, dates, occupancy, coordinates and source evidence. Google IDs are not Airbnb room IDs."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}