{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Reviews Scraper",
    "description": "Scrape every Booking.com guest review for any hotel. Just add hotel URLs or names and get the score, the good and the bad text, stay dates, nights, room, traveller type, reviewer country, owner replies and photos. Filter by language, score, traveller type or stay month. $1.65 per 1,000 reviews.",
    "version": "1.0",
    "x-build-id": "fQvpcv6sWrCbALnSr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~booking-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-booking-reviews",
        "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/boncross~booking-reviews/runs": {
      "post": {
        "operationId": "runs-sync-boncross-booking-reviews",
        "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/boncross~booking-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-booking-reviews",
        "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": {
          "hotels": {
            "title": "Hotels",
            "type": "array",
            "description": "The hotels to scrape. Paste a Booking.com hotel address, or just type the hotel name and it will be looked up. A numeric Booking hotel id also works.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (bulk upload)",
            "type": "array",
            "description": "Booking.com page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxReviewsPerHotel": {
            "title": "Maximum reviews per hotel",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many reviews for each hotel. Set it high to take everything; the scraper reaches the oldest review a hotel has.",
            "default": 100
          },
          "maxItems": {
            "title": "Maximum results for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "A run-wide ceiling across every target. The per-target limit applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "newest",
              "oldest",
              "relevant",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "The order reviews are read in. Newest first is the one to use when you only want recent reviews.",
            "default": "newest"
          },
          "reviewLanguages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep only reviews written in these languages, as two-letter codes such as en, fr, de, es, it, ja, zh. Leave empty for every language.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "customerType": {
            "title": "Traveller type",
            "enum": [
              "",
              "FAMILIES",
              "COUPLES",
              "GROUP_OF_FRIENDS",
              "SOLO_TRAVELLERS",
              "BUSINESS_TRAVELLERS"
            ],
            "type": "string",
            "description": "Keep only reviews from one kind of trip.",
            "default": ""
          },
          "scoreBand": {
            "title": "Score band",
            "enum": [
              "",
              "superb",
              "good",
              "average",
              "poor",
              "very_poor"
            ],
            "type": "string",
            "description": "Keep only reviews in one of Booking.com's score bands.",
            "default": ""
          },
          "stayMonths": {
            "title": "Months of stay",
            "type": "array",
            "description": "Keep only reviews whose stay began in these months, as numbers from 1 to 12. Booking.com groups the year into four seasons, so the season is applied at source and the exact month is checked here.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "containsText": {
            "title": "Contains keyword",
            "type": "string",
            "description": "Keep only reviews mentioning this word or phrase, for example breakfast or noisy.",
            "default": ""
          },
          "topics": {
            "title": "Topics",
            "type": "array",
            "description": "Keep reviews about these topics, as on the chips above Booking.com's review list: Location, Breakfast, Room, Clean, Staff and so on. Names are matched on each hotel's own list, which varies by hotel; a topic id works too.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Keep only reviews posted on or after this date, as YYYY-MM-DD. Pair it with newest first and the run stops as soon as it has passed the date.",
            "default": ""
          },
          "onlyWithOwnerResponse": {
            "title": "Only reviews with an owner response",
            "type": "boolean",
            "description": "Keep only reviews the property has replied to.",
            "default": false
          },
          "includeGuestProfile": {
            "title": "Include guest details",
            "type": "boolean",
            "description": "When off, the guest name, country and avatar are left empty. Turn it off if you do not want personal data in your dataset.",
            "default": true
          },
          "includeAiSummary": {
            "title": "Add Booking's AI review summary",
            "type": "boolean",
            "description": "Adds one extra row per hotel, before its reviews, with the pros and cons Booking.com's own AI summary draws from recent reviews (for example \"Location: central position on the Strip\"). The row has isSummary set to true and is billed as its own event. A hotel Booking has not summarised gets no row and no charge.",
            "default": false
          },
          "onlyNewReviews": {
            "title": "Only reviews not seen in earlier runs",
            "type": "boolean",
            "description": "Skip reviews already returned by a previous run. Needs a de-duplication store name.",
            "default": false
          },
          "dedupStoreName": {
            "title": "De-duplication store name",
            "type": "string",
            "description": "Name of a key-value store that remembers which reviews have already been returned, so a scheduled run gives you only what is new.",
            "default": ""
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 32,
            "type": "integer",
            "description": "How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.",
            "default": 32
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}