# Airbnb Scraper: Listings, Reviews, Prices & Availability (`shadowextractor/airbnb-scraper`) Actor

Scrape Airbnb listings by city, search URL, or property URL. Extract prices, fees, ratings, amenities, host details, photos, complete review text and scores, availability calendars, and structured rental-market data.

- **URL**: https://apify.com/shadowextractor/airbnb-scraper.md
- **Developed by:** [Shadow Extractor](https://apify.com/shadowextractor) (community)
- **Categories:** Travel, Real estate, Automation
- **Stats:** 2 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 airbnb listings

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/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Listings, Reviews & Calendar Scraper

Build structured Airbnb datasets from location searches or direct listing URLs. Collect listing cards, live price signals, property details, host profiles, amenities, house rules, full guest review text, review intelligence, and 12-month availability metrics.

Use the Actor for short-term rental research, competitor tracking, pricing comparisons, listing audits, guest sentiment analysis, and repeatable market monitoring.

> New here? Choose **Quick test**, enter one location, and collect 10 listings. You can move to reviews, calendars, and monitoring after checking the sample output.

---

### ✨ What You Can Collect

| Data group | Examples |
|---|---|
| 🏠 Listing | ID, title, Airbnb URL, room type, property type, capacity, bedrooms, beds, bathrooms |
| 📍 Location | Display location, neighborhood, coordinates when available |
| 💸 Pricing | Display price, nightly price, total price, original total, selected currency, availability signal |
| ⭐ Reputation | Listing rating, public review count, rating categories, listing badges |
| 👤 Host | Name, Superhost and verification signals, rating, hosting experience, biography, cohosts, profile photo |
| 🧾 Property details | Amenities, unavailable amenities, house rules, safety notes, highlights, sleeping setup |
| 💬 Reviews | Full review text, reviewer, date, language, per-review rating, reviewer profile picture, host response |
| 📊 Review intelligence | Rating breakdown, health score, positive/negative share, common pros, common issues, recent low ratings |
| 📅 Calendar | Available and blocked days, availability percentage, occupancy estimate, 30/90/365-day windows |
| 🔔 Monitoring | New, changed, and removed listings with previous and current values |

Airbnb does not expose every field for every listing. Optional values are returned only when present in the live source data.

---

### 🚀 Start in Three Steps

1. Pick a **Research preset**.
2. Add a location or direct Airbnb listing URLs.
3. Set the listing limit and click **Start**.

#### Minimal Market Search

```json
{
  "researchPreset": "quick-test",
  "locationQueries": ["Prague"]
}
````

#### Detailed Market Sample

```json
{
  "researchPreset": "full-audit",
  "locationQueries": ["Barcelona"],
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-14",
  "adults": 2,
  "maxItemsPerQuery": 10,
  "currency": "EUR",
  "locale": "en"
}
```

#### Direct Listing Audit

```json
{
  "researchPreset": "full-audit",
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/123456789" }
  ],
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-14",
  "adults": 2,
  "currency": "USD"
}
```

***

### 🎛️ Research Presets

Presets configure the mode and related enrichment switches for you.

| Preset | Best for | Applied behavior |
|---|---|---|
| `quick-test` | First run | Fast search, at most 10 results per location, reviews/calendar/monitoring off |
| `market-scan` | Price and supply research | Fast location search, reviews and calendar off |
| `review-intelligence` | Guest feedback analysis | Full search or direct URLs, reviews on, calendar off |
| `full-audit` | Complete listing inspection | Full search or direct URLs, reviews and calendar on |
| `monitor` | Repeated market tracking | Fast search or direct URLs, monitoring on |
| `custom` | Exact manual control | Keeps the mode and enrichment settings you provide |

#### Important Preset Behavior

A preset owns its related settings. For example:

- `quick-test` always disables reviews, calendar, and monitoring;
- `market-scan` always disables reviews and calendar;
- `review-intelligence` always enables reviews and disables calendar;
- `full-audit` always enables both reviews and calendar;
- `monitor` always enables monitoring.

Choose `custom` when you want the form switches to be followed exactly.

For direct URL runs, every valid URL you provide is processed. The 10-item Quick test cap applies to location search results, so keep the direct URL list small when testing.

***

### 🧭 Run Modes

| Mode | Source | What it does |
|---|---|---|
| `auto` | Location or URLs | Uses `urls` when valid listing URLs exist; otherwise uses `search-fast` |
| `search-fast` | `locationQueries` | Collects paginated search cards, prices, ratings, photos, capacity, and basic property data |
| `search-full` | `locationQueries` | Finds listings, then opens each listing data source for richer property, host, amenity, review, and calendar fields |
| `urls` | `startUrls` | Scrapes specific Airbnb room URLs directly |

Reviews and calendar enrichment work in `search-full` and `urls`. A `search-fast` run remains a fast card-level scan even if those switches are included in custom JSON.

#### Data Flow

```text
Location query ──► search-fast ──► Listing cards ───────────────► Listings dataset
       │
       └─────────► search-full ──► Listing details ─┬───────────► Listings dataset
                                                   ├───────────► Hosts dataset
