{
  "openapi": "3.0.1",
  "info": {
    "title": "Hostelworld Scraper - Hostels, Hotels, Prices, Reviews & Events",
    "description": "Scrape Hostelworld hostels, hotels, guesthouses, B&Bs, apartments and campsites by city, property URL or ID. Extract prices, ratings, rooms, facilities, full reviews, Linkups events and attendee details.",
    "version": "0.1",
    "x-build-id": "zJbGHmye0YJ0F8dUL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~hostelworld-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-hostelworld-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/abotapi~hostelworld-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-hostelworld-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/abotapi~hostelworld-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-hostelworld-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Input mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode finds hostels, hotels and other stays in the cities you name. URL mode accepts pasted property pages, or city search pages which the actor walks page by page.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities to search, one per line. Examples: Berlin, Lisbon Portugal, Bangkok.",
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "hostel",
              "hotel",
              "guesthouse",
              "bed-and-breakfast",
              "apartment",
              "campsite",
              "accommodation"
            ],
            "type": "string",
            "description": "What to search for in the chosen cities.",
            "default": "hostel"
          },
          "district": {
            "title": "District / neighbourhood (optional)",
            "type": "string",
            "description": "Narrow the search to one district, e.g. kreuzberg in Berlin. Leave empty for the whole city."
          },
          "sortBy": {
            "title": "Sort listings",
            "enum": [
              "recommended",
              "price_low",
              "price_high",
              "rating",
              "reviews",
              "name"
            ],
            "type": "string",
            "description": "Order in which properties from the search are returned.",
            "default": "recommended"
          },
          "startUrls": {
            "title": "URLs",
            "type": "array",
            "description": "Property pages (…/hostels/p/703/circus-hostel/), the mobile share form (…/st/hostel/703/…), or city search pages for any property type (…/hostels/europe/germany/berlin/, …/hotels/…, with or without ?page=N). Search pages walk forward page by page.",
            "default": [
              {
                "url": "https://www.hostelworld.com/hostels/p/703/circus-hostel/"
              },
              {
                "url": "https://www.hostelworld.com/st/hostel/703/circus-hostel/"
              },
              {
                "url": "https://www.hostelworld.com/hostels/europe/germany/berlin/"
              },
              {
                "url": "https://www.hostelworld.com/hotels/europe/germany/berlin/?page=2"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "propertyIds": {
            "title": "Property IDs",
            "type": "array",
            "description": "Optionally add numeric Hostelworld property IDs directly (the number in /p/703/). Works in both modes.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Maximum rows to save across the whole run (property rows, or review rows in reviews-only output). The run can return fewer when the site has fewer matches.",
            "default": 20
          },
          "maxPages": {
            "title": "Max search pages per location",
            "minimum": 1,
            "type": "integer",
            "description": "Advanced safety bound for search-page walking, 1-500 (leave empty for the internal bound; listings always stop at Max items first)."
          },
          "includeDetails": {
            "title": "Property details (charged per property)",
            "type": "boolean",
            "description": "Fetch the full detail page for every listing: description, facilities, room board with prices, policies, check-in, payment methods, address and directions, photos, business registration. Charged per property.",
            "default": true
          },
          "includeReviews": {
            "title": "Reviews (charged per review)",
            "type": "boolean",
            "description": "Collect guest reviews with full text, per-category ratings, traveller details and owner replies. Charged per review.",
            "default": true
          },
          "maxReviewsPerProperty": {
            "title": "Max reviews per property",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Cap on reviews collected from each property.",
            "default": 20
          },
          "reviewSort": {
            "title": "Review sort order",
            "enum": [
              "newest",
              "oldest",
              "topRated",
              "lowestRated"
            ],
            "type": "string",
            "description": "Order of reviews returned for each property.",
            "default": "newest"
          },
          "allLanguages": {
            "title": "All review languages",
            "type": "boolean",
            "description": "Include machine-translated reviews written in other languages, not just English.",
            "default": false
          },
          "includeEvents": {
            "title": "Linkups events (charged per event)",
            "type": "boolean",
            "description": "Collect Linkups events (hostel gatherings: pub crawls, city walks, meetups) hosted at each property, inside Events window. Charged per event.",
            "default": true
          },
          "eventsDaysAhead": {
            "title": "Events window (days ahead)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "How many days ahead to look for Linkups events.",
            "default": 7
          },
          "eventsPageSize": {
            "title": "Max events per property",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Cap on Linkups events collected from each property.",
            "default": 8
          },
          "includePeople": {
            "title": "Who's going (included with details)",
            "type": "boolean",
            "description": "Add the travellers heading to each property in the events window (nationality mix and avatars, as shown on the site).",
            "default": true
          },
          "reviewsOnly": {
            "title": "Output reviews only",
            "type": "boolean",
            "description": "When ON, the dataset holds ONLY review rows (one row per review with property fields denormalized) and property rows are not emitted. Max items then counts review rows.",
            "default": false
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO code prices are returned in.",
            "default": "EUR"
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Connection settings. The default Apify Proxy (datacenter) works out of the box; pick residential under Proxy groups for large or frequent runs."
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Optional run or dataset ID from a previous run: rows already collected there are skipped, so this run returns only the delta. Cannot be combined with an existing Incremental mode baseline for the same scope."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Remember the last run for this exact scope (state key below) and return only NEW/UPDATED rows next time: changes to prices, ratings, reviews counts, details text, rooms, facilities, events or people drive UPDATED; the availability flag, booked-today counter, rotating image URLs and scrape timestamps never do (see Ignore fields below). UNCHANGED rows are neither saved nor charged.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Optional name for the incremental baseline. Leave empty to key it automatically on this run's scope."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows",
            "type": "boolean",
            "description": "Incremental mode only: also save rows that did not change since the last run (classified UNCHANGED).",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows",
            "type": "boolean",
            "description": "Incremental mode only: also save rows from the last run that this run could not find anymore (classified EXPIRED). Only when the full scope was scanned.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Advanced. Field names that must never mark a row UPDATED in incremental mode (telemetry you do not care about). Availability flag, booked-today counter and scraped-at timestamp are already ignored by default.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send scraped rows into connected apps via Model Context Protocol connectors. Authorize a connector under Apify > Settings > API & Integrations, then select it here. Supported: Notion, Linear, Airtable, and Apify."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page",
            "type": "string",
            "description": "URL or id of the Notion page under which result pages are created. Required for Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max rows to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on how many rows are written to each selected connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}