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

Pull every guest review for one or more Airbnb listings - full text, star rating, author first name & avatar, trip date, host response. Built for reputation analytics, sentiment scoring, and AI/RAG corpora.

- **URL**: https://apify.com/xtracto/airbnb-reviews-scraper.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Real estate, Lead generation, Travel
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

Pull every guest review for an Airbnb listing — full review text, star rating, author first name and avatar, trip date, host response — into clean structured JSON.

Whether you are a vacation-rental host benchmarking competitor properties, a sentiment-analysis team building a reputation dashboard, a content site publishing "what guests are saying," or an AI team assembling a hospitality RAG corpus, this actor gives you the reviews you need without managing scrapers, browsers, or CAPTCHAs.

***

### What you can do with it

- **Reputation analytics** — monitor your listing's review velocity, rating distribution, and sentiment trends over time.
- **Competitive benchmarking** — see exactly what guests praise and complain about at neighbouring properties.
- **Host-response audits** — measure how often (and how quickly) hosts respond, and what they say.
- **AI / RAG corpora** — feed thousands of real travel reviews into a hospitality chatbot, recommendation model, or sentiment classifier.
- **Travel content sites** — surface "top quotes" pulled from real guests on your own pages.
- **Fraud signals** — flag listings with suspicious review patterns (velocity spikes, duplicate text, geographic clustering).

***

### Why use this actor

- **No Airbnb account required** — runs on public data anonymous visitors can read.
- **No CAPTCHAs, no browsers** — point it at one or more listings and it returns the reviews.
- **Up to thousands of reviews per listing** — pagination is automatic.
- **Original language preserved** — both the original review text and Airbnb's localized translation when present.
- **Stable JSON schema** — fixed fields ready to feed straight into your warehouse, spreadsheet, or notebook.

***

### How it works

1. You give the actor a list of Airbnb listing URLs (or numeric room IDs) and how many reviews to pull per listing.
2. For each listing the actor walks the public reviews endpoint Airbnb's own site uses, page by page, in your chosen sort order.
3. Each review is normalized to one row in the dataset, ready for download as JSON, CSV, Excel, or XML.

Pagination, retries, and proxy rotation are handled automatically — you only need to provide listings and a max-review cap.

***

### Input

```json
{
  "listing_urls": [
    "https://www.airbnb.com/rooms/983207483398233150"
  ],
  "max_reviews_per_listing": 100,
  "sort": "MOST_RECENT",
  "locale": "en",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

| Field | Type | Required | Description |
|---|---|---|---|
| `listing_urls` | string\[] | one of urls/ids | Full Airbnb listing URLs (e.g. `https://www.airbnb.com/rooms/12345678`) |
| `listing_ids` | string\[] | one of urls/ids | Numeric Airbnb room IDs |
| `max_reviews_per_listing` | integer | no | Hard cap per listing (default 100, max 5000) |
| `sort` | string | no | `MOST_RECENT` (default), `BEST_QUALITY`, `RATING_DESC`, `RATING_ASC` |
| `locale` | string | no | Two-letter language tag (default `en`) — Airbnb may auto-translate; the original language is preserved |
| `max_concurrency` | integer | no | Parallel listings (1–4, default 1) |
| `proxy` | object | no | Apify proxy configuration; residential recommended |

***

### Sample output

One record per review. Real shape of a single record:

```json
{
  "id": "9876543210",
  "listing_id": "983207483398233150",
  "url": "https://www.airbnb.com/rooms/983207483398233150",
  "rating": 5,
  "language": "en",
  "comments": "Loved every minute of our stay. The hot tub at sunset is unforgettable. Anna was an excellent host — quick to respond, full of local recommendations.",
  "localized_review": null,
  "localized_response": null,
  "created_at": "2025-09-18T03:14:12Z",
  "localized_date": "September 2025",
  "localized_short_date": "Sep 2025",
  "trip_duration": "Stayed about a week",
  "highlighted_review_sentence": [
    "Anna was an excellent host"
  ],
  "reviewer_id": "147015926",
  "reviewer_name": "Marta",
  "reviewer_location": "Madrid, Spain",
  "reviewer_picture_url": "https://a0.muscache.com/im/pictures/user/Hosting-User-147015926/original/abcdef12-3456-7890.jpeg",
  "response": "Thank you Marta! We are so glad you enjoyed the sunsets — see you again soon.",
  "response_date": "2025-09-19T10:02:44Z"
}
```