Direct room URL ─► urls ───────────────────────────┼───────────► Amenities dataset
                                                   ├───────────► House rules dataset
                                                   ├─ reviews ─► Reviews + summary datasets
                                                   └─ calendar ► Calendar metrics

Saved listings + stable monitor key ───────────────► Monitor changes dataset
```

***

### 🔎 Location Search

Add cities, neighborhoods, regions, or Airbnb search URLs to `locationQueries`.

```json
{
  "researchPreset": "market-scan",
  "mode": "search-fast",
  "locationQueries": [
    "Prague Old Town",
    "Vinohrady, Prague"
  ],
  "checkIn": "2026-08-15",
  "checkOut": "2026-08-20",
  "adults": 2,
  "maxItemsPerQuery": 50,
  "currency": "EUR",
  "locale": "en"
}
```

`maxItemsPerQuery` is applied separately to every location. Two locations with a limit of 50 can therefore produce up to 100 listing rows before duplicates or source availability are considered.

Airbnb search pagination naturally limits a single location to a maximum of 270 results.

***

### 🔗 Direct Listing URLs

Use `urls` mode when you know exactly which listings to inspect. Only public Airbnb room URLs containing `/rooms/` are accepted; empty, invalid, and duplicate entries are ignored.

```json
{
  "researchPreset": "custom",
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/123456789" },
    { "url": "https://www.airbnb.com/rooms/987654321" }
  ],
  "includeReviews": true,
  "maxReviewsPerListing": 20,
  "includeCalendar": true,
  "currency": "USD",
  "locale": "en"
}
```

Direct URLs are ideal for competitor audits because every output table preserves `listingId`, `listingName`, and `listingUrl`.

***

### 📅 Dates, Guests & Prices

Price and availability signals depend on the selected stay context.

| Field | Purpose |
|---|---|
| `checkIn` | Check-in date in `YYYY-MM-DD` format |
| `checkOut` | Check-out date later than check-in |
| `adults` | Adult guests, from 1 to 16 |
| `children` | Children aged 2–12 |
| `infants` | Infants under 2 |
| `pets` | Number of pets |
| `currency` | `USD` or `EUR` |

Use the same dates, guest counts, currency, and filters when comparing prices between runs.

```json
{
  "researchPreset": "market-scan",
  "locationQueries": ["Lisbon"],
  "checkIn": "2026-10-05",
  "checkOut": "2026-10-12",
  "adults": 2,
  "children": 1,
  "pets": 0,
  "maxItemsPerQuery": 100,
  "currency": "EUR"
}
```

Displayed marketplace prices can change with dates, guests, promotions, fees, availability, and live inventory.

***

### 🎚️ Search Filters

These filters are sent with location searches. They do not remove direct URL results after scraping.

| Field | Example | Meaning |
|---|---|---|
| `minPrice` | `80` | Minimum search price in the selected currency |
| `maxPrice` | `250` | Maximum search price |
| `roomType` | `Entire home/apt` | Entire place, private room, shared room, or hotel room |
| `minBedrooms` | `2` | Minimum bedrooms |
| `minBathrooms` | `1` | Minimum bathrooms |
| `minBeds` | `2` | Minimum beds |

```json
{
  "researchPreset": "custom",
  "mode": "search-fast",
  "locationQueries": ["Rome"],
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-06",
  "adults": 4,
  "minPrice": 100,
  "maxPrice": 300,
  "roomType": "Entire home/apt",
  "minBedrooms": 2,
  "minBathrooms": 1,
  "minBeds": 2,
  "maxItemsPerQuery": 50,
  "currency": "EUR"
}
```

***

### 💬 Full Reviews & Review Intelligence

Enable reviews through the `review-intelligence` or `full-audit` preset, or use `custom` with `includeReviews: true`.

The Actor saves:

- full guest review text when Airbnb returns it;
- reviewer name, ID, and profile picture;
- review date and language;
- numeric star rating and readable star display;
- host response when available;
- one flat row per review;
- one review-intelligence summary per listing.

`maxReviewsPerListing` accepts values from 1 to 100. Reviews are requested most recent first.

#### Collect 10 Reviews per Listing

```json
{
  "researchPreset": "review-intelligence",
  "locationQueries": ["Amsterdam"],
  "maxItemsPerQuery": 10,
  "maxReviewsPerListing": 10,
  "currency": "EUR",
  "locale": "en"
}
```

#### Collect One Review from a Known Listing

```json
{
  "researchPreset": "review-intelligence",
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/123456789" }
  ],
  "maxReviewsPerListing": 1
}
```

#### How Reviews Stay Linked

Every review row includes the listing identifiers:

```text
Listings.id  = Reviews.listingId
Listings.url = Reviews.listingUrl
```

If a run collects 50 listings and requests 50 reviews per listing, the Reviews dataset can contain up to 2,500 rows. Each row still links to the correct listing.

#### Review Summary Metrics

The summary dataset can include:

- fetched review count and average rating;
- 1–5 star distribution;
- positive, mixed, and negative review counts;
- positive and negative percentages;
- review health score from 0 to 100;
- common positive themes and complaint themes;
- newest review details;
- recent low-rated review snippets;
- detected review languages.

Theme extraction is a compact rule-based summary of the collected review sample, not an AI-generated judgment.

***

### 📅 Availability Calendar

Enable calendar data through `full-audit`, or use `custom` with `includeCalendar: true` in `search-full` or `urls` mode.

The Actor requests up to 12 months beginning with the check-in month, or the current month when no check-in date is provided.

Calendar output includes:

- start and end dates;
- months and days returned;
- available and blocked day counts;
- availability percentage;
- occupancy estimate percentage;
- available and blocked days for the next 30, 90, and 365 days;
- simple available-revenue estimates for those windows when a nightly price exists.

```json
{
  "researchPreset": "custom",
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/123456789" }
  ],
  "checkIn": "2026-10-01",
  "checkOut": "2026-10-07",
  "includeCalendar": true,
  "includeReviews": false
}
```

> Occupancy is an estimate based on publicly blocked calendar days. A blocked date can represent a booking, a host block, or another availability rule. Revenue estimates are not verified host earnings.

***

### 🔔 Monitor Listing Changes

Monitoring compares the current result set with the previous snapshot saved for the same monitor key.

Tracked changes include:

- new listings;
- removed listings;
- display price and total price;
- availability;
- rating and review count;
- listing name and URL.

#### Monitor a Market

```json
{
  "researchPreset": "monitor",
  "locationQueries": ["Prague Old Town"],
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-15",
  "adults": 2,
  "maxItemsPerQuery": 100,
  "monitorKey": "prague-old-town-september"
}
```

Run the same configuration again with the same `monitorKey`. The first run establishes a snapshot and marks discovered listings as `new`; later runs can produce `changed` and `removed` rows.

If `monitorKey` is omitted, the Actor creates one from the input. An explicit stable key is easier to manage for scheduled runs.

For meaningful comparisons, keep the locations, dates, guests, currency, mode, and result limit consistent.

***

### 📤 Output Tables

The Actor separates repeated entities into clean datasets so you do not have to expand large nested arrays manually.

| Output tab | Dataset shape | Available when |
|---|---|---|
| **Listings** | One row per listing | Every successful mode |
| **Pricing** | Price-focused listing view | Price data is available |
| **Hosts & ratings** | Rating and host overview from listing rows | Full listing data is available |
| **Hosts** | One row per listing host | Host details are available |
| **Amenities** | One row per amenity | Full listing data is available |
| **House rules** | One row per rule, safety note, highlight, or sleeping item | Full listing data is available |
| **Calendar metrics** | Flat 30/90/365-day metrics on listing rows | Calendar enrichment is enabled and available |
| **Reviews & calendar** | One row per guest review | Review enrichment is enabled and review text exists |
| **Review summary** | One intelligence row per listing | At least one usable review is collected |
| **Monitor changes** | One row per detected change | Monitoring is enabled |

All datasets can be exported from Apify as JSON, CSV, Excel, HTML, XML, or RSS.

***

### 🔑 Join Keys

Use `listingId` to connect secondary datasets to the main Listings dataset.

```text
Listings.id = Hosts.listingId
Listings.id = Amenities.listingId
Listings.id = House rules.listingId
Listings.id = Reviews.listingId
Listings.id = Review summary.listingId
Listings.id = Monitor changes.listingId
```

`listingName`, `listingUrl`, `displayLocation`, and `displayPrice` are repeated in many secondary rows to make CSV and Excel exports readable without a join.

***

### 🧾 Main Listing Fields

| Field | Meaning |
|---|---|
| `recordType` | `listing` |
| `id` | Airbnb listing ID |
| `name` | Listing title |
| `url` | Canonical Airbnb room URL |
| `displayLocation` | Human-readable location or coordinate fallback |
| `displayPrice` | Price label shown for the selected search context |
| `pricePerNight` | Numeric nightly price when available |
| `priceTotal` | Numeric stay total |
| `priceOriginalTotal` | Original total before a visible discount |
| `currency` | Requested currency |
| `available` | Public availability signal for the selected dates |
| `displayRating` | Listing rating and review count label |
| `ratingValue` | Numeric listing rating |
| `reviewsCount` | Public listing review count |
| `roomType` | Entire place, private room, shared room, or hotel room |
| `personCapacity` | Guest capacity |
| `bedrooms`, `beds`, `bathrooms` | Property layout |
| `hostName`, `isSuperhost` | Compact host fields |
| `amenitiesCount` | Number of parsed amenities |
| `imageUrl` | First listing photo |
| `scrapedAt` | UTC collection timestamp |

#### Example Listing Row

```json
{
  "recordType": "listing",
  "id": "123456789",
  "name": "Modern apartment near the historic center",
  "url": "https://www.airbnb.com/rooms/123456789",
  "displayLocation": "Prague 1, Czechia",
  "displayPrice": "€827",
  "pricePerNight": 180.65,
  "priceTotal": 827,
  "currency": "EUR",
  "available": true,
  "displayRating": "4.87 (115)",
  "ratingValue": 4.87,
  "reviewsCount": 115,
  "roomType": "Entire home/apt",
  "personCapacity": 4,
  "bedrooms": 2,
  "beds": 2,
  "bathrooms": 1,
  "hostName": "Daniel",
  "isSuperhost": true,
  "amenitiesCount": 46,
  "imageUrl": "https://a0.muscache.com/...",
  "scrapedAt": "2026-07-16T12:00:00Z"
}
```

***

### 💬 Example Review Row

```json
{
  "recordType": "review",
  "listingId": "123456789",
  "listingName": "Modern apartment near the historic center",
  "listingUrl": "https://www.airbnb.com/rooms/123456789",
  "reviewId": "review-id",
  "reviewerName": "Linda",
  "reviewRating": "★★★★★ 5/5",
  "rating": 5,
  "createdAt": "2026-06-29T07:58:26Z",
  "language": "en",
  "reviewsText": "Perfectly located apartment in a quiet street. The host was friendly and helpful.",
  "hostResponse": "Thank you for staying with us!",
  "scrapedAt": "2026-07-16T12:00:00Z"
}
```

***

### 📊 Example Review Summary

```json
{
  "recordType": "review_summary",
  "listingId": "123456789",
  "listingName": "Modern apartment near the historic center",
  "reviewSignal": "Excellent guest sentiment",
  "averageReviewRating": 4.8,
  "averageReviewRatingDisplay": "★★★★★ 4.8/5",
  "reviewHealthScore": 96,
  "ratingBreakdown": "5★ 44 | 4★ 4 | 3★ 2 | 2★ 0 | 1★ 0",
  "fetchedReviewsCount": 50,
  "positiveReviews": 48,
  "negativeReviews": 2,
  "positiveSharePercent": 96.0,
  "topPros": "Location; Host & communication; Cleanliness",
  "topIssues": "Heat / AC",
  "latestReviewDate": "2026-06-29T07:58:26Z",
  "listingUrl": "https://www.airbnb.com/rooms/123456789"
}
```

***

### 👤 Hosts, Amenities & Property Information

#### Host Rows

One host row can contain the host name, profile photo, Superhost status, verification status, rating, hosting experience, biography, and cohost count.

#### Amenity Rows

One row is created for each amenity, including its category, title, optional subtitle, availability flag, and icon identifier.

```json
{
  "recordType": "amenity",
  "listingId": "123456789",
  "listingName": "Modern apartment near the historic center",
  "category": "Bathroom",
  "amenityTitle": "Hair dryer",
  "available": true,
  "listingUrl": "https://www.airbnb.com/rooms/123456789"
}
```

#### House Rules Rows

The House rules dataset uses `infoType` to distinguish:

- `house_rule`;
- `safety`;
- `highlight`;
- `sleeping`.

```json
{
  "recordType": "property_info",
  "listingId": "123456789",
  "listingName": "Modern apartment near the historic center",
  "infoType": "house_rule",
  "title": "Checkout before 11:00 AM",
  "listingUrl": "https://www.airbnb.com/rooms/123456789"
}
```

***

### 🌐 Language & Currency

Supported currencies:

- `USD`;
- `EUR`.

Supported locale choices in the input form:

- English `en`;
- German `de`;
- French `fr`;
- Spanish `es`;
- Italian `it`;
- Portuguese `pt`;
- Dutch `nl`;
- Polish `pl`;
- Russian `ru`.

The requested locale controls localized listing text when Airbnb provides a translated value. User-generated content can remain in its original language.

***

### ⚙️ Volume, Speed & Cost Controls

| Setting | Effect |
|---|---|
| `maxItemsPerQuery` | Listings collected for each location, from 1 to 270 |
| `maxReviewsPerListing` | Reviews requested per detailed listing, from 1 to 100 |
| `includeReviews` | Adds review and summary requests and output rows |
| `includeCalendar` | Adds a 12-month calendar request per detailed listing |
| `maxConcurrency` | Maximum parallel request budget, from 1 to 50 |
| `maxRetries` | Retry attempts for temporary source failures, from 0 to 10 |

Recommended progression:

1. Run 5–10 listings with `quick-test`.
2. Use `market-scan` for larger price research.
3. Use `review-intelligence` for a smaller set of listings first.
4. Use `full-audit` only when you need every enrichment.
5. Increase limits after checking row counts in all output datasets.

***

### ✅ Data Expectations

- Search and listing data are live marketplace signals and can change between runs.
- A listing can disappear, become unavailable, or expose fewer fields without warning.
- Review rows are created only for reviews containing usable text.
- A Review summary is created only when at least one usable review row exists.
- Host, amenity, and property-information datasets can be empty in `search-fast` mode.
- Calendar metrics appear only when calendar enrichment succeeds.
- Missing values reflect unavailable public data; they are not replaced with invented placeholders.

***

### ❓ FAQ

#### Which option should a new user choose?

Use `quick-test` with one location. It limits search output to 10 listings and disables expensive enrichments.

#### Why did my manual review switch get ignored?

Your selected preset controls related switches. Choose `custom` to follow manual `includeReviews`, `includeCalendar`, and mode settings exactly.

#### Why are there no reviews in `search-fast`?

Fast search collects marketplace cards only. Use `review-intelligence`, `full-audit`, `search-full`, or `urls`.

#### Can I choose 1, 10, or 50 reviews?

Yes. Set `maxReviewsPerListing` to any value from 1 to 100.

#### Are reviews saved under the correct home?

Yes. Every review row includes `listingId` and `listingUrl`, which match the main listing row.

#### Why is the Reviews dataset smaller than requested?

A listing may have fewer public reviews, some reviews may lack usable text, or the source may return fewer rows for that request.

#### Are blocked calendar days confirmed bookings?

No. They are public availability signals. A host can block dates without a booking, so occupancy and revenue values are estimates.

#### Can I filter direct listing URLs by price or room type?

The structured filters are search filters. Direct URL mode audits the supplied listings instead of dropping them after collection.

#### What does the first monitoring run show?

It creates the baseline snapshot and records the current listings as `new`. Later runs can identify changes and removals.

#### What happens with empty API input?

The Actor exits cleanly with an explanatory status instead of producing a failed run. Add a location or direct listing URL to collect data.

#### Can I export to Excel?

Yes. Open any output dataset and download it as Excel, CSV, JSON, HTML, XML, or RSS.

***

### 💼 Common Use Cases

- short-term rental market sizing;
- city and neighborhood price comparisons;
- competitor listing audits;
- guest sentiment and complaint analysis;
- host and amenity benchmarking;
- availability-calendar research;
- recurring price and listing monitoring;
- CSV and Excel datasets for analysts;
- scheduled Apify workflows and integrations.

***

### 🏷️ Keywords

`airbnb scraper` · `airbnb listings` · `airbnb prices` · `airbnb reviews` · `airbnb calendar` · `short-term rental data` · `vacation rental research` · `airbnb market analysis` · `host intelligence` · `rental monitoring`

# Actor input Schema

## `researchPreset` (type: `string`):

Choose a ready-made setup. You can still adjust the fields below.

## `mode` (type: `string`):

Choose a quick location search, a detailed listing scrape, or direct Airbnb URLs.

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

Cities, neighborhoods, or Airbnb location search terms. Example: Prague, Barcelona, New York.

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

Paste direct listing URLs such as https://www.airbnb.com/rooms/123456789.

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

Add a future date when you need date-aware prices and availability.

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

Must be later than check-in.

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

Number of adult guests.

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

Children ages 2-12.

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

Infants under 2.

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

Number of pets.

## `maxItemsPerQuery` (type: `integer`):

Maximum listings to save per location or per URL batch. Use 10 for a quick test.

## `includeReviews` (type: `boolean`):

Save guest review text, star ratings, and Review summary analytics. Works in Full search and Direct listing URLs modes.

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

Maximum guest reviews to save per listing when reviews are enabled. Use 1 or 10 for quick tests, 50 for deeper analysis.

## `includeCalendar` (type: `boolean`):

Save a 12-month availability calendar when Airbnb returns it. Works in Full search and Direct listing URLs modes.

## `monitorChanges` (type: `boolean`):

Compare this run with the previous run for the same monitor key and save new, changed, and removed listings.

## `monitorKey` (type: `string`):

Optional stable name for this market or listing set, for example prague-old-town-august. Leave blank to auto-generate one from the input.

## `minPrice` (type: `integer`):

Minimum price filter in the selected currency.

## `maxPrice` (type: `integer`):

Maximum price filter in the selected currency.

## `roomType` (type: `string`):

Filter listings by stay type.

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

Keep listings with at least this many bedrooms.

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

Keep listings with at least this many bathrooms.

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

Keep listings with at least this many beds.

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

Currency used for price fields.

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

Language for listing text when Airbnb provides it.

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

How many requests can run in parallel. The default is a balanced choice for most runs.

## `maxRetries` (type: `integer`):

How many times to retry a temporary request failure.

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

Default connection settings work for most runs. Advanced users can customize them here.

## `rawOutput` (type: `boolean`):

Adds raw source data for debugging. Keep off for normal exports.

## `debugLog` (type: `boolean`):

Enable verbose logs for troubleshooting.

## Actor input object example

```json
{
  "researchPreset": "quick-test",
  "mode": "search-fast",
  "locationQueries": [
    "Prague"
  ],
  "startUrls": [],
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "maxItemsPerQuery": 10,
  "includeReviews": false,
  "maxReviewsPerListing": 50,
  "includeCalendar": false,
  "monitorChanges": false,
  "roomType": "",
  "currency": "USD",
  "locale": "en",
  "maxConcurrency": 10,
  "maxRetries": 5,
  "proxy": {
    "useApifyProxy": true
  },
  "rawOutput": false,
  "debugLog": false
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `pricing` (type: `string`):

No description

## `host_ratings` (type: `string`):

No description

## `hosts` (type: `string`):

No description

## `amenities` (type: `string`):

No description

## `property_info` (type: `string`):

No description

## `calendar_metrics` (type: `string`):

No description

## `review_rows` (type: `string`):

No description

## `review_summary` (type: `string`):

No description

## `monitor_changes` (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 = {
    "researchPreset": "quick-test",
    "mode": "search-fast",
    "locationQueries": [
        "Prague"
    ],
    "adults": 2,
    "maxItemsPerQuery": 10,
    "includeReviews": false,
    "maxReviewsPerListing": 50,
    "includeCalendar": false,
    "monitorChanges": false,
    "currency": "USD",
    "locale": "en",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("shadowextractor/airbnb-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 = {
    "researchPreset": "quick-test",
    "mode": "search-fast",
    "locationQueries": ["Prague"],
    "adults": 2,
    "maxItemsPerQuery": 10,
    "includeReviews": False,
    "maxReviewsPerListing": 50,
    "includeCalendar": False,
    "monitorChanges": False,
    "currency": "USD",
    "locale": "en",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("shadowextractor/airbnb-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 '{
  "researchPreset": "quick-test",
  "mode": "search-fast",
  "locationQueries": [
    "Prague"
  ],
  "adults": 2,
  "maxItemsPerQuery": 10,
  "includeReviews": false,
  "maxReviewsPerListing": 50,
  "includeCalendar": false,
  "monitorChanges": false,
  "currency": "USD",
  "locale": "en",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call shadowextractor/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Scraper: Listings, Reviews, Prices & Availability",
        "description": "Scrape Airbnb listings by city, search URL, or property URL. Extract prices, fees, ratings, amenities, host details, photos, complete review text and scores, availability calendars, and structured rental-market data.",
        "version": "0.1",
        "x-build-id": "q2jW2tcIJcRchtCzT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shadowextractor~airbnb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shadowextractor-airbnb-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/shadowextractor~airbnb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shadowextractor-airbnb-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/shadowextractor~airbnb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shadowextractor-airbnb-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": {
                    "researchPreset": {
                        "title": "Research preset",
                        "enum": [
                            "quick-test",
                            "market-scan",
                            "review-intelligence",
                            "full-audit",
                            "monitor",
                            "custom"
                        ],
                        "type": "string",
                        "description": "Choose a ready-made setup. You can still adjust the fields below.",
                        "default": "quick-test"
                    },
                    "mode": {
                        "title": "Run mode",
                        "enum": [
                            "auto",
                            "search-fast",
                            "search-full",
                            "urls"
                        ],
                        "type": "string",
                        "description": "Choose a quick location search, a detailed listing scrape, or direct Airbnb URLs.",
                        "default": "auto"
                    },
                    "locationQueries": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Cities, neighborhoods, or Airbnb location search terms. Example: Prague, Barcelona, New York.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "Prague"
                        ]
                    },
                    "startUrls": {
                        "title": "Airbnb listing URLs",
                        "type": "array",
                        "description": "Paste direct listing URLs such as https://www.airbnb.com/rooms/123456789.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "checkIn": {
                        "title": "Check-in",
                        "type": "string",
                        "description": "Add a future date when you need date-aware prices and availability."
                    },
                    "checkOut": {
                        "title": "Check-out",
                        "type": "string",
                        "description": "Must be later than check-in."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Number of adult guests.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Children ages 2-12.",
                        "default": 0
                    },
                    "infants": {
                        "title": "Infants",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Infants under 2.",
                        "default": 0
                    },
                    "pets": {
                        "title": "Pets",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of pets.",
                        "default": 0
                    },
                    "maxItemsPerQuery": {
                        "title": "Listings per source",
                        "minimum": 1,
                        "maximum": 270,
                        "type": "integer",
                        "description": "Maximum listings to save per location or per URL batch. Use 10 for a quick test.",
                        "default": 10
                    },
                    "includeReviews": {
                        "title": "Include review texts",
                        "type": "boolean",
                        "description": "Save guest review text, star ratings, and Review summary analytics. Works in Full search and Direct listing URLs modes.",
                        "default": false
                    },
                    "maxReviewsPerListing": {
                        "title": "Reviews per listing",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum guest reviews to save per listing when reviews are enabled. Use 1 or 10 for quick tests, 50 for deeper analysis.",
                        "default": 50
                    },
                    "includeCalendar": {
                        "title": "Include availability calendar",
                        "type": "boolean",
                        "description": "Save a 12-month availability calendar when Airbnb returns it. Works in Full search and Direct listing URLs modes.",
                        "default": false
                    },
                    "monitorChanges": {
                        "title": "Monitor changes",
                        "type": "boolean",
                        "description": "Compare this run with the previous run for the same monitor key and save new, changed, and removed listings.",
                        "default": false
                    },
                    "monitorKey": {
                        "title": "Monitor key",
                        "type": "string",
                        "description": "Optional stable name for this market or listing set, for example prague-old-town-august. Leave blank to auto-generate one from the input."
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price filter in the selected currency."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price filter in the selected currency."
                    },
                    "roomType": {
                        "title": "Room type",
                        "enum": [
                            "",
                            "Entire home/apt",
                            "Private room",
                            "Shared room",
                            "Hotel room"
                        ],
                        "type": "string",
                        "description": "Filter listings by stay type.",
                        "default": ""
                    },
                    "minBedrooms": {
                        "title": "Minimum bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Keep listings with at least this many bedrooms."
                    },
                    "minBathrooms": {
                        "title": "Minimum bathrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Keep listings with at least this many bathrooms."
                    },
                    "minBeds": {
                        "title": "Minimum beds",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Keep listings with at least this many beds."
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR"
                        ],
                        "type": "string",
                        "description": "Currency used for price fields.",
                        "default": "USD"
                    },
                    "locale": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "pt",
                            "nl",
                            "pl",
                            "ru"
                        ],
                        "type": "string",
                        "description": "Language for listing text when Airbnb provides it.",
                        "default": "en"
                    },
                    "maxConcurrency": {
                        "title": "Speed",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many requests can run in parallel. The default is a balanced choice for most runs.",
                        "default": 10
                    },
                    "maxRetries": {
                        "title": "Retry attempts",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a temporary request failure.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Connection",
                        "type": "object",
                        "description": "Default connection settings work for most runs. Advanced users can customize them here.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "rawOutput": {
                        "title": "Include raw response",
                        "type": "boolean",
                        "description": "Adds raw source data for debugging. Keep off for normal exports.",
                        "default": false
                    },
                    "debugLog": {
                        "title": "Debug logs",
                        "type": "boolean",
                        "description": "Enable verbose logs for troubleshooting.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
