{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Reviews Scraper: Anonymous Scores",
    "description": "Scrape Booking.com reviews from hotel URLs: score, month, language, title, liked and disliked texts, trip type, nights, room type and the hotel's 7 sub-scores. Anonymous: no reviewer name, country or photo, property replies left out. No personal data.",
    "version": "0.1",
    "x-build-id": "EiTlOrd8VtOL8iJZf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~booking-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-booking-reviews-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~booking-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-booking-reviews-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~booking-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-booking-reviews-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": {
          "hotelUrls": {
            "title": "Booking.com hotel URLs",
            "type": "array",
            "description": "One hotel page per line, copied from your browser: <code>https://www.booking.com/hotel/pt/masa-campo-grande.html</code> (any Booking.com domain, language suffixes such as <code>.en-gb.html</code> and query parameters are fine) or just <code>pt/masa-campo-grande</code>. 1 to 1,000 URLs; duplicates are read once. Search result URLs are not accepted: use the Booking.com Scraper to find hotels.",
            "items": {
              "type": "string",
              "pattern": "^(https?://|(www\\.)?booking\\.|[A-Za-z]{2}/)"
            }
          },
          "maxReviewsPerHotel": {
            "title": "Maximum reviews per hotel",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop reading a hotel after this many reviews, in the chosen order, 1 to 100,000. Booking.com gives the full published history of a hotel: set a high value to get every review. Default 100: the recent opinion of a hotel, about $0.12 per hotel on the Free plan.",
            "default": 100
          },
          "maxResults": {
            "title": "Maximum reviews in total",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop the run after this many reviews over all hotels, 1 to 1,000,000; you are never charged for more. Default 1000: ten hotels at the default 100 reviews each, about $1.20 on the Free plan. The form is prefilled with 20 for a quick first run.",
            "default": 1000
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "NEWEST_FIRST",
              "MOST_RELEVANT",
              "OLDEST_FIRST",
              "SCORE_DESC",
              "SCORE_ASC"
            ],
            "type": "string",
            "description": "Order in which Booking.com returns the reviews of each hotel: newest first (default, all languages), most relevant (Booking.com's own ranking, which puts reviews in the interface language first), oldest first, highest scores first or lowest scores first. The <code>position</code> column keeps this order.",
            "default": "NEWEST_FIRST"
          },
          "reviewsSince": {
            "title": "Only reviews since",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])(-(0[1-9]|[12]\\d|3[01]))?$",
            "type": "string",
            "description": "Optional date, <code>YYYY-MM-DD</code> or <code>YYYY-MM</code>, e.g. <code>2026-09</code> for September 2026 onwards: only reviews published on or after it are kept. Sorted newest first, each hotel stops at the first older review, which makes monitoring new reviews cheap; with another order the reviews are filtered."
          },
          "languages": {
            "title": "Review languages",
            "type": "array",
            "description": "Optional: only reviews written in these languages, one Booking.com code per line, e.g. <code>en</code>, <code>fr</code>, <code>de</code>, <code>es</code>, <code>pt</code>, <code>it</code>, <code>nl</code>, <code>pl</code>, <code>ja</code>, <code>zh</code>; up to 40, duplicates dropped. Default empty: every language.",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}(-[A-Za-z]{2})?$"
            },
            "default": []
          },
          "tripType": {
            "title": "Trip type",
            "enum": [
              "family",
              "couple",
              "group",
              "solo",
              "business"
            ],
            "type": "string",
            "description": "Optional: only reviews of this type of traveller (Booking.com's own filter): families, couples, groups of friends, solo travellers or business travellers."
          },
          "season": {
            "title": "Season of the stay",
            "enum": [
              "mar_may",
              "jun_aug",
              "sep_nov",
              "dec_feb"
            ],
            "type": "string",
            "description": "Optional: only reviews of stays in these months (Booking.com's own filter)."
          },
          "scoreBand": {
            "title": "Score band",
            "enum": [
              "superb",
              "good",
              "fair",
              "poor",
              "very_poor"
            ],
            "type": "string",
            "description": "Optional: only reviews in this score band (Booking.com's own filter): superb 9+, good 7 to 9, fair 5 to 7, poor 3 to 5, very poor 1 to 3."
          },
          "topic": {
            "title": "Topic",
            "type": "string",
            "description": "Optional topic among those Booking.com shows above a hotel's reviews, in the interface language below, 2 to 50 characters, e.g. <code>Breakfast</code>, <code>Room</code>, <code>Clean</code>, <code>Location</code>, <code>Noise</code>, <code>Parking</code>. Matched without case or accents. A hotel without this topic is skipped and the log lists its topics. Leave empty: no topic filter."
          },
          "searchQuery": {
            "title": "Search in reviews",
            "type": "string",
            "description": "Optional word or phrase: only the reviews that contain it (Booking.com's own full-text search, e.g. <i>noise</i>, <i>parking</i>, <i>breakfast</i>)."
          },
          "language": {
            "title": "Booking.com interface language",
            "pattern": "^[a-z]{2}(-[a-z]{2})?$",
            "type": "string",
            "description": "Booking.com interface language of the room types, of the topic names and of the most-relevant order: two lowercase letters, optionally a region, e.g. <code>en-us</code>, <code>en-gb</code>, <code>fr</code>, <code>de</code>, <code>pt-pt</code>. Review texts always stay in the language they were written in (<code>language</code> column). Default en-us: English (US), the language of our validation runs.",
            "default": "en-us"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies of the requests. Default: Apify datacenter proxies, included in the price and enough for Booking.com reviews in our tests. If your runs get blocked, choose another Apify proxy group or give your own proxy URLs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Safety cap on requests for the whole run: one per 25 reviews, plus one per hotel, plus one per hotel with a topic. Default 2000: far more than the default 1,000 reviews need (about 40 pages plus one request per hotel).",
            "default": 2000
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two pages of reviews of the same hotel, in milliseconds, 0 to 30,000; 0 disables it. Increase it if you get blocked. Default 250: a quarter of a second, a short pause that keeps long histories quick to read.",
            "default": 250
          },
          "debugStoreResponses": {
            "title": "Store responses (debugging)",
            "type": "boolean",
            "description": "Debugging only: save every Booking.com response in the run's key-value store as it is. The requests never ask for reviewer names, countries, photos or property replies, so the responses hold none. 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}