{
  "openapi": "3.0.1",
  "info": {
    "title": "Agoda Hotels Scraper",
    "description": "Scrape a whole Agoda destination: every property with live prices for your dates, the full profile, the operator's contact details, and guest reviews from Agoda and Booking.com. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "IQcm1hKGEwpMMD5Sw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nice_dev~agoda-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nice_dev-agoda-hotels-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/nice_dev~agoda-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nice_dev-agoda-hotels-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/nice_dev~agoda-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nice_dev-agoda-hotels-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": {
          "location": {
            "title": "Destination",
            "maxLength": 200,
            "type": "string",
            "description": "A city, as typed on the site (e.g. `Paris`, `Bangkok`, `New York`, `Bali`). The Actor resolves it with Agoda's own suggestion API: the city of exactly that name wins; with none, Agoda's closest match is taken and named in the log (`Spa` → Athens: type `Spa Belgium`, or give its City ID). A district, an airport or a landmark (`Ubud`, `Shibuya`) is refused before anything is charged, with the City ID of the city it is in: the Actor searches whole cities."
          },
          "locations": {
            "title": "More destinations",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several destinations in one run: one search per destination. Added to **Destination**. Properties found by several searches are saved once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "cityIds": {
            "title": "City IDs",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Agoda numeric city ids (e.g. `15470` for Paris), when you already know them: no name resolution, no ambiguity. Added to the destinations above.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "Agoda search URLs copied from the address bar (`https://www.agoda.com/search?city=15470&...`, in any site language: its language, dates, guests, currency, sort and ticked star ratings are kept, profiles and reviews included; the site's other filters are not — set them in the Filters section) or single property URLs (`https://www.agoda.com/<slug>/hotel/<city>.html`). When this list is not empty, the destination fields above are ignored; caps, filters and monitoring still apply. Max 1 000 URLs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "propertyIds": {
            "title": "Property IDs",
            "maxItems": 5000,
            "uniqueItems": true,
            "type": "array",
            "description": "Agoda numeric property ids to scrape directly (e.g. `335650`), without any search. One request per property, for its profile. Added to the destination fields: clear **Destination** to get only these properties. A property given by id (or by a property URL) has **no price** — its profile carries none — unless you tick **Price of properties given by id** (`fetchPropertyPrices`).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotelNames": {
            "title": "Property names",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Properties named as you would type them on Agoda (e.g. `Park Hyatt Tokyo`), without any search: each name is looked up in Agoda's own suggestions before the run and the property of exactly that name wins, else the first one it proposes (the log says which one). Then read like a property id: its profile, and its price with **Price of properties given by id**. Added to the destination fields: clear **Destination** to get only these properties.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "First night: a date (`2026-12-20`), or a period from the run date such as `7 days` or `2 weeks` — a saved task then always looks the same distance ahead. Empty = 30 days from the run date."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "Departure day, `YYYY-MM-DD`. Empty = check-in plus **Nights** (the way to keep the length of a stay whose check-in moves with the run date). Must be after the check-in date."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay, used when **Check-out date** is empty.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Adults per room.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Children per room. When above 0, fill **Children ages** with one age per child.",
            "default": 0
          },
          "childrenAges": {
            "title": "Children ages",
            "maxItems": 10,
            "type": "array",
            "description": "One age (0-17) per child, in the same order as on the site. Must hold exactly **Children** values.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of rooms requested.",
            "default": 1
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "maxLength": 3,
            "type": "string",
            "description": "Three-letter currency of every price (`USD`, `EUR`, `GBP`, `THB`…). Agoda converts server-side.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-zA-Z]{2}-[a-zA-Z]{2}$",
            "maxLength": 5,
            "type": "string",
            "description": "Agoda locale for names, descriptions and reviews (`en-us`, `fr-fr`, `de-de`, `es-es`, `it-it`, `ja-jp`, `th-th`, `zh-cn`…). Agoda also gives each language its own deals: the same hotel can cost less in `fr-fr` than in `en-us` (coupon already taken off the price, shown in the price as couponPerNight). A search URL pasted from agoda.com in another language (…/fr-fr/search?…) keeps its own.",
            "default": "en-us"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "recommended",
              "price_low_to_high",
              "price_high_to_low",
              "review_high_to_low",
              "review_low_to_high"
            ],
            "type": "string",
            "description": "Order asked from the site. `recommended` is the only order Agoda keeps stable between two calls — the others repeat and skip properties, which the Actor absorbs by de-duplicating, but the first N results are then less predictable. Whatever the order, Agoda slips one sold-out property (no price) into every ten results: tick **Available properties only** to have the site leave them out.",
            "default": "recommended"
          },
          "maxItems": {
            "title": "Max properties",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of properties saved for the whole run (after de-duplication and filters). 0 = no limit — a big city holds about 4 500 properties.",
            "default": 100
          },
          "maxItemsPerSearch": {
            "title": "Max properties per destination",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap for EACH destination (or search URL), so the first one cannot use up the whole **Max properties** budget. 0 = no per-search cap.",
            "default": 0
          },
          "extractDetails": {
            "title": "Extract full property profile",
            "type": "boolean",
            "description": "Description, grouped amenities, policies, check-in / check-out times, category scores, AI review summary, nearby places, every photo. One request per property, charged apart (see Pricing). Off = search-result fields only (name, stars, price, rating, GPS, photos). A property given by id, name or URL is always read with its profile, and charged for it. The operator's contact details: see **Operator's contact details** below.",
            "default": true
          },
          "fetchPropertyPrices": {
            "title": "Price of properties given by id",
            "type": "boolean",
            "description": "For the properties given in **Property IDs**, **Property names** or as a property URL in **Start URLs**: read their price, availability and cancellation terms for your dates — one more request per property, charged apart (see Pricing). Without it they come with no price (`price: null`, `isAvailable: false`). Properties found by a destination or a search URL always have their price.",
            "default": false
          },
          "includeOperator": {
            "title": "Operator's contact details",
            "type": "boolean",
            "description": "Add the company running each property (`trader`): trading name, e-mail, phone, registration number, address. Agoda shows it to visitors in Europe only: with this option the Actor reads it from Europe for you — one small request per property whose profile is read, charged apart on each property that has an operator (see Pricing). Needs the profile (**Extract full property profile**, or properties given by id). With your own proxy (**Proxy configuration** → your proxy URLs) the option does nothing more: the profile then carries the operator when your proxy is in Europe, at no extra charge.",
            "default": false
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Add the guest reviews to each property, charged apart on each property that has reviews (see Pricing). One request per page of reviews: a page brings up to 100 Agoda reviews and 100 Booking.com reviews, and the next pages are read only when **Max reviews per property** or a review filter needs them. Off = only the score and the review count.",
            "default": false
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per property",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on the reviews saved for each property, both sources together — up to 5,000, the full history of most hotels (The Magani, Bali: 2,367 reviews, all read). Up to 100 = one request per property; above, one more request per 100 reviews of each source. With a review filter below (score, dates), only the first 200 reviews of each source are searched (2 pages per property): the reviews kept are those among them that pass it. A property whose page of reviews could not be read is saved with the ones read so far and `reviewsIncomplete: true`. The first 200 reviews of a property come with the reviews option; each one beyond is charged on its own (see Pricing).",
            "default": 20
          },
          "reviewsSort": {
            "title": "Reviews order",
            "enum": [
              "newest",
              "highest_rating",
              "lowest_rating"
            ],
            "type": "string",
            "description": "Order of the saved reviews, both sources together: with the cap on reviews per property, it picks which ones are kept (the most recent, the best or the worst of what Agoda serves).",
            "default": "newest"
          },
          "reviewProviders": {
            "title": "Review sources",
            "uniqueItems": true,
            "type": "array",
            "description": "Which sources to keep. Both come back in the same request, at no extra cost — with them, the other sites Agoda republishes (`Priceline.com`…). Untick one to keep only the other.",
            "items": {
              "type": "string",
              "enum": [
                "agoda",
                "booking"
              ],
              "enumTitles": [
                "Agoda",
                "Booking.com"
              ]
            },
            "default": [
              "agoda",
              "booking"
            ]
          },
          "reviewsMinRating": {
            "title": "Minimum review rating",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Keep only the reviews scored at least this (out of 10). 0 = every review.",
            "default": 0
          },
          "reviewsMaxRating": {
            "title": "Maximum review rating",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Keep only the reviews scored at most this (out of 10). 0 = every review. Set it low to collect complaints only.",
            "default": 0
          },
          "reviewsAfter": {
            "title": "Reviews after",
            "type": "string",
            "description": "Keep only the reviews written on or after this date: `2026-01-01`, or a period before now such as `7 days`, `3 months`, `1 year`."
          },
          "reviewsBefore": {
            "title": "Reviews before",
            "type": "string",
            "description": "Keep only the reviews written on or before this date (the whole day is included)."
          },
          "minStars": {
            "title": "Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep properties with at least this many stars (1-5). 0 = no filter. Asked from the site, so filtered pages are not even downloaded.",
            "default": 0
          },
          "maxStars": {
            "title": "Maximum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep properties with at most this many stars. 0 = no filter.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum guest rating",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Keep properties whose guest score is at least this (Agoda scores out of 10). 0 = no filter. Properties without any review are dropped when this is set.",
            "default": 0
          },
          "minReviewCount": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep properties with at least this many reviews. 0 = no filter.",
            "default": 0
          },
          "minPrice": {
            "title": "Minimum price per night",
            "minimum": 0,
            "maximum": 1000000,
            "type": "number",
            "description": "Keep properties whose cheapest offer is at least this, in **Currency**, tax included. 0 = no filter. A property given by id or URL has a price only with `fetchPropertyPrices`: without it, this filter drops it.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price per night",
            "minimum": 0,
            "maximum": 1000000,
            "type": "number",
            "description": "Keep properties whose cheapest offer is at most this, in **Currency**, tax included. 0 = no filter. A property given by id or URL has a price only with `fetchPropertyPrices`: without it, this filter drops it.",
            "default": 0
          },
          "availableOnly": {
            "title": "Available properties only",
            "type": "boolean",
            "description": "Leave out the properties with no bookable offer for your dates (sold out or not sellable): asked from the site, so they are never read. Off = they are saved with a null price (about one in ten results). A property given by id or URL has a price only with `fetchPropertyPrices`: without it, this filter drops it.",
            "default": false
          },
          "propertyTypes": {
            "title": "Property types",
            "maxItems": 30,
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these types, as Agoda names them (`Hotel`, `Apartment`, `Resort`, `Hostel`, `Villa`, `Guest House`…). Empty = every type.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Drop the properties whose name contains one of these words (case and accents ignored).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludePropertyIds": {
            "title": "Exclude property IDs",
            "maxItems": 5000,
            "uniqueItems": true,
            "type": "array",
            "description": "Agoda property ids to skip, even when they match the search (e.g. your own hotels).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyNew": {
            "title": "Only new properties",
            "type": "boolean",
            "description": "Skip the properties that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their profile is not even fetched. First run = everything is new.",
            "default": false
          },
          "stateKey": {
            "title": "Memory key",
            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
            "maxLength": 64,
            "type": "string",
            "description": "Name of the memory used by **Only new properties**. Give each schedule / task its own key (e.g. `paris-hotels`) so that they do not share their memory. Letters, digits, `-` and `_`.",
            "default": "default"
          },
          "resetState": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every property again. Untick it afterwards.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor. Your own proxy in Europe also brings the operator's contact details with each profile, at no extra charge (see **Operator's contact details**).",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of requests processed in parallel. Together with **Min delay between requests**, it sets how fast the run goes.",
            "default": 4
          },
          "minRequestIntervalMs": {
            "title": "Min delay between requests",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Minimum time between two requests leaving the Actor, in milliseconds. Lower it only with your own proxies.",
            "default": 1000
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 6,
            "maximum": 600,
            "type": "integer",
            "description": "Upper bound on the request rate for the whole run, on top of **Min delay between requests**. A property's profile and its reviews count as ONE request here (the reviews are read with the profile); the min delay spaces both.",
            "default": 60
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Retries per request before it is marked as failed.",
            "default": 5
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Include debug messages in the run log.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}