{
  "openapi": "3.0.1",
  "info": {
    "title": "Agoda Hotel Scraper — Prices, Reviews & Amenities",
    "description": "Scrape **Agoda** hotel property pages to extract **hotel name, star rating, review score, room types, amenities, coordinates, and images**. Input: property URLs or hotel IDs. Uses Agoda's internal **Cronos JSON API** — structural, no CSS classes, robust to HTML changes.",
    "version": "0.1",
    "x-build-id": "HyJsJEUhBwL3rX3fB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/bovi~agoda-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-bovi-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/bovi~agoda-scraper/runs": {
      "post": {
        "operationId": "runs-sync-bovi-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/bovi~agoda-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-bovi-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": "Search by hotel name or destination",
            "type": "array",
            "description": "Free-text hotel names or destinations to look up — no URL hunting needed. Each term is resolved via Agoda's suggest API to one or more hotel IDs, then scraped. Works best with a specific hotel name (e.g. \"Peninsula Bangkok\", \"Marina Bay Sands\"). Broad city names (e.g. \"Bangkok\") return only the few top properties Agoda surfaces in its suggest box — for full city coverage, supply propertyUrls or hotelIds. Combine freely with the other inputs.",
            "items": {
              "type": "string"
            }
          },
          "propertyUrls": {
            "title": "Hotel Property URLs",
            "type": "array",
            "description": "List of Agoda hotel property page URLs to scrape. Each URL must be the full Agoda property page, e.g. https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html. The actor extracts the hotel ID from the page and calls the internal JSON API — no HTML parsing needed. Find URLs by searching Agoda normally and copying the property link.",
            "items": {
              "type": "string"
            }
          },
          "hotelIds": {
            "title": "Hotel IDs (numeric)",
            "type": "array",
            "description": "Alternative input: list of Agoda numeric hotel IDs. Each ID is the integer found in the Agoda Cronos API, e.g. [10715, 197181]. Use this when you already know the hotel IDs from a previous run or from the Agoda URL structure. Example: [10715]",
            "items": {
              "type": "integer"
            }
          },
          "includeReviews": {
            "title": "Include Review Comments",
            "type": "boolean",
            "description": "When enabled, fetches up to reviewsPerHotel individual review comments for each hotel via the Agoda reviews API. Each review adds an extra API call. Reviews include reviewer rating, title, comment text, and check-in date. Default: false.",
            "default": false
          },
          "reviewsPerHotel": {
            "title": "Reviews per hotel",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of review comments to fetch per hotel (only applies when includeReviews is enabled). Reviews are sorted by most recent. Range: 1–50. Default: 10.",
            "default": 10
          },
          "maxItems": {
            "title": "Max hotels (total)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum total hotel records to return across all inputs. 0 = unlimited. Use to control cost — each hotel is one PPE charge regardless of how many reviews are fetched.",
            "default": 0
          },
          "requestDelay": {
            "title": "Delay between requests (seconds)",
            "minimum": 0,
            "maximum": 30,
            "type": "number",
            "description": "Seconds to wait between consecutive property fetches. Default 1.5s is polite and reduces ban risk. Increase for large batches.",
            "default": 1.5
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings. Default: Apify RESIDENTIAL proxy (recommended for production scale). Property pages and JSON API calls work from datacenter IPs in testing, but RESIDENTIAL ensures reliability at volume. Set useApifyProxy:true with groups:[\"RESIDENTIAL\"].",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}