# Airbnb Scraper - Data, Prices, Reviews, Availability, Occupancy (`factden/airbnb-data-scraper`) Actor

Scrape Airbnb by location or listing URL: listings, prices and property details, 12-month availability and price-by-date, occupancy / ADR / RevPAR revenue signals, reviews with sentiment, and a market report. No login, no API key. An AirDNA alternative.

- **URL**: https://apify.com/factden/airbnb-data-scraper.md
- **Developed by:** [Factden](https://apify.com/factden) (community)
- **Categories:** Travel, Real estate, AI
- **Stats:** 8 total users, 7 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 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 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 Data Scraper — Listings, Prices, Occupancy, Revenue & Reviews

Scrape **Airbnb** for any market or listing and get **listings, prices, property details, 12-month availability,
occupancy / ADR / RevPAR revenue signals, and guest reviews with sentiment** — structured JSON/CSV, no login and
no Airbnb API key. A **pay-per-use AirDNA alternative**: pull the short-term-rental data you need for one market or
one listing, without a $125+/month subscription.

Runs on the Apify platform: schedule it, call it over the API, pipe it into your integrations, rotate proxies, and
monitor every run.

⭐ **If this actor helps, a rating + bookmark on the Store means a lot** — it keeps the actor maintained and free to
improve.

![Airbnb occupancy scraper output — occupancy rate, ADR, RevPAR and estimated annual revenue per Airbnb listing, a pay-per-use AirDNA alternative](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/04-occupancy.png?v=1)

### What makes this Airbnb scraper different

- **Five modes, one actor.** Discovery, availability/price-by-date, occupancy+revenue, reviews, and a market
  report — pick one per run; you only pay for what that mode returns.
- **The occupancy + revenue layer most scrapers skip.** Occupancy rate, ADR, RevPAR and an estimated annual
  revenue per listing, plus an aggregate market report (median ADR, price percentiles, revenue quartiles).
- **Reviews with sentiment.** Full review history + reviewer, host reply, photos, room-type, and topic tags.
- **LLM-ready.** Every row carries a `markdownContent` field and an **AI ingest** dataset view for RAG / agents.
- **Cheap + open.** No Airbnb API key, no browser farm — fast structured extraction at a low pay-per-result price.

### What does Airbnb Data Scraper do?

Give it a **location** (Discover / Market report) or one or more **listing URLs / IDs** (Availability / Occupancy /
Reviews), choose a **Mode**, and it returns clean structured data:

- **🔍 Discover** — every listing in a market: name, coordinates, nightly price, rating, review count, superhost,
  photos (plus best-effort property type). For the exact entire-place / private-room type, use Occupancy mode.
- **📅 Availability & price-by-date** — a 12-month forward calendar per listing: per-day available / bookable /
  min-max nights.
- **📊 Occupancy, ADR & RevPAR** — revenue signals derived from the forward calendar + a live price quote.
- **⭐ Reviews & sentiment** — full review history with ratings, host replies, photos and topic tags.
- **📈 Market report** — one aggregate KPI row for a whole market (an AirDNA-style snapshot).

![Airbnb Discover mode output — every listing in a market with name, property type, nightly price, rating, review count and superhost status](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/02-discover.png?v=1)

### Does Airbnb have a public API? Scraper vs official API

| | Official Airbnb API | Airbnb Data Scraper |
|---|---|---|
| Public access | ❌ No public data API | ✅ No key needed |
| Market discovery | ❌ | ✅ by location |
| Prices & availability | ❌ | ✅ 12-month calendar + price-by-date |
| Occupancy / ADR / RevPAR | ❌ | ✅ derived, transparent |
| Reviews | ❌ | ✅ full history + sentiment |
| Output | — | ✅ JSON / CSV / Excel, API, scheduling |

Airbnb has **no public data API**, so a scraper is the only way to get this data programmatically.

### Who uses it

- **Short-term-rental investors** — "should I buy in this market?" (occupancy, ADR, revenue).
- **Revenue managers & hosts** — benchmark comps and price competitively.
- **Property managers & agencies** — track a portfolio or a whole market.
- **Analysts, researchers & alt-data** — market structure, pricing and demand signals.
- **Developers** — a clean data source instead of a $125+/mo dashboard.

#### Example scenarios

- Score every market you're considering with a one-row **Market report** each.
- Monitor a competitor set's **availability + occupancy** on a daily schedule.
- Pull **reviews + sentiment** for a portfolio to spot service issues.

### How to scrape Airbnb data (to CSV)

1. Open the actor and pick a **Mode** (start with 🔍 Discover).
2. Enter a **Location** (Discover / Market) or paste **Listing URLs / IDs** (Availability / Occupancy / Reviews).
3. Set currency, dates or review filters if you want.
4. Click **Start**. When it finishes, open the **Output** tab and **Export** to JSON, CSV, Excel or HTML.

![Airbnb Scraper input on Apify — pick a mode (Discover, Availability, Occupancy, Reviews, Market), then enter a location or paste listing URLs](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/01-input-form.png?v=2)

### Input

| Field | Applies to | Description |
|---|---|---|
| `mode` | all | `discover` / `availability` / `occupancy` / `reviews` / `market` |
| `location` | discover, market | City / neighborhood / search term |
| `startUrls` | availability, occupancy, reviews | `airbnb.com/rooms/…` URLs or numeric IDs |
| `checkInDate` / `checkOutDate` | discover | Optional pricing dates |
| `minPrice` / `maxPrice` / `roomType` | discover | Filters |
| `maxListings` | discover | Upper cap (0 = no cap). Airbnb surfaces ~240 per location query — split by neighborhood for more |
| `months` | availability, occupancy | Forward months (1–12) |
| `maxReviews` / `reviewsSort` / `fromDate` / `toDate` / `minRating` / `maxRating` | reviews | Review controls |
| `sampleSize` | market | Listings sampled for the KPIs (20–240; ~100 is representative) |
| `currency` / `locale` / `proxyConfiguration` | all | Defaults are fine (Apify Datacenter proxy on) |

### Output

Every run bills to the **default** dataset (an **Overview** + **AI ingest** view) and also mirrors to a clean,
mode-specific dataset you can pick from the Output tab's dataset selector: `listings` (Discover), `calendar`
(Availability), `occupancy`, `reviews`, or `market`.

![Airbnb market report output — one aggregate row per market with median ADR, price percentiles, occupancy, RevPAR and revenue quartiles](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/06-market.png?v=1)

![Airbnb availability calendar output — per-day available, check-in/out, bookable, min and max nights and real nightly price for each listing](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/03-availability.png?v=1)

![Airbnb reviews output — full guest reviews with reviewer, star rating, review text, date, host reply and language](https://raw.githubusercontent.com/factden/apify-actor-assets/main/airbnb-data-scraper/05-reviews.png?v=1)

**Discover / listing row**

```json
{
  "mode": "discover",
  "listingId": "34445868",
  "name": "Charming Apt w/ Premium location, in Rua Garrett",
  "url": "https://www.airbnb.com/rooms/34445868",
  "latitude": 38.711, "longitude": -9.1403,
  "roomType": "Apartment", "rating": 4.98, "reviewsCount": 171,
  "price": "$178", "pricePerNight": 178, "currency": "USD", "isSuperhost": true
}
```

**Occupancy row**

```json
{
  "mode": "occupancy", "listingId": "39896685",
  "occupancyRate": 0.81, "adr": 269, "revpar": 217.84,
  "estAnnualRevenue": 79510, "bookedNights": 149, "availableNights": 35
}
```

**Market report row**

```json
{
  "mode": "market", "market": "Lisbon, Portugal", "listingCount": 22,
  "adrMedian": 1230, "priceP25": 920, "priceP50": 1133, "priceP75": 1386,
  "roomTypeMix": {"Apartment": 21, "Condo": 1}
}
```

Download the dataset in **JSON, CSV, Excel or HTML**.

### Pricing — how much does it cost to scrape Airbnb?

Pay-per-result, **no monthly fee, no start fee**:

| Event | Price | Fires |
|---|---|---|
| Listing | $0.004 | per listing (Discover) |
| Availability calendar | $0.0015 | per calendar day (Availability) — cost scales with the months you pull |
| Price per date (add-on) | $0.005 | per priced date, only if "Price each available date" is on (Availability) |
| Occupancy / ADR / RevPAR | $0.05 | per listing (Occupancy) — the full revenue estimate in one row |
| Review | $0.004 | per review (Reviews) |
| Market report | $0.99 | per market — includes the sampled listings + the aggregate |

Example: a 500-listing discovery = **$2**. A full 12-month calendar for one listing ≈ **$0.55**. One market
report = **$0.99**. Compare that to a **$125+/month** market-data subscription.

### Run on a schedule

Use Apify **Schedules** to re-run any mode daily/weekly (e.g. track a comp set's occupancy), and get the results
via the API, webhooks or an integration (Google Sheets, Slack, S3, and more).

### For AI agents & RAG

Every row includes a `markdownContent` field and an **AI ingest (LLM-ready)** dataset view, so you can feed Airbnb
listings, occupancy or reviews straight into a vector store or an LLM prompt with no reshaping. The actor is
discoverable and blind-fillable by AI agents over MCP.

### Data & GDPR

Only public listing data is collected. Reviewer first names appear as shown publicly on Airbnb; **no host email or
phone is collected**, and exact street addresses are not available pre-booking (an Airbnb platform limitation).
Occupancy / ADR / RevPAR are a **transparent estimate** derived from the forward availability calendar (a blocked
night is not always a booked night). Use the data lawfully and in line with applicable regulations.

### FAQ

**Does Airbnb have a reviews API?** No public one — this actor extracts reviews (with sentiment tags) directly.

**Do I need an Airbnb account or API key?** No.

**Is this an AirDNA alternative?** Yes — the same occupancy/ADR/RevPAR signals, pay-per-use instead of a monthly
subscription. Occupancy is a transparent estimate from the calendar, not a proprietary model.

**How many listings can I get for a market?** Airbnb's search returns **up to ~240 listings per location query**
(its own 15-page limit — every scraper hits it). Discover paginates all of them in one run. To go beyond ~240 for a
big city, split the location into **neighborhoods or arrondissements** (e.g. "Le Marais, Paris", "Montmartre, Paris")
or run separate **price bands**, then combine — each sub-query returns its own ~240. `maxListings` is an upper cap,
so if you set it above what a location surfaces you'll simply get everything available.

**Can it run on a schedule / via API / MCP?** Yes to all three.

**Which modes cost what?** See Pricing — one billed event per mode, $0 start fee.

**Is scraping Airbnb legal?** The actor collects only public data. You are responsible for using it in compliance
with Airbnb's Terms and applicable law.

**What currencies/languages?** 20 currencies and 9 locales.

⭐ **Found it useful? A Store rating + bookmark genuinely helps.**

### Related FactDen actors

- Google Hotels Scraper — apify.com/factden/google-hotels-scraper
- Expedia Reviews Scraper — apify.com/factden/expedia-hotel-reviews-scraper
- Hotels.com Reviews Scraper — apify.com/factden/hotels-com-reviews-scraper
- Ctrip / Trip.com Reviews — apify.com/factden/ctrip-trip-reviews-scraper

### Changelog

- **2026-08-03** — Initial release: 5 modes (discover, availability, occupancy, reviews, market), occupancy/ADR/
  RevPAR, market report, AI-ingest view, multi-event pay-per-result pricing.

### Support

Found a bug or want a field added? Open an issue on the **Issues** tab — we read every one.

# Actor input Schema

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

Pick what to scrape. Then fill the ONE input it needs below — Location for Discover & Market, Listing URLs for Availability / Occupancy / Reviews. Only the selected mode's fields are used.

## `location` (type: `string`):

City / neighborhood / search term, e.g. `Paris, France`.

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

One `airbnb.com/rooms/…` URL or numeric listing ID per line.

## `checkInDate` (type: `string`):

YYYY-MM-DD. Optional live pricing for Discover; leave empty to skip.

## `checkOutDate` (type: `string`):

YYYY-MM-DD. Must be after check-in.

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

Guests used for price quotes.

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

Drop listings below this nightly price.

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

Drop listings above this nightly price.

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

Refine the search toward a room type.

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

Stop after this many unique listings. 0 = no cap.

## `months` (type: `integer`):

How many months of the forward calendar to pull (1-12). Availability is billed per calendar day, so cost scales with this (≈30 days/month). Note: occupancy is most accurate for the near term - months far out are all still available (unbooked).

## `includeDailyPrices` (type: `boolean`):

Availability add-on: fetch the real nightly price for each available check-in date (capped 30/listing). Billed separately per priced date (see pricing). Off = calendar only.

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

Cap on reviews per listing (paginated).

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

Order reviews are fetched in.

## `fromDate` (type: `string`):

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

## `toDate` (type: `string`):

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

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

Only reviews rated at or above this (1-5).

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

Only reviews rated at or below this (1-5).

## `sampleSize` (type: `integer`):

Listings sampled for the market KPIs. ~100 is statistically representative; price percentiles stabilise well before the cap. Capped at 240 - Airbnb surfaces ~240 listings per location query (15 pages), so higher values can't be reached from one search.

## `marketMonths` (type: `integer`):

Forward months read per sampled listing for the market occupancy/RevPAR (1-6). Capped at 6 on purpose: forward occupancy is a near-term booking-pace proxy - months further out are all unbooked and would understate occupancy. No extra cost (one call, bigger response).

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

Currency for all prices.

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

Language for names, review text and labels.

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

Apify Datacenter proxy (default) rotates IPs across the run - recommended for Airbnb. Switch to Residential only if you scale very hard and see throttling.

## Actor input object example

```json
{
  "mode": "discover",
  "location": "Paris, France",
  "startUrls": [
    "https://www.airbnb.com/rooms/39896685"
  ],
  "adults": 2,
  "roomType": "any",
  "maxListings": 100,
  "months": 12,
  "includeDailyPrices": false,
  "maxReviews": 100,
  "reviewsSort": "recent",
  "sampleSize": 100,
  "marketMonths": 3,
  "currency": "USD",
  "locale": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per listing: name, room/property type, photo, coordinates, nightly price, rating, superhost.

## `calendar` (type: `string`):

One row per calendar day per listing: date, availability, min/max nights, and per-date price when enabled.

## `occupancy` (type: `string`):

One row per listing: occupancy rate, ADR, RevPAR, estimated annual revenue, booked/available nights.

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

One row per guest review: reviewer, rating, text, date, host reply, language.

## `market` (type: `string`):

One aggregate KPI row per market: ADR (median/mean), price percentiles, occupancy, RevPAR, revenue quartiles, average rating.

## `market_samples` (type: `string`):

The individual listings sampled to build the market report, each with its ADR, occupancy and RevPAR.

# 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 = {
    "location": "Paris, France",
    "startUrls": [
        "https://www.airbnb.com/rooms/39896685"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factden/airbnb-data-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 = {
    "location": "Paris, France",
    "startUrls": ["https://www.airbnb.com/rooms/39896685"],
}

# Run the Actor and wait for it to finish
run = client.actor("factden/airbnb-data-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 '{
  "location": "Paris, France",
  "startUrls": [
    "https://www.airbnb.com/rooms/39896685"
  ]
}' |
apify call factden/airbnb-data-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/65SXvHEFgsCmxQHgw/builds/EH8wuG5E38neyfY5c/openapi.json
