Tony Wang6 min readHow to Scrape Agoda in 2026 (API & Python)
Scrape Agoda in 2026 — hotel search, detail, homes, activities, and flights — DIY, no-code, or a structured API, with the legal basics.
The fastest way to scrape Agoda in 2026 is to call a structured API that returns normalized JSON — hotel search and detail, vacation homes, activities, and flights — instead of reverse-engineering Agoda's internal endpoints and running a browser fleet to get past its defenses. Agoda is one of the largest OTAs out of Asia and competes head-on with Booking.com across Southeast Asia and beyond, but it has no simple public read API and defends its pages accordingly. This guide covers all three approaches, what each surface returns, and the legal basics.
Why scrape Agoda data?
Agoda's hotel, home, activity, and flight data feeds several recurring use cases:
- Hotel price and availability monitoring — track how a property's rate moves by city, date, and season.
- OTA rate-parity checks — compare a hotel's Agoda pricing against Booking.com, Expedia, or the property's own site.
- Market research — measure hotel and vacation-home supply density by city, especially across Agoda's strong APAC markets.
- Travel-metasearch and itinerary products — combine hotel, activity, and flight data for a single destination.
- AI travel pipelines — feed normalized hotel and flight data into an agent or trip-planning assistant instead of scraping HTML on the fly.
Is it legal to scrape Agoda?
Option 1: DIY in Python (and why it breaks)
Agoda's search and hotel pages render from internal XHR/GraphQL-style calls behind client-side JavaScript, so a DIY scraper has to replicate those requests:
import requests
# Agoda's search UI calls internal endpoints that aren't documented for public use
resp = requests.get(
"https://www.agoda.com/api/en-us/serp/search/hotels",
params={"cid": -1, "city": 9395},
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
It demos and then breaks:
- No open self-serve API. The real Agoda Partner APIs (Search, Content, CDS) require becoming an approved affiliate or MSE partner through an account manager — not a signup form for a research or monitoring use case.
- Internal endpoints, no stability guarantee. The request shapes behind the search and property pages aren't a public contract; Agoda can change parameters, headers, or response fields without notice.
- Anti-bot on the storefront. Agoda fronts its pages with bot detection and rate limiting tuned for a booking flow, not a research pull — expect blocks or challenge pages from a plain HTTP client at any real volume.
- Four separate surfaces, four different shapes. Hotels, vacation homes, activities, and flights are distinct products with distinct identifiers (property id, activity id, IATA route) — covering all four means four integrations, not one.
Option 2: No-code / ready-made tools
A handful of marketplace scraper actors target Agoda hotel search specifically and suit an occasional one-off pull, but they inherit the same anti-bot and internal-endpoint fragility as DIY, break silently when Agoda changes its markup, and don't cover homes, activities, or flights in the same tool.
Option 3: A structured Agoda API
For a repeatable workflow across all four surfaces, a Agoda scraping API returns normalized JSON with no browser fleet or endpoint reverse-engineering. Search hotels by city:
curl "https://api.crawlora.net/api/v1/agoda/hotels/search?city_id=9395&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"
Pull hotel detail, a vacation-home search, an activity search, and a flight search in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1"
hotels = requests.get(f"{base}/agoda/hotels/search", headers=h, params={
"city_id": 9395, "limit": 10,
}).json()["data"]["properties"]
property_id = hotels[0]["property_id"]
detail = requests.get(f"{base}/agoda/hotels/{property_id}", headers=h).json()["data"]
homes = requests.get(f"{base}/agoda/homes/search", headers=h, params={
"city_id": 9395, "limit": 10,
}).json()["data"]["homes"]
activities = requests.get(f"{base}/agoda/activities/search", headers=h, params={
"keyword": "chim chum", "city_id": 9395,
}).json()["data"]["activities"]
flights = requests.get(f"{base}/agoda/flights/search", headers=h, params={
"origin": "SYD", "destination": "BKK", "departure_date": "2026-10-20", "adults": 1,
}).json()["data"]["itineraries"]
A hotel detail result is normalized JSON (real fields — check the docs):
{
"code": 200,
"msg": "OK",
"data": {
"property_id": 10637,
"display_name": "Baiyoke Sky Hotel",
"accommodation_type": 34,
"rating": 4,
"address": {
"city": { "id": 9395, "name": "Bangkok" },
"country": { "id": 106, "name": "Thailand" },
"address1": "222 Ratchaprarop Road, Ratchathewi",
"postal_code": "10400"
},
"main_image_url": "https://pix8.agoda.net/hotelImages/10637/-1/878a9b58ccd19eee41b98d20e388c080.jpg?ca=9&ce=1",
"number_of_rooms": "659",
"chain_id": 3603,
"description_short": "Experience Luxury and Convenience at Baiyoke Sky Hotel.",
"policy": {
"adult": ["Guests 12 years and older are considered adults."],
"additional": ["When booking more than 5 rooms, different policies and additional supplements may apply."]
},
"source_url": "https://www.agoda.com/search?cid=-1&selectedproperty=10637&city=9395"
}
}
Flight search returns itineraries with per-segment detail (airline, aircraft, cabin, layovers), and flights/itinerary-amenities adds cabin-amenity notes (wifi, meals, seat layout) for a given flight number. Store one row per property (or route) per pull date, and re-run on a schedule to track price movement.
What you can collect
Public hotel data: search results (property id, name, rating, city, source URL) and hotel detail (address, room count, chain, policies, description, main image). Vacation-home listings via the homes-search endpoint. Activities and things-to-do by keyword or city, plus per-activity detail (categories, duration, description). Flight itineraries by origin/destination/date (price, airline, stops, segments) and location autocomplete for building routes. Public listing data only.
Limitations
- No open self-serve official API. Agoda's Partner APIs are affiliate/MSE-only through an account manager, not a signup form for research.
- Internal endpoints drift. Agoda's storefront calls aren't a documented public contract and can change without notice.
- Rates and availability change constantly. A single pull only covers the city, dates, and party size you searched — re-pull per date range you care about.
- Four separate surfaces. Hotels, homes, activities, and flights use different identifiers and response shapes — plan for four integrations, not one.
- Public data only. This collects what's publicly listed — never a way to complete or manipulate an actual booking.
Where this gets used
- Hotel and vacation-home price monitoring — track a property's rate and availability over time.
- OTA rate-parity and competitive research — compare Agoda pricing against other channels for the same property.
- Trip-planning and metasearch products — combine hotel, activity, and flight data for one destination.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search and hotel-detail endpoints in the Playground, check the schema in the API docs, and review pricing. Agoda covers the APAC-heavy side of OTA data; how to scrape Booking.com covers the largest global OTA by traffic, how to scrape Trip.com rounds out the rate-comparison set with another APAC-strong OTA, and how to scrape Airbnb covers the short-term-rental side of the same trip — see the broader travel & hospitality research use case for how these fit together. See also is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does Agoda have a public API?
Agoda offers Partner/Affiliate APIs (Search, Content, CDS, Post-Booking) through its Developer Portal, but access requires becoming an approved affiliate or metasearch partner via an account manager — there is no simple self-serve signup for open read access.
Is it legal to scrape Agoda?
Public facts like a hotel's name or star rating aren't copyrightable, and accessing public data generally isn't a CFAA violation under hiQ v. LinkedIn. But Agoda's Terms of Use explicitly prohibit scraping, data mining, and automated access (including by AI-powered assistants), so treat any scraping as a terms-of-service risk, not a legal green light — see our guide on whether web scraping is legal.
How do I get an Agoda property id?
Search hotels by city_id (or city name) with the hotels/search endpoint; each result includes a property_id you then pass to the hotels/{property_id} endpoint for full detail.
Can I scrape Agoda vacation homes separately from hotels?
Yes — homes/search is a distinct endpoint from hotels/search, returning vacation-rental-style listings (display_name, accommodation_type, rating, address) for the same city_id pattern.
Does the API cover Agoda flights?
Yes — flights/search returns itineraries by origin, destination, and departure date (price, airline, stops, per-segment detail), flights/search-locations resolves city/airport codes from a keyword, and flights/itinerary-amenities returns cabin-amenity notes for a given flight number.
What data can I legally collect from Agoda?
Public listing facts: hotel and vacation-home names, ratings, addresses, room counts, descriptions, and source URLs; activity names and categories; flight itineraries and fares. Avoid anything behind a login, and don't use the data to complete or manipulate an actual booking.
Why does a DIY Agoda scraper break?
Agoda's search and property pages call internal, undocumented endpoints behind client-side JavaScript and bot detection tuned for a booking flow. Request shapes can change without notice, and a plain HTTP client typically gets blocked or challenged at any real scraping volume.