# 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:** [Xtractoo](https://apify.com/xtracto) (community)
- **Categories:** Real estate, Lead generation, Travel
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, NaN 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Reviews Scraper",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "DEGxfTshKfVL57n5K"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtracto~airbnb-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtracto-airbnb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/xtracto~airbnb-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-xtracto-airbnb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/xtracto~airbnb-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-xtracto-airbnb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "listing_urls": {
                        "title": "Listing URLs",
                        "type": "array",
                        "description": "Full Airbnb listing URLs, e.g. https://www.airbnb.com/rooms/12345678. The actor extracts the numeric room ID from each URL.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "listing_ids": {
                        "title": "Listing IDs",
                        "type": "array",
                        "description": "Airbnb numeric room IDs (alternative to listing_urls). e.g. ['983207483398233150']",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_reviews_per_listing": {
                        "title": "Max reviews per listing",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on how many reviews to pull for each listing.",
                        "default": 100
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "MOST_RECENT",
                            "BEST_QUALITY",
                            "RATING_DESC",
                            "RATING_ASC"
                        ],
                        "type": "string",
                        "description": "MOST_RECENT = newest first, BEST_QUALITY = Airbnb relevance, RATING_DESC = highest rated first, RATING_ASC = lowest rated first.",
                        "default": "MOST_RECENT"
                    },
                    "locale": {
                        "title": "Locale",
                        "type": "string",
                        "description": "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.",
                        "default": "en"
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO 4217 currency code. Sent on every reviews call; affects only the currency of any embedded pricing strings (review text is unaffected).",
                        "default": "USD"
                    },
                    "max_concurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 4,
                        "type": "integer",
                        "description": "Parallel in-flight requests per actor run (1-4). Reviews pages are heavy; keep this low.",
                        "default": 1
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Residential is recommended for the best success rate against DataDome.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
