# Airbnb Scraper — Listings, Prices, Ratings & Details (`vulcandata/airbnb-scraper`) Actor

Search Airbnb stays by location or URL and get listings with total and nightly price, rating, reviews, bedrooms, host type, coordinates and photos. Optional details: amenities, description, host profile, category ratings, house rules. Filters: dates, guests, price, room type, bedrooms.

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

## Pricing

from $2.10 / 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?

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 — Listings, Prices, Ratings & Details

Search Airbnb by **place**, **search URL**, **listing URL** or **listing ID** and get clean JSON: name, type, **total and per-night price** for your dates, rating and review count, Guest-favorite and Superhost badges, bedrooms/beds/baths, host type, coordinates and photos. Turn on details to add **amenities, description, property type, capacity, host profile, category ratings, house rules, safety info and all photos**. Uses Airbnb's own data endpoints — no browser, no login — so runs are fast and cheap.

### Use cases

- **Market research & pricing** — compare nightly rates, occupancy signals and ratings across a city or neighbourhood for given dates.
- **Property investment & short-term-rental analysis** — count listings by type, bedrooms, price band and host type (individual vs. business).
- **Travel apps & AI agents** — feed structured availability and pricing into planners, chatbots or recommendation engines.
- **Monitoring** — track a set of listings (by URL/ID) for price and rating changes on a schedule.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `locations` | array of strings | — | Places (`Warsaw, Poland`), Airbnb search URLs (dates, guests and filters in the URL are respected), listing URLs or numeric IDs |
| `maxItems` | integer | 100 | Cap per location. Airbnb serves at most ~280 results per search; narrow with dates, price or room type for different sets |
| `checkIn`, `checkOut` | `YYYY-MM-DD` | — | Stay dates (set both). Prices then reflect the actual stay |
| `adults`, `children`, `infants`, `pets` | integer | 1 / 0 / 0 / 0 | Guests |
| `currency` | string | `USD` | ISO 4217 code for prices |
| `priceMin`, `priceMax` | integer | — | Per-night price bounds |
| `roomTypes` | array | all | `entire`, `private`, `shared`, `hotel` |
| `minBedrooms`, `minBeds`, `minBathrooms` | integer | — | Minimum counts |
| `includeDetails` | boolean | false | One extra request per listing for the full details block |
| `locale` | string | `en` | Language of names and descriptions |
| `proxy` | object | Apify datacenter proxy | Proxy configuration |

```json
{
  "locations": ["Lisbon, Portugal", "https://www.airbnb.com/rooms/1224722232392342773"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-13",
  "adults": 2,
  "currency": "EUR",
  "priceMax": 150,
  "roomTypes": ["entire"],
  "maxItems": 200,
  "includeDetails": true
}
```

### Output (one item = one listing)

```json
{
  "id": "1654891137786665306",
  "url": "https://www.airbnb.com/rooms/1654891137786665306",
  "name": "Stylish Atelier | Nowy Świat | Self check-in",
  "title": "Apartment in City Centre",
  "room_type": "Apartment",
  "rating": 5.0,
  "reviews_count": 28,
  "is_guest_favorite": true,
  "is_superhost": false,
  "host_type": "individual",
  "bedrooms": 2, "beds": 3, "bathrooms": 1,
  "price": { "total": 347.0, "total_text": "$347", "currency": "USD", "original_total": null, "qualifier": "total", "nights": 3, "per_night": 115.65 },
  "free_cancellation": false,
  "lat": 52.2351, "lng": 21.0205,
  "images": ["https://a0.muscache.com/im/pictures/hosting/…/original/0740dcf4-….png"],
  "check_in": "2026-11-10", "check_out": "2026-11-13", "adults": 2,
  "query": "Warsaw, Poland",

  // with includeDetails = true:
  "description": "Unique studio close to the center. It consists of …",
  "property_type": "Entire rental unit",
  "space_type": "ENTIRE_HOME",
  "person_capacity": 4,
  "overview": ["4 guests", "1 bedroom", "2 beds", "1 bath"],
  "category_ratings": { "cleanliness": 4.6, "accuracy": 4.8, "checkin": 4.8, "communication": 4.9, "location": 4.8, "value": 4.8 },
  "is_new_listing": false,
  "location": { "lat": 52.24636, "lng": 20.99172, "is_exact": false, "subtitle": "Warsaw, Masovian Voivodeship, Poland" },
  "amenities": [{ "group": "Bathroom", "name": "Hair dryer", "description": null, "available": true }],
  "amenities_count": 27,
  "host": { "id": "389655643", "name": "Krzysztof", "is_superhost": false, "is_verified": true, "rating": 4.67, "reviews_count": 639,
            "years_hosting": 6, "response_rate": "Response rate: 100%", "response_time": "Responds within an hour", "type": "business",
            "profile_picture_url": "https://a0.muscache.com/im/pictures/user/….jpg" },
  "highlights": ["Self check-in"],
  "house_rules": ["Check-in after 1:00 PM", "Checkout before 10:00 AM", "No pets"],
  "safety_and_property": ["Smoke alarm not reported"],
  "sleeping_arrangements": ["Bedroom", "Living room"],
  "photos": ["https://a0.muscache.com/im/pictures/hosting/…/original/….jpeg"]
}
```

Notes:

- `price` is what Airbnb shows for your dates and guests in the requested currency (`original_total` is set when Airbnb displays a discount). Without dates it is Airbnb's indicative total. Listings queried directly by URL/ID carry no price in this version.
- Field names are a stable contract: new fields may be added in minor versions; renames only in a major version (see Changelog).

