Agoda Hotel API
Pricing
from $3.43 / 1,000 property returneds
Agoda Hotel API
Agoda hotel data as clean, structured JSON. Search a destination and dates to get properties with live per-room rates, the pre-discount price, cancellation policies, and availability, or pull hotel reviews and full property detail from a hotel URL. Pay per result, MCP-ready for Claude and AI agents.
Agoda API | Hotel Rates, Availability and Guest Reviews
Agoda hotel data as clean, structured JSON, including the part most hotel APIs will not give you: live per-room rates for a specific stay, with the pre-discount price next to the price you would actually pay.
This is an independent Agoda API. Agoda publishes its own developer API only to approved partners, so if you need programmatic hotel rates today, this Actor is the practical route. There is no partner application and no key to request, and you pay for the rows you get back. It is not affiliated with, endorsed by, or connected to Agoda.
Give it a destination and dates. You get every property with a full table of bookable offers, each carrying its room type, nightly rate, original rate, tax inclusion, and cancellation policy. The cheapest nightly rate is lifted to the top of each record, so a rate monitor can diff one number instead of walking a tree.
What this actor returns
In search mode, per property:
- Room rates: one entry per bookable offer, with room type, bed configuration, occupancy, nightly price, pre-discount price, currency, whether taxes and fees are included, nights, and the cancellation policy
- Lowest nightly rate: the cheapest offer across all rooms, lifted to the top level for sorting and alerting
- Availability: whether the property has rooms for the requested stay
- Scores: overall guest score, review count, and the breakdown by cleanliness, comfort, location, facilities, staff, and value
- Location: address, city, country, coordinates, location rating, what is nearby, walkable places, metro access
- Detail: description, highlights, popular facilities, full amenities, images, fine print, FAQ
In reviews mode, per review: what the guest liked and what they disliked as separate fields, their score, nights stayed, language, any owner reply, and attached photos.
Every property and review row also carries a one-line plain-language summary.
The fields you will actually sort and filter on
| Field | Type | What it is |
|---|---|---|
result_type | string | property, review, or error. Filter on this first. |
propertyName | string | Hotel or property name |
propertyUrl | string | Link back to the property page |
city / country | string | Where the property is |
latitude / longitude | number | Coordinates for mapping |
checkIn / checkOut | string | The stay these rates are quoted for |
available | boolean | Whether the property has rooms for that stay |
lowestPricePerNight | number | Cheapest nightly rate across every offer |
currency | string | Currency the rates are quoted in |
roomRates | array | One entry per bookable offer, with pricePerNight, originalPricePerNight, taxesAndFeesIncluded, nights, and policies |
reviewScore / reviewCount | number / integer | Overall guest score and how many reviews back it |
reviewScoreBreakdown | object | Cleanliness, comfort, location, facilities, staff, value for money |
locationRating / locationRatingLabel | number / string | Numeric location score and its word form |
rating, reviewPositive, reviewNegative | number / string | Per-review score and the liked and disliked halves, in reviews mode |
nightsStayed, authorName, ownerReply | integer / string | Review context, in reviews mode |
fetched_at | string | UTC timestamp for the row, which is what makes a price history a time series |
The Output tab ships four ready-made views: All Results, Room rates, Property overview, and Guest reviews. Each exports to JSON, CSV, or Excel.
Use cases
- Monitor rates over time. Run a destination and date range on a schedule and diff
lowestPricePerNightto catch price moves. - Compare the real discount. Every offer carries both the pre-discount and final price, so you can see how deep a "deal" actually is.
- Filter by cancellation terms. Policies come through per offer, so you can separate refundable from non-refundable rates.
- Track availability. The availability flag plus the room table tells you what is actually bookable for a given stay.
- Analyse guest sentiment. Reviews split liked from disliked, which is far easier to work with than one blob of text.
- Run a rate parity check. Pull the same stay here and from another source, with
currencyandcountrypinned, and see where the two disagree.
Input parameters
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
mode | string | Required | search | search finds properties with rates from a destination and dates. property and reviews collect from hotel URLs. | search |
locations | array of strings | Required in search mode | none | Cities, regions, or landmarks. Up to 20. | ["Singapore"] |
checkIn | string | Required in search mode | none | YYYY-MM-DD. | 2026-09-15 |
checkOut | string | Required in search mode | none | YYYY-MM-DD, later than check-in. | 2026-09-18 |
adults | integer | Optional | 2 | Number of adults, which changes the rates returned. 1 to 20. | 2 |
currency | string | Optional | source default | Three-letter code for the rates. | USD |
country | string | Optional | source default | Two-letter point-of-sale country. Rates differ by market. | SG |
hotelUrls | array of strings | Required in property and reviews modes | none | Agoda property URLs. Up to 200. | ["https://www.agoda.com/.../hotel/singapore-sg.html"] |
maxResultsPerInput | integer | Optional | 20 | Properties per destination, or reviews per hotel. 1 to 2000. This is your cost control. | 20 |
sortReviewsBy | string | Optional | source default | Sort order for reviews mode, passed through to the source. Leave empty for the default order. | Most recent |
{"mode": "search","locations": ["Singapore"],"checkIn": "2026-09-15","checkOut": "2026-09-23","adults": 2,"currency": "USD","maxResultsPerInput": 20}
Dates are required in search mode, and both are validated before anything is sent upstream. Room rates only exist for a specific stay, so a search without dates has no meaningful answer.
The dates above are illustrative. Use whatever future stay you care about, and if you are scripting this, compute the dates from today rather than hard-coding them so your job does not quietly start asking for a stay in the past.
Example output
{"result_type": "property","propertyName": "Village Hotel Bugis by Far East Hospitality","city": "Singapore","country": "Singapore","checkIn": "2026-09-15T00:00:00.000Z","checkOut": "2026-09-23T00:00:00.000Z","available": true,"lowestPricePerNight": 129.27,"currency": "USD","reviewScore": 8.2,"reviewCount": 23921,"reviewScoreBreakdown": {"cleanliness": 8.1, "comfort": 8.2, "location": 8.9,"facilities": 7.9, "staff": 8.3, "value_for_money": 8.1},"locationRating": 8.9,"locationRatingLabel": "Excellent","roomRates": [{"roomType": "Superior","bedConfiguration": "2 single beds or 1 king bed","adults": 2,"pricePerNight": 129.27,"originalPricePerNight": 327.63,"currency": "USD","taxesAndFeesIncluded": true,"nights": 8,"policies": ["Non-refundable (Low price!)", "Book and pay now"]}],"summary": "Village Hotel Bugis by Far East Hospitality in Singapore. Scored 8.2 from 23,921 reviews, from USD 129.27 per night."}
An input that returns nothing produces a row with result_type: "error" and a plain-language error_message.
Pricing
Pay per result. Two events: property-scraped for each property returned with its full rate table, and review-scraped for each review. A property counts as one result no matter how many offers its rate table holds.
maxResultsPerInput caps what a run can cost, and the cap is applied at the source. Current rates are shown on the Store card.
How to get started
- View on Apify Store and click Try for free.
- Leave Mode on
search, enter a destination, and set your check-in and check-out dates. - Run it. Results appear on the Output tab and export as JSON, CSV, or Excel. The Room rates view puts the offer table next to the lowest nightly price.
- Prefer to start from code? The example repo has a Python quick-start plus MCP install walkthroughs for Claude, Cursor, and ChatGPT.
🔌 Use this API from Claude (MCP)
Add this Actor as a tool in Claude Code (free trial), Claude Cowork (free trial), Cursor, or any other MCP client through the hosted Apify MCP server:
https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api
With Claude Code (free trial):
claude mcp add --transport http agoda "https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api"
Then ask your agent something like "what is the cheapest refundable rate in Singapore for those dates".
Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp
💸 Pay per run with crypto (x402)
The Agoda Hotel API supports agentic payments via the x402 protocol. AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed: point your agent at the Apify MCP server and it can discover, pay for, and run this Actor autonomously. Read the Apify x402 announcement for details.
Speed
Search returns in about a minute for a handful of properties. Reviews are considerably slower, several minutes per batch, because each property's review history is paged through. The Actor collects in chunks and pushes each chunk as it completes, so results arrive as they go rather than all at the end.
🔌 Integrations: Automate Agoda Rate Monitoring
One search tells you what a room costs right now. Run the same search tomorrow and the day after and you have something more useful, which is a record of which way the rate is moving. The native Apify platform integrations let you wire this Actor into the tools you already use without standing up a server or writing your own cron job.
Tasks and schedules: build a rate history
The pattern is one saved task per stay you care about, one schedule across all of them.
- Create a task. A saved task is this Actor plus a saved input, so give each stay its own named task, for example "Singapore, first week of December" with your
locations,checkIn,checkOut,currency, andcountry. Click Create empty task on the Actor page, fill in the input, and save. - Attach a schedule. Open Schedules in the Apify Console, create one with a standard cron expression, and add your tasks to it. Useful examples:
0 7 * * *(every morning at 7 AM),0 */6 * * *(every six hours),0 9 * * 1(Mondays at 9 AM). One schedule can trigger many tasks, so a single "daily rate check" schedule can watch every stay you have saved. - Diff the number. Each run appends fresh rows with a new
fetched_at, so comparinglowestPricePerNightbetween runs gives you the price move, androomRatestells you which room type caused it.
A monitoring task holds its dates fixed and watches the price for that stay move. When the stay is behind you, update the dates on the task rather than leaving it asking for the past.
The published task Track Agoda hotel prices for a destination and dates is this recipe already set up.
n8n
There is no dedicated community node for this Actor yet, so use the Apify n8n integration, which can run any Actor. A price-drop workflow is four nodes:
- Schedule Trigger, every morning at 7 AM.
- Apify node, run
johnvc/agoda-hotel-apiinsearchmode with your destination and dates. - Filter node, keep rows where
lowestPricePerNightis below your threshold. - Slack or email node, send yourself the property name, the rate, and the cancellation policy.
Make and Zapier
Both have native Apify integrations, Apify on Make and Apify on Zapier, with "Run Actor" and "Get Dataset Items" actions. The same pattern applies: trigger on a schedule, run this Actor, filter on price, then notify or store.
Supabase: keep the price history somewhere queryable
A rate history is only useful if it lands in something you can query. Supabase (hosted Postgres) fits well, and there are two paths:
- No code: in n8n, connect the Apify node to the built-in Supabase node and insert a row per property after each scheduled run.
- A few lines of Python: run the Actor and bulk-insert the flat property rows into a table. Note the dates are computed from today, so this script keeps working months from now.
from datetime import date, timedeltafrom apify_client import ApifyClientfrom supabase import create_clientapify = ApifyClient("YOUR_APIFY_TOKEN")supabase = create_client("https://YOUR_PROJECT.supabase.co", "YOUR_SERVICE_ROLE_KEY")check_in = date.today() + timedelta(days=45)check_out = check_in + timedelta(days=3)run = apify.actor("johnvc/agoda-hotel-api").call(run_input={"mode": "search","locations": ["Singapore"],"checkIn": check_in.isoformat(),"checkOut": check_out.isoformat(),"adults": 2,"currency": "USD","country": "SG","maxResultsPerInput": 20,})rows = [{"property_name": item["propertyName"],"city": item.get("city"),"check_in": item.get("checkIn"),"check_out": item.get("checkOut"),"lowest_price_per_night": item.get("lowestPricePerNight"),"currency": item.get("currency"),"available": item.get("available"),"review_score": item.get("reviewScore"),"fetched_at": item.get("fetched_at"),}for item in apify.dataset(run.default_dataset_id).iterate_items()if item.get("result_type") == "property"]if rows:supabase.table("agoda_rates").insert(rows).execute()
Point a schedule at that and the table fills itself in, ready for a chart or a parity report.
MCP and AI agents
Apify exposes this Actor through the Apify MCP server, so MCP clients such as Claude Code (free trial), Claude Cowork (free trial), and Cursor can run live searches as a tool and answer things like "which Singapore hotels under 200 a night for those dates have free cancellation". The published task Get Agoda hotel rates in Claude via MCP walks through the setup.
Webhooks
For anything custom, attach an Apify webhook to the ACTOR.RUN.SUCCEEDED event. When a scheduled run finishes, Apify POSTs the run details, including the dataset ID, to your endpoint, and your code takes it from there: refresh a dashboard, update a sheet, or text you when a rate drops.
🔗 Related Tools
Hotel pricing is rarely a one-source question, so these pair well with this API:
- Tripadvisor API for hotel, restaurant, and attraction reviews when you want a second read on a property before you trust its score
- Google Hotels Search Scraper for aggregated hotel prices across booking sites, which is the other half of a rate parity check
- Google Flights API for the flights half of a trip, on the same monitoring pattern
- Google Travel Explore API for destination discovery before you know where you are pricing
- Google Maps Places Scraper for what is actually around a property
Other Agoda Actors exist, and it is worth knowing what you are choosing between. Fast Agoda Scraper is an older one; at the time of writing its Store card shows a run success rate in the mid fifties and a last update in June 2026, which means a meaningful share of runs come back empty. This API is actively maintained, validates your dates before a request leaves the building, and returns the same field set on every row so downstream code does not have to guess.
Applications of the Agoda API
Ready-to-run examples of this API in action. Open any one and run it in a single click.
Get Agoda hotel rates as JSON without an API key
Structured rates for a destination and stay, without applying to a partner programme first. Run this task
Track Agoda hotel prices for a destination and dates
The rate monitoring recipe: same stay, on a schedule, diffing lowestPricePerNight run over run.
Run this task
Get Agoda hotel rates in Claude via MCP
Add the Actor to Claude Code (free trial) or another MCP client and ask for rates in plain language. Run this task
Find Agoda hotel rates with free cancellation
Every offer carries its policy, so you can keep only the refundable ones. Run this task
Pull live Agoda rates for a hotel rate parity check
Pin the currency and the point-of-sale country, then compare the same stay against another channel. Run this task
Export Agoda guest reviews to CSV or Excel
Reviews mode with liked and disliked kept apart, ready for a spreadsheet or a sentiment pass. Run this task
获取实时酒店房价,用于酒店比价分析 (Live hotel room rates for price comparison, in Chinese)
酒店比价: live nightly rates for a destination and stay, set up for hotel price comparison work. Run this task
获取酒店评价数据,逐条含评分与酒店回复 (Hotel review data with scores and owner replies, in Chinese)
酒店评价: one row per guest review, with the score, the liked and disliked halves, and any reply from the property. Run this task
❓ FAQ
How do I use the Agoda API?
Set Mode to search, give it one or more destinations in locations, and set checkIn and checkOut. That is the whole minimum input. Add currency and country when the numbers need to be comparable to another source, and use maxResultsPerInput to cap how many properties come back. You can run it from the Console, from the Apify API, from an MCP client, or from the example repo.
Can I schedule this Agoda Scraper to run automatically?
Yes, and most people should. One run gives you today's rate, which is rarely the question you actually had. Save your input as a task, then attach a schedule from the Actor's Actions menu, then Schedule. Standard cron applies: 0 7 * * * runs every morning at 7 AM, 0 */6 * * * every six hours, 0 9 * * 1 every Monday. One schedule can trigger many tasks at once, so a single "daily rate check" can cover every stay you are watching. The full monitoring recipe, including where to put the results, is in the Integrations section above.
Should I use an official API or a web Scraper for hotel data?
An official API is the cleanest option when you can get one, but hotel APIs are usually gated behind a partner programme, rate limited, and quota bound, and they often drop the fields you actually wanted. Web scraping fills that gap, and this Actor sits in between: you get the reliability of a hosted endpoint and the field coverage of a scraper, with no quota to manage and no approval to wait for. You call it, you get JSON, you pay for the rows you got.
Can I use this Agoda Scraper through an MCP Server?
Yes. It runs as a tool in any MCP client through the hosted Apify MCP server. The Actor-specific URL is https://mcp.apify.com/?tools=actors,docs,johnvc/agoda-hotel-api, which works in Claude Code (free trial), Claude Cowork (free trial), Cursor, and anything else that speaks MCP. See the Apify MCP docs for client setup, and the MCP section above for the one-line install command.
Can I use this Actor with the Apify API?
Yes. The Apify API lets you start runs, read run status, and pull dataset items programmatically, and there is an apify-client package for both Python and Node.js so you are not hand-rolling HTTP. The Actor's API tab gives you ready-made snippets with your input already filled in.
Can I integrate this Agoda Scraper with other apps?
It connects to almost anything through Apify integrations: Make, Zapier, n8n, Slack, Google Drive, and more. For anything not on that list, attach a webhook to ACTOR.RUN.SUCCEEDED and handle the run yourself. The Integrations section above has the full recipes.
Is this an official Agoda API?
No. This Actor is not affiliated with, endorsed by, or connected to Agoda. It collects publicly visible listing and review data and returns it as structured JSON. It is an independent tool and makes no claim of feature parity with Agoda's own partner API.
How do I track hotel prices over time?
Run search mode on a schedule with the same destination and dates, and compare lowestPricePerNight between runs. Every property also keeps its full offer table, so you can see which room type moved.
How do I compare hotel rates across booking sites?
Rates here are quoted for a specific stay, currency, and point-of-sale country. Set currency and country explicitly so you are comparing like with like against another source.
How do I get hotel availability programmatically?
Every property row carries an available boolean for the stay you asked about, plus roomsAvailable and the roomRates table showing what is actually bookable. A property that comes back with available: false was checked and had nothing for those nights, which is itself a useful signal when you are watching a sold-out period.
Can I get only refundable rates?
The Actor returns all offers with their policies attached, so filter on the policies field in roomRates. Free-cancellation offers say so there.
Why do I need check-in and check-out dates?
Because room rates only exist for a specific stay. A hotel has no single price, it has a price for a set of nights and an occupancy. Without dates there is nothing meaningful to return, so both are required and validated up front.
Does the price include taxes and fees?
Each offer says so, in taxesAndFeesIncluded. Do not assume it is consistent across offers, because it is not.
What is the difference between the two prices on each offer?
pricePerNight is what you would pay. originalPricePerNight is the pre-discount rate the source displays alongside it. The gap between them is the advertised saving.
Can I get reviews and rates in one run?
Not in a single run: rates come from search mode and reviews from reviews mode. Run search first, take the property URLs from the results, then run reviews mode on those.
Does it cover properties outside Asia?
Yes. Coverage is strongest across Asia-Pacific, but the source lists properties worldwide and the Actor returns whatever the destination search finds.
How much does it cost to scrape hotel rates?
You pay per result, not per run: one charge per property returned with its full rate table, and one per review. Rate tables are free of extra charge no matter how many offers they hold. maxResultsPerInput is a hard ceiling on how many results a run can produce, so it doubles as your budget control. Current per-result rates are on the Store card.
What do I do if I get no results?
Check the error rows first: any input that produced nothing comes back as a row with result_type: "error" and a plain-language error_message telling you why. The usual causes are a destination string the search does not recognise, dates in the past, a check-out that is not after the check-in, or a genuinely sold-out stay. Try a broader destination such as the city name on its own, and confirm the dates are in the future.
Is it legal to scrape hotel data?
Collecting publicly available data is generally lawful in many jurisdictions, and Apify has a readable overview in is web scraping legal. That said, what you do with the data matters more than how you got it, so check your own obligations before republishing prices or reviews, and take your own legal advice for anything commercial.
How can I collect hotel data from other travel sites?
Pair this API with the neighbours in the portfolio: Google Hotels Search Scraper for prices aggregated across booking sites, Tripadvisor API for a second opinion on a property's reviews, and Google Flights API when you need the airfare next to the room rate. The full list is in Related Tools above.
Resources
- Example repo: Python quick-start and MCP walkthroughs
- Actor API tab, with ready-made client snippets
- Apify platform integrations
- Apify MCP documentation
🌐 About Alpha OSINT
This Actor is part of Alpha OSINT, toolset of financial and operations data sources and APIs. For support or requests for this actor, please start a ticket directly on our support page.
Last Updated: 2026.08.10