Agoda Hotel Scraper — Prices, Reviews & Amenities | $5/1K
Pricing
from $4.85 / 1,000 hotels
Agoda Hotel Scraper — Prices, Reviews & Amenities | $5/1K
Collect Agoda hotel records from property pages and Cronos JSON API. Get rooms, amenities, scores, images, plus optional reviews. Use hotel names, URLs, or IDs; no Agoda login. Pricing: Free plan $0.005 per hotel record + $0.00005 per Actor Start event.
Pricing
from $4.85 / 1,000 hotels
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
131
Total users
31
Monthly active users
17 hours ago
Last modified
Categories
Features
Share
Agoda Hotel Scraper
Collect Agoda hotel records from property pages and Agoda's Cronos JSON API, including rooms, amenities, scores, images, and optional review comments. No Agoda login is required.
- Compare hotel ratings, category scores, review distributions, and amenities.
- Enrich travel apps and maps with rooms, coordinates, nearby places, amenities, and image URLs.
- Monitor reputation with review scores, counts, distributions, and optional comments.
- Search by hotel name, Agoda property URL, or numeric hotel ID.
- The default configuration uses a RESIDENTIAL proxy through Apify’s proxy settings.
What you get
A field is null when unavailable; lists and objects use the empty values shown below.
| Field family | Fields | Type | Description |
|---|---|---|---|
| Identity | hotel_id, hotel_name, former_name, accommodation_type | integer, string | Agoda ID and property identity. |
| Location | address, city, country, area_name, postal_code, location_highlight, lat, lng | string, number | Address, location, and coordinates. |
| Ratings | star_rating, review_score, review_count, review_text, category_scores, score_distribution, awards | number, integer, string, object | Ratings, counts, scores, bands, and awards; empty score objects are {}. |
| Pricing | price, currency, rooms_available, offer_count, room_offers | number, string, boolean, integer, array | Date-aware pricing and offers; room_offers is empty when none are returned. |
| Requested dates | check_in, length_of_stay | string, integer | Requested check-in and stay length; null without a valid check-in date. |
| Rooms | room_types, rooms | array of strings, array | Room names and details including room_id, name, bed, size, view, features, image_count, and thumbnail. |
| Amenities | amenities, amenity_groups | array of strings, object | Flat and grouped amenities; empty list/object when unavailable. |
| Nearby places | highlights, nearby_attractions, nearby_essentials | array | Highlights, attractions, essentials, and distance data. |
| Property content | check_in_time, check_out_time, description | string | Check-in, check-out, and description. |
| Images | image_url, image_count, all_images | string, integer, array of strings | Hero image, photo count, and image URLs. |
| Provenance | property_url, scraped_at | string, ISO 8601 string | Source URL and UTC scrape timestamp; property_url is null for a direct hotel ID. |
| Parse status | parse_confidence, warnings | number, array of strings | Parse score from 0.0 to 1.0 and drift signals. |
| Review comments | reviews | array | Optional reviews containing review_id, rating, title, comment, positives, negatives, check_in_month, review_date, reviewer_type, reviewer_country, room_type, and stay_length. |
Sample output
This shortened sample uses one dataset record. Whole fields and list items are omitted; the values shown are unchanged.
{"hotel_id": 10715,"hotel_name": "The Peninsula Bangkok","city": "Bangkok","country": "Thailand","star_rating": 5,"review_score": 9.2,"review_count": 5331,"category_scores": {"cleanliness": 9.6, "facilities": 9.4, "location": 9, "roomComfort": 9.3, "staffPerformance": 9.5, "valueForMoney": 9},"room_types": ["Deluxe Twin Room", "Deluxe King Room"],"rooms": [{"name": "Deluxe Twin Room", "room_id": 7619240, "bed": "2 single beds", "size": "Room size: 45 m²/484 ft²", "view": "Sea view", "features": ["Room size: 45 m²/484 ft²", "Sea view", "2 single beds"], "image_count": 15, "thumbnail": "https://q-xx.bstatic.com/xdata/images/hotel/max500/668438342.jpg?k=cf470c4280e289e0fdad068e3f648ac416a80bc2a1b8dfe6b091f4c74b8318d6&o="}],"amenities": ["English", "Chinese [Mandarin]", "Filipino"],"nearby_essentials": [{"category": "Airports", "name": "Don Mueang International Airport (DMK)", "distance_km": 23.43, "distance_text": "23.43 km"}],"parse_confidence": 1,"warnings": [],"scraped_at": "2026-10-26T16:27:30.286453+00:00"}
Pricing
You pay for each hotel record and each Actor start. The primary event is apify-default-dataset-item, representing one Agoda hotel with prices, rooms, and review scores. Reviews are embedded in the hotel row when enabled and add no separate charge.
| Plan | apify-default-dataset-item | apify-actor-start |
|---|---|---|
| Free | $0.005 per hotel record on the Free plan | $0.00005 per event on the Free plan |
| Bronze | $0.00495 per hotel record | $0.0000495 per event |
| Silver | $0.0049 per hotel record | $0.000049 per event |
| Gold | $0.00485 per hotel record | $0.0000485 per event |
| Platinum | $0.0048 per hotel record | $0.000048 per event |
| Diamond | $0.00475 per hotel record | $0.0000475 per event |
The apify-actor-start event is charged once per GB of run memory, minimum one event. A one-result run (maxItems: 1) shows the exact charge with one Actor Start event.
On the Free plan, 1,000 hotel records cost 1,000 × $0.005 = $5.00 on the Free plan; 10,000 cost 10,000 × $0.005 = $50.00 on the Free plan. 1,000 Actor Start events cost 1,000 × $0.00005 = $0.05 on the Free plan; 10,000 cost 10,000 × $0.00005 = $0.50.
The Free plan’s $5 credit covers 999 hotel results, calculated with one Actor Start event. A Free-plan run delivers at most 5 hotel records, and every run has its own Actor Start event(s). On the Bronze plan, 1,000 hotel records cost 1,000 × $0.00495 = $4.95.
The Apify Free plan includes $5 of monthly platform usage credit. You pay only for the events listed above. This Actor does not use the Pay per event + usage option, so compute, proxy traffic, and storage are not billed separately.
On Free plans, review comments and live price lookup are disabled for preview runs. Paid Apify plans unlock full results, subject to maxItems.
How to use
- Choose
searchTerms, AgodapropertyUrls, numerichotelIds, or a combination. - Enter a specific hotel name for
searchTerms; Agoda’s suggest API resolves it to hotel IDs. - Add a valid
checkIndate inYYYY-MM-DDformat for date-aware pricing. - Set
lengthOfStay,adults, androomsfor live pricing. - Set
includeReviewstotrueand choosereviewsPerHotelfor comments on paid plans. - Use
maxItemsto cap records andrequestDelayto set the delay between property fetches. - Check
parse_confidenceandwarnings, then repeat the run through Apify Schedules; daily is a starting point for listings or prices.
This example needs a paid Apify plan: on the Free plan checkIn and includeReviews are ignored.
{"hotelIds": [10715, 10571],"checkIn": "2026-12-28","lengthOfStay": 1,"adults": 2,"rooms": 1,"includeReviews": true,"reviewsPerHotel": 10,"maxItems": 2,"requestDelay": 1.5}
Export the Apify dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
searchTerms | Hotel names or destinations resolved through Agoda’s suggest API; specific names work best. | None |
propertyUrls | Agoda property page URLs; extracts the hotel ID when possible. | None |
hotelIds | Positive numeric Agoda hotel IDs. | None |
checkIn | Live-pricing date in YYYY-MM-DD; without it, returns dateless metadata. | Empty |
lengthOfStay | Live-pricing nights. Accepted range: 1–30. | 1 |
adults | Live-pricing adult guests. Accepted range: 1–20. | 2 |
rooms | Live-pricing rooms. Accepted range: 1–10. | 1 |
includeReviews | Fetches and embeds individual review comments. | false |
reviewsPerHotel | Maximum comments per hotel. Accepted range: 1–50; ignored on the Free plan. | 10 |
maxItems | Maximum hotel records. Accepted range: 0–100000; 0 means no user-specified limit, but Free remains limited to 5. | 0 |
requestDelay | Seconds between property fetches. Schema default is 1.5; code fallback when omitted is 0.3. | 1.5 in schema |
proxyConfiguration | Proxy settings; default is useApifyProxy: true with apifyProxyGroups: ["RESIDENTIAL"]. | RESIDENTIAL proxy |
disableUsageStats | Set to true to turn off the run summary in Usage statistics. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
No propertyUrls, hotelIds, or searchTerms | Failed run; no hotel record. | Supply an input mode. |
| No specific search match or all inputs fail | Succeeded run with an empty dataset; OUTPUT has emptyReason and message as NO_MATCH_FOR_INPUT. | Use a specific name, URL, or ID. |
| Broad destination search term | Only the few properties surfaced by the suggest API. | Use property URLs or hotel IDs. |
| Non-Agoda property URL | URL skipped with a warning. | Provide a full Agoda property URL. |
| Property URL cannot yield a hotel ID | hotel_id or hotelId query parameters can provide it; otherwise the page must contain the ID. | Check the URL or provide numeric hotelIds. |
| Agoda blocks or a fetch fails | Retried up to two times when proxy configuration is available; no row is produced. | Use RESIDENTIAL and retry. |
| Some hotels fail after others are delivered | Partial result; OUTPUT contains stoppedEarly as BLOCK_PARTIAL or INPUT_PARTIAL. | Check the message and retry unresolved inputs. |
| Block or fetch failure leaves no hotel delivered | Failed run; OUTPUT records BLOCKED; no hotel event is charged. | Use RESIDENTIAL and retry. |
| Page loads but no hotel ID is readable | Failed run; OUTPUT records PARSE_FAILED. | Check URLs or provide hotelIds. |
| Rows are pushed during a long run | Batches of 10 are pushed; the remainder follows the loop. Free pushes 5 rows; fewer than 10 hotels wait until processing finishes. | Let the run finish for the current batch. |
checkIn is missing or invalid | Dateless metadata; invalid dates are ignored. | Provide a valid date for live pricing. |
| Live-price lookup fails | Hotel kept; price and currency are null, with requested dates retained. | Retry or use the metadata. |
| Requested date is sold out | Pricing can be null; rooms_available can be false. | Try another date or use the metadata. |
| Review fetching fails | Hotel kept with reviews as an empty list. | Retry if comments are needed. |
| Duplicate hotel IDs are supplied | IDs are de-duplicated; the first-seen property URL is kept. | No action is required. |
| Free plan is used | At most 5 records; reviews and live price lookup are disabled. | Use a paid Apify plan for full results. |
| Agoda’s JSON structure changes | parse_confidence can decrease and warnings can identify drift. | Inspect those fields before accepting records. |
| Public Agoda data is used | The Actor retrieves public data from Agoda property pages and Agoda's JSON API without a login. | Check whether your use is legal or allowed under applicable law and relevant source terms. |
FAQ
How much does it cost to scrape Agoda hotels?
On the Free plan, hotel records cost $0.005 each and Actor Start events cost $0.00005 each. 1,000 hotel records cost $5.00 on the Free plan, and 1,000 Actor Start events cost $0.05.
Why did my run return no hotels?
Check the inputs and the run’s OUTPUT record. It stores the applicable reason under emptyReason and message, including NO_MATCH_FOR_INPUT, BLOCKED, and PARSE_FAILED.
What should I do if a hotel is not working?
Check the URL or ID, inspect the run message, use the default RESIDENTIAL proxy configuration, and retry.
Is using this public Agoda data legal or allowed under Agoda’s ToS?
The Actor retrieves public data from public Agoda property pages and Agoda's JSON API without a login. Whether a use is legal or allowed depends on your use case, jurisdiction, applicable law, and relevant source terms; this Actor provides no legal guarantee.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.