# Airbnb Market Reviews Scraper (`cirkit/airbnb-market-reviews-scraper`) Actor

Paste one Airbnb search URL and get every review from every listing in that market. Discovers listings, then downloads all review pages in parallel — thousands of reviews per minute.

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

## Pricing

$1.90 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

## Airbnb Market Reviews Scraper

**Scrape every Airbnb review in a whole market** from a single search URL. This **Airbnb market reviews scraper** discovers all the listings in the market first, then downloads every review page in parallel — thousands of reviews per minute — so you get a market-wide review corpus in one run instead of orchestrating hundreds of per-listing jobs.

No Airbnb API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Airbnb Market Reviews Scraper?

Airbnb Market Reviews Scraper is an [Apify Actor](https://apify.com/actors) that extracts every review from every listing in a market from [Airbnb](https://www.airbnb.com) and returns them as clean, structured records. Every review row carries its parent listing's identity, rating, and coordinates, so the output is ready to group by listing, by neighborhood, or by price band without a join step.

### What data can this Airbnb market reviews scraper extract?

Every run writes one row per review. The full schema carries **29 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `searchQuery` | string | searchQuery |
| `searchUrl` | string | searchUrl |
| `roomId` | string | roomId |
| `listingUrl` | string | listingUrl |
| `listingName` | string | listingName |
| `listingType` | string | listingType |
| `listingRating` | number | listingRating |
| `listingReviewCount` | integer | listingReviewCount |
| `latitude` | number | latitude |
| `longitude` | number | longitude |
| `id` | string | id |
| `rating` | integer | rating |
| `text` | string | text |
| `localizedText` | string | localizedText |
| `language` | string | language |
| `createdAt` | string | createdAt |
| `localizedDate` | string | localizedDate |
| `response` | string | response |
| `reviewHighlight` | string | reviewHighlight |
| `highlightType` | string | highlightType |
| `photoUrls` | array | photoUrls |
| `reviewer` | object | reviewer |

See the **Output** tab in Apify Console for all 29 fields.

### How to scrape Airbnb reviews across a whole market

1. Open [Airbnb Market Reviews Scraper](https://apify.com/cirkit/airbnb-market-reviews-scraper) and click **Try for free**.
2. Paste one Airbnb search URL into `startUrls`, or give a destination in `locationQueries`.
3. Bound the crawl with `maxListings` and `maxReviews`, plus `maxReviewsPerListing` for even coverage.
4. Narrow the market with the same filters Airbnb search uses — `priceMin`, `minBedrooms`, dates, guests.
5. Use `dateFrom` and `dateTo` to restrict to a review window.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Airbnb Market Reviews Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `startUrls` | array | Paste Airbnb search URLs, e.g. https://www.airbnb.com/s/Asheville--North-Carolina--United-States/homes. Any filters... | `see schema` |
| `locationQueries` | array | Simpler alternative to URLs — list destinations like "Austin, Texas" or "Lisbon, Portugal". Each becomes its own... |  |
| `maxReviews` | integer | Hard cap on reviews across the whole run — your main cost control. A mid-size market holds 20,000–40,000 reviews, so... | `1000` |
| `maxListings` | integer | How many listings from the search to pull reviews from. Airbnb pages through at most ~270 listings per search; to... | `100` |
| `maxReviewsPerListing` | integer | Optional per-listing cap. Leave empty for every review. Useful for an even sample across a market instead of a few... |  |
| `reviewsSort` | string | Order Airbnb returns reviews in. Keep Most recent when using the date filter. | `"MOST_RECENT"` |
| `dateFrom` | string | Only keep reviews on or after this date (YYYY-MM-DD). Note: filtering makes the run slower and less predictable,... |  |
| `dateTo` | string | Only keep reviews on or before this date (YYYY-MM-DD). |  |
| `checkIn` | string | YYYY-MM-DD, today or later. Narrows the market to listings available for these dates. Past or contradictory date... |  |
| `checkOut` | string | YYYY-MM-DD, after check-in. |  |
| `adults` | integer | Guest count the listings must accommodate. |  |
| `children` | integer | Children (ages 2-12). |  |
| `infants` | integer | Infants (under 2). |  |
| `pets` | integer | Pets travelling along. |  |
| `priceMin` | integer | Lower bound in the selected currency. Handy for splitting a market that exceeds Airbnb's ~270-listing paging cap. |  |
| `priceMax` | integer | Upper bound in the selected currency. |  |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "startUrls": [
    { "url": "https://www.airbnb.com/s/Asheville--North-Carolina--United-States/homes" }
  ],
  "maxListings": 100,
  "maxReviews": 20000,
  "dateFrom": "2024-01-01"
}
```

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

This Actor runs on **pay per result** pricing: **$0.0019 per review** ($1.9 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $1.90 |
| 10,000 | $19.00 |
| 100,000 | $190.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Airbnb Market Reviews Scraper at no cost.

### What can you build with Airbnb data?

#### Find what guests in a market complain about most

A market-wide review corpus surfaces the recurring complaints — parking, noise, check-in friction — that a single-listing pull can never reveal.

#### Build a demand proxy for a whole market

Review counts and timestamps aggregated across every listing give the closest public approximation of booking volume and its seasonality.

#### Research amenity gaps before you buy or renovate

Cluster positive mentions across the market to see which amenities guests actually reward in that specific area.

#### Train or evaluate an NLP model on real guest writing

Thousands of reviews with ratings, languages, and listing context attached make a strong labelled dataset.

#### Benchmark your listing's sentiment against local supply

Score your own reviews against the market distribution rather than against an absolute five-star ideal.

### Airbnb scraping tips and limits

- This Actor can produce very large datasets quickly. Always set `maxReviews` on a first run so you learn the market's size before committing budget.
- `maxReviewsPerListing` keeps a handful of heavily-reviewed listings from dominating the corpus — important if you plan to compute market averages.
- For a single listing, [Airbnb Reviews Scraper](https://apify.com/cirkit/airbnb-reviews-scraper) is cheaper and more direct. Use this one when you want the whole market.
- Use a search URL you have already filtered in the Airbnb UI — every filter in the URL is respected during discovery.

### Integrations and automation

Run Airbnb Market Reviews Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Airbnb dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Airbnb Reviews Scraper](https://apify.com/cirkit/airbnb-reviews-scraper) | Single-listing reviews, cheaper per review. |
| [Airbnb Market Occupancy Scraper](https://apify.com/cirkit/airbnb-market-occupancy-scraper) | Supply-side occupancy for the same market. |
| [Airbnb Search Scraper](https://apify.com/cirkit/airbnb-search-scraper) | The listing census on its own. |
| [Airbnb Listing Details Scraper](https://apify.com/cirkit/airbnb-details-scraper) | Full property detail per listing. |

### Frequently asked questions

#### How does it find the listings?

It runs the Airbnb search you supply, paginates the results to collect listing IDs, then fetches reviews for each discovered listing in parallel. `listingsFound` reports how many it located.

#### How many reviews can it pull per minute?

Review fetching is heavily parallelised, so throughput is typically in the thousands per minute and is bounded mostly by your `maxConcurrency` setting and proxy pool rather than by the Actor itself.

#### Do I need a Airbnb API key?

No. Airbnb Market Reviews Scraper reads publicly available Airbnb pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Airbnb data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Airbnb Market Reviews Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Airbnb?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public review content Airbnb displays publicly, which includes reviewer first names and photos — treat those as personal data. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Airbnb page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

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

Paste Airbnb search URLs, e.g. https://www.airbnb.com/s/Asheville--North-Carolina--United-States/homes. Any filters already in the URL (dates, price, bedrooms, amenities) are respected. Single-listing /rooms/ URLs are NOT accepted here — use the Airbnb Reviews Scraper for those.

## `locationQueries` (type: `array`):

Simpler alternative to URLs — list destinations like "Austin, Texas" or "Lisbon, Portugal". Each becomes its own market search, combined with the filters below.

## `maxReviews` (type: `integer`):

Hard cap on reviews across the whole run — your main cost control. A mid-size market holds 20,000–40,000 reviews, so raise this deliberately.

## `maxListings` (type: `integer`):

How many listings from the search to pull reviews from. Airbnb pages through at most ~270 listings per search; to cover a bigger market, split it by price band, dates, or property type across several search URLs.

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

Optional per-listing cap. Leave empty for every review. Useful for an even sample across a market instead of a few heavily-reviewed listings dominating.

## `reviewsSort` (type: `string`):

Order Airbnb returns reviews in. Keep Most recent when using the date filter.

## `dateFrom` (type: `string`):

Only keep reviews on or after this date (YYYY-MM-DD). Note: filtering makes the run slower and less predictable, because pages are walked in waves instead of downloaded all at once.

## `dateTo` (type: `string`):

Only keep reviews on or before this date (YYYY-MM-DD).

## `checkIn` (type: `string`):

YYYY-MM-DD, today or later. Narrows the market to listings available for these dates. Past or contradictory date pairs are ignored and the search runs dateless.

## `checkOut` (type: `string`):

YYYY-MM-DD, after check-in.

## `adults` (type: `integer`):

Guest count the listings must accommodate.

## `children` (type: `integer`):

Children (ages 2-12).

## `infants` (type: `integer`):

Infants (under 2).

## `pets` (type: `integer`):

Pets travelling along.

## `priceMin` (type: `integer`):

Lower bound in the selected currency. Handy for splitting a market that exceeds Airbnb's ~270-listing paging cap.

## `priceMax` (type: `integer`):

Upper bound in the selected currency.

## `minBedrooms` (type: `integer`):

Only include listings with at least this many bedrooms.

## `minBeds` (type: `integer`):

Only include listings with at least this many beds.

## `minBathrooms` (type: `integer`):

Only include listings with at least this many bathrooms.

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

Language Airbnb localizes review dates and translations into.

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

ISO 4217 code used for the market search filters.

## `maxConcurrency` (type: `integer`):

Parallel requests. This is the speed dial: every review page of every listing is queued at once, so higher means faster. Airbnb rate-limits per IP, so lower it (or switch to residential proxies) if you see repeated retries.

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

Apify Proxy is enabled by default and is enough for most markets. For very large runs (50k+ reviews), switch to residential for a wider IP pool.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/s/Asheville--North-Carolina--United-States/homes"
    }
  ],
  "locationQueries": [],
  "maxReviews": 1000,
  "maxListings": 100,
  "reviewsSort": "MOST_RECENT",
  "locale": "en-US",
  "currency": "USD",
  "maxConcurrency": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

All reviews from the latest run.

## `consoleRun` (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/s/Asheville--North-Carolina--United-States/homes"
        }
    ],
    "maxReviews": 1000,
    "maxListings": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/airbnb-market-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/s/Asheville--North-Carolina--United-States/homes" }],
    "maxReviews": 1000,
    "maxListings": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/s/Asheville--North-Carolina--United-States/homes"
    }
  ],
  "maxReviews": 1000,
  "maxListings": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/airbnb-market-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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