{
  "openapi": "3.0.1",
  "info": {
    "title": "Agoda Hotels Scraper & Price Tracker",
    "description": "Agoda hotels scraper and Agoda price tracker: search results for any city and dates — nightly and total price with and without taxes, guest rating, reviews, stars, photos. Schedule it for hotel price tracking: price drops and rises flagged between runs. One flat row per property, no personal data.",
    "version": "0.1",
    "x-build-id": "4xElio0g9YfZSjAg9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~agoda-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-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/myth84~agoda-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-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/myth84~agoda-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-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": {
          "locations": {
            "title": "Cities",
            "maxItems": 50,
            "type": "array",
            "description": "One or more cities, one per line, as typed in the Agoda search box, e.g. <code>Lisbon</code>, <code>Paris</code>, <code>Bangkok</code>. Each is its own search with the same dates, occupancy, currency and sort, and <b>maxResults applies to each destination</b> (and to each search URL). A property found twice is saved and charged once. Always searched, also with cityId or searchUrls: clear the list to search those only. Up to 50. Default empty; with no city at all, the Actor searches Lisbon.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "cityId": {
            "title": "Agoda city id",
            "minimum": 1,
            "maximum": 9007199254740991,
            "type": "integer",
            "description": "Advanced: Agoda's numeric city id, a positive integer, the <code>city</code> parameter of a search URL, e.g. <code>15470</code> for Paris (Lisbon = 16364). Takes precedence over the city name, which then only labels the rows; ignored when searchUrls is given. Leave empty to search by name."
          },
          "searchUrls": {
            "title": "Agoda search URLs",
            "type": "array",
            "description": "Advanced: search URLs copied from agoda.com, one per line, starting with http(s) and with a <code>city</code> parameter, e.g. <code>https://www.agoda.com/search?city=16364&checkIn=2026-11-20&los=3&adults=2</code>; one search each, their city, dates and occupancy win over the fields. They take precedence over location and cityId; locations are still searched. A URL that is not an Agoda city search stops the run with a clear message. Leave empty to search by name.",
            "items": {
              "type": "string",
              "pattern": "^\\s*[Hh][Tt][Tt][Pp][Ss]?:"
            }
          },
          "location": {
            "title": "Single city",
            "type": "string",
            "description": "Single destination (kept for compatibility; prefer <code>locations</code>): one city as typed in the Agoda search box, e.g. <code>Bangkok</code>, resolved by Agoda's suggestion service and searched before the cities of <code>locations</code> (up to 50 together). Ignored when searchUrls is given; with cityId it only labels the rows. Leave empty when you use locations."
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-in date, YYYY-MM-DD, e.g. <code>2026-12-01</code>, given with checkOut. Leave both empty for a stay relative to today (checkInDaysFromNow and nights), better for schedules: fixed dates expire."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-out date, YYYY-MM-DD, after checkIn, e.g. <code>2026-12-04</code>. Required when checkIn is set."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Without fixed dates: check-in this many days after today (UTC), e.g. <code>7</code> for next week. Default 30: a month ahead, a typical booking window, and the stay moves with each scheduled run so it never expires.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 28,
            "type": "integer",
            "description": "Without fixed dates: length of the stay in nights, 1 to 28. Default 3: a typical city break.",
            "default": 3
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 9,
            "type": "integer",
            "description": "Number of adults in one room, 1 to 9; prices depend on it. Default 2: the most searched occupancy.",
            "default": 2
          },
          "childAges": {
            "title": "Children (ages)",
            "maxItems": 6,
            "type": "array",
            "description": "Ages of the children in the room, one integer per child (0 to 17, up to 6), e.g. <code>[8]</code> or <code>[4, 10]</code>: the search is then sent as an Agoda family search with these children in the occupancy, so prices are for the whole party. Default empty: adults only.",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 17
            },
            "default": []
          },
          "maxResults": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Maximum number of properties saved and charged, 1 to 2,000 (Agoda lists thousands per capital; one request returns up to 100). With <code>locations</code> it applies to each destination; with price monitoring it is the number compared. Default 100: enough to compare a city, about $0.20 on the Free plan. The form prefills 20 for a quick first run (our daily check).",
            "default": 100
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "PRICE_ASC",
              "REVIEW_SCORE_DESC",
              "RANKING",
              "STAR_RATING_DESC",
              "DISTANCE_ASC"
            ],
            "type": "string",
            "description": "Order of the results: <code>PRICE_ASC</code> (cheapest first, by the price before taxes) and <code>REVIEW_SCORE_DESC</code> are validated; <code>RANKING</code> is Agoda's own order, variable between requests; stars and distance are passed as they are. Default PRICE_ASC: exact and stable across pages.",
            "default": "PRICE_ASC"
          },
          "priceView": {
            "title": "Prices shown",
            "enum": [
              "inclusive",
              "exclusive"
            ],
            "type": "string",
            "description": "Which Agoda price fills pricePerNight, priceTotal and priceBeforeDiscount: <code>inclusive</code> (taxes and fees included, what you pay) or <code>exclusive</code> (before taxes and fees, what Agoda advertises); taxesAndFees gives the difference either way. Default inclusive: the final price.",
            "default": "inclusive"
          },
          "resultsPerPage": {
            "title": "Properties per request",
            "enum": [
              "45",
              "100"
            ],
            "type": "string",
            "description": "Properties fetched by one request: <code>100</code> (the server maximum) or <code>45</code> (the site's page size), both validated. Default 100: fewer requests.",
            "default": "100"
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "ISO 4217 code of every price, e.g. <code>USD</code>, <code>EUR</code> or <code>GBP</code>; pick one or type any code Agoda supports (USD and EUR validated). Default USD: the currency of our validation runs.",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "pattern": "^[A-Za-z]{2}-[A-Za-z]{2}$",
            "type": "string",
            "description": "Agoda language of the city, neighbourhood and country names and of the badges, e.g. <code>en-us</code>, <code>en-gb</code>, <code>fr-fr</code>, <code>de-de</code>, <code>es-es</code>; pick one or type any locale of the site (en-us and fr-fr validated). Property names keep their own language. Default en-us: English (US), validated.",
            "default": "en-us"
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Compare the total price of each property (the price per night when Agoda gives no total; taxes included or not as in priceView) with the one recorded by your previous run of the same search, and fill changeType, previousPrice and priceDelta. maxResults is then the number of properties compared. Default off: a plain search.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Key-value store of your account that keeps the previous prices, one record per search (each city and each search URL has its own), e.g. <code>agoda-bangkok-daily</code>. Letters, digits and dashes, up to 63 characters. Default agoda-price-monitor: one store for all your monitoring runs.",
            "default": "agoda-price-monitor"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With monitorPrices: save and charge only the new properties and the price changes (price drop alerts); a run without any change succeeds with an empty dataset. Default off: every compared property is saved with its changeType.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies of the requests. Default: Apify datacenter proxies, included in the price, which passed every request of our tests. A proxy country you select is recorded in viewCountryCode; you can also give your own proxy URLs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Safety cap on API requests for the whole run, retries and place lookups included: one per page of up to 100 properties, plus one lookup per city name. Default 100: enough for 50 cities of 100 properties.",
            "default": 100
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two page requests of the same search, in milliseconds (retries have their own growing pause); 0 disables it. Default 1000: one second, the pacing of our tests.",
            "default": 1000
          },
          "debugStoreHtml": {
            "title": "Store raw API responses",
            "type": "boolean",
            "description": "Debugging only: save every API response (JSON, refused attempts and place lookups included) in the run's key-value store. Default off: it uses storage.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}