# Airbnb Scraper API - Total Prices, Calendar, Reviews & Hosts (`scrapifier/airbnb-scraper`) Actor

🏠 Scrape Airbnb listings by location, search URL or listing URL with every filter. Real prices for your dates with fee breakdown, full listing page (host, amenities, rules, photos), 12-month availability calendar with occupancy metrics, and reviews. No 270-listing cap. Pay per result.

- **URL**: https://apify.com/scrapifier/airbnb-scraper.md
- **Developed by:** [Scrapifier](https://apify.com/scrapifier) (community)
- **Categories:** Travel, Real estate
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.02 / 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.
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 Scraper API - Total Prices, Calendar, Reviews & Hosts

Benchmark nightly rates, measure occupancy, source hosts or build a short-term-rental dataset from [Airbnb](https://www.airbnb.com) — 8M+ listings in 220 countries.

⚡ **Scrape Airbnb listings by location, search URL or listing URL with every filter the site offers (dates, guests, price, type of place, bedrooms, beds, bathrooms, amenities, Superhost, Instant Book). One row per listing with the real price for your dates and its breakdown (nightly rate, cleaning fee, service fee, taxes, discount, total), rating and reviews count, coordinates, badges and photos. Add the full listing page (description, amenities by group, host profile and stats, house rules, check-in/out times, safety, sleeping arrangement, category ratings, rating distribution, review tags, cancellation policy, all photos), the 12-month availability calendar with occupancy metrics, and the latest reviews — or one row per review. Airbnb stops every search at ~270 listings; this Actor splits big searches by price and map until every listing is reached. No browser, pay per result.**

### What you get

#### Listings — one row per listing

| Field | Example |
|---|---|
| `listingId`, `url`, `name`, `title`, `listingType`, `area` | 45482776, "Cozy studio / Gare de l'Est", Apartment in Paris |
| `rating`, `reviewCount`, `isSuperhost`, `isGuestFavorite`, `badges` | 4.68, 409, true, false |
| `price`, `priceQualifier`, `nightlyPrice`, `nights`, `cleaningFee`, `serviceFee`, `taxes`, `discount`, `priceOriginal`, `currency` | 154 total, 65.93/night × 2, taxes 22.10, EUR |
| `latitude`, `longitude`, `images`, `imageCount`, `checkIn`, `checkOut`, `matchedInput` | 48.87, 2.36, 6 photos |

With **Fetch each listing's page** on, every row additionally carries:

- **Identity & capacity**: `propertyType`, `roomType`, `pdpType`, `personCapacity`, `bedrooms`, `beds`, `bathrooms`, `overviewTitle`, `registrationNumber`, `isNewListing`.
- **Description**: `description` (translated when Airbnb shows one), `descriptionOriginal`, `descriptionLanguage`, `neighborhoodDescription`.
- **Amenities**: `amenities` by group (Bathroom, Kitchen and dining, Internet and office…), `amenityCount`, `amenitiesNotIncluded`.
- **Host**: `hostName`, `hostId`, `hostUrl`, `hostIsSuperhost`, `hostIsVerified`, `hostRating`, `hostReviewCount`, `hostYears`, `hostHighlights`, `hostAbout`, `hostType` (BUSINESS for professional hosts), `cohosts`, `hostPictureUrl`.
- **Rules & policies**: `houseRules`, `checkInWindow`, `checkOutTime`, `selfCheckIn`, `safetyAndProperty`, `thingsToKnow`, `cancellationPolicy`, `childrenAllowed`, `infantsAllowed`.
- **Quality**: `categoryRatings` (cleanliness, accuracy, check-in, communication, location, value), `ratingDistribution`, `highlights`, `reviewTags`, `availableForDates`.
- **Location & media**: `locationName`, `isExactLocation`, `locationVerified`, `sleepingArrangement`, all `images` with `imageCaptions`, `canonicalUrl`, `sharingTitle`.

With **Availability calendar** set to 1–12 months, every row carries `calendar` (day by day: available, min/max nights, check-in/out allowed) and the metrics `occupancy30` / `occupancy60` / `occupancy90` / `occupancy365` (share of unavailable days), `availableDays`, `unavailableDays`, `nextAvailableDate`, `minNights`, `maxNights`, `unavailableStreaks`, `longestUnavailableStreak`. Unavailable days include bookings and host blocks — Airbnb does not tell them apart.

With **Reviews per listing** > 0, the latest reviews are nested in `reviews`.

#### Reviews — one row per review

`reviewId`, `rating`, `text`, `textTranslated`, `language`, `date`, `reviewerName`, `reviewerId`, `reviewerUrl`, `reviewerLocation`, `stayDetails`, `highlight`, `hostResponse`, `photos`, plus the listing context (`listingId`, `listingUrl`, `listingName`, `listingType`, `listingRating`, `listingReviewCount`, `listingArea`, `hostName`). Sorted most recent / highest / lowest / most relevant, every review reachable (50 per request).

Turn on **Flatten rows** for spreadsheet-ready columns (`categoryRatings_cleanliness`, `amenities_Kitchen and dining`…).

### Inputs

| Field | Type | Default | Meaning |
|---|---|---|---|
| Locations | `locations` | `["Lisbon, Portugal"]` | Cities, areas or addresses as typed on Airbnb. |
| Search URLs | `searchUrls` | — | Any Airbnb results URL; its dates, guests, filters and map bounds are kept. |
| Listing URLs / ids | `listingUrls` | — | Specific listings; each gets its full page. |
| Data type | `dataType` | listings | listings / reviews. |
| Dates & guests | `checkIn`, `checkOut`, `adults`, `children`, `infants`, `pets` | 1 adult | With dates, prices are the real totals for the stay. |
| Filters | `priceMin`, `priceMax`, `roomTypes`, `minBedrooms`, `minBeds`, `minBathrooms`, `amenities`, `superhostOnly`, `instantBookOnly` | — | Applied by Airbnb itself; you only pay for matching listings. |
| Currency | `currency` | USD | 22 currencies. |
| Listing page | `includeDetails` | off | One extra request per listing for the full record. |
| Calendar | `calendarMonths` | 0 | 1–12 months of availability + occupancy metrics (one request per listing). |
| Reviews | `maxReviewsPerListing`, `reviewSort` | 0, most recent | Nested latest reviews (listings) or the per-listing cap (reviews mode; 0 = all). |
| Max listings per search | `maxListingsPerSearch` | 0 | 0 = everything the search returns. |
| Maximum rows | `maxItems` | 100 | Total cap — the number of results you pay for. 0 = everything. |
| Flatten rows | `flatten` | off | Flat columns for CSV/Excel. |
| Input status report | `emitInputStatus` | on | OUTPUT lists, per input, listings found, the count Airbnb announced and requests used. |

### Examples — all live-verified

**1. Every entire home in Lisbon for a weekend, real prices**

```json
{ "locations": ["Lisbon, Portugal"], "checkIn": "2026-11-13", "checkOut": "2026-11-15", "adults": 2, "roomTypes": ["entire_home"], "currency": "EUR", "maxItems": 0 }
```

**2. Occupancy and pricing of the competition around a listing (investor / host comps)**

```json
{ "searchUrls": [{ "url": "https://www.airbnb.com/s/Paris/homes?checkin=2026-11-10&checkout=2026-11-12&adults=2&min_bedrooms=1&ne_lat=48.88&ne_lng=2.38&sw_lat=48.86&sw_lng=2.34&search_by_map=true" }], "calendarMonths": 3, "includeDetails": true, "currency": "EUR", "maxItems": 150 }
```

**3. Full records for specific listings**

```json
{ "listingUrls": ["https://www.airbnb.com/rooms/45482776", "720177146102065251"], "checkIn": "2026-11-10", "checkOut": "2026-11-12", "calendarMonths": 12, "maxReviewsPerListing": 10 }
```

**4. The 200 most recent reviews of each Superhost villa with a pool in Bali**

```json
{ "dataType": "reviews", "locations": ["Bali, Indonesia"], "amenities": ["pool"], "superhostOnly": true, "maxListingsPerSearch": 20, "maxReviewsPerListing": 200, "reviewSort": "most_recent" }
```

**5. Budget private rooms in Berlin, spreadsheet export**

```json
{ "locations": ["Berlin, Germany"], "roomTypes": ["private_room"], "priceMax": 60, "currency": "EUR", "flatten": true, "maxItems": 300 }
```

### Why this scraper

- **No 270-listing cap** — Airbnb shows at most 15 pages per search; bigger searches are split into price ranges and map quadrants automatically until every listing is reached, deduplicated by id.
- **Real prices** — with dates, every row has the exact total and its breakdown, in your currency.
- **Occupancy in one run** — listings, 12-month calendar, occupancy metrics, host profile and reviews come from one Actor instead of three.
- **Every filter wired** — each input is sent to Airbnb as a server-side filter.
- **Honest reporting** — the `input_status` report in OUTPUT shows, per input, listings found, the count the site announced, requests used, and why any input returned nothing.
- **Fast and cheap** — no browser: ~1 second per page of 40 listings; a whole city in minutes.

### FAQ

**Is this legal?** The Actor reads only publicly displayed listings, the same pages any visitor sees. You are responsible for using the output in compliance with applicable laws and Airbnb's terms.

**Is "occupancy" exact?** It is the share of days a listing is not bookable. Airbnb does not say whether a day is booked or blocked by the host, so treat it as an upper bound of real occupancy — the same limitation applies to every occupancy data provider.

**Why fewer listings than Airbnb announces?** The announced count is an estimate that changes between requests; `input_status` shows both the estimate and the deduplicated listings actually collected.

**Which price is shown without dates?** Airbnb's indicative nightly price; set dates for exact totals, fees and taxes.

***

Looking for more travel and real-estate data? See the rest of the family: [AutoScout24](https://apify.com/scrapifier/autoscout24-scraper), [Leboncoin](https://apify.com/scrapifier/leboncoin-scraper), [SeLoger](https://apify.com/scrapifier/seloger-scraper), [Bien'ici](https://apify.com/scrapifier/bienici-scraper), [Trustpilot](https://apify.com/scrapifier/trustpilot-reviews-scraper).

# Actor input Schema

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

Cities, neighbourhoods, regions or addresses as you would type them on Airbnb ("Paris, France", "Lisbon", "Brooklyn, NY"). One search each; big searches are split automatically until every listing is reached.

## `searchUrls` (type: `array`):

Any Airbnb search results URL (https://www.airbnb.com/s/Paris/homes?...) — its dates, guests, filters and map bounds are kept.

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

Specific listings: https://www.airbnb.com/rooms/45482776 or just 45482776. Each gets its full listing page.

## `dataType` (type: `string`):

Listings: one row per listing with the real price for your dates and, optionally, the full listing page, the availability calendar with occupancy metrics and the latest reviews nested. Reviews: one row per review for each listing found.

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

YYYY-MM-DD. With dates, every listing carries its real total price and breakdown for the stay. Without dates Airbnb shows an indicative nightly price.

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

YYYY-MM-DD. Defaults to two nights after check-in.

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

Number of adult guests.

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

Number of children (2-12).

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

Number of infants (under 2).

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

Number of pets — only pet-friendly listings are returned when set.

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

In the selected currency.

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

In the selected currency.

## `roomTypes` (type: `array`):

Empty = any.

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

0 = any.

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

0 = any.

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

0 = any.

## `amenities` (type: `array`):

Only listings offering all the selected amenities.

## `superhostOnly` (type: `boolean`):

Keep only listings run by a Superhost.

## `instantBookOnly` (type: `boolean`):

Keep only listings bookable instantly.

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

Currency of every price in the output (and of the price filters).

## `includeDetails` (type: `boolean`):

One extra request per listing for the full record: description, amenities by group, host profile and stats, house rules, check-in/out times, safety, sleeping arrangement, category ratings, rating distribution, review tags, highlights, all photos, cancellation policy.

## `calendarMonths` (type: `integer`):

0 = off. 1-12 = read the day-by-day availability calendar this many months ahead and compute occupancy metrics (occupancy over 30/60/90/365 days, available and unavailable days, next available date, typical minimum stay, unavailable streaks). Unavailable days include both bookings and host blocks.

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

Listings mode: nest this many latest reviews in each listing row (0 = none, max 50). Reviews mode: stop after this many reviews per listing (0 = every review).

## `reviewSort` (type: `string`):

Server-side order of the reviews.

## `maxListingsPerSearch` (type: `integer`):

0 = every listing Airbnb returns for the search (the Actor keeps splitting the search until the site's 270-listing cap no longer applies).

## `maxItems` (type: `integer`):

Stop after this many rows in total — the number of results you pay for. 0 = no limit.

## `flatten` (type: `boolean`):

Emit flat columns (categoryRatings_cleanliness, amenities_Kitchen and dining…) instead of nested objects; the calendar becomes a JSON string.

## `emitInputStatus` (type: `boolean`):

Write an input_status report to OUTPUT: listings found per input, the count Airbnb announced, requests used, and why any input returned nothing.

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

Keep the default residential proxy settings for reliable results; datacenter proxies are refused by Airbnb.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "dataType": "listings",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "superhostOnly": false,
  "instantBookOnly": false,
  "currency": "USD",
  "includeDetails": false,
  "calendarMonths": 0,
  "maxReviewsPerListing": 0,
  "reviewSort": "most_recent",
  "maxListingsPerSearch": 0,
  "maxItems": 100,
  "flatten": false,
  "emitInputStatus": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

All listing / review rows extracted by this run.

# 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 = {
    "locations": [
        "Lisbon, Portugal"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapifier/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 = {
    "locations": ["Lisbon, Portugal"],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapifier/airbnb-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 '{
  "locations": [
    "Lisbon, Portugal"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call scrapifier/airbnb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapifier/airbnb-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/Ybb4PON6Mo0Pzoa69/builds/TmjuPKqtdIzH7WeFh/openapi.json
