{
  "openapi": "3.0.1",
  "info": {
    "title": "Agoda Reviews Scraper — Hotel Reviews, Guest Reviews & Ratings",
    "description": "Agoda hotel reviews by hotel name, URL or id, with the Booking.com reviews Agoda shows. One row per review: 0-10 rating, title, text, positives, negatives, language, stay dates, room, reviewer country, photos, hotel reply, source. Free filters before billing: max score (negative reviews), text only.",
    "version": "1.0",
    "x-build-id": "iUBDOCfSgh1oRqLni"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kestrel~agoda-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kestrel-agoda-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/kestrel~agoda-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-kestrel-agoda-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/kestrel~agoda-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-kestrel-agoda-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": "Agoda hotel URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Agoda property pages, e.g. [\"https://www.agoda.com/tivoli-avenida-liberdade-lisboa/hotel/lisbon-pt.html\"]; any agoda.com URL of the property works. The numeric hotel id is read from the page for you (one page request, no browser). A URL whose page carries no id costs nothing and is reported in a status row. Give at least one of startUrls, hotelNames or hotelIds.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotelNames": {
            "title": "Hotel names",
            "uniqueItems": true,
            "type": "array",
            "description": "Property names as typed into Agoda's search box, e.g. [\"Park Hyatt Tokyo\", \"Tivoli Avenida Liberdade Lisbon\"]; add the city for chains. Resolved to the exact property through Agoda's own autocomplete (best match first), so no id hunting. Use for \"reviews of hotel X\" when you have no URL. A name that matches nothing costs nothing and is reported in a status row; check hotel_name on the rows when the name is generic.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hotelIds": {
            "title": "Agoda hotel ids",
            "uniqueItems": true,
            "type": "array",
            "description": "Agoda's numeric property ids, e.g. [\"63820\"] — the hotel_id on an earlier run's rows. The fastest path: no lookup. Use to re-read the same properties every day. hotel_name is filled from the reviews themselves. An id Agoda answers with no reviews at all is reported as an error status row (free) rather than as \"no reviews\", because a throttled call looks the same.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per hotel",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "The main cost control: reviews delivered per property, e.g. 50; default 200 (at most $1 per property at $0.005 a review). 0 = every review (at most 6,000 per property per run; a busy hostel can exceed 1,000, so 0 can cost $5+). Reviews come in reviewsSort order: 50 with \"most_recent\" = the 50 newest. maxRating and requireText are applied AFTER this cap: 200 asked with maxRating 5 delivers only those of the 200 at or below 5, so pair maxRating with reviewsSort \"lowest_rated\".",
            "default": 200
          },
          "reviewsSort": {
            "title": "Order",
            "enum": [
              "most_recent",
              "highest_rated",
              "lowest_rated",
              "most_relevant"
            ],
            "type": "string",
            "description": "\"most_recent\" (default), \"highest_rated\", \"lowest_rated\" or \"most_relevant\" — Agoda's own orders. Use \"lowest_rated\" with maxReviewsPerHotel 50 for \"the 50 worst reviews\" or with maxRating for complaints; \"most_recent\" for a scheduled feed (each run re-reads the newest N — dedupe on review_id).",
            "default": "most_recent"
          },
          "maxRating": {
            "title": "Only reviews at or below this score",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Only reviews at or below this score on Agoda's 0-10 scale, e.g. 5 for complaints; 0 (default) = every score. Use for \"negative reviews\", \"complaints\", \"what guests dislike\". Reviews above the score are never delivered or charged, but they count against maxReviewsPerHotel: set reviewsSort \"lowest_rated\" so the cap is spent on low scores.",
            "default": 0
          },
          "requireText": {
            "title": "Only reviews with a written comment",
            "type": "boolean",
            "description": "true = deliver and pay only for reviews with written text; many Agoda reviews are a score with no words, and these are dropped before billing. Default false. Applied after maxReviewsPerHotel, so 200 asked with true delivers fewer. Use for sentiment analysis, summaries or any task that reads the text.",
            "default": false
          },
          "includeHotelRow": {
            "title": "Include a hotel row",
            "type": "boolean",
            "description": "true (default) = also one free row per property (type \"hotel\"): hotel_id, hotel_name, url and reviews_fetched. Never charged. It carries no scores: Agoda's category ratings are not on the review endpoint this actor reads.",
            "default": true
          },
          "locale": {
            "title": "Language",
            "type": "string",
            "description": "Agoda locale for the request, e.g. \"en-us\" (default), \"ja-jp\", \"ko-kr\", \"th-th\", \"zh-cn\", \"de-de\", \"es-es\". Sets the language of labels and of the translation Agoda supplies: for some reviews text holds Agoda's translation into this language, original_text the guest's own words and language the language it was written in; reviews Agoda does not translate come as written. Not a filter: every language is delivered.",
            "default": "en-us"
          },
          "sessions": {
            "title": "Parallel sessions",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel proxy sessions (egress IPs), 1 to 16, default 4. More is faster; each is paced separately by perIp. Leave the default unless runs are throttled.",
            "default": 4
          },
          "perIp": {
            "title": "Requests per second per IP",
            "minimum": 0.1,
            "maximum": 3,
            "type": "number",
            "description": "Requests per second per session, 0.1 to 3, default 1. Agoda tolerates about 1/s per IP; faster causes retries, not speed.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy, default {\"useApifyProxy\": true}; the default datacenter group works. Agoda throttles unrotated datacenter traffic by answering 200 with no reviews — the actor detects that and retries on a fresh IP, so a busy property is never reported as having none. No browser, no login; HTTP/2 is handled for you.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}