{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Hotels Prices API & Scraper: Rate Parity",
    "description": "Google Hotels prices API and scraper for daily hotel price tracking and rate parity checks: per night and per stay, taxes, rating, stars and, optionally, every booking site's rate (Booking.com, Expedia, official site) for your hotels and fixed dates. $3 / 1,000 hotels, +$2 with rates.",
    "version": "1.0",
    "x-build-id": "9P5b1SJ1g4wLcNdAG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/egra_van~google-hotels-prices/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-egra_van-google-hotels-prices",
        "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/egra_van~google-hotels-prices/runs": {
      "post": {
        "operationId": "runs-sync-egra_van-google-hotels-prices",
        "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/egra_van~google-hotels-prices/run-sync": {
      "post": {
        "operationId": "run-sync-egra_van-google-hotels-prices",
        "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": {
          "queries": {
            "title": "Searches",
            "type": "array",
            "description": "What you would type into Google Hotels, one per line: a city, district or landmark, e.g. \"hotels in Paris\", \"hotels near Times Square\", \"Lisbon Alfama\". Each search returns up to \"Max hotels per search\".",
            "items": {
              "type": "string"
            }
          },
          "hotelNames": {
            "title": "Hotel names",
            "type": "array",
            "description": "Specific hotels to look up by name, e.g. \"Hotel Lutetia Paris\". Add the city for best matching. The best-matching result is returned (hotels without a confident match are skipped and listed in the log).",
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Google Hotels links",
            "type": "array",
            "description": "Links to hotels on Google Hotels (they contain \"/travel/hotels/entity/...\"), or the entity ID itself (the \"entityId\" output field). Most reliable way to track the same hotels every day.",
            "items": {
              "type": "string"
            }
          },
          "checkInDate": {
            "title": "Check-in date",
            "type": "string",
            "description": "Check-in date as YYYY-MM-DD, or relative like \"+30 days\". Default: 30 days from today."
          },
          "checkOutDate": {
            "title": "Check-out date",
            "type": "string",
            "description": "Check-out date as YYYY-MM-DD, or relative like \"+32 days\". If empty, check-out = check-in + \"Nights\"."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay used when no check-out date is given (1-30).",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Number of adult guests (1-12). Prices depend on it.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Number of children (0-8). With children, searches use Google's internal search endpoint, which accepts child ages.",
            "default": 0
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "One age (0-17) per child, e.g. [\"5\", \"9\"]. If empty, every child is treated as 8 years old.",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter currency code for all prices, e.g. USD, EUR, GBP, MDL, RON.",
            "default": "USD"
          },
          "includeOffers": {
            "title": "Include prices of every booking site",
            "type": "boolean",
            "description": "Also load each hotel's offers list: Booking.com, Expedia, Agoda, Hotels.com, the hotel's official site and 30+ others, with price, price with taxes, official-site and sponsored flags and link. Needs one extra request per hotel and is charged as an extra event.",
            "default": false
          },
          "maxOffersPerHotel": {
            "title": "Max offers per hotel",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Keep only the N cheapest offers per hotel. 0 = keep all.",
            "default": 0
          },
          "minPrice": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Skip hotels cheaper than this per night (in the chosen currency, before taxes, as shown on Google). Hotels without a price are skipped when a price filter is set."
          },
          "maxPrice": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Skip hotels more expensive than this per night (in the chosen currency, before taxes, as shown on Google)."
          },
          "minRating": {
            "title": "Min guest rating",
            "enum": [
              "3",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Only hotels with at least this Google guest rating (out of 5)."
          },
          "hotelClass": {
            "title": "Hotel class (stars)",
            "type": "array",
            "description": "Only hotels with these official star classes. Empty = any. Hotels without a class are skipped when set.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            }
          },
          "maxHotelsPerQuery": {
            "title": "Max hotels per search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop each search after this many hotels (after filters). Google shows about 18-20 hotels per page.",
            "default": 20
          },
          "maxPagesPerQuery": {
            "title": "Max result pages per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Safety limit on result pages read per search (about 18-20 hotels each), useful with strict filters.",
            "default": 10
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google interface language (hl), e.g. \"en\", \"de\", \"fr\". Affects hotel class texts and descriptions.",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Country the search is made from (gl), 2 letters, e.g. \"us\", \"gb\", \"de\". Google shows prices and taxes the way travelers from this country see them.",
            "default": "us"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Google blocks datacenter IPs quickly. The default Apify proxy works for small runs; each retry uses a new IP, and the browser fallback helps. The Apify RESIDENTIAL and GOOGLE_SERP groups are not available in this Actor: if selected, the run uses the default Apify proxy instead. For residential or other IPs, use your own proxy URLs. The free plan's shared datacenter IPs work only for small runs and often get \"unusual traffic\" pages.",
            "default": {
              "useApifyProxy": true
            }
          },
          "useBrowser": {
            "title": "Real browser",
            "enum": [
              "fallback",
              "always",
              "never"
            ],
            "type": "string",
            "description": "\"fallback\": fast HTTP requests first; if Google blocks them or shows a consent page, switch to a real Chrome browser for the rest of the run. \"always\": use the browser from the start (slower, more memory). \"never\": HTTP only.",
            "default": "fallback"
          },
          "searchMethod": {
            "title": "Search method",
            "enum": [
              "auto",
              "page",
              "rpc"
            ],
            "type": "string",
            "description": "Advanced. \"auto\": the search results page, with Google's internal RPC endpoint as a backup (and first choice when children are set). \"page\" or \"rpc\" force one method.",
            "default": "auto"
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times a blocked or failed request is retried, each time with a new session and proxy IP.",
            "default": 4
          },
          "maxConcurrency": {
            "title": "Parallel offer requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many hotels' offers are loaded at the same time. Lower is gentler on Google (fewer blocks).",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Timeout for one request to Google.",
            "default": 45
          },
          "saveDebugPages": {
            "title": "Save debug pages",
            "type": "boolean",
            "description": "When Google returns something unexpected (captcha, consent, no data), save up to 5 of those responses to the key-value store (keys DEBUG-...) so they can be inspected.",
            "default": true
          },
          "baseUrl": {
            "title": "Base URL (testing)",
            "type": "string",
            "description": "For testing only: send all requests to this address instead of https://www.google.com (e.g. a local mock server). Leave empty."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}