# Airbnb Scraper (`mikolabs/airbnb`) Actor

Ultra-fast Airbnb scraper by Mikolabs. Extract listings, prices, ratings, coordinates, reviews, images & room specs by destination or custom URL. Features parallel cursor scraping with 10 concurrency & residential proxies for 50+ items in under 30s. Export in JSON, CSV, Excel.

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

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify)](https://apify.com)
[![High Speed](https://img.shields.io/badge/Speed-Parallel%20Scraping-green)](#performance--speed)
[![Residential Proxies](https://img.shields.io/badge/Proxies-Residential%20Ready-orange)](#proxy-configuration)
[![Formats](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-purple)](#export-formats)

High-speed, production-grade **Airbnb Scraper** built by **Mikolabs**. Extract structured vacation rental data from any destination, city, or custom search URL in seconds. Built on modern Crawlee and Playwright with intelligent parallel cursor navigation, resource blocking, and anti-blocking residential proxy integration.

***

### ⚡ What Makes Mikolabs Airbnb Scraper Better?

Unlike traditional scrapers that crawl listings sequentially and take minutes to finish, this Actor is optimized from the ground up:

- **🚀 Ultra-Fast Parallel Architecture (10 Concurrent Workers):** Collect **50 listings in under 18–35 seconds**. Instead of waiting for pages one by one, our cursor engine discovers all pagination tokens on Page 1 and scrapes pages concurrently.
- **🌐 90% Less Bandwidth & Memory:** Automatically blocks non-essential media (images, fonts, video streams, ad trackers) during crawl execution, ensuring lightning-fast page rendering and massive savings on proxy bandwidth costs.
- **🎯 Full Filter Support:** Query by destinations or apply custom granular filters: exact check-in/out dates, price ranges, guest counts, room configurations (beds, baths, bedrooms), currencies, and languages.
- **📍 Precise Geolocation & Rich Metadata:** Extracts latitude, longitude coordinates, room details, pricing breakdowns, star ratings, accessibility labels, and direct listing links.
- **🛡️ Built-in Anti-Bot Bypass:** Native integration with Apify Residential Proxies and randomized fingerprinting avoids blocks, CAPTCHAs, and IP bans.

***

### 📌 What Data Does It Extract?

Every record in the dataset is normalized into clean, structured JSON ready for analytics, spreadsheets, or machine learning pipelines:

| Field | Type | Description |
|---|---|---|
| `id` | String | Unique Airbnb property / room identifier. |
| `url` | String | Direct canonical URL to the Airbnb listing (`https://www.airbnb.com/rooms/...`). |
| `name` | String | Full title / localized display name of the accommodation. |
| `title` | String | Subtitle / property category (e.g., `Entire home in London`). |
| `roomType` | String | Accommodation type (e.g., `Entire rental unit`, `Private room`). |
| `price` | String | Display price (e.g., `$120`, `₹4,500`, `€95`). |
| `priceQualifier` | String | Price qualifier (e.g., `per night`, `for 5 nights`, `total before taxes`). |
| `rating` | String | Average customer review rating (e.g., `4.92`, `New`). |
| `ratingA11yLabel` | String | Full accessibility rating label with review context. |
| `coordinates` | Object | Geolocation object containing `{ latitude, longitude }`. |
| `roomDetails` | Array | Structured list of room specs (e.g., `["2 bedrooms", "2 beds", "1 bath"]`). |
| `images` | Array | High-resolution listing photo URLs. |
| `checkIn` | String | Configured check-in date (`YYYY-MM-DD`). |
| `checkOut` | String | Configured check-out date (`YYYY-MM-DD`). |

***

### 🚀 How to Use Airbnb Scraper to Its Full Potential

You can run this Actor in three distinct modes depending on your workflow:

#### Mode 1: Search by Destination Queries (Easiest)

Simply provide a list of cities or locations. The Actor automatically forms Airbnb search queries:

```json
{
  "locationQueries": ["London, UK", "Paris, France", "Tokyo, Japan"],
  "maxResults": 50
}
```

#### Mode 2: Granular Filters (Dates, Guests, Budget, Currency)

Fine-tune search results with Airbnb's booking engine parameters:

```json
{
  "locationQueries": ["Miami Beach, FL"],
  "checkIn": "2026-12-01",
  "checkOut": "2026-12-07",
  "priceMin": 100,
  "priceMax": 350,
  "adults": 2,
  "children": 1,
  "minBedrooms": 2,
  "minBeds": 2,
  "minBathrooms": 1,
  "currency": "USD",
  "locale": "en-US",
  "maxResults": 100
}
```

#### Mode 3: Direct Airbnb Search URLs (Maximum Control)

Go to [Airbnb.com](https://www.airbnb.com), perform any search with your custom filters, amenities (e.g., pool, beachfront, pet-friendly), or map zoom, then paste the URL directly into `startUrls`:

```json
{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/s/Wakad--Pune--Maharashtra/homes?guest_favorite=true&min_beds=2"
    }
  ],
  "maxResults": 100
}
```

***

### ⚙️ Input Configuration Reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `locationQueries` | `array` | `["London"]` | Target cities or regions to search. Example: `["New York", "Barcelona"]`. |
| `startUrls` | `array` | `[]` | Exact Airbnb search result URLs with custom filters. |
| `maxResults` | `integer` | `50` | Maximum listings to collect across the run. |
| `checkIn` | `string` | `""` | Arrival date in `YYYY-MM-DD` format (uses calendar picker). |
| `checkOut` | `string` | `""` | Departure date in `YYYY-MM-DD` format (uses calendar picker). |
| `currency` | `string` | `"USD"` | Target pricing currency (`USD`, `EUR`, `GBP`, `INR`, `AUD`, `CAD`, `JPY`, etc.). |
| `locale` | `string` | `"en-US"` | Display language & locale (`en-US`, `en-GB`, `fr-FR`, `de-DE`, `es-ES`, etc.). |
| `priceMin` | `integer` | `0` | Minimum nightly price filter. |
| `priceMax` | `integer` | `0` | Maximum nightly price filter. |
| `adults` | `integer` | `0` | Number of adult guests. |
| `children` | `integer` | `0` | Number of children. |
| `infants` | `integer` | `0` | Number of infants. |
| `pets` | `integer` | `0` | Number of pets allowed. |
| `minBeds` | `integer` | `0` | Minimum number of beds. |
| `minBedrooms` | `integer` | `0` | Minimum number of bedrooms. |
| `minBathrooms` | `integer` | `0` | Minimum number of bathrooms. |

***

### 📊 Sample Output Data

```json
{
  "id": "1192847192837192",
  "url": "https://www.airbnb.com/rooms/1192847192837192",
  "name": "Luxury Central Penthouse with Skyline Terrace",
  "title": "Entire rental unit in Westminster",
  "roomType": "Entire rental unit",
  "price": "$280",
  "priceQualifier": "per night",
  "rating": "4.96",
  "ratingA11yLabel": "4.96 out of 5 stars, 142 reviews",
  "coordinates": {
    "latitude": 51.4995,
    "longitude": -0.1332
  },
  "roomDetails": [
    "4 guests",
    "2 bedrooms",
    "2 beds",
    "2 baths"
  ],
  "images": [
    "https://a0.muscache.com/im/pictures/hosting/Hosting-1192847192837192/original/a1b2c3d4-e5f6-7890.jpeg"
  ],
  "checkIn": "2026-12-01",
  "checkOut": "2026-12-07"
}
```

***

### 💼 Practical Use Cases

- **📈 Short-Term Rental Market Research:** Track pricing dynamics, occupancy trends, and supply in emerging tourist hotspots.
- **🏷️ Real Estate Investing & Arbitrage:** Identify high-performing property types, bed-to-bath ratios, and average nightly rates (ADR).
- **🥊 Competitor Price Monitoring:** Automatically monitor competitor listings and adjust dynamic pricing for your vacation rental portfolio.
- **🗺️ Travel & Hospitality Aggregators:** Populate travel booking websites, itinerary planners, and comparison portals with live Airbnb data.
- **🤖 AI & Machine Learning:** Build models to predict listing demand, optimal pricing algorithms, and guest review sentiment.

***

### 🔄 Integrations & Export Formats

Mikolabs Airbnb Scraper connects seamlessly with your existing data stack:

- **Export Formats:** Download data directly from Apify Console in **JSON**, **CSV**, **Excel (XLSX)**, **XML**, or **HTML table**.
- **No-Code Automation:** Connect directly to **Make**, **Zapier**, **Google Sheets**, **Slack**, and **Airtable**.
- **Webhooks:** Set up real-time webhooks to trigger downstream cloud functions or database imports upon crawl completion.

***

### 💻 Programmatic API Access

You can trigger and integrate this scraper directly from your applications using Apify's official client libraries:

#### Node.js / JavaScript

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

const client = new ApifyClient({
    token: 'YOUR_APIFY_TOKEN',
});

const run = await client.actor('mikolabs/airbnb-scraper').call({
    locationQueries: ['London, UK'],
    maxResults: 50,
    currency: 'USD',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Retrieved ${items.length} listings:`, items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("mikolabs/airbnb-scraper").call(
    run_input={
        "locationQueries": ["Paris, France"],
        "maxResults": 50,
        "currency": "EUR",
    }
)

dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"Scraped {len(dataset_items)} listings.")
```

***

### ❓ Frequently Asked Questions (FAQ)

##### How fast is this scraper?

Thanks to Mikolabs' parallel cursor batching and asset blocking, this Actor scrapes **50 listings in ~18–35 seconds**.

##### Do I need my own proxies?

No. The Actor comes pre-configured with Apify Residential Proxies (`RESIDENTIAL` group), ensuring seamless rotation and maximum success rate. When running locally without a paid proxy plan, it automatically falls back gracefully.

##### Can I scrape thousands of listings?

Yes. Simply adjust `maxResults` to your desired volume. For large datasets (e.g., 500+ listings), we recommend splitting queries across multiple sub-locations (e.g., neighborhood names) to bypass Airbnb's internal ~300-listing search query ceiling.

***

### 📬 Support & Feedback

Maintained by **Mikolabs**. We continuously maintain and optimize this Actor to adapt to Airbnb's frequent layout and API changes.

Have a feature request, question, or need a custom enterprise scraping solution?

- Open an issue in the **Issues** tab.
- Contact our team through [Mikolabs on Apify](https://apify.com).

# Actor input Schema

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

List of location queries to scrape. Example: London, Manchester, Birmingham, etc.

## `maxResults` (type: `integer`):

Maximum results to return from this run

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

List of Airbnb URLs to start with. Note that you can only use search URLs here and not direct property URLs.

## `enrichUserProfiles` (type: `boolean`):

If enabled, the actor makes extra requests for each host/co-host in every listing to get more detailed user info.

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

Date must be in YYYY-MM-DD format with zero-padded month and day, e.g., 2026-12-01.

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

Date must be in YYYY-MM-DD format with zero-padded month and day, e.g., 2026-12-31.

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

Localized results in this locale will be extracted (language and region).

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

Currency that will be extracted for prices.

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

Minimum price per night

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

Maximum price per night

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

Minimum number of beds

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

Minimum number of bedrooms

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

Minimum number of bathrooms

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

Number of adult guests

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

Number of children guests

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

Number of infants

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

Number of pets

## Actor input object example

```json
{
  "locationQueries": [
    "London"
  ],
  "maxResults": 20,
  "startUrls": [],
  "enrichUserProfiles": false,
  "locale": "en-US",
  "currency": "USD",
  "priceMin": 0,
  "priceMax": 0,
  "minBeds": 0,
  "minBedrooms": 0,
  "minBathrooms": 0,
  "adults": 0,
  "children": 0,
  "infants": 0,
  "pets": 0
}
```

# Actor output Schema

## `results` (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"
    ],
    "maxResults": 20,
    "startUrls": [],
    "locale": "en-US",
    "currency": "USD",
    "priceMin": 0,
    "priceMax": 0,
    "minBeds": 0,
    "minBedrooms": 0,
    "minBathrooms": 0,
    "adults": 0,
    "children": 0,
    "infants": 0,
    "pets": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikolabs/airbnb").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"],
    "maxResults": 20,
    "startUrls": [],
    "locale": "en-US",
    "currency": "USD",
    "priceMin": 0,
    "priceMax": 0,
    "minBeds": 0,
    "minBedrooms": 0,
    "minBathrooms": 0,
    "adults": 0,
    "children": 0,
    "infants": 0,
    "pets": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("mikolabs/airbnb").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"
  ],
  "maxResults": 20,
  "startUrls": [],
  "locale": "en-US",
  "currency": "USD",
  "priceMin": 0,
  "priceMax": 0,
  "minBeds": 0,
  "minBedrooms": 0,
  "minBathrooms": 0,
  "adults": 0,
  "children": 0,
  "infants": 0,
  "pets": 0
}' |
apify call mikolabs/airbnb --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikolabs/airbnb"
        }
    }
}
```

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/v1sP4iciJIfAPdeSi/builds/YvSlDspnhYzDWphLl/openapi.json
