# Airbnb Scraper & API (`parsebird/airbnb-scraper`) Actor

Scrape Airbnb listings and prices by location: title, nightly and total price, rating breakdown, amenities, host, house rules, coordinates, photos, and availability calendars. Export JSON, CSV, Excel.

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

## Pricing

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

### Airbnb Scraper & API

Extract **Airbnb listings and live prices** by city, neighborhood, or country. **Airbnb Scraper & API** returns clean, structured JSON for every listing — nightly and total price, rating breakdown, amenities, host details, house rules, coordinates, photos, and an optional day-by-day availability calendar.

<table><tr>
<td style="border-left:4px solid #FF5A5F;padding:12px 16px;font-weight:600">
Search any location worldwide, filter by dates, price, beds, bedrooms, and bathrooms, and get every listing enriched with the same data Airbnb's own listing page shows — plus an exact quote for your dates and up to 12 months of availability, in over 50 structured fields per listing.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Airbnb Scraper & API (parsebird/airbnb-scraper) scrapes Airbnb listings and prices by location. Inputs: locationQueries (array of strings, e.g. "London" or "Paris, France"), startUrls (array — Airbnb search or /rooms/ URLs, alternative to locationQueries), checkIn/checkOut (YYYY-MM-DD, search prices use this exact stay), adults/children/infants/pets (integers), priceMin/priceMax (per-night bounds), minBeds/minBedrooms/minBathrooms, locale (default en-US), currency (default USD), skipDetailPages (boolean, default false — true = faster search-only run with less data per listing), calendarMonths (0-12, default 0 — adds a per-day `calendar` field), maxListings (0 = unlimited), maxPricePerNight (default 10000 — used to split a busy location into price ranges past Airbnb's ~270-result cap), maxRequestsPerCrawl (0 = unlimited), proxyConfiguration (residential proxies required, set by default). Output per listing: id, title, url, androidLink/iosLink, locale, language, nightlyPrice, totalPrice, currency, ratingScore, reviewCount, price{label,qualifier,price,originalPrice,breakDown}, coordinates{latitude,longitude}, roomType, personCapacity, isSuperHost; with detail pages also description, seoTitle, rating{cleanliness,accuracy,checking,communication,location,value}, host{name,isSuperHost,profileImage,highlights,about}, amenities[], houseRules{general,cancellationPolicy}, highlights[], images[], locationDescriptions[], coHosts[]; with calendarMonths>0 also calendar[] (date, available, availableForCheckin/Checkout, minNights, maxNights, price). Pricing: pay-per-event, $0.00199 per listing on Free (down to $0.00139 on Gold) plus an extra $0.00249 per listing when detail pages are fetched (down to $0.00219 on Gold). API: https://apify.com/parsebird/airbnb-scraper/api - Token: https://console.apify.com/account/integrations
```

### What is Airbnb Scraper & API?

**Airbnb Scraper & API** is an Apify Actor that extracts listing and pricing data from [Airbnb](https://www.airbnb.com) for any location, without Airbnb's own API. Give it a city — `"London"`, `"Paris, France"`, `"Tokyo, Japan"` — and it returns every matching listing as structured JSON: price, rating, amenities, host, house rules, coordinates, photos, and more.

It works as a practical **Airbnb API alternative**: search by location and dates like a guest would, or paste a listing URL to pull a single property's full detail page. Multiple locations run in a single job, and results export straight to JSON, CSV, or Excel.

### What can Airbnb Scraper & API do?

- 🌍 **Location search** — search any city, neighborhood, or country; run several locations in one job.
- 📅 **Date-aware pricing** — set `checkIn`/`checkOut` and get the exact nightly and total price for that stay, with a full price breakdown (base price, cleaning fee, service fee, taxes).
- 🎚️ **Filters** — price range, minimum beds, bedrooms, bathrooms, and guest counts (adults, children, infants, pets).
- 🔗 **URL mode** — paste a pre-built Airbnb search URL or a direct `/rooms/` link instead of a location.
- 🧾 **Full listing detail** — description, amenities by category, host profile, house rules, highlights, location notes, and photos, pulled from the listing's own detail page.
- ⭐ **Rating breakdown** — overall guest satisfaction plus cleanliness, accuracy, check-in, communication, location, and value sub-ratings.
- 📆 **Availability calendars** — up to 12 months of day-by-day availability per listing (`calendarMonths`).
- ⚡ **Fast mode** — `skipDetailPages` returns search-level data only, for the cheapest and quickest run.
- 🌐 **Locale & currency** — get results in the language and currency you need.
- 🚀 Runs on Apify with scheduling, API access, integrations, and export to JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Airbnb?

| Field | Description |
|-------|-------------|
| `id` / `url` | Airbnb listing ID and canonical URL |
| `title` | Listing title |
| `nightlyPrice` / `totalPrice` / `currency` | Flat numeric prices, ready for sorting/BI |
| `price` | Original nested price object, incl. `breakDown` for a dated stay |
| `ratingScore` / `reviewCount` | Flat rating fields |
| `rating` | Full breakdown: cleanliness, accuracy, check-in, communication, location, value |
| `coordinates` | Latitude / longitude |
| `roomType` / `personCapacity` / `isSuperHost` | Listing basics |
| `description` | Full listing description (detail pages) |
| `amenities` | Grouped amenities with availability flags (detail pages) |
| `host` | Name, Superhost status, profile image, highlights, about (detail pages) |
| `houseRules` | Check-in/out rules, cancellation policy (detail pages) |
| `images` | Photo captions and URLs (detail pages) |
| `calendar` | Per-day availability, min/max nights, and price when `calendarMonths > 0` |

### How to scrape Airbnb listings and prices

1. Open [Airbnb Scraper & API](https://apify.com/parsebird/airbnb-scraper) on Apify Store and click **Try for free**.
2. Add one or more **Location queries**, e.g. `"Barcelona, Spain"`.
3. (Optional) Set **Check-in** / **Check-out** dates, guest counts, and price/bed filters.
4. (Optional) Turn on **Skip detail pages** for a fast, cheap search-only run, or set **Calendar months** for availability data.
5. Click **Start**, then open the **Dataset** tab. Export as JSON, CSV, Excel, HTML, or XML.

#### Input example — simplest search

```json
{
    "locationQueries": ["London"]
}
```

#### Input example — targeted search with dates

```json
{
    "locationQueries": ["Barcelona, Spain"],
    "checkIn": "2026-06-15",
    "checkOut": "2026-06-22",
    "adults": 2,
    "currency": "EUR",
    "locale": "en-US"
}
```

#### Input example — multiple locations

```json
{
    "locationQueries": ["Paris, France", "Rome, Italy", "Berlin, Germany"]
}
```

#### Input example — fast search-only mode

```json
{
    "locationQueries": ["Tokyo, Japan"],
    "skipDetailPages": true
}
```

### Output example

**Full listing (with detail pages)**

```json
{
    "id": "788405891732745420",
    "title": "Recanto da Lima",
    "url": "https://www.airbnb.com/rooms/788405891732745420?adults=1&locale=en-US&currency=USD",
    "nightlyPrice": 263.52,
    "totalPrice": 1510,
    "currency": "USD",
    "ratingScore": 4.98,
    "reviewCount": 129,
    "price": {
        "label": "$1,510 for 5 nights",
        "price": "$1,510",
        "breakDown": {
            "basePrice": { "description": "5 nights x $263.52", "price": "$1,318" },
            "cleaningFee": { "description": "Cleaning fee", "price": "$72" },
            "serviceFee": { "description": "Airbnb service fee", "price": "$120" },
            "total": { "description": "Total", "price": "$1,510" }
        }
    },
    "coordinates": { "latitude": 38.546, "longitude": -8.84326 },
    "roomType": "Private room in home",
    "isSuperHost": true,
    "personCapacity": 3,
    "rating": { "guestSatisfaction": 4.98, "cleanliness": 5, "accuracy": 5, "location": 4.8, "value": 4.9 },
    "host": { "name": "Cláudia", "isSuperHost": true, "highlights": ["Superhost", "128 reviews"] },
    "amenities": [{ "title": "Bathroom", "values": [{ "title": "Bathtub", "available": true }] }],
    "images": [{ "caption": "Photo 1", "imageUrl": "https://a0.muscache.com/im/pictures/hosting/…jpeg" }]
}
```

**Search-only** (`skipDetailPages: true`) returns the same core fields — `id`, `title`, `url`, `nightlyPrice`, `currency`, `ratingScore`, `reviewCount`, `price`, `coordinates`, `roomType`, `rating`, `thumbnail` — without the description, amenities, host, or house-rules detail.

Download the dataset in JSON, CSV, Excel, HTML, or XML from the [Dataset tab](https://docs.apify.com/platform/storage/dataset).

### Use cases

- 🏡 **Market research** — analyze pricing, availability, and amenities across a city or neighborhood.
- 💰 **Revenue management** — benchmark nightly rates and occupancy patterns for comparable listings.
- 🧳 **Travel apps & meta-search** — power a search or comparison tool with live Airbnb data.
- 📊 **Investment analysis** — evaluate short-term rental yield potential by location.
- 📆 **Availability tracking** — schedule recurring runs with `calendarMonths` to monitor booking patterns.
- 🤖 **AI & data pipelines** — feed listing data into LLM agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### How it works

1. The Actor resolves each location query (or Start URL) to an Airbnb search and loads the first page of results.
2. It paginates through results via Airbnb's own search API, automatically splitting the price range into sub-searches when a location has more listings than a single search can page through.
3. Every listing is normalized into flat fields (`nightlyPrice`, `ratingScore`, etc.) alongside the original nested objects.
4. Unless `skipDetailPages` is set, each listing's detail page is fetched for description, amenities, host, house rules, and rating breakdown.
5. If `calendarMonths` is set, up to 12 months of day-by-day availability are fetched per listing.
6. Each listing is billed as one pay-per-event result, plus an extra event when it was detail-enriched.

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

Airbnb Scraper & API uses **pay-per-event** pricing with two events.

| Event | When it fires | Free | Bronze | Silver | Gold |
|-------|---------------|------|--------|--------|------|
| Listing | Every listing | $1.99 / 1k | $1.79 / 1k | $1.59 / 1k | $1.39 / 1k |
| Detail | Extra, per detail-enriched listing | $2.49 / 1k | $2.39 / 1k | $2.29 / 1k | $2.19 / 1k |

A search-only run of 1,000 listings costs about **$1.99** on the Free plan. The same run with detail pages costs about **$4.48** per 1,000. Apify platform usage (compute and residential proxy) is billed separately. See the [Apify pricing page](https://apify.com/pricing).

### API usage examples

Run Airbnb Scraper & API with the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "locationQueries": ["Lisbon, Portugal"],
    "checkIn": "2026-07-01",
    "checkOut": "2026-07-05",
    "adults": 2,
    "maxListings": 50,
}

run = client.actor("parsebird/airbnb-scraper").call(run_input=run_input)

for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["title"], "-", listing.get("totalPrice"), listing.get("currency"))
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/airbnb-scraper').call({
    locationQueries: ['London'],
    skipDetailPages: true,
    maxListings: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((l) => `${l.title} — ${l.nightlyPrice} ${l.currency}`));
```

