# Airbnb Reviews Scraper (`lergassy/airbnb-reviews-scraper`) Actor

\[$2/1K reviews] Scrape Airbnb reviews for any listing: star rating, full text, date, reviewer name and location, host reply, photos, listing name and overall rating. Newest, lowest or highest first, up to 2,000 reviews per listing, hundreds of listings per run. No fee per run, no browser, no login.

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

## Pricing

from $1.40 / 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

Guest reviews of any Airbnb listing, one row per review: star rating, full text, date, reviewer name and location, the host's reply, photos, and the listing's name and overall rating on every row. Paste listing URLs, choose newest, lowest or highest first, press Start. **$2 per 1,000 reviews, no fee per run, no fee per listing, error rows free.**

### What is Airbnb Reviews Scraper?

Airbnb Reviews Scraper reads the review feed a listing page loads — the same reviews, in the same order, through the same data endpoint the page itself uses — and writes them as a flat table you can download as JSON, CSV or Excel or pull through the API. No browser, no login, nothing to configure. One listing or five hundred in a run; every listing is billed only for the reviews it returns.

It is built for people who need reviews in bulk rather than one at a time: property managers watching their portfolio, hosts benchmarking neighbours, investors sizing a market, and anyone training or evaluating a model on what guests actually wrote.

### What data can Airbnb Reviews Scraper extract?

| Field | What it holds |
|---|---|
| `listingId`, `listingUrl` | The listing the review belongs to |
| `listingName`, `listingRating`, `listingReviewCount`, `listingCity`, `hostName` | Listing context on every row (name, rating and city need the listing page — one extra request, on by default) |
| `reviewId` | Stable review id for deduplication |
| `rating` | Stars, 1–5 |
| `date`, `createdAt` | The date as Airbnb shows it ("April 2026", "4 days ago") and the ISO timestamp |
| `text`, `language` | Full review text in its original language |
| `reviewerName`, `reviewerLocation`, `reviewerPhoto` | Reviewer as shown on the page (first name, city) |
| `hostResponse`, `hostRespondedAt` | The host's public reply, if any |
| `roomTypeTitle` | Which room the guest stayed in, for listings with several |
| `photos` | Photos attached to the review |
| `highlight` | The sentence Airbnb highlights from the review |
| `scrapedAt` | When the row was taken |

Every row carries `type: "review"`. A listing that cannot be read — wrong URL, removed listing, no reviews yet — produces one `type: "error"` row that says what happened; error rows cost nothing.

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

One event, one price: **$0.002 per review** on the free plan, down to $0.0012 on the highest plans. No fee per run, no fee per listing, no fee per page, no proxy charge — Airbnb is read over plain HTTP through Apify's datacenter proxies, which are included; if Airbnb pushes back, the run switches itself to residential addresses and carries on.

| Plan | Price per review | Reviews per $1 |
|---|---|---|
| Free | $0.002 | 500 |
| Bronze | $0.0018 | 555 |
| Silver | $0.0016 | 625 |
| Gold | $0.0014 | 714 |
| Platinum, Diamond | $0.0012 | 833 |

The $5 of free monthly credit on Apify's free plan buys 2,500 reviews. A listing with 400 reviews costs $0.80 to export in full.

#### Bulk export: what 50,000 reviews actually cost

This Actor is built for volume — put hundreds of listing URLs into one run, or call it from the API on a schedule. Because there is no fee per run and no fee per listing, the bill is the number of reviews you keep and nothing else.

| Job | This Actor | Most-used Actor in this category |
|---|---|---|
| 50,000 reviews across 100 runs | **$100** | $250 |

Checked on the Apify Store on 23 September 2026 against the Actor with the most monthly users for "airbnb reviews"; its per-run fee is counted in, as ours would be if we charged one. Some Actors here ask less per row — this table compares against the one buyers actually use most.

### How to scrape Airbnb reviews

1. Open the listing on Airbnb and copy the address from the browser: `https://www.airbnb.com/rooms/1369235628901673242`. Anything after `?` is ignored.
2. Paste one or more URLs into **Airbnb listing URLs**. The numeric id alone works too.
3. Set **Reviews per listing** (24 is one page; 2,000 is the ceiling per listing per run) and the order — newest first for monitoring, lowest ratings first for complaints.
4. Press **Start**. Download the table, or read it through the API.

### ⬇️ Input

#### The newest 24 reviews of two Bali villas (the form's default — runs in about 30 seconds)

```json
{
  "startUrls": [
    "https://www.airbnb.com/rooms/1369235628901673242",
    "https://www.airbnb.com/rooms/1444770032031301233"
  ],
  "maxReviewsPerListing": 24,
  "sortBy": "MOST_RECENT"
}
```

#### Every complaint about a listing: lowest ratings first, all of them

```json
{
  "startUrls": ["https://www.airbnb.com/rooms/1369235628901673242"],
  "maxReviewsPerListing": 2000,
  "sortBy": "LOWEST_RATED"
}
```

#### Fastest bulk run: reviews only, no listing page

```json
{
  "startUrls": ["1369235628901673242", "1444770032031301233", "1737705214482888416"],
  "maxReviewsPerListing": 500,
  "includeListingInfo": false
}
```

### ⬆️ Output

```json
{
  "type": "review",
  "listingId": "1369235628901673242",
  "listingUrl": "https://www.airbnb.com/rooms/1369235628901673242",
  "listingName": "Private pool villa 5 min from Seminyak beach",
  "listingRating": 4.92,
  "listingReviewCount": 413,
  "listingCity": "Kuta Utara, Bali, Indonesia",
  "hostName": "Made",
  "reviewId": "1517303182213421512",
  "rating": 5,
  "date": "4 days ago",
  "createdAt": "2026-09-19T03:12:44Z",
  "text": "We had an amazing stay! The accommodation was beautiful, very clean and the staff went out of their way…",
  "language": "en",
  "reviewerName": "Emma",
  "reviewerLocation": "Melbourne, Australia",
  "hostResponse": "Thank you Emma, it was a pleasure hosting you.",
  "hostRespondedAt": "3 days ago",
  "roomTypeTitle": null,
  "photos": [],
  "highlight": null,
  "scrapedAt": "2026-09-23T05:40:12.000Z"
}
```

Export as JSON, CSV, Excel, XML or RSS from the **Dataset** tab, or fetch the same rows with one API call.

### Use cases for Airbnb review data

#### Property management

Pull the newest reviews across the whole portfolio every morning; anything under 4 stars goes to the operations channel before the next guest checks in.

#### Competitive benchmarking

Export the reviews of the twenty listings around yours, tag by topic (cleanliness, Wi-Fi, noise, host communication) and see exactly where you lose bookings.

#### Market research and investment

Review volume per month is the closest public proxy for occupancy. Track it for a neighbourhood and you have a demand curve nobody sells.

#### Guest sentiment and AI

Clean review text with a numeric rating attached, in the original language — ready for sentiment models, RAG over "what guests say about X", and chat assistants for hosts.

### Integrations and Airbnb reviews API

Run the Actor from your own code with the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients, from n8n, Make and Zapier through the Apify nodes, straight into Google Sheets, or on a schedule with a webhook when the run finishes. The dataset endpoint returns JSON, CSV or Excel:

```
https://api.apify.com/v2/acts/lergassy~airbnb-reviews-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN
```

#### Use it from Claude, Cursor or any MCP agent

Every Apify Actor is available as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). Add the server and an agent can ask for "the lowest-rated reviews of this listing" and get the rows back.

### 🤖 For AI Agents & LLM Apps

- One row type, flat fields; only `photos` is an array.
- `rating` is an integer 1–5, `createdAt` is ISO, `language` is a two-letter code.
- `listingReviewCount` on every row tells the agent how much of the listing it has seen.
- Error rows carry `type: "error"` with a plain-English `error` string and cost nothing.

### Troubleshooting

- **Error row "Not a listing URL"** — only `airbnb.com/rooms/<id>` pages are accepted; search and wishlist pages are not listings.
- **Error row "no reviews for this listing"** — brand-new listings and removed listings have none. Open the URL in a browser to check.
- **Listing name empty but reviews present** — Airbnb refused the listing page for that request; reviews were still fetched. Run again, or turn **Add listing name…** off for bulk jobs where it does not matter.
- **HTTP 429 in the log** — Airbnb's rate limiter; the run switches to residential proxy by itself and continues.

### ❓ FAQ

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

The Actor reads only what any visitor sees on a public listing page, without logging in, and shows reviewer names exactly as Airbnb publishes them (first name and city). How you store and use the data is subject to the laws of your country and Airbnb's terms; consult a lawyer for commercial projects involving personal data.

#### Does Airbnb have a public reviews API?

No. Airbnb's API is only for approved software partners and does not expose reviews of arbitrary listings. This Actor is the practical alternative.

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

Up to 2,000 per listing per run — enough for all but a handful of listings on the platform. For those, run twice with different orders (newest and lowest rated).

#### Do I need proxies?

No. Apify datacenter proxies are included; residential is a fallback the run applies itself when Airbnb pushes back.

#### Can I run it on a schedule?

Yes — save a Task with your listing list, schedule it daily, and deduplicate by `reviewId` to keep only new rows.

#### What happens on an error?

You get an error row that explains the problem in plain words. Error rows are never billed.

### Your feedback

If a field is missing or a listing does not parse, open an issue on the Actor page with the URL — it is usually fixed within a day. If the Actor saved you time, a review on the Store helps other buyers find it.

### You might also like

| Actor | What it does |
|---|---|
| [Airbnb Scraper](https://apify.com/lergassy/airbnb-scraper) | Listings for any place and dates with prices, ratings, amenities, calendar and host |
| [Airbnb Availability Calendar](https://apify.com/lergassy/airbnb-availability-calendar) | Day-by-day availability and minimum stay for any listing |
| [Booking Reviews Scraper](https://apify.com/lergassy/booking-reviews-scraper) | Guest reviews from Booking.com property pages |
| [Agoda Reviews Scraper](https://apify.com/lergassy/agoda-reviews-scraper) | Hotel reviews from Agoda, including the Booking.com reviews shown on Agoda |
| [Google Hotels Scraper](https://apify.com/lergassy/google-hotels-scraper) | Hotel prices across booking sites from Google Hotels |

# Actor input Schema

## `startUrls` (type: `array`):

One listing per line, as you see it in the browser: <code>https://www.airbnb.com/rooms/1369235628901673242</code>. The numeric id alone works too. Hundreds of listings in one run are fine — each is billed only for the reviews it returns.

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

How many reviews to take from each listing, in the order chosen below. Airbnb serves 24 per page; up to 2,000 per listing per run.

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

<b>Newest first</b> for monitoring; <b>Lowest ratings first</b> to read the complaints.

## `includeListingInfo` (type: `boolean`):

Reads the listing page once per listing (one extra request) to fill <code>listingName</code>, <code>listingRating</code>, <code>listingCity</code> and <code>hostName</code>. Turn off for the fastest possible bulk run — the review count still comes with the reviews.

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

Airbnb locale for dates and labels: <code>en</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>it</code>, <code>id</code>… Review texts stay in the language they were written in.

## `currency` (type: `string`):

Only used when the listing page is read for its name and rating. Reviews carry no prices.

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

Apify datacenter proxies by default. If Airbnb pushes back with HTTP 429 the run switches itself to residential addresses and carries on; you can also start on Residential right away.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.airbnb.com/rooms/1369235628901673242",
    "https://www.airbnb.com/rooms/1444770032031301233"
  ],
  "maxReviewsPerListing": 24,
  "sortBy": "MOST_RECENT",
  "includeListingInfo": true,
  "locale": "en",
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One flat row per guest review: listing id, URL, name, overall rating and review count; review id, star rating, date, full text and language, reviewer name and location, host reply and its date, review photos.

# 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 = {
    "startUrls": [
        "https://www.airbnb.com/rooms/1369235628901673242",
        "https://www.airbnb.com/rooms/1444770032031301233"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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 = { "startUrls": [
        "https://www.airbnb.com/rooms/1369235628901673242",
        "https://www.airbnb.com/rooms/1444770032031301233",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lergassy/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 '{
  "startUrls": [
    "https://www.airbnb.com/rooms/1369235628901673242",
    "https://www.airbnb.com/rooms/1444770032031301233"
  ]
}' |
apify call lergassy/airbnb-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/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/azZLCX1XegIwgza4W/builds/ZXhuYlDbawrO9mcUx/openapi.json
