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

Extract public Airbnb reviews, reviewer details, ratings, dates, host responses, and listing context from room URLs for STR research.

- **URL**: https://apify.com/fetch\_cat/airbnb-reviews-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 review saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Extract public guest reviews from Airbnb listing URLs. Add one or more room URLs and get structured review text, dates, reviewer metadata, listing ratings, review counts, languages, and host responses when Airbnb makes them public.

### What does Airbnb Reviews Scraper do?

Airbnb Reviews Scraper turns public Airbnb room pages into clean review datasets. It is built for teams that need recurring guest feedback, reputation monitoring, competitor research, or market intelligence without copying reviews by hand.

The actor accepts Airbnb room URLs such as `https://www.airbnb.com/rooms/20669368` and saves one dataset item per review.

### Who is it for?

- 🏡 Property managers tracking guest sentiment across their own listings.
- 📊 Short-term rental analysts comparing competing stays in a destination.
- ⭐ Reputation teams monitoring recent public guest feedback.
- 🧭 Hospitality researchers building review datasets for market studies.
- 🤖 Automation teams feeding reviews into BI, CRM, or AI workflows.

### Why use this actor?

- Saves structured review rows instead of screenshots or copied text.
- Includes listing context with every review for easy exports.
- Supports multiple Airbnb URLs in one run.
- Lets you cap reviews per listing to control run size and cost.
- Works through Apify datasets, API, webhooks, integrations, and MCP.

### What data can it extract?

| Field | Description |
| --- | --- |
| `listingUrl` | Normalized Airbnb room URL |
| `listingId` | Airbnb listing ID |
| `listingTitle` | Public listing title when available |
| `overallRating` | Listing-level overall rating when available |
| `reviewCount` | Listing-level public review count |
| `reviewId` | Stable Airbnb review ID |
| `reviewerName` | Public reviewer first/display name |
| `reviewerProfileUrl` | Public Airbnb profile URL when exposed |
| `reviewerLocation` | Reviewer location when exposed |
| `reviewDate` | Review creation date |
| `rating` | Per-review rating when Airbnb exposes it |
| `language` | Review language code |
| `text` | Review text with HTML cleaned |
| `translatedText` | Translated/localized text when visible |
| `responseText` | Host response text when visible |
| `responseDate` | Host response date when visible |
| `scrapedAt` | Timestamp for the scrape |

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

This actor uses pay-per-event pricing. A run has a small start charge and then charges per review saved. Keep `maxReviewsPerListing` low for test runs, then increase it once your input list is ready.

Recommended first test:

- 1 Airbnb listing URL
- 10 reviews per listing
- Default proxy settings

### Quick start

1. Open the actor on Apify.
2. Paste one or more Airbnb room URLs into **Airbnb listing URLs**.
3. Set **Maximum reviews per listing**.
4. Run the actor.
5. Download results from the dataset as JSON, CSV, Excel, XML, or HTML.

### Input

```json
{
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/20669368" }
  ],
  "maxReviewsPerListing": 10,
  "sort": "default",
  "proxyConfiguration": { "useApifyProxy": true }
}
````

### Input fields

#### Airbnb listing URLs

Use public Airbnb room URLs. Search result pages, wishlists, and account-only pages are not supported in the first version.

#### Maximum reviews per listing

Controls how many reviews are saved for each listing URL. If a listing has fewer public reviews than requested, the actor saves the available reviews.

#### Review sort order

Use Airbnb default order or request recent reviews when the upstream endpoint honors that setting.

#### Proxy configuration

The default Apify Proxy configuration is suitable for most small public-review runs. If Airbnb blocks your traffic, try a different proxy group or country.

### Output example

```json
{
  "listingUrl": "https://www.airbnb.com/rooms/20669368",
  "listingId": "20669368",
  "listingTitle": "Little Country Houses - Finley's Fort + hot tub",
  "overallRating": 4.9,
  "reviewCount": 308,
  "reviewId": "1701461540622642748",
  "reviewerName": "Gabriella",
  "reviewerProfileUrl": "https://www.airbnb.com/users/show/755284424",
  "reviewerLocation": null,
  "reviewDate": "2026-06-05T13:40:21Z",
  "rating": null,
  "language": "en",
  "text": "Our stay here was Superb...",
  "translatedText": null,
  "responseText": null,
  "responseDate": null,
  "scrapedAt": "2026-06-26T00:00:00.000Z"
}
```

### Tips for best results

- Use direct `/rooms/` URLs.
- Start with 5-10 reviews per listing for testing.
- Remove duplicate URLs before large runs.
- Split very large URL lists into smaller batches.
- Review the dataset sample before connecting automation.

### Common workflows

#### Reputation monitoring

Run the actor weekly on your managed listings and send new rows to your dashboard or spreadsheet.

#### Market research

Collect reviews from competing listings in the same destination and compare guest language, sentiment, and frequency.

#### Guest experience analysis

Export text to your NLP or LLM pipeline to classify recurring topics such as cleanliness, check-in, location, host communication, and amenities.

### Integrations

Apify datasets connect to:

- Google Sheets
- Make
- Zapier
- Webhooks
- BigQuery exports
- S3-compatible storage
- Custom API clients

### API usage

#### Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/airbnb-reviews-scraper').call({
  startUrls: [{ url: 'https://www.airbnb.com/rooms/20669368' }],
  maxReviewsPerListing: 10,
});
console.log(run.defaultDatasetId);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/airbnb-reviews-scraper').call(run_input={
    'startUrls': [{'url': 'https://www.airbnb.com/rooms/20669368'}],
    'maxReviewsPerListing': 10,
})
print(run['defaultDatasetId'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~airbnb-reviews-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"startUrls":[{"url":"https://www.airbnb.com/rooms/20669368"}],"maxReviewsPerListing":10}'
```

### MCP usage

Use the Apify MCP server to run this actor from Claude Code, Claude Desktop, or other MCP clients.

MCP URL format:

```text
https://mcp.apify.com/?tools=fetch_cat/airbnb-reviews-scraper
```

Claude Code setup:

```bash
claude mcp add apify-airbnb-reviews "https://mcp.apify.com/?tools=fetch_cat/airbnb-reviews-scraper"
```

Claude Desktop JSON config:

```json
{
  "mcpServers": {
    "apify-airbnb-reviews": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/airbnb-reviews-scraper"
    }
  }
}
```

Example prompts:

- "Run Airbnb Reviews Scraper for this listing and summarize the latest guest complaints."
- "Get 25 public reviews from these three Airbnb URLs and export them as CSV."
- "Compare guest sentiment across these competitor listings."

### Data quality notes

Airbnb may not expose every field for every review. For example, per-review star ratings, reviewer location, translated text, or host response can be missing. Missing fields are returned as `null` rather than invented.

### Limitations

- Supports public Airbnb room/listing pages only.
- Does not access private account data.
- Does not bypass login-only, CAPTCHA, or blocked pages.
- Availability, prices, and booking calendars are outside this actor's scope.

### Legality

Use Airbnb Reviews Scraper responsibly and only for data you are allowed to process.

### Legal and responsible use

This actor is intended for public web data. Review Airbnb's terms, privacy requirements, and applicable laws before using scraped data. Do not use the output for spam, harassment, or discriminatory decisions.

### FAQ

#### Can it scrape private reviews?

No. It only extracts publicly visible review data from public Airbnb listing pages.

#### Why are some fields null?

Airbnb does not expose every review attribute on every listing. The actor keeps the row and leaves unavailable values as `null`.

#### Can I scrape many listings at once?

Yes. Add multiple room URLs and set a reasonable per-listing review cap. For large batches, use smaller chunks.

#### What if a listing was removed?

Removed, private, or blocked listings may return an HTTP error. Check the run log for the affected URL.

#### Does it support API and MCP automation?

Yes. You can call the actor through the Apify API, schedule it, connect webhooks, or run it via Apify MCP.

### Related actors

- Airbnb Listings Scraper: `https://apify.com/fetch_cat/airbnb-listings-scraper`

### Changelog

#### 0.1

Initial version for public Airbnb room review extraction.

### Support

If a run fails, include the run ID, input URLs, and expected result count when opening an issue. This helps reproduce the problem quickly.

# Actor input Schema

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

Public Airbnb room/listing URLs such as https://www.airbnb.com/rooms/20669368.

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

How many guest reviews to save for each Airbnb listing URL.

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

Use Airbnb's default order or request recent reviews when available.

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

Optional Apify Proxy settings. Datacenter proxy is usually enough for small public-review runs; use residential only if Airbnb blocks your traffic.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/rooms/20669368"
    }
  ],
  "maxReviewsPerListing": 10,
  "sort": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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/20669368"
        }
    ],
    "maxReviewsPerListing": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/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/20669368" }],
    "maxReviewsPerListing": 10,
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Reviews Scraper",
        "description": "Extract public Airbnb reviews, reviewer details, ratings, dates, host responses, and listing context from room URLs for STR research.",
        "version": "0.1",
        "x-build-id": "MVCcIdLEYI60Ewnkn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fetch_cat~airbnb-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fetch_cat-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/fetch_cat~airbnb-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fetch_cat-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/fetch_cat~airbnb-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fetch_cat-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Airbnb listing URLs",
                        "type": "array",
                        "description": "Public Airbnb room/listing URLs such as https://www.airbnb.com/rooms/20669368.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxReviewsPerListing": {
                        "title": "Maximum reviews per listing",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "How many guest reviews to save for each Airbnb listing URL.",
                        "default": 25
                    },
                    "sort": {
                        "title": "Review sort order",
                        "enum": [
                            "default",
                            "recent"
                        ],
                        "type": "string",
                        "description": "Use Airbnb's default order or request recent reviews when available.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy settings. Datacenter proxy is usually enough for small public-review runs; use residential only if Airbnb blocks your traffic.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