Connect finished datasets to [Google Sheets](https://docs.apify.com/platform/integrations/google-sheets), [Slack](https://docs.apify.com/platform/integrations/slack), [Zapier](https://docs.apify.com/platform/integrations/zapier), [Make](https://docs.apify.com/platform/integrations/make), webhooks, or your own pipeline.

### Is it legal to scrape Airbnb?

Airbnb Scraper & API reads only publicly visible data — the same listing and search information any visitor sees on [airbnb.com](https://www.airbnb.com). It does not log in, book, or access private guest/host account data. You should still review Airbnb's Terms of Service and make sure your use case complies with applicable laws in your jurisdiction. For background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

- [Airbnb Availability Calendar Scraper](https://apify.com/parsebird/airbnb-availability-calendar-scraper) — Day-by-day availability for a single listing, with rolling date ranges.
- [Trulia Property Scraper](https://apify.com/parsebird/trulia-property-scraper) — US real estate listings and home values.
- [Vinted Scraper](https://apify.com/parsebird/vinted-scraper) — Secondhand marketplace listings.
- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — Emails, phones, and socials from any list of websites.

### FAQ

**Do I need an Airbnb account or API key?**
No. The Actor uses Airbnb's public website data — no login, API key, or booking.

**Why does it use residential proxies?**
Airbnb rate-limits and blocks datacenter traffic. Residential proxies (the default) get through reliably.

**How do I get an exact price for my dates?**
Set `checkIn` and `checkOut`. The listing-level `price` object and `totalPrice`/`nightlyPrice` fields then reflect that exact stay. If a listing isn't available for those dates, `isAvailable` is `false` and the dated price fields are omitted — the search-level price still shows.

**What's the difference between `skipDetailPages: true` and `false`?**
`false` (default) fetches each listing's own page for description, amenities, host, house rules, and rating breakdown — richer data, one extra request (and pay-per-event charge) per listing. `true` returns only what Airbnb's search results already include — faster and cheaper.

**How do I get more than ~270 results for one city?**
The Actor automatically splits a busy location into price-range sub-searches once it hits Airbnb's page cap. Increase `maxPricePerNight` if you're scraping a luxury market where the default $10,000 ceiling is too low.

**Can I scrape a single listing directly?**
Yes. Put its URL (`https://www.airbnb.com/rooms/<id>`) in `startUrls`.

**Can I schedule recurring runs?**
Yes. Use Apify [schedules](https://docs.apify.com/platform/schedules) to track pricing or availability for a location over time.

**Can I use this as an Airbnb API?**
Yes. Call the Actor through the [Apify API](https://docs.apify.com/api/v2), use webhooks, or connect it to AI assistants with the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Something looks wrong or missing.**
Report it on the [Issues tab](https://apify.com/parsebird/airbnb-scraper/issues) and it will be looked at quickly.

# Actor input Schema

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

Locations to search, e.g. "London" or "Paris, France". One search runs per entry.

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

Pre-built Airbnb search URLs or individual room URLs (https://www.airbnb.com/rooms/...). An alternative to Location queries.

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

Check-in date in YYYY-MM-DD format. Prices then reflect this exact stay.

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

Check-out date in YYYY-MM-DD format.

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

Number of adult guests.

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

Number of children.

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

Number of infants.

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

Number of pets.

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

Lower bound for the nightly price filter (in the selected currency).

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

Upper bound for the nightly price filter.

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

Minimum number of beds.

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

Minimum number of bedrooms.

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

Minimum number of bathrooms.

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

Language/locale for text (en-US, de-DE, fr-FR, ja-JP, etc.).

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

Currency code for prices (USD, EUR, GBP, JPY, etc.).

## `skipDetailPages` (type: `boolean`):

Return search-level data only — faster and cheaper. Off = fetch each listing's detail page for description, amenities, host, house rules, and rating breakdown.

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

Months of future availability calendar to fetch per listing (0–12). 0 = disabled.

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

Stop after this many listings (0 = unlimited).

## `maxPricePerNight` (type: `integer`):

Upper bound used when splitting a busy location into price ranges to get past Airbnb's ~270-result page cap. Increase for luxury markets.

## `maxRequestsPerCrawl` (type: `integer`):

Hard limit on total HTTP requests (0 = unlimited).

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

Proxy for the Airbnb requests. Residential proxies are strongly recommended and used by default.

## Actor input object example

```json
{
  "locationQueries": [
    "London"
  ],
  "startUrls": [],
  "checkIn": "",
  "checkOut": "",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "locale": "en-US",
  "currency": "USD",
  "skipDetailPages": false,
  "calendarMonths": 0,
  "maxListings": 20,
  "maxPricePerNight": 10000,
  "maxRequestsPerCrawl": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "locationQueries": [
        "London"
    ],
    "maxListings": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "locationQueries": ["London"],
    "maxListings": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "locationQueries": [
    "London"
  ],
  "maxListings": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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