{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Reviews Scraper",
    "description": "Scrape every guest review for any Booking.com property: full positive and negative text, 1–10 score, stay dates, nights, room type, reviewer country, traveller type, photos and replies. Adds a reputation profile per property with all seven sub-scores. Filter by keyword, language, season or date.",
    "version": "0.0",
    "x-build-id": "r4XD74dbjMFxmumnu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/apt_marble~booking-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-apt_marble-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/apt_marble~booking-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-apt_marble-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/apt_marble~booking-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-apt_marble-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": {
          "hotelNames": {
            "title": "Property names",
            "maxItems": 200,
            "type": "array",
            "description": "Property names to look up, one per line — for example \"Hilton Austin\". A name is matched against the property Booking.com returns, and a weak match is reported and skipped instead of being guessed at, so use the property link or its id when you need certainty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Property links",
            "maxItems": 200,
            "type": "array",
            "description": "Booking.com property page links, pasted straight from your browser — for example https://www.booking.com/hotel/us/hilton-austin.en-gb.html. The property in the link is verified before any reviews are saved.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotelIds": {
            "title": "Property IDs",
            "maxItems": 200,
            "type": "array",
            "description": "Booking.com numeric property ids, for example 191102. This is the most exact and the fastest way to name a property: nothing has to be looked up and there is no chance of landing on the wrong hotel.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxHotels": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many properties to work through in this run, counted after duplicates across the three lists above are merged.",
            "default": 20
          },
          "maxReviewsPerHotel": {
            "title": "Reviews per property",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "How many reviews to save for each property. Set it to 0 to save only the reputation profile and no individual reviews. Booking.com puts no ceiling on review depth, so a property with thousands of reviews can be collected in full. When you list several review languages below, this is the allowance for each language, so the row count grows with the number of languages.",
            "default": 50
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "MOST_RELEVANT",
              "NEWEST_FIRST",
              "OLDEST_FIRST",
              "SCORE_DESC",
              "SCORE_ASC"
            ],
            "type": "string",
            "description": "The order Booking.com serves the reviews in. \"Newest first\" is the one to use for monitoring, because the run then stops as soon as it reaches reviews older than your cut-off date.",
            "default": "MOST_RELEVANT"
          },
          "onlyReviewsSince": {
            "title": "Only reviews since",
            "type": "string",
            "description": "Keep only reviews written on or after this date (YYYY-MM-DD). Combine it with \"Newest first\" for a cheap daily or weekly top-up run.",
            "default": ""
          },
          "keywordFilter": {
            "title": "Keyword",
            "type": "string",
            "description": "Keep only the reviews Booking.com matches for this term, for example \"noise\" or \"breakfast\". Matching is Booking.com's own, not a pattern you control, and a term nobody wrote about returns nothing at all rather than an error.",
            "default": ""
          },
          "reviewLanguages": {
            "title": "Review languages",
            "maxItems": 10,
            "type": "array",
            "description": "Two-letter language codes such as en, es, fr — up to ten. Each language is collected as its own pass, with its own reviews-per-property allowance, and every row records which language pass produced it. Leave empty for every language. Note that a review's language is the language it was written in, not where the reviewer is from.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "customerType": {
            "title": "Traveller type",
            "enum": [
              "ALL",
              "FAMILIES",
              "COUPLES",
              "GROUP_OF_FRIENDS",
              "SOLO_TRAVELLERS",
              "BUSINESS_TRAVELLERS"
            ],
            "type": "string",
            "description": "Keep only reviews from one kind of traveller. These counts are published by Booking.com and are reliable.",
            "default": "ALL"
          },
          "timeOfYear": {
            "title": "Season of stay",
            "enum": [
              "ALL",
              "_03_05",
              "_06_08",
              "_09_11",
              "_12_02"
            ],
            "type": "string",
            "description": "Keep only reviews from stays in one season. Booking.com's published seasonal totals read zero even for properties with thousands of reviews, so the season is applied as a real filter here and the recalculated total is what gets reported.",
            "default": "ALL"
          },
          "includeReputationProfile": {
            "title": "Add a reputation profile per property",
            "type": "boolean",
            "description": "Adds one extra row per property with all seven sub-scores (staff, facilities, cleanliness, comfort, value, location, wifi), the traveller-segment mix, the review-language mix and the topics Booking.com itself surfaces for that property.",
            "default": true
          },
          "includePhotos": {
            "title": "Include review photos",
            "type": "boolean",
            "description": "Adds the guest photos attached to a review, with every published size. Turn it off for a smaller, tidier dataset.",
            "default": true
          },
          "maxRequests": {
            "title": "Maximum work per run",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "A hard ceiling on how much work one run may do. The projected size of the job is printed in the log before anything starts, and the run finishes cleanly with whatever it has collected once the ceiling is reached.",
            "default": 2000
          },
          "maxConcurrency": {
            "title": "Properties at a time",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many properties are worked on simultaneously. Higher finishes a long list sooner; 4 is a good balance and 8 is the ceiling.",
            "default": 4
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Booking.com language code used for labels such as sub-score names and the property link, for example en-us, en-gb, de, fr, es.",
            "default": "en-us"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code, for example USD, EUR, GBP. Reviews carry no prices, so this only affects the wording of anything money-related.",
            "default": "USD"
          },
          "proxyCountry": {
            "title": "Country to appear to browse from",
            "type": "string",
            "description": "Two-letter country code, for example us, gb, de. Booking.com serves the same reviews everywhere, so most runs can leave this alone.",
            "default": "us"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}