# Airbnb Reviews Scraper (Ratings, Text, Host Replies) (`webdatatools/airbnb-reviews-scraper`) Actor

Scrape guest reviews of Airbnb stays: rating, review text, date, language, reviewer first name and host reply, for any listing URL or ID. Real browser, no login. Pay per review.

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

## Pricing

from $2.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

## Airbnb Reviews Scraper (Ratings, Text, Host Replies)

### What is Airbnb Reviews Scraper?

Airbnb Reviews Scraper collects guest reviews of Airbnb stays. Give it a listing link (`airbnb.com/rooms/<id>`) or a numeric listing ID and it returns one row per review: rating, review text, date, language, the reviewer's first name and the host's reply. It opens the listing's reviews page in a real browser and records the review data Airbnb's own web app loads, so no login or API key is needed.

### What data does Airbnb Reviews Scraper extract?

| Field | Type | Description |
|---|---|---|
| `listingId` | string | Airbnb listing ID, e.g. `49049534` |
| `listingUrl` | string | Link to the listing |
| `reviewId` | string | Airbnb review ID (unique per review) |
| `rating` | number | Stars, 1 to 5 |
| `reviewText` | string or null | Review text in the language it was written in |
| `createdAt` | string or null | Review date, ISO 8601 (UTC) |
| `language` | string or null | Language code, e.g. `en`, `ja`, `de` |
| `reviewerName` | string or null | Reviewer's first name as shown on Airbnb. No profile links or photos |
| `hostResponse` | string or null | Host's public reply, if any |
| `hostResponseDate` | string or null | Date of the host's reply, as Airbnb shows it |
| `position` | number | Running number of the row within the run |
| `scrapedAt` | string | Time the Actor read the review (ISO 8601) |

### How to use Airbnb Reviews Scraper

1. Open the Actor in Apify Console and paste one or more listing links or IDs into **Listing URLs or IDs**.
2. Set **Max reviews per listing** (default 50, maximum 1000).
3. Click **Start** and wait for the run to finish.
4. Download the results as JSON, CSV or Excel from the dataset tab, or read them through the API.

### Example input

```json
{
    "listings": ["https://www.airbnb.com/rooms/49049534", "1195206575229724261"],
    "maxReviews": 60
}
```

### Example output

One real row from a test run on listing 49049534 (review text shortened here for length):

```json
{
    "listingId": "49049534",
    "listingUrl": "https://www.airbnb.com/rooms/49049534",
    "reviewId": "1734676364653404563",
    "rating": 5,
    "reviewText": "Spent my first night here in Lisbon and had all I needed to recover from travelling internationally.",
    "createdAt": "2026-07-21T09:32:17Z",
    "language": "en",
    "reviewerName": "Cam",
    "hostResponse": null,
    "hostResponseDate": null,
    "position": 7,
    "scrapedAt": "2026-10-23T02:55:49.559Z"
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `listings` | array of strings | Lisbon demo listing `49049534` | Listing links (`airbnb.com/rooms/<id>`) or numeric IDs. Other links are reported as errors in the run |
| `maxReviews` | integer 1–1000 | `50` | Most reviews returned for each listing |

### Pricing

Pay per review. Volume tiers depend on your Apify plan:

| Plan | Price per review |
|---|---|
| FREE | $0.004 |
| BRONZE | $0.0032 |
| SILVER | $0.0028 |
| GOLD | $0.0024 |
| PLATINUM | $0.0024 |
| DIAMOND | $0.0024 |

Apify also charges a small start fee per run ($0.00005). Compute cost on the Apify side was small in the test runs (see the measurement notes below), but the Apify plan you use is what you pay for.

### Airbnb Reviews Scraper vs. alternatives

The most-used comparable Actor on the Apify Store is `tri_angle/airbnb-reviews-scraper` (265 users in the last 30 days, measured 23 Oct 2026 from the public Store API). Its public price is $0.005 per review on the FREE plan and $0.001 per review on DIAMOND. This Actor is not cheaper at the top volume tier. Compare the two on your own listings before you choose. Measured data for this Actor is limited to the test runs listed below.

### Using Airbnb Reviews Scraper with AI agents

The Actor is pay-per-event, so it can be called through the Apify API or the Apify MCP server. Each call returns one row per review, so an agent can read ratings and text directly from the dataset without parsing HTML.

### FAQ

**Does it need a login or an Airbnb account?**
No. It reads the public listing and reviews pages in a real browser, without signing in.

**How many reviews can one listing have?**
The Actor stops at **Max reviews per listing**, or at the end of the list if the listing has fewer reviews. Airbnb's reviews page loads more reviews as you scroll; the Actor scrolls the same way.

**Are the reviews sorted in a particular order?**
In the test runs the order was Airbnb's default on the reviews page. The Actor does not yet let you choose a sort order. Which reviews you get when **Max reviews** is smaller than the total depends on that default.

**Are host replies included?**
The host-reply fields are in the output. In the test runs (120 reviews across 2 listings) no review had a host reply, so the reply fields were not checked against a review that has one. Treat them as unverified until a run confirms them.

**Does the Actor return personal data?**
Only the reviewer's first name as shown on Airbnb. It does not collect profile links, photos or the reviewer's location.

**Why does a run report an error for a listing?**
The Actor writes an error entry when a link is not an Airbnb listing link or ID, or when the reviews page shows no reviews. Check the run's log and its `ERRORS` record in the key-value store.

### Limitations

- Airbnb may change its web app; the Actor's review parsing would then need an update. The tests use a response captured on 23 Oct 2026.
- Listings that show no reviews return no rows.
- Without a proxy the Actor runs from Apify's datacenter addresses. Airbnb may block some of these; the Actor does not switch to a residential proxy yet. A block shows up as an error entry, not as a silent empty run.

### Measurements (test runs, 23 Oct 2026)

- Probe run `EeVPbTAUSiqxzO2br`: listing 49049534, 20 reviews, status SUCCEEDED, about 10 s.
- Run `6dyxZqK8okX76cMss`: 2 listings (49049534 by URL, 1195206575229724261 by ID), 60 reviews each, 120 rows, no duplicates, all ratings numeric, SUCCEEDED, 42 s, 0.0467 CU at 4 GB (the memory default before the Actor's own default was synced).
- Cost per 1,000 reviews: not measured directly. Extrapolated from CU use; treat as an estimate.

### Support

Report problems through the Actor's **Issues** tab in Apify Console.

# Actor input Schema

## `listings` (type: `array`):

One or more Airbnb listing links or numeric IDs, e.g. https://www.airbnb.com/rooms/49049534 or 49049534. Each listing returns up to "Max reviews per listing" reviews.

## `maxReviews` (type: `integer`):

Most reviews to return for each listing, e.g. 100. Airbnb shows reviews in pages; the Actor scrolls until this number or the end of the list.

## Actor input object example

```json
{
  "listings": [
    "https://www.airbnb.com/rooms/49049534"
  ],
  "maxReviews": 50
}
```

# Actor output Schema

## `results` (type: `string`):

All reviews from this 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 = {
    "listings": [
        "https://www.airbnb.com/rooms/49049534"
    ],
    "maxReviews": 50
};

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

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

```

## MCP server setup

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