# Airbnb Reviews Scraper by City or Listing, Translated (`wellbuilt_zythem/airbnb-reviews`) Actor

Airbnb reviews for any listing URL, or for the top listings of any city: rating, date, text with English translation, host reply, stay length, reviewer first name and home town, plus Airbnb's topic summaries per listing. Filter by stars, date or Airbnb's review search. Feed mode: only new reviews.

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

## Pricing

from $1.80 / 1,000 reviews

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Airbnb Reviews Scraper by City or Listing, Translated

Guest reviews from Airbnb, for the listings you name **or for the top listings of any city, with no URLs needed**. Every review comes with its rating, date, text, **an English translation when it was written in another language**, the host's reply, how long the guest stayed, and the guest's first name and home town as Airbnb shows them. Each listing also gets a summary row with its total review count and **the topics Airbnb itself summarizes from the reviews** (location, cleanliness, check-in, value...).

Filter by stars, by date or with Airbnb's own review search ("noise", "parking"), sort the complaints first, and switch on **only new reviews since the last run** to get a feed.

More Airbnb data from the same publisher: [Airbnb Multi-Listing Hosts by City](https://apify.com/wellbuilt_zythem/airbnb-host-portfolio), [Airbnb New Listings & Price Drops by City](https://apify.com/wellbuilt_zythem/airbnb-new-listings) and [Airbnb License Check & US Short-Term Rental Licenses](https://apify.com/wellbuilt_zythem/airbnb-license-check).

### What you get

One row per review (measured on 2026-10-15 over 206 reviews of four listings in Austin and Lisbon):

| Field | Example | Filled |
|---|---|---|
| `date` | `2026-10-13T14:59:40Z` | 100 % |
| `rating` | `5` (1-5) | 100 % |
| `text` | `Good location, clean, comfortable beds...` | 100 % |
| `language` | `pt` | 100 % |
| `translatedText` | `All perfect!` (from "Tudo perfeito!") | every review not in the translation language (67 of 68) |
| `hostReply` | `Hi, Felipe! We are very happy...` (`null` when none) | 52 % |
| `hostReplyTranslated` | the reply in your language, when it was translated | 7 % |
| `stay` | `Stayed a few nights`, `Stayed with kids` | 98 % |
| `reviewerName` | `Kasey` (first name, as Airbnb shows it) | 100 % |
| `reviewerLocation` | `Smyrna, Georgia` | 46 % |
| `reviewerTenure` | `10 years on Airbnb` (shown instead of a home town) | 54 % |
| `listingId`, `listingUrl` | `48933584` | 100 % |
| `listingName`, `searchLocation` | `Casa Teva Lisboa Hotel`, `Lisbon, Portugal` | listings found by city |
| `reviewId`, `scrapedAt` | | 100 % |

One summary row per listing (`recordType: "listing"`): `reviewsCount`, `rating` (city mode), and `topics`, a list of `{ topic, mentions, summary }` such as `{ "topic": "Cleanliness", "mentions": 201, "summary": "Most guests find the apartment clean, with some saying it's spotless." }`. The summary text is Airbnb's own; some topics come with a count only.

The dataset has two views in the Console: **Reviews** and **Listing summaries**.

#### What Airbnb does not publish, so this Actor does not promise

- **The guest's full name, photo, profile or contact.** First name and home town only, as shown next to the review. This Actor does not deliver profile links or photos.
- **A home town for every guest.** Airbnb shows "N years on Airbnb" instead for about half of them; that goes to `reviewerTenure`, never to `reviewerLocation`.
- **The date of the host's reply.** Airbnb only shows it as "Today", "2 weeks ago".
- **Listing names for listings given by URL.** The reviews do not carry the listing name; listings found by city do.

### Input

| Field | What it does |
|---|---|
| **Listings** | Airbnb listing URLs or ids. |
| **Cities** | Takes the first listings with reviews from Airbnb's search for each city (**Listings per city**, default 20). |
| **Max reviews per listing** | Default 100. Airbnb serves 50 per page. |
| **Sort** | `newest`, `relevant`, `lowest_rating`, `highest_rating`. |
| **Reviews since** | Date; with `newest` the run stops reading at it. |
| **Min / Max stars** | `maxRating: 2` with `lowest_rating` gives the complaints first. |
| **Search in reviews** | Airbnb's own search box: matches related words too. |
| **Translation language** | `en` by default; any language Airbnb translates into. |
| **Include a summary row per listing** | On by default. |
| **Only new reviews since the last run** | Feed mode, with a memory per listing. |

```json
{
  "locations": ["Austin, TX", "Nashville, TN"],
  "listingsPerCity": 20,
  "maxReviewsPerListing": 50,
  "sort": "lowest_rating",
  "maxRating": 2
}
```

### Speed and limits

- About 1 to 3 seconds per page of 50 reviews, three listings at a time.
- Before reading, the run reads Airbnb's public web client settings from one listing page, as any browser does: no login, no cookies. If Airbnb changes its reviews query, the run reads the new one from Airbnb's website code and carries on.
- Up to 3,000 reviews are read per listing when filters discard most of them.
- The run stops 45 seconds before its timeout and delivers what it read, with a warning.

### Pricing

Per review delivered (`review` event) and per listing summary row (`listing_summary` event), plus the platform's start fee. Reviews filtered out, and reviews already delivered in feed mode, are not charged.

# Actor input Schema

## `listingUrls` (type: `array`):

Airbnb listing URLs (https://www.airbnb.com/rooms/48933584) or listing ids, one per line.

## `locations` (type: `array`):

Places as you would type them in Airbnb's search box: "Austin, TX", "Lisbon, Portugal". The run takes the first listings with reviews from Airbnb's search for each city. No URLs needed.

## `listingsPerCity` (type: `integer`):

How many listings with reviews to take from each city's search (about 18 per search page).

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

Reviews to deliver per listing. Airbnb serves 50 per page.

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

Newest first (needed for "Reviews since" and feed mode to stop early), most relevant (Airbnb's default), lowest rating first (complaints), or highest rating first.

## `sinceDate` (type: `string`):

Keep only reviews written on or after this date (2026-01-31).

## `minRating` (type: `integer`):

Keep only reviews with at least this many stars (1-5).

## `maxRating` (type: `integer`):

Keep only reviews with at most this many stars. 2 with "Lowest rating first" gives the complaints fast.

## `searchText` (type: `string`):

Airbnb's own review search, the same box as on the listing page: "noise", "parking", "clean". Airbnb matches related words too (noise also finds noisy).

## `language` (type: `string`):

Two-letter language Airbnb translates reviews into: en (default), es, fr, de, pt... Reviews already in that language are not translated.

## `includeListingSummary` (type: `boolean`):

One extra row per listing with its total review count and the topics Airbnb summarizes from the reviews (location, cleanliness, check-in...). Charged as the "listing_summary" event. In feed mode, only for listings with new reviews.

## `onlyNewReviews` (type: `boolean`):

Remember delivered reviews per listing and deliver only newer ones. Schedule the Actor to get a feed of new reviews.

## `stateStoreName` (type: `string`):

Key-value store that remembers delivered reviews. One name per feed; the same name every run.

## `resetState` (type: `boolean`):

Start the feed memory from scratch in this run.

## `maxResults` (type: `integer`):

Hard cap for the whole run, across all listings. Empty for no cap.

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

Airbnb refuses some data-center addresses; Apify proxy is on by default.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/48933584"
  ],
  "locations": [
    "Austin, TX"
  ],
  "listingsPerCity": 3,
  "maxReviewsPerListing": 50,
  "sort": "newest",
  "language": "en",
  "includeListingSummary": true,
  "onlyNewReviews": false,
  "stateStoreName": "airbnb-reviews-seen",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "listingUrls": [
        "https://www.airbnb.com/rooms/48933584"
    ],
    "locations": [
        "Austin, TX"
    ],
    "listingsPerCity": 3,
    "maxReviewsPerListing": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wellbuilt_zythem/airbnb-reviews").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 = {
    "listingUrls": ["https://www.airbnb.com/rooms/48933584"],
    "locations": ["Austin, TX"],
    "listingsPerCity": 3,
    "maxReviewsPerListing": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("wellbuilt_zythem/airbnb-reviews").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 '{
  "listingUrls": [
    "https://www.airbnb.com/rooms/48933584"
  ],
  "locations": [
    "Austin, TX"
  ],
  "listingsPerCity": 3,
  "maxReviewsPerListing": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call wellbuilt_zythem/airbnb-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wellbuilt_zythem/airbnb-reviews"
        }
    }
}
```

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/dkjCXsQZOs0RsRULu/builds/VPv0DpetsbWI29ePD/openapi.json
