# Airbnb Reviews Scraper: Anonymous Ratings & Texts (`myth84/airbnb-reviews-scraper`) Actor

Scrape Airbnb reviews from listing URLs: rating, month, language, text and translation, stay length, trip type, room type and the listing's six category ratings. Anonymous: no author name, photo, profile or location, first names masked in texts. No personal data.

- **URL**: https://apify.com/myth84/airbnb-reviews-scraper.md
- **Developed by:** [Flatrow Data Studio](https://apify.com/myth84) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Airbnb Reviews Scraper – anonymous ratings, texts, translations and stay types, no personal data

- Verified daily by an automated run on Apify with the default input.
- Price: $1.80 per 1,000 reviews on the Free plan; on paid plans, from $1.19 for 1,000 (Business plan).
- Start fee: $0.00005 per run (Apify's minimum).

Airbnb reviews scraper — anonymous, no reviewer names: get the reviews of any Airbnb listing with the month, star rating, language, original text and Airbnb's translation, stay length or trip type, plus the listing's six category ratings, as a clean table or through an API — no login. Use it for Airbnb review analysis, sentiment analysis, benchmarking a listing against its competitors and monitoring new reviews.

**No login, no cookies, no personal data:** nothing to sign in to, no cookies to paste. Anonymous Airbnb reviews: no author name, photo, profile or location, host replies left out, first names masked in texts.

- **What you get:** one flat row per Airbnb review of the listings you give: month, rating, language, original text and Airbnb's translation, stay length or trip type, room type for hotels, whether the host replied, and the listing's average rating, review count and six category ratings on every row. No personal data.
- **For whom:** hosts and property managers benchmarking their listings, revenue and market analysts, travel researchers, product teams building sentiment or topic datasets, AI agents through MCP.
- **How much:** from $1.80 per 1,000 reviews on the Free plan, lower on paid plans; Apify's free monthly credit of $5 covers about 2,777 reviews. A fixed price per review saved and nothing else (see the Pricing tab); `maxReviewsPerListing` and `maxResults` cap every run.

**Sample output**: one real review of a Lisbon listing, key columns only, nothing about its author (the full row, with the original text and Airbnb's English translation, is under *Output example*):

```json
{
  "platformListingId": "21607939",
  "reviewMonth": "2026-09",
  "rating": 5,
  "language": "es",
  "translatedLanguage": "en",
  "tripType": "with_kids",
  "stayHighlight": "Stayed with kids",
  "hasHostResponse": false,
  "listingRating": 4.96,
  "listingReviewCount": 658,
  "listingRatingCleanliness": 4.96,
  "listingRatingLocation": 4.78
}
```

Give this Airbnb reviews scraper a list of **listing URLs** (or listing ids) and get **one flat row per review**, in the order you choose (most recent, most relevant, highest or lowest rating first), up to the full history of each listing. Each row has the **month** of the review, the **rating** (1 to 5 stars), the **language** of the original text, the **text** itself and, when the guest wrote in another language, **Airbnb's translation** into yours. Airbnb's stay label becomes two clean columns, `stayLength` (one night, a few nights, about a week, over a week) and `tripType` (with kids, group, with pets); hotel-type listings add the **room type** of the stay. Filter on an Airbnb **topic** (cleanliness, location, noise…), search the texts for a **word**, or keep only the reviews **since a date** to monitor new ones cheaply.

**No personal data, by design.** Airbnb review scrapers usually publish the reviewer's first name, photo, profile link and city, and the host's reply. This Actor publishes none of them: rows are built from a short list of review facts, the first names Airbnb gives with each review are masked inside the texts, links, e-mails and phone numbers are removed, the date is kept to the month and the review id is replaced by an anonymous key. The dataset is safe to store, share and feed to AI agents.

### What can you do with Airbnb reviews?

- **Benchmark a listing against its competitors**: average rating and category ratings side by side, the share of 4-star reviews, what guests praise and what they complain about (`sortBy` lowest rating first).
- **Monitor new reviews** of your own or competing listings: schedule the Actor with `reviewsSince` and compare `reviewKey` from run to run.
- **Build sentiment and topic datasets**: original texts and translations in one language, with `topic` filters (cleanliness, noise, location) and Airbnb's full-text search.
- **Feed AI agents, spreadsheets and BI tools** with a stable, documented schema (`travel-review/1.1`) shared by the review scrapers of the travel studio; join with the Airbnb Listings and Listing Details scrapers on `platformListingId`.

### What data does Airbnb Reviews Scraper extract?

Every row has every column: a value Airbnb does not give is `null`, so CSV and Excel exports keep the same columns from run to run.

| Group | Columns |
|---|---|
| Identity | `schemaVersion`, `platform`, `platformListingId`, `listingUrl`, `reviewKey` |
| Review | `reviewMonth`, `rating`, `ratingMax`, `language`, `text`, `translatedText`, `translatedLanguage`, `hasHostResponse` |
| Stay | `stayLength`, `tripType`, `stayHighlight`, `roomType` |
| Request | `position`, `sortOrder`, `matchedTopic`, `searchQuery` |
| Listing ratings | `listingRating`, `listingReviewCount`, `listingRatingAccuracy`, `listingRatingCheckIn`, `listingRatingCleanliness`, `listingRatingCommunication`, `listingRatingLocation`, `listingRatingValue` |
| Booking.com columns of the shared schema (always `null` here) | `title`, `positiveText`, `negativeText`, `nights`, `stayMonth`, `listingRatingStaff`, `listingRatingComfort`, `listingRatingFacilities`, `listingRatingWifi` |
| Context | `scrapedAt` |

`listingRating…` columns come from the listing page (one extra request per listing, no extra charge) and are repeated on each of its reviews; untick **Add the listing's ratings** to skip them. Airbnb publishes no category rating per review: the six category ratings are the listing's averages.

### Privacy by design

The rules below are applied to every review before it is saved, in this order, and tested on real captured responses:

1. **No identity of the author or of the host.** Never a name, first name, pseudonym, photo, profile link or id, city or country of the guest; nothing about the host; no guest photos. The host's public reply is left out (it may name the guest): only `hasHostResponse` says whether there is one.
2. **Rows are built from a whitelist** of review facts, never by copying Airbnb's response, then pass the studio's privacy filter.
3. **First names masked in the texts.** Airbnb sends the host's and the guest's first names with each review: they are replaced in `text` and `translatedText` by `[host]` and `[guest]` (whole words, any case or accent, every part of names such as "Ana & Rui", and variants one letter away for names of five letters or more, a common typing slip), then forgotten.
4. **Links, e-mails and phone numbers removed** from the texts: links become `[link]`, e-mail addresses and phone numbers `[redacted]`.
5. **Date to the month.** `reviewMonth` is the month of publication (UTC); the exact date and time are never published.
6. **No review id.** `reviewKey` is the first 16 characters of a SHA-256 hash of Airbnb's review id: stable from run to run (to deduplicate and spot new reviews) but not reversible.

Limit: review texts are written by guests; we mask the first names Airbnb gives us (host and guest), links, e-mails and phone numbers, but other names a guest may write can remain (a co-host, a member of staff, a neighbour).

### How to scrape Airbnb reviews

1. **Paste listing URLs** copied from your browser (`https://www.airbnb.com/rooms/21607939`, any Airbnb country site) or just the numeric ids, one per line.
2. **Choose how many reviews** per listing (`maxReviewsPerListing`, up to the full history) and the order (`sortBy`).
3. **Optionally filter**: a date (`reviewsSince`), an Airbnb topic (`topic`) or a word (`searchQuery`); pick the language of the translations (`locale`).
4. **Run** and open the **Output** tab: the *Overview*, *Texts* and *Listing ratings* views show the main columns; export everything as JSON, CSV, Excel or through the API.

### Input

Give at least one listing URL or id in `listingUrls`. Field names and defaults are those of the input form.

The input of our validation run: three listings (a Lisbon flat with 658 reviews, a Lisbon hotel with room types, a new listing with a few reviews), the 60 most recent reviews of each, translations into English (every other field keeps its default):

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/21607939",
    "https://www.airbnb.com/rooms/1663639623527062900",
    "https://www.airbnb.com/rooms/1767433945191122578"
  ],
  "maxReviewsPerListing": 60,
  "sortBy": "MOST_RECENT",
  "locale": "en",
  "translate": true,
  "includeListingRatings": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugStoreResponses": false
}
```

Every field, with its type and default:

| Field | Type | Default | Description |
|---|---|---|---|
| `listingUrls` | string\[] | — | Airbnb listing URLs (`/rooms/<id>`, any country site) or numeric listing ids, up to 1,000. Duplicates are read once. |
| `maxReviewsPerListing` | integer | `100` | Reviews kept per listing, in the chosen order (up to 10,000: the full history of most listings). Prefilled with 20 in the form. |
| `maxResults` | integer | `1000` | Stop the run after this many reviews over all listings. You are never charged for more. Prefilled with 20 in the form. |
| `sortBy` | string | `"MOST_RECENT"` | `MOST_RECENT`, `BEST_QUALITY` (most relevant), `RATING_DESC` (highest first) or `RATING_ASC` (lowest first). |
| `reviewsSince` | string | — | Only reviews published on or after this date, `YYYY-MM-DD` or `YYYY-MM`. With `MOST_RECENT`, each listing stops at the first older review. |
| `topic` | string | — | Airbnb review topic, e.g. `CLEANLINESS`, `LOCATION`, `NOISE`, `HOSPITALITY` (the topics shown above a listing's reviews). |
| `searchQuery` | string | — | Only the reviews containing this word or phrase (Airbnb's full-text search). |
| `locale` | string | `"en"` | Airbnb language code of the translations and stay labels (en, fr, de, es, it, pt, nl…). |
| `translate` | boolean | `true` | Keep Airbnb's translation of reviews written in another language (`translatedText`). |
| `includeListingRatings` | boolean | `true` | Read each listing page once and add its average rating, review count and six category ratings to every row. |
| `proxyConfiguration` | object | `{"useApifyProxy":true}` | Apify datacenter proxies by default, included in the price; keep them, or bring your own proxy URLs. |
| `maxRequests` | integer | `2000` | Safety cap on requests in one run (one per 50 reviews, plus one per listing for its ratings, plus up to 3 per page that Airbnb answers short). |
| `delayMs` | integer | `250` | Pause between two pages of the same listing, in milliseconds. |
| `debugStoreResponses` | boolean | `false` | Debugging only: store a copy of every response without the author, host and reply fields. |

### Output example

One real row, produced by the Actor from a review of a Lisbon listing on airbnb.com (Spanish original, English translation, family stay, host's first name masked). All columns are present, in this order, for every review:

```json
{
  "schemaVersion": "travel-review/1.1",
  "platform": "airbnb",
  "platformListingId": "21607939",
  "listingUrl": "https://www.airbnb.com/rooms/21607939",
  "reviewKey": "8c279961b553d684",
  "reviewMonth": "2026-09",
  "rating": 5,
  "ratingMax": 5,
  "language": "es",
  "title": null,
  "text": "Hemos recorrido varias ciudades en varios sitios, pero la experiencia en Lisboa ha sido de todo nuestro agrado. Hemos estado como en casa, todo completo en cocina, en baños, en habitaciones.... la distribución es diferente, pero para nosotros ha sido bien. Cocinamos y todo super dotado, las atenciones.... sin palabras. Bella experiencia.\nPor otra parte la ubicación, bus, tren, tranvía, y en medio de todos ,los puntos a recorrer y conocer de tan bella ciudad. A pocos metros y no más de 5 minutos caminando el transporte más lejano.\nCon los niños hemos clasificado los hospedajes y de lejos ha sido el mejor hasta ahora.... solo faltan Madrid y Barcelona.\n[host] ha estado pendiente de todo, con recomendaciones y atenciones...\nQue si volveremos? 100% seguros que sí, y esperamos poder hospedarnos nuevamente en éste espacio.",
  "positiveText": null,
  "negativeText": null,
  "translatedText": "We've visited several cities in various places, but we really enjoyed our experience in Lisbon. We felt at home. The kitchen, bathrooms and bedrooms were fully equipped. The layout is different, but it worked well for us. We cooked, and everything was super well-equipped. The hospitality... I'm speechless. A wonderful experience.\nOn the other hand, the location: buses, trains, trams, and in the middle of all the places to visit and explore in such a beautiful city. The farthest public transportation is just a few meters away and no more than a 5-minute walk.\nWe have rated the places we've stayed with the kids, and this has by far been the best one so far... We just have Madrid and Barcelona left.\n[host] was attentive to everything, with recommendations and thoughtful gestures...\nWill we come back? We're 100% sure we will, and we hope to be able to stay in this place again.",
  "translatedLanguage": "en",
  "stayLength": null,
  "tripType": "with_kids",
  "stayHighlight": "Stayed with kids",
  "nights": null,
  "stayMonth": null,
  "roomType": null,
  "hasHostResponse": false,
  "position": 4,
  "sortOrder": "MOST_RECENT",
  "matchedTopic": null,
  "searchQuery": null,
  "listingRating": 4.96,
  "listingReviewCount": 658,
  "listingRatingAccuracy": 4.97,
  "listingRatingCheckIn": 4.99,
  "listingRatingCleanliness": 4.96,
  "listingRatingCommunication": 5,
  "listingRatingLocation": 4.78,
  "listingRatingValue": 4.93,
  "listingRatingStaff": null,
  "listingRatingComfort": null,
  "listingRatingFacilities": null,
  "listingRatingWifi": null,
  "scrapedAt": "2026-10-20T08:00:00.000Z"
}
```

### How much does it cost to scrape Airbnb reviews?

This Actor uses **pay-per-event pricing: you pay a fixed price per review** saved to your dataset, and nothing else. On the Free plan, reviews cost $1.80 per 1,000, so Apify's free monthly credit of $5 covers about 2,777 reviews; paid plans pay less per review, and the price of every plan tier is on the **Pricing tab** of this page.

| What you pay for | How it is counted | Price |
|---|---|---|
| `result` event: one anonymous review saved to your dataset | once per unique review of the run, capped by `maxReviewsPerListing` and `maxResults` | Pricing tab, per plan tier |
| Listing ratings (`includeListingRatings`) | one listing page per listing | included |
| Run start | a symbolic amount, once per run | Pricing tab |
| Compute, proxies, storage and data transfer | included: no platform usage is passed on to you | — |

The cost of a run is known before you start: 1,000 reviews cost 1,000 times the `result` price of your tier, whatever the number of listings or pages fetched. Airbnb returns 50 reviews per request, so 1,000 reviews take about half a minute.

### Limits and behaviour worth knowing

- **Full history, in Airbnb's order.** Airbnb gives every review of a listing, 50 per request; the order is Airbnb's for the chosen `sortBy` and `position` keeps it. Ratings are whole stars (1 to 5).
- **Short pages are not the end.** After a few pages, Airbnb may start answering only 2 reviews per page to the same visitor. The Actor changes session (proxy session, cookies) every 3 pages to stay under that limit, asks a short page again in a new session (up to 3 times), and goes on until the review count Airbnb announces for the listing. If a listing still gets 5 short pages in a row, it stops early and the log says how many of its reviews are missing: run it again later for the rest (`reviewKey` stays the same).
- **Stay labels in English and French.** `stayLength` and `tripType` are filled from Airbnb's labels in English and French; with another `locale` they may stay `null` while `stayHighlight` keeps the label as displayed.
- **Translations are Airbnb's.** `translatedText` is the translation Airbnb shows its visitors, in the `locale` you choose; the original is always in `text`.
- **Filters count differently.** With `topic` or `searchQuery`, Airbnb returns only the matching reviews; `listingReviewCount` then comes from the listing page only (it is `null` if the listing ratings are turned off).
- **Removed listings are reported, not fatal.** A listing that does not exist any more is named in the log and the run goes on with the others. A run that saves no review at all ends as failed with a message that says why (listings not found, without reviews, or an Airbnb change), so that your schedules notice (no empty successes).
- **Blocking.** Airbnb's reviews were served to Apify datacenter proxies without challenge in our tests. An unusable response gets one retry in a new session, then the listing is given up and reported in the log.
- **Airbnb changes.** The reviews come from a versioned Airbnb query; if Airbnb retires it, the Actor retries with the previous version and the log says so. The fix is shipped as a new build; check the Changelog.

### Integrations and API

Start the Actor from Apify Console, schedule it, or call it from the [Apify API](https://docs.apify.com/api/v2) with any language (the **API** tab shows ready-made code for Node.js, Python and curl). Webhooks notify your systems when a run finishes; the dataset can be pulled as JSON, CSV, Excel, XML or RSS, or pushed to Google Sheets, Make, Zapier, n8n, Slack, Airtable, Google Drive and more through the Apify integrations.

### Use it from your AI assistant

Add this Actor as a tool to Claude, ChatGPT, Cursor, VS Code or any MCP client with the Apify MCP server URL below (sign in with your Apify account when asked):

`https://mcp.apify.com?tools=myth84/airbnb-reviews-scraper`

Then ask in plain words. Copy this prompt and change the details:

```text
Use myth84/airbnb-reviews-scraper to get the 30 most recent reviews of this Airbnb listing, in English, and sum up what guests liked and disliked: https://www.airbnb.com/rooms/21607939. Input: {"listingUrls": ["https://www.airbnb.com/rooms/21607939"], "maxReviewsPerListing": 30, "sortBy": "MOST_RECENT", "locale": "en"}. Show the month, rating, trip type and the English text of each review.
```

### For AI agents (MCP)

Through the [Apify MCP server](https://docs.apify.com/mcp) this Actor is a tool that answers questions such as *"what do guests say about noise in this Airbnb?"*, *"how is this listing rated for cleanliness and what did the last 20 guests write?"* or *"which reviews of these three listings mention the check-in?"*.

**Minimal input** (every other field keeps its default; raise `maxReviewsPerListing` only when the question needs more reviews):

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/21607939"
  ],
  "maxReviewsPerListing": 20
}
```

- **Key output fields**: `platformListingId`, `reviewMonth`, `rating`, `language`, `text`, `translatedText`, `stayLength`, `tripType`, `roomType`, `hasHostResponse`, `listingRating`, `listingReviewCount` and the six `listingRatingAccuracy` … `listingRatingValue` columns. Every column is always present, in a fixed order; `null` means Airbnb did not give the value. The full list is in *What data does Airbnb Reviews Scraper extract?* above.
- **Use it when** you have Airbnb listing URLs or ids and need what guests wrote and how they rated their stay: recent reviews, lowest-rated reviews, reviews about a topic or containing a word, reviews since a date. Pass `listingUrls` (a few URLs) and a small `maxReviewsPerListing`; add `topic`, `searchQuery`, `sortBy` or `reviewsSince` to narrow down.
- **Do not use it for** finding listings by place or price (use the Airbnb Listings Scraper), amenities and house rules (Airbnb Listing Details Scraper), reviewer or host profiles, host replies or guest photos: it collects no personal data and only reads public reviews.
- **Cost per 1,000 results**: 1,000 `result` events, $1.80 per 1,000 on the Free plan and less on paid plans (Pricing tab); nothing else is charged.
- **Typical time**: about two seconds per listing plus one second per 50 reviews: 20 reviews of one listing in a few seconds, 1,000 reviews in about half a minute.

### Alternatives and switching

- **Official API.** Airbnb does not offer an open API for reviews: its API is reserved to selected partners. This Actor reads the reviews any visitor sees on a public listing page, without the reviewers' identity, with no account, no keys and no approval.
- **Your own scraper.** Nothing to build or maintain: pagination over the full history, translations, retries, short pages and Airbnb changes are handled for you, and the anonymisation rules are applied and tested on every row. The columns stay the same from run to run, a run that finds nothing fails with an explicit message instead of succeeding empty, and a scheduled test run catches Airbnb changes early.
- **Another scraper from the Store.** The input names differ from one Actor to the next; the usual ones map to this Actor as follows:

| Usual input | Here | Note |
|---|---|---|
| `startUrls`, `urls`, `listingIds` | `listingUrls` | Airbnb listing URLs or numeric listing ids |
| `maxReviews`, `maxItems` | `maxReviewsPerListing` | Reviews per listing; `maxResults` caps the whole run |
| `sort` | `sortBy` | `MOST_RECENT`, `BEST_QUALITY`, `RATING_DESC` or `RATING_ASC` |
| `cutoffDate`, `startDate` | `reviewsSince` | `YYYY-MM-DD` or `YYYY-MM` |
| `language` | `locale` | Language of Airbnb's translations and stay labels |
| `translate`, `translateReviews` | `translate` | Keep Airbnb's translation in `translatedText` |
| `keyword`, `search` | `searchQuery` | Airbnb's full-text search of the reviews |
| `category`, `tag` | `topic` | An Airbnb review topic such as `CLEANLINESS` or `LOCATION` |
| `proxy` | `proxyConfiguration` | Apify proxies, included in the price |

### FAQ

#### Does Airbnb Reviews Scraper collect personal data?

No. It never saves the reviewer's name, photo, profile, id or location, nothing about the host and no host reply; the first names Airbnb gives with each review are masked in the texts, links, e-mails and phone numbers are removed, dates are kept to the month and review ids are replaced by an anonymous key. See *Privacy by design* above for the rules and their limit.

#### Why no reviewer names?

Because names, photos and profile links of reviewers are personal data under the GDPR and similar laws, and they add nothing to an analysis of what guests think of a listing. Leaving them out makes the dataset safe to store, share and process, which reviewer-level data from other scrapers is not. The `reviewKey` column still lets you deduplicate reviews and follow them from run to run.

#### Can I get only new reviews?

Yes. Set `reviewsSince` to the date (or month) of your last run and keep `sortBy` on `MOST_RECENT`: each listing stops at the first older review, so a daily run costs only the new reviews. You can also compare the `reviewKey` column with your previous dataset: it is stable from run to run.

#### Are sub-ratings per review available?

No: Airbnb publishes only an overall rating (1 to 5 stars) per review. The category ratings (accuracy, check-in, cleanliness, communication, location, value) exist for the listing as a whole: with **Add the listing's ratings** (on by default) they are repeated on every review row in the `listingRating…` columns.

#### How many reviews can I get per listing?

All of them: Airbnb gives the full history of a listing, 50 reviews per request. Set `maxReviewsPerListing` high enough (up to 10,000) and `maxResults` above the total you expect.

#### Which languages are supported?

Reviews in every language are collected with their original text and language code. Translations (`translatedText`) come in the `locale` you choose (en, fr, de, es, it, pt, nl…); the stay labels are normalised for English and French, and kept as displayed in `stayHighlight` for every language.

#### Is it legal to scrape Airbnb reviews?

The Actor only reads reviews that Airbnb shows to any visitor without an account, and it stores no personal data. Scraping public data is generally lawful, but you are responsible for how you use the results and for complying with Airbnb's terms of service and the laws that apply to you; review texts are the guests' own words, use them for analysis rather than republishing.

#### What if my runs get blocked? Do I need proxies?

Apify datacenter proxies (the default) work for Airbnb reviews and are included in the price. If a run reports blocked responses, increase `delayMs` and try again later, or bring your own proxy URLs; persistent blocking is fixed as a priority, open an issue with your run id.

#### How do I export or integrate the results?

From the run's Output tab (JSON, CSV, Excel, XML, RSS) or automatically: Apify API, webhooks, scheduled runs and integrations with Google Sheets, Make, Zapier, n8n, Slack and others. AI agents can call the Actor through the Apify MCP server.

#### Where do I get support?

Open an issue in the **Issues** tab of this Actor with your run id and input. Bugs and Airbnb changes are fixed as a priority; feature requests (other review platforms of the travel studio) are welcome.

### More scrapers by Flatrow Data Studio

Put what guests say next to prices and availability: the Airbnb scrapers share the listing id (`platformListingId`), and the travel scrapers of the studio share the same core columns:

- [Airbnb Listings Scraper & Price Tracker](https://apify.com/myth84/airbnb-listings-scraper): Airbnb prices, ratings, review counts and locations for any place and dates, up to 50 destinations per run, with price monitoring — the listing URLs to feed this Actor.
- [Airbnb Listing Details & Availability Calendar](https://apify.com/myth84/airbnb-listing-details-scraper): amenities, house rules, six category ratings and a 1–12 month availability calendar for the Airbnb listing URLs you give.
- [Booking.com Hotels Scraper & Price Tracker](https://apify.com/myth84/booking-hotels-scraper): Booking.com hotel prices for your dates with the excluded taxes, review scores and stars, search URLs and price monitoring.
- [Expedia Hotels Scraper: Prices & Ratings](https://apify.com/myth84/expedia-hotels-scraper): Expedia hotel prices per night and for the whole stay, guest ratings and review counts, to compare with the other platforms.

Did this scraper give you the data you needed? A rating on its Store page helps other people find it. For a bug or a missing field, open an issue in the **Issues** tab.

If this Actor saved you time, a short review helps others find it.

### Legal note

This Actor reads publicly available Airbnb reviews without logging in and collects no personal data. You are responsible for your use of the data and for complying with Airbnb's terms and the laws that apply to you.

Not affiliated with, endorsed or sponsored by Airbnb. Airbnb is a trademark of Airbnb, Inc.

# Changelog

This Actor's version history is a separate document: https://apify.com/myth84/airbnb-reviews-scraper/changelog.md

# Actor input Schema

## `listingUrls` (type: `array`):

One Airbnb listing per line: a listing URL copied from your browser (<code>https://www.airbnb.com/rooms/21607939</code>, any Airbnb country site) or just the numeric listing id. Duplicates are read once. Up to 1,000 listings per run. Search result URLs are not accepted: use the Airbnb Listings Scraper to find listings.

## `maxReviewsPerListing` (type: `integer`):

Stop reading a listing after this many reviews (in the chosen order). Airbnb gives the full history of a listing: set a high value (up to 10,000) to get every review. Default 100: two requests of 50 reviews per listing, its recent history (the form is prefilled with 20 for a quick first run).

## `maxResults` (type: `integer`):

Stop the run after this many reviews over all listings; you are never charged for more. Default 1,000: caps the bill of a long list of listings (the form is prefilled with 20 for a quick first run).

## `sortBy` (type: `string`):

Order in which Airbnb returns the reviews of each listing: most recent first, most relevant (Airbnb's own ranking), highest rating first or lowest rating first. The <code>position</code> column keeps this order. Default most recent: the newest reviews first, the only order in which Only reviews since stops reading a listing early.

## `reviewsSince` (type: `string`):

Optional date, <code>YYYY-MM-DD</code> or <code>YYYY-MM</code>, e.g. <code>2026-09</code>: only reviews published on or after it are kept. With the most-recent order the listing stops at the first older review, which makes incremental monitoring cheap; with another order the reviews are filtered.

## `topic` (type: `string`):

Optional Airbnb review topic: only the reviews Airbnb tags with it, e.g. <b>CLEANLINESS</b>, <b>LOCATION</b>, <b>NOISE</b>, <b>HOSPITALITY</b>. The topics of a listing are those shown above its reviews; pick one from the list or type another one in capitals.

## `searchQuery` (type: `string`):

Optional word or phrase: only the reviews that contain it (Airbnb's own full-text search, e.g. <i>noise</i>, <i>parking</i>, <i>wifi</i>).

## `locale` (type: `string`):

Airbnb language code of the translations and of the stay labels: en, fr, de, es, it, pt, nl… The original text is always kept in <code>text</code>; <code>stayLength</code> and <code>tripType</code> are filled for English and French labels. Two lowercase letters, optionally followed by a region such as en-GB. Default en: English translations, and labels that fill stayLength and tripType.

## `translate` (type: `boolean`):

Keep Airbnb's translation of reviews written in another language than the one above (<code>translatedText</code>). Untick to save only the original texts. Default on: every review readable in one language, the original always kept in text.

## `includeListingRatings` (type: `boolean`):

Read each listing page once and repeat its average rating, review count and six category ratings (accuracy, check-in, cleanliness, communication, location, value) on every review row. Airbnb publishes no category rating per review. One extra request per listing, no extra charge. Default on: the listing's category ratings are the only per-aspect scores Airbnb publishes.

## `proxyConfiguration` (type: `object`):

Proxies of the requests. Default: Apify datacenter proxies (automatic), enough for Airbnb reviews and included in the price. If your runs get blocked, choose another Apify proxy group or provide your own proxy URLs.

## `maxRequests` (type: `integer`):

Safety cap on the number of requests in one run (one per 50 reviews, plus one per listing for its ratings, plus up to 3 per page that Airbnb answers short). Default 2,000: room for about 100,000 reviews, far above the default total of 1,000.

## `delayMs` (type: `integer`):

Pause between two pages of reviews of the same listing, in milliseconds. Increase it if you get blocked; 0 disables the pause. Default 250: the pacing of our validation and control runs.

## `debugStoreResponses` (type: `boolean`):

Debugging only: save a copy of every reviews response in the run's key-value store, without the author, host and host-reply fields (never the raw response), and the rating summary read on each listing page. Default off: no response is stored.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/21607939"
  ],
  "maxReviewsPerListing": 20,
  "maxResults": 20,
  "sortBy": "MOST_RECENT",
  "locale": "en",
  "translate": true,
  "includeListingRatings": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxRequests": 2000,
  "delayMs": 250,
  "debugStoreResponses": false
}
```

# Actor output Schema

## `reviews` (type: `string`):

All extracted reviews as dataset items, one flat row per review. Append ?format=csv or ?format=xlsx for spreadsheets. The Overview view is selected by default.

## `runStats` (type: `string`):

Requests made, bytes transferred, blocked responses, reviews pushed, listings read, not found, without reviews or failed, first names masked, links removed, retries, and the estimated platform cost of the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "listingUrls": [
        "https://www.airbnb.com/rooms/21607939"
    ],
    "maxReviewsPerListing": 20,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("myth84/airbnb-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "listingUrls": ["https://www.airbnb.com/rooms/21607939"],
    "maxReviewsPerListing": 20,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("myth84/airbnb-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "listingUrls": [
    "https://www.airbnb.com/rooms/21607939"
  ],
  "maxReviewsPerListing": 20,
  "maxResults": 20
}' |
apify call myth84/airbnb-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,myth84/airbnb-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UqUQyM7eWgsNqtzJJ/builds/GBdwyyKMd5A2L1z08/openapi.json
