{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Reviews Scraper",
    "description": "Scrape Booking.com guest reviews by hotel URL or hotel name: score, date, title, liked and disliked text, guest country, traveler type, room, stay dates and owner reply. Filter by language, score band, traveler type and review date. No login or API key needed.",
    "version": "0.0",
    "x-build-id": "df9NACXQgbEsp722F"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/axiomworks~booking-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-axiomworks-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/axiomworks~booking-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-axiomworks-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/axiomworks~booking-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-axiomworks-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": {
          "startUrls": {
            "title": "Booking.com hotel page URLs",
            "description": "Booking.com hotel URLs, e.g. [{\"url\":\"https://www.booking.com/hotel/gb/the-savoy.html\"}]. Also accepts a list of URL strings or one URL string through the API. Locale domains, language suffixes and query parameters are normalised. Supply startUrls or searchTerms; hotel names belong in searchTerms."
          },
          "searchTerms": {
            "title": "Hotel names and cities",
            "description": "Hotel names with cities, e.g. [\"The Savoy London\"]. Also accepts a newline-separated string through the API. Uses the top Booking.com search result, so check hotelUrl in the output. Supply searchTerms or startUrls, or both; omitted means no name searches.",
            "default": []
          },
          "maxReviewsPerHotel": {
            "title": "Review limit for each hotel",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum reviews returned per hotel, e.g. 20. Integer 0 or greater; 0 means all available matching reviews. Default 50. maxItems can stop the run earlier across all hotels.",
            "default": 50
          },
          "maxItems": {
            "title": "Total review limit across hotels",
            "type": "integer",
            "description": "Maximum reviews returned across all hotels, e.g. 100. Integer 1 or greater. Omit for no total cap; maxReviewsPerHotel still applies to each hotel."
          },
          "sortBy": {
            "title": "Review collection order",
            "enum": [
              "MOST_RELEVANT",
              "NEWEST_FIRST",
              "OLDEST_FIRST",
              "SCORE_DESC",
              "SCORE_ASC"
            ],
            "type": "string",
            "description": "Review order, e.g. \"NEWEST_FIRST\" (default). Choose MOST_RELEVANT, NEWEST_FIRST, OLDEST_FIRST, SCORE_DESC (highest scores first), or SCORE_ASC (lowest scores first). minDate stops paging early only with NEWEST_FIRST.",
            "default": "NEWEST_FIRST"
          },
          "languageFilter": {
            "title": "Review language code",
            "description": "Review language code, e.g. \"en\", \"de\" or \"fr\"; common English names such as \"French\" also work. Through the API a list is accepted, using its first value. Omit or use an empty string for all languages. Unrecognised values are ignored with a warning.",
            "default": ""
          },
          "travelerTypeFilter": {
            "title": "One traveler type",
            "description": "One traveler type, e.g. \"COUPLES\" or [\"COUPLES\"]. Choose FAMILIES, COUPLES, GROUP_OF_FRIENDS, SOLO_TRAVELLERS or BUSINESS_TRAVELLERS. Case-insensitive; aliases such as \"solo\" work. Lists use only the first value. Omit for all types; unrecognised values are ignored with a warning.",
            "default": ""
          },
          "reviewScoreFilter": {
            "title": "One review score band",
            "description": "One score band, e.g. \"REVIEW_ADJ_SUPERB\", [\"REVIEW_ADJ_SUPERB\"] or 9. Choose REVIEW_ADJ_SUPERB (9+), REVIEW_ADJ_GOOD (7-9), REVIEW_ADJ_AVERAGE_PASSABLE (5-7), REVIEW_ADJ_POOR (3-5), or REVIEW_ADJ_VERY_POOR (1-3). Case-insensitive; aliases such as \"9+\" work. Lists use only the first value. Omit for all scores; unrecognised values are ignored with a warning.",
            "default": ""
          },
          "minDate": {
            "title": "Earliest review date",
            "type": "string",
            "description": "Earliest review date to include, e.g. \"2025-01-01\" in YYYY-MM-DD format. Omit or leave empty for no date cutoff. With NEWEST_FIRST, paging stops at the first older review; other orders filter dates without that early stop.",
            "default": ""
          },
          "includeReviewsWithoutText": {
            "title": "Include reviews with only a score",
            "type": "boolean",
            "description": "Whether to include reviews without a title or written comments, e.g. true. Default false returns only reviews with text. Set true when score-only reviews are useful or no written reviews match your filters.",
            "default": false
          },
          "enrichment": {
            "title": "Add AI sentiment and topics",
            "type": "boolean",
            "description": "Whether to send review text to a third-party AI processor for sentiment and topics, e.g. true. Default false leaves both fields null. Successful enrichment adds an enriched-result event; AI errors return the review without enrichment.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Booking.com request proxy settings",
            "type": "object",
            "description": "Apify Proxy settings, e.g. {\"useApifyProxy\":true} (default). Default routing starts with datacenter IPs and can fall back to residential after blocking. Custom proxyUrls or explicit apifyProxyGroups are respected. If blocked, retry with {\"useApifyProxy\":true,\"apifyProxyGroups\":[\"RESIDENTIAL\"]}.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}