***

### Output schema

| Field | Type | Description |
|---|---|---|
| `id` | string | Airbnb review ID |
| `listing_id` | string | Numeric room ID this review is for |
| `url` | string | Canonical listing URL |
| `rating` | integer | Guest star rating, 1–5 |
| `language` | string | ISO language code of the original review (`en`, `de`, `id`, ...) |
| `comments` | string | Full review text in the original language |
| `localized_review` | string | Airbnb-localized version when the original was in another language |
| `created_at` | string | ISO 8601 timestamp |
| `localized_date` | string | Human-friendly "September 2025" |
| `localized_short_date` | string | Compact "Sep 2025" |
| `trip_duration` | string | "Stayed a few nights" / "Stayed about a week" |
| `highlighted_review_sentence` | string\[] | Sentences Airbnb highlights in the UI |
| `reviewer_id` | string | Airbnb's numeric user ID |
| `reviewer_name` | string | Guest first name (Airbnb does not expose last names) |
| `reviewer_location` | string | Guest's hometown |
| `reviewer_picture_url` | string | Avatar URL |
| `response` | string | Host's reply text |
| `response_date` | string | ISO 8601 timestamp of the host's reply |

***

### Tips

- Use `MOST_RECENT` for fresh signal; switch to `RATING_ASC` to surface complaints first.
- Combine with the `airbnb-scraper` actor: scrape listings first, then feed the resulting `id` values into this actor for full reviews.
- For high-volume runs (many listings × thousands of reviews) split across multiple actor runs to keep each within memory limits and to spread proxy load.

# Actor input Schema

## `listing_urls` (type: `array`):

Full Airbnb listing URLs, e.g. https://www.airbnb.com/rooms/12345678. The actor extracts the numeric room ID from each URL.

## `listing_ids` (type: `array`):

Airbnb numeric room IDs (alternative to listing\_urls). e.g. \['983207483398233150']

## `max_reviews_per_listing` (type: `integer`):

Hard cap on how many reviews to pull for each listing.

## `sort` (type: `string`):

MOST\_RECENT = newest first, BEST\_QUALITY = Airbnb relevance, RATING\_DESC = highest rated first, RATING\_ASC = lowest rated first.

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

Language tag, e.g. en, id, de, fr. Airbnb may auto-translate reviews into this language; the original language is always preserved in the language field.

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

ISO 4217 currency code. Sent on every reviews call; affects only the currency of any embedded pricing strings (review text is unaffected).

## `max_concurrency` (type: `integer`):

Parallel in-flight requests per actor run (1-4). Reviews pages are heavy; keep this low.

## `proxy` (type: `object`):

Apify proxy configuration. Residential is recommended for the best success rate against DataDome.

## Actor input object example

```json
{
  "listing_urls": [
    "https://www.airbnb.com/rooms/983207483398233150"
  ],
  "listing_ids": [],
  "max_reviews_per_listing": 50,
  "sort": "MOST_RECENT",
  "locale": "en",
  "currency": "USD",
  "max_concurrency": 1,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "listing_urls": [
        "https://www.airbnb.com/rooms/983207483398233150"
    ],
    "listing_ids": [],
    "max_reviews_per_listing": 50,
    "sort": "MOST_RECENT",
    "locale": "en",
    "currency": "USD",
    "max_concurrency": 1,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/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 = {
    "listing_urls": ["https://www.airbnb.com/rooms/983207483398233150"],
    "listing_ids": [],
    "max_reviews_per_listing": 50,
    "sort": "MOST_RECENT",
    "locale": "en",
    "currency": "USD",
    "max_concurrency": 1,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "listing_urls": [
    "https://www.airbnb.com/rooms/983207483398233150"
  ],
  "listing_ids": [],
  "max_reviews_per_listing": 50,
  "sort": "MOST_RECENT",
  "locale": "en",
  "currency": "USD",
  "max_concurrency": 1,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call xtracto/airbnb-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=xtracto/airbnb-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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