The run's key-value store record `OUTPUT` holds statistics: requests, blocks, empty or unsupported queries, `reason_if_empty`.

### Pricing

Pay only for results: **$3.00 per 1,000 listings**. Platform usage is included — no compute bills, no proxy costs. A run that finds nothing costs (almost) nothing.

Discounts on paid Apify plans:

| Apify plan | Price per 1,000 listings |
|---|---|
| Free plan | $3.00 |
| Starter | $2.70 |
| Scale | $2.40 |
| Business | $2.10 |

Examples (Free plan price):

- one city search (~250 listings) → **$0.75**
- 1,000 listings across four neighbourhoods → **$3.00**
- 10,000 listings for a country-wide study → **$30.00**

### Limitations

- Airbnb caps every search at ~280 results. To cover a large city, run several narrower searches (price bands, room types, neighbourhoods).
- Reviews text and the availability calendar are not included in this version.
- Airbnb changes its internal API from time to time; this actor re-discovers the query signatures automatically and is monitored daily.

### API & integrations

Run it from code — Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vulcandata/airbnb-scraper").call(run_input={"locations": ["Lisbon, Portugal"], "checkIn": "2026-11-20", "checkOut": "2026-11-22", "adults": 2, "maxItems": 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

…or plain HTTP (returns the dataset items directly):

```bash
curl -X POST "https://api.apify.com/v2/acts/vulcandata~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" -d '{"locations": ["Lisbon, Portugal"], "checkIn": "2026-11-20", "checkOut": "2026-11-22", "adults": 2, "maxItems": 100}'
```

- **No-code:** connect to Make, Zapier, n8n, Google Sheets, Slack or webhooks from the actor's *Integrations* tab.
- **Schedules:** run daily/weekly from *Schedules* and get fresh data automatically.
- **AI agents (MCP):** add `vulcandata/airbnb-scraper` to the Apify MCP server (mcp.apify.com) and let Claude, ChatGPT or Cursor call it as a tool.
- **Exports:** JSON, CSV, Excel, XML, RSS — straight from the dataset.

### FAQ

**Is this legal?** The actor collects public listing information that Airbnb shows to every visitor. No login, no private messages, no guest data.

**Why do I get at most ~280 listings per search?** That is Airbnb's own cap per search. Split a big city into several searches (price bands, room types, neighbourhoods or search URLs with a map area) — duplicates are removed automatically within a run.

**Are prices the real prices for my dates?** Yes — with `checkIn`/`checkOut` you get the total and per-night price Airbnb shows for those dates and guests, in your currency, including Airbnb's discount display when present.

**Can I track a list of specific listings?** Yes — put listing URLs or IDs into `locations` and schedule the actor; add `includeDetails` for amenities, host and rating breakdown.

**What happens when Airbnb changes its site?** The actor uses Airbnb's own data API and re-discovers its query signatures automatically; it is also tested daily.

### More scrapers by VULCAN

- [Medium Scraper](https://apify.com/vulcandata/medium-scraper)
- [Google Ads Transparency Center Scraper](https://apify.com/vulcandata/google-ads-transparency)
- [Google Hotels Scraper](https://apify.com/vulcandata/google-hotels-scraper)

### Changelog

See `CHANGELOG.md`.

# Changelog

This Actor's version history is a separate document: https://apify.com/vulcandata/airbnb-scraper/changelog.md

# Actor input Schema

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

One per line: a place (`Warsaw, Poland`, `Lisbon`, `Bali`), an Airbnb search URL (its dates, guests and filters are respected), a listing URL (`https://www.airbnb.com/rooms/1224722232392342773`) or a numeric listing ID.

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

Cap on listings returned per location. Airbnb serves at most ~280 results per search — narrow with dates, price or room type to get different sets. You are charged only for listings returned.

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

With check-out: prices are the total for the stay and per night. Without dates Airbnb shows an indicative total.

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

Must be set together with check-in.

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

Number of adult guests.

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

Number of children (ages 2–12).

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

Number of infants (under 2).

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

Number of pets.

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

ISO 4217 code for prices: USD, EUR, GBP, PLN, …

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

Lower price bound per night in the selected currency.

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

Upper price bound per night in the selected currency.

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

Restrict to these room types; empty = all.

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

Minimum number of bedrooms.

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

Minimum number of beds.

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

Minimum number of bathrooms.

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

Fetch each listing's page data: description, property type, capacity, amenities, host profile (Superhost, rating, response time), category ratings, house rules, safety info, all photos. One extra request per listing — slower.

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

Language of names and descriptions (en, de, fr, es, pl, …).

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

Apify Proxy settings. Datacenter proxies are used by default; switch to residential if you see blocks.

## Actor input object example

```json
{
  "locations": [
    "Warsaw, Poland"
  ],
  "maxItems": 100,
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "currency": "USD",
  "roomTypes": [],
  "includeDetails": false,
  "locale": "en",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped listings as JSON (also available as CSV, Excel or XML via the dataset API).

## `overview` (type: `string`):

Compact table view: name, type, price, rating, reviews, badges.

# 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": [
        "Warsaw, Poland"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vulcandata/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": ["Warsaw, Poland"] }

# Run the Actor and wait for it to finish
run = client.actor("vulcandata/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": [
    "Warsaw, Poland"
  ]
}' |
apify call vulcandata/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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