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

Scrape Airbnb guest reviews for any listing: text, rating, reviewer and host profiles, host responses, and optional AI sentiment, topics, and translation. Export JSON, CSV, Excel.

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

## Pricing

from $1.29 / 1,000 review scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Airbnb Reviews Scraper

Extract **guest reviews from any Airbnb listing** — review text, star rating, reviewer and host profiles, host responses, and dates. **Airbnb Reviews Scraper** returns clean, structured JSON for every review, with optional sentiment scoring, topic detection, and automatic translation for non-English reviews.

<table><tr>
<td style="border-left:4px solid #FF5A5F;padding:12px 16px;font-weight:600">
Paste a listing URL or ID and get every review with reviewer and host profiles, ratings, and host responses — sort by date or rating, filter by topic or keyword, and optionally add sentiment, detected topics, and English translations to each review.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Airbnb Reviews Scraper (parsebird/airbnb-reviews-scraper) scrapes guest reviews for Airbnb listings. Inputs: startUrls (array of {url} — Airbnb /rooms/ URLs), listingIds (array of numeric strings, alternative to startUrls), maxReviewsPerListing (integer, default 0 = all), sortBy (MOST_RECENT default / BEST_QUALITY / RATING_DESC / RATING_ASC — non-default sorts read all reviews first to rank correctly), filterByTopic (CLEANLINESS/LOCATION/HOSPITALITY/SLEEP/VALUE/COMMUNICATION/ACCURACY/CHECKIN/AMENITIES/NOISE/PARKING/WIFI/COMFORT/SAFETY/VIEW/GETTING_AROUND/BATHROOM/PRIVACY/FAMILY, matched against review text), searchQuery (string, case-insensitive substring match), locale (default en-US), enableAIAnalysis (boolean, default false — adds sentiment/sentimentScore/aiTopics/translatedText; translation only for non-English reviews), proxyConfiguration (residential, set by default). Output per review: listingId, listingUrl, reviewId, language, text, localizedDate, createdAt, rating, hostResponse, reviewerId/Name/PictureUrl/ProfileUrl/IsSuperhost, hostId/Name/PictureUrl/ProfileUrl/IsSuperhost, scrapedAt; with enableAIAnalysis also sentiment, sentimentScore, aiTopics, translatedText. Pricing: pay-per-event, $0.00199 per review on Free down to $0.00129 on Gold. API: https://apify.com/parsebird/airbnb-reviews-scraper/api - Token: https://console.apify.com/account/integrations
```

### What is Airbnb Reviews Scraper?

**Airbnb Reviews Scraper** is an Apify Actor that pulls the full guest review history from any [Airbnb](https://www.airbnb.com) listing — the same reviews shown on the listing page, without Airbnb's own API. Paste a listing URL or its numeric ID and get every review as structured JSON: text, star rating, dates, reviewer and host profiles, and host responses.

It runs on one listing or hundreds in a single job, so it works equally well for checking your own property's feedback or benchmarking a set of competitor listings.

### What can Airbnb Reviews Scraper do?

- 📝 **Full review text & rating** — every review's text, star rating, and both a localized ("3 weeks ago") and exact ISO date.
- 👤 **Reviewer & host profiles** — names, profile pictures, profile URLs, and Superhost status for both sides.
- 💬 **Host responses** — the host's public reply to a review, when one exists.
- 🔢 **Multiple listings per run** — combine Start URLs and/or plain listing IDs.
- 🔀 **Sorting** — most recent (Airbnb's native, fastest order), best quality, highest rated, or lowest rated.
- 🎯 **Topic & keyword filtering** — keep only reviews about cleanliness, location, wifi, noise, and 15 more topics, or matching a free-text search.
- 🤖 **Optional AI analysis** — a sentiment label and score, detected topics, and an English translation for non-English reviews.
- 🌐 **Locale support** — get localized dates and labels in the language you need.
- 📅 **Built for monitoring** — save an input and run it on an [Apify Schedule](https://docs.apify.com/platform/schedules) for a rolling review feed.
- ⚡ Runs on Apify with API access, webhooks, integrations, and export to JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Airbnb reviews?

| Field | Description |
|-------|-------------|
| `reviewId` / `text` / `rating` | Core review content |
| `localizedDate` / `createdAt` | Localized ("3 weeks ago") and exact ISO-8601 dates |
| `language` | Detected language code of the review text |
| `hostResponse` | The host's public reply, when present |
| `reviewerName` / `reviewerPictureUrl` / `reviewerProfileUrl` / `reviewerIsSuperhost` | Reviewer profile |
| `hostName` / `hostPictureUrl` / `hostProfileUrl` / `hostIsSuperhost` | Host profile |
| `sentiment` / `sentimentScore` | Positive / neutral / negative label and a -1..1 score (only with `enableAIAnalysis`) |
| `aiTopics` | Topics detected in the review text (only with `enableAIAnalysis`) |
| `translatedText` | English translation, for non-English reviews only (only with `enableAIAnalysis`) |

### How to scrape Airbnb reviews

1. Open [Airbnb Reviews Scraper](https://apify.com/parsebird/airbnb-reviews-scraper) on Apify Store and click **Try for free**.
2. Paste one or more listing URLs into **Start URLs**, or plain numeric IDs into **Listing IDs**.
3. (Optional) Set **Max reviews per listing**, **Sort by**, a **Filter by topic**, or a **Search query**.
4. (Optional) Turn on **Enable AI analysis** for sentiment, topics, and translations.
5. Click **Start**, then open the **Dataset** tab. Export as JSON, CSV, Excel, HTML, or XML.

#### Input example — simplest run

```json
{
    "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }]
}
```

#### Input example — plain listing IDs

```json
{
    "listingIds": ["12937", "1029728", "54321"]
}
```

#### Input example — most recent 50, sorted

```json
{
    "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],
    "maxReviewsPerListing": 50,
    "sortBy": "MOST_RECENT"
}
```

#### Input example — topic filter

```json
{
    "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],
    "filterByTopic": "CLEANLINESS"
}
```

#### Input example — AI sentiment and translations

```json
{
    "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],
    "maxReviewsPerListing": 50,
    "sortBy": "MOST_RECENT",
    "enableAIAnalysis": true
}
```

### Turn one scrape into a recurring review monitor

For reputation tracking, save an input for your own or a competitor's listings and run it on an [Apify Schedule](https://docs.apify.com/platform/schedules):

- **Weekly, active properties**: `sortBy: "MOST_RECENT"`, `maxReviewsPerListing: 25-50`, and `enableAIAnalysis: true` for a rolling sentiment view.
- **Monthly, competitor benchmarking**: batch several `listingIds`, keep `sortBy: "MOST_RECENT"`, and export to Google Sheets or your BI tool.
- **Issue triage after each run**: filter by low ratings, negative sentiment, or a `searchQuery` like `wifi`, `cleanliness`, or `noise`.

```json
{
    "listingIds": ["12937", "1029728"],
    "maxReviewsPerListing": 50,
    "sortBy": "MOST_RECENT",
    "enableAIAnalysis": true
}
```

Use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to notify your team when each run finishes. If you also need fresh listing details, run [Airbnb Scraper & API](https://apify.com/parsebird/airbnb-scraper) on the same listing IDs to update prices, availability, and host details alongside the review history.

### Output example

```json
{
    "listingId": "12937",
    "listingUrl": "https://www.airbnb.com/rooms/12937",
    "reviewId": "1598794192968517887",
    "language": "de",
    "text": "Ich war zum dritten oder vierten Mal bei Orestes...",
    "localizedDate": "3 weeks ago",
    "createdAt": "2026-01-14T21:58:39Z",
    "rating": 5,
    "hostResponse": null,
    "reviewerId": "232038",
    "reviewerName": "Marion",
    "reviewerPictureUrl": "https://a0.muscache.com/im/users/232038/profile_pic/…/original.jpg",
    "reviewerProfileUrl": "/users/show/232038",
    "reviewerIsSuperhost": false,
    "hostId": "50124",
    "hostName": "Orestes",
    "hostIsSuperhost": false,
    "scrapedAt": "2026-02-10T00:52:54.470Z",
    "sentiment": "positive",
    "sentimentScore": 0.95,
    "aiTopics": ["location", "hospitality"],
    "translatedText": "I stayed at Orestes for the third or fourth time..."
}
```

Download the dataset in JSON, CSV, Excel, HTML, or XML from the [Dataset tab](https://docs.apify.com/platform/storage/dataset).

### Use cases

- ⭐ **Reputation monitoring** — track new reviews and sentiment trends for your own listings.
- 🔍 **Competitor benchmarking** — compare review volume, ratings, and recurring complaints across similar listings.
- 🛠️ **Issue triage** — surface negative reviews about a specific topic (cleanliness, noise, wifi) right after each stay.
- 📊 **Market research** — analyze what guests value across a market or neighborhood.
- 🤖 **AI & data pipelines** — feed review data into LLM agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) or a BI tool.

### How it works

1. The Actor resolves each Start URL or listing ID to a numeric Airbnb listing id.
2. It paginates through that listing's reviews. For the default `MOST_RECENT` sort with no topic/search filter, it stops as soon as `maxReviewsPerListing` is reached; sorting by rating or filtering requires reading every review first so results can be ranked or filtered correctly.
3. Each raw review is normalized into a flat record with reviewer and host profile fields.
4. `filterByTopic` and `searchQuery` are applied against the review text, then results are sorted per `sortBy` and trimmed to `maxReviewsPerListing`.
5. With `enableAIAnalysis`, each kept review gets a sentiment label/score, detected topics, and — for non-English reviews — an English translation.
6. Each review is billed as one pay-per-event result.

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

Airbnb Reviews Scraper uses **pay-per-event** pricing. You are charged **once per review**.

| Plan | Price per review | Price per 1,000 reviews |
|------|-------------------|---------------------------|
| Free | $0.00199 | **$1.99** |
| Bronze | $0.00179 | **$1.79** |
| Silver | $0.00159 | **$1.59** |
| Gold | $0.00129 | **$1.29** |

Scraping 1,000 reviews costs about **$1.99** on the Free plan. Apify platform usage (compute and proxy) is billed separately but is minimal for the default run; `enableAIAnalysis` adds a small amount of processing time and, for non-English reviews, one translation request each. See the [Apify pricing page](https://apify.com/pricing).

### API usage examples

Run Airbnb Reviews Scraper with the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "listingIds": ["12937"],
    "maxReviewsPerListing": 50,
    "sortBy": "MOST_RECENT",
    "enableAIAnalysis": True,
}

run = client.actor("parsebird/airbnb-reviews-scraper").call(run_input=run_input)

for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["reviewerName"], review["rating"], review.get("sentiment"))
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/airbnb-reviews-scraper').call({
    startUrls: [{ url: 'https://www.airbnb.com/rooms/12937' }],
    filterByTopic: 'CLEANLINESS',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => `${r.rating}★ — ${r.text.slice(0, 60)}`));
```

Connect finished datasets to [Google Sheets](https://docs.apify.com/platform/integrations/google-sheets), [Slack](https://docs.apify.com/platform/integrations/slack), [Zapier](https://docs.apify.com/platform/integrations/zapier), [Make](https://docs.apify.com/platform/integrations/make), webhooks, or your own pipeline.

### Is it legal to scrape Airbnb reviews?

Airbnb Reviews Scraper reads only publicly visible data — the same reviews any visitor sees on a listing's [airbnb.com](https://www.airbnb.com) page. It does not log in or access private account data. Review text includes personal opinions and reviewer names, which may be personal data under the GDPR and similar laws; you are responsible for having a lawful basis to process it and for complying with Airbnb's Terms of Service. For background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

- [Airbnb Scraper & API](https://apify.com/parsebird/airbnb-scraper) — Listings, prices, amenities, host details, and availability calendars.
- [Airbnb Availability Calendar Scraper](https://apify.com/parsebird/airbnb-availability-calendar-scraper) — Day-by-day availability for a single listing.
- [Trustpilot Reviews Scraper](https://apify.com/parsebird/trustpilot-reviews-scraper) — Business reviews from Trustpilot.
- [GetYourGuide Review Scraper](https://apify.com/parsebird/getyourguide-review-scraper) — Tour and activity reviews.

### FAQ

**Do I need an Airbnb account or API key?**
No. The Actor uses Airbnb's public review data — no login or API key.

**How does sorting by rating work if Airbnb doesn't expose a sort parameter?**
Airbnb's public review data is always served in most-recent-first order. For `BEST_QUALITY`, `RATING_DESC`, and `RATING_ASC`, the Actor reads every review for the listing and sorts them itself, so those modes take longer than `MOST_RECENT` on listings with many reviews.

**Is `filterByTopic` Airbnb's own topic tagging?**
No. Airbnb doesn't expose its internal per-review topic tags through the data this Actor uses, so `filterByTopic` and `aiTopics` match review text against a keyword set for each topic (cleanliness, location, wifi, noise, and so on). It's a practical approximation, not Airbnb's own classification.

**Is the sentiment score from a trained AI model?**
It's a deterministic method that combines the review's star rating with a keyword-weighted read of the text — fast, free, and consistent, but not a large language model. Treat `sentiment`/`sentimentScore` as a useful signal for triage, not a definitive judgment.

**How accurate are the translations?**
`translatedText` uses a machine translation service and is populated only for reviews whose detected `language` isn't English. Quality is generally good for everyday review text but, like any machine translation, can miss nuance or slang.

**Can I schedule recurring runs to monitor new reviews?**
Yes — see "Turn one scrape into a recurring review monitor" above. Use Apify [schedules](https://docs.apify.com/platform/schedules) and webhooks.

**Can I use this as an Airbnb reviews API?**
Yes. Call the Actor through the [Apify API](https://docs.apify.com/api/v2), use webhooks, or connect it to AI assistants with the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Something looks wrong or missing.**
Report it on the [Issues tab](https://apify.com/parsebird/airbnb-reviews-scraper/issues) and it will be looked at quickly.

# Actor input Schema

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

Airbnb listing URLs to scrape reviews from, e.g. https://www.airbnb.com/rooms/12937.

## `listingIds` (type: `array`):

Numeric Airbnb listing IDs — an alternative to Start URLs. Combine as many as you like.

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

Maximum number of reviews to return per listing. 0 = all reviews.

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

Review order. MOST\_RECENT is Airbnb's native order and the fastest option; the other three are computed after fetching (all reviews are read from Airbnb first so they can be ranked correctly).

## `filterByTopic` (type: `string`):

Keep only reviews whose text relates to a topic (matched against a keyword set, since Airbnb doesn't expose its own per-review topic tags publicly).

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

Keep only reviews whose text contains this word or phrase (case-insensitive).

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

Language for localized dates and labels (en-US, de-DE, fr-FR, ja-JP, etc.).

## `enableAIAnalysis` (type: `boolean`):

Add a sentiment label + score, detected topics, and an English translation to every non-English review. Increases run time — each review needs extra processing, and non-English reviews need an extra translation request.

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

Proxy for the Airbnb requests. Residential proxies are strongly recommended and used by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/rooms/12937"
    }
  ],
  "listingIds": [],
  "maxReviewsPerListing": 20,
  "sortBy": "MOST_RECENT",
  "filterByTopic": "",
  "searchQuery": "",
  "locale": "en-US",
  "enableAIAnalysis": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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": [
        {
            "url": "https://www.airbnb.com/rooms/12937"
        }
    ],
    "maxReviewsPerListing": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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": [{ "url": "https://www.airbnb.com/rooms/12937" }],
    "maxReviewsPerListing": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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": [
    {
      "url": "https://www.airbnb.com/rooms/12937"
    }
  ],
  "maxReviewsPerListing": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/airbnb-reviews-scraper --silent --output-dataset

```

## MCP server setup

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