Airbnb Reviews Scraper (Cheap)
Pricing
from $1.99 / 1,000 results
Airbnb Reviews Scraper (Cheap)
Airbnb reviews scraper that pulls every guest review from any listing by URL or room ID, including ratings, comments, reviewer profiles, and host responses, so property managers and data teams can run competitive analysis and sentiment research across one or many properties.
Pricing
from $1.99 / 1,000 results
Rating
0.0
(0)
Developer
Data API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Airbnb Reviews Scraper

Reading through Airbnb reviews by hand is slow, and the page only shows a handful at a time before you have to keep clicking "Show more". This scraper pulls the full review history of any listing for you. Give it a room URL or just the numeric ID and it returns every review as its own row: the star rating, the text (with the English translation when there is one), who wrote it, when, the trip tag, and the host's reply. Pass one listing or a whole batch and the results land in your dataset as the run goes.
What you get
One row per review, with a steady shape so columns stay predictable in a sheet or database. Missing values come back as null rather than disappearing. Each row covers three groups:
- Review —
reviewId,starRating,reviewText,originalText,languageCode,wasTranslated,tripTag - Dates —
submittedAt,displayDate,collectedAt - People —
guestName,guestId,guestContextualId,guestPhotoUrl,guestProfilePath,guestTenure,hostName,hostId,hostReply, plus thelistingIdthe review belongs to
Quick start
- Hit Try for free and open the input form.
- Paste an Airbnb listing URL into Single listing URL or ID, or drop several into Multiple listing URLs or IDs (a bare room ID works too).
- Set Reviews per listing to cap each listing, or leave it at 0 to pull them all. Pick a proxy type if you need one.
- Press Start, then export the results as JSON, CSV, Excel, or XML when the run finishes.

Use cases
- Competitor research — pull reviews from rival listings and compare what guests say before you adjust pricing or amenities
- Sentiment analysis — feed
reviewTextinto an NLP pipeline to find what guests praise and what they gripe about - Host monitoring — schedule the actor to catch new reviews on your own listing as they land
- Travel planning — read a listing's whole review history before booking instead of trusting the headline score
- Dataset building — gather Airbnb reviews in bulk to train or benchmark short-term-rental models
Input
| Field | Type | Required | Description |
|---|---|---|---|
listingUrl | string | One of listingUrl or listingUrls | A single Airbnb listing URL or numeric room ID. Prefilled with a sample listing. |
listingUrls | array of strings | One of listingUrl or listingUrls | Several Airbnb URLs or room IDs, one per line. Merged with listingUrl when both are given. |
reviewsLimit | integer | No | Reviews to collect per listing. Default 50; use 0 to pull every review. |
contentLocale | string | No | Language for date labels and translated text, e.g. en, fr, de, zh. Default en. |
currencyCode | string | No | Currency sent with the request, e.g. USD, EUR, GBP. Does not change review text. Default USD. |
requestTimeoutSeconds | integer | No | Seconds to wait on each HTTP request before giving up. Default 45. |
proxyConfiguration | object | No | Proxies used for requests. Defaults to Datacenter (Anywhere); switch to Residential if datacenter IPs get blocked. |
Example input
{"listingUrls": ["https://www.airbnb.com/rooms/20669368","https://www.airbnb.com/rooms/14926879","987654321"],"reviewsLimit": 0,"contentLocale": "en","currencyCode": "USD","proxyConfiguration": { "useApifyProxy": true }}
Output
Each review on a listing becomes one row in the dataset, and every field is always present — values Airbnb doesn't supply come back as null so the dataset stays rectangular.
Example output
{"reviewId": "1646862738258373172","listingId": "20669368","starRating": 5,"reviewText": "The place was fantastic. For the price you get a prime spot close to everything.","originalText": null,"languageCode": "en","wasTranslated": false,"submittedAt": "2026-03-22T05:42:17Z","displayDate": "6 days ago","tripTag": "WEEKEND TRIP","guestName": "Lester","guestId": "507561268","guestContextualId": "1498306238959795062","guestPhotoUrl": "https://a0.muscache.com/im/pictures/user/example.jpg","guestProfilePath": "/users/profile/1498306238959795062","guestTenure": "3 years on Airbnb","hostName": "Sourov","hostId": "599574226","hostReply": null,"collectedAt": "2026-06-29T10:00:00.000000+00:00"}
Output fields
| Field | Type | Description |
|---|---|---|
reviewId | string | Unique identifier Airbnb assigns to the review |
listingId | string | Room/listing ID the review was left on |
starRating | integer | Score the guest gave, from 1 to 5 |
reviewText | string | Review content in English, translated when the original was another language |
originalText | string | Untranslated review as the guest wrote it; null when already in English |
languageCode | string | BCP-47 code of the original language, e.g. en, zh-CN, fr |
wasTranslated | boolean | True when Airbnb auto-translated the review |
submittedAt | string | ISO 8601 timestamp of when the guest posted the review |
displayDate | string | Date label as shown on Airbnb, e.g. "February 2026" |
tripTag | string | Trip-type label such as WEEKEND TRIP; null when absent |
guestName | string | First name of the guest who wrote the review |
guestId | string | Airbnb user ID of the reviewer |
guestContextualId | string | Contextual ID used in Airbnb profile URLs |
guestPhotoUrl | string | Link to the reviewer's profile picture |
guestProfilePath | string | Relative path to the reviewer's Airbnb profile |
guestTenure | string | How long the reviewer has been on Airbnb, e.g. "3 years on Airbnb" |
hostName | string | First name of the host the review was written for |
hostId | string | Airbnb user ID of the host |
hostReply | string | Host's response to the review; null when there is none |
collectedAt | string | ISO 8601 timestamp of when the record was captured |
Tips for best results
- Pull everything with
reviewsLimit: 0. Set it to 0 and the actor pages through the full review history of each listing instead of stopping at the first page. - Batch listings in one run. Put multiple URLs or IDs in
listingUrls, one per line. Each review carries itslistingId, so you can tell the listings apart afterward. - Any URL format works. Links with query parameters like
check_inorsource_impression_idare fine, and a bare numeric room ID works on its own. - Switch to Residential if you get blocked. Datacenter proxies handle most runs; move to Residential when you hit repeated rate limits on large scrapes.
- Check the translation fields for non-English reviews. When Airbnb has an English version,
reviewTextholds it andoriginalTextkeeps the source;languageCodeandwasTranslatedtell you what happened.
How can I use Airbnb review data?
How can I use the Airbnb Reviews Scraper to analyze guest sentiment?
Run it across the listings you care about with reviewsLimit set to 0, then push the reviewText and starRating columns into your sentiment or topic-modeling pipeline. Because every review is a separate row tagged with languageCode and wasTranslated, you can split English from translated text or weight scores by rating before you summarize what guests actually think.
How can I scrape all reviews from an Airbnb listing, not just the first page?
Paste the room URL or ID and set reviewsLimit to 0. The scraper calls Airbnb's review endpoint page by page until there's nothing left, so you get the complete history rather than the handful shown on the listing page.
How can I track new Airbnb reviews for my own listing over time?
Schedule the actor on your listing URL and compare submittedAt between runs to see what's new. Pair it with guestName, tripTag, and hostReply to keep a running log of feedback and spot reviews that still need a response.
How can I collect Airbnb reviews in bulk for research?
Drop a list of listing URLs or IDs into listingUrls and let it run. Every review lands in one dataset with its listingId attached, ready to export as JSON, CSV, or Excel for a market study or a training set.
Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Support
Questions, feature requests, or a field you'd like added? Reach out at data.apify@proton.me and we'll get back to you.