{
  "openapi": "3.0.1",
  "info": {
    "title": "Agoda Scraper - Hotels, Prices, Reviews & Ratings",
    "description": "Scrape Agoda hotels: full property details, star ratings, amenities, location, category review scores and complete guest reviews with reviewer demographics and hotel responses. Search by hotel name or paste hotel URLs. No browser needed. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "JldyNDjbBqCH2pG86"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~agoda-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-agoda-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/scrapesage~agoda-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-agoda-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/scrapesage~agoda-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-agoda-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": {
          "searchTerms": {
            "title": "Hotel / destination search",
            "type": "array",
            "description": "Hotel names to look up on Agoda, e.g. `Marina Bay Sands` or `The Ritz-Carlton, Bangkok`. Each term is resolved through Agoda's suggest API and every matching hotel is scraped. Tip: a specific hotel name resolves directly; a bare city name only returns the destination (use hotel URLs/names for individual properties — see README).",
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Hotel page URLs",
            "type": "array",
            "description": "Direct Agoda hotel page URLs (any country domain), e.g. `https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html`. The most reliable way to scrape a known list of properties.",
            "items": {
              "type": "string"
            }
          },
          "hotelIds": {
            "title": "Hotel IDs",
            "type": "array",
            "description": "Numeric Agoda hotel IDs (e.g. `185945`). Useful when you already have IDs from a previous run.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (advanced)",
            "type": "array",
            "description": "Alternative way to pass Agoda hotel page URLs (accepts a list of URL objects). Equivalent to Hotel page URLs.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "outputType": {
            "title": "Output",
            "enum": [
              "hotels",
              "reviews",
              "all"
            ],
            "type": "string",
            "description": "What to put in the dataset. `Hotels` (default) gives one clean, dense table of properties — ideal for direct export. `Reviews` gives one row per guest review. `All` returns hotels + reviews together, each row tagged with a `type` field (the 'All fields' grid will then show columns that only apply to the other type as blank — by design).",
            "default": "hotels"
          },
          "includeReviews": {
            "title": "Scrape guest reviews",
            "type": "boolean",
            "description": "Fetch each hotel's guest reviews (rating, title, text, positives/negatives, reviewer country & traveler type, room, stay dates, helpful votes and the hotel's response). Applies when Output is Reviews or All.",
            "default": true
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per hotel",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the number of reviews fetched per hotel (0 = all available). Reviews are paginated 25 per request.",
            "default": 100
          },
          "reviewsSort": {
            "title": "Review sort order",
            "enum": [
              "most_helpful",
              "newest",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "Order in which reviews are fetched.",
            "default": "most_helpful"
          },
          "maxHotels": {
            "title": "Max hotels",
            "minimum": 0,
            "type": "integer",
            "description": "Limit the total number of hotels scraped this run (0 = no limit). Handy for quick test runs.",
            "default": 0
          },
          "monitorMode": {
            "title": "Monitor mode (only new/changed)",
            "type": "boolean",
            "description": "Remember each hotel's review score and review count between runs (in a named key-value store) and, on later runs, output only hotels that are new or have changed. Designed to run on an Apify Schedule — Schedules trigger the runs, monitor mode makes each run emit only fresh data. Does not conflict with the scheduler.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Name for this monitoring watchlist. Use different keys for different watchlists so their states don't mix.",
            "default": "default"
          },
          "onlyChangedInMonitor": {
            "title": "Emit only changed hotels",
            "type": "boolean",
            "description": "When Monitor mode is on, skip hotels whose review score and count are unchanged since the last run. Turn off to always output every hotel but still tag it as new/changed/unchanged.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of parallel requests.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Agoda serves cleanly on Apify Residential proxy (the default). You can switch to datacenter to lower cost if it works for your volume.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}