# Airbnb Search Scraper (`virtual-constructs/airbnb-search-scraper`) Actor

Scrape Airbnb search results by location or by pasting a search URL. Get listing names, prices, ratings, review counts, coordinates, images, and badges as clean JSON. No login or API key. Stable schema built for market analysis, pricing dashboards, and AI agents (MCP-friendly).

- **URL**: https://apify.com/virtual-constructs/airbnb-search-scraper.md
- **Developed by:** [Virtual Constructs](https://apify.com/virtual-constructs) (community)
- **Categories:** Real estate, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 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.

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 Search Scraper

Scrape Airbnb search results by location or by pasting a search URL. Get
listing names, prices, ratings, review counts, coordinates, images, and
badges as clean JSON. No login, no API key.

The data comes from Airbnb's own server-rendered search pages, so the actor
is fast and cheap to run. Output is a stable, documented schema, easy to
wire into pricing dashboards, market analysis, and AI agent workflows.

### What data does this Airbnb scraper extract?

One dataset item per listing on the search results:

- Listing ID and canonical `airbnb.com/rooms` URL
- Name and room-type label (e.g. "Home in Austin")
- Price (parsed amount, currency, and the displayed string)
- Rating and review count
- Latitude/longitude of the listing's map position
- Photo URLs from the card carousel
- Badges (e.g. "Guest favorite") and a `isGuestFavorite` flag

### How to scrape Airbnb listings

1. Enter a **Location** the way you would type it on Airbnb, e.g.
   `Paris, France` or `Austin, TX`.
2. Optionally set check-in/check-out dates, guest counts, and a price range.
3. Run it. Results land in the dataset as JSON, CSV, or Excel.

Power users can skip the fields and paste a full **Search URL** instead
(with your own map bounds, amenities, or property-type filters); the actor
scrapes exactly that search.

#### Input

| Field                   | Type    | Default        | Notes                                                                          |
| ----------------------- | ------- | -------------- | ------------------------------------------------------------------------------ |
| `location`              | string  | required\*     | Search location, e.g. "Paris, France". \*Required unless `searchUrl` is set.   |
| `searchUrl`             | string  | none           | Full Airbnb search URL; overrides `location` and the guest/price fields.       |
| `checkIn` / `checkOut`  | string  | none           | ISO dates (YYYY-MM-DD). Prices are exact totals with dates, estimates without. |
| `adults`                | integer | 1              | Adult guests.                                                                  |
| `children`              | integer | none           | Children (2-12).                                                               |
| `priceMin` / `priceMax` | integer | none           | Price bounds in the search currency.                                           |
| `currency`              | string  | Airbnb default | ISO code, e.g. USD, EUR, GBP.                                                  |
| `maxListings`           | integer | 40             | Max listings to return (see the depth limit below).                            |
| `proxyConfiguration`    | object  | Apify Proxy on | Recommended; Airbnb rotates bot defenses.                                      |

#### Output example

```json
{
	"id": "28254684",
	"url": "https://www.airbnb.com/rooms/28254684",
	"name": "The Iconic Bloomhouse | Romantic Austin Escape",
	"roomType": "Home in Austin",
	"rating": 4.95,
	"reviewCount": 268,
	"price": {
		"amount": 2698,
		"currency": "USD",
		"qualifier": "for 5 nights",
		"displayPrice": "$2,698",
		"originalPrice": null,
		"accessibilityLabel": "$2,698 for 5 nights"
	},
	"coordinate": { "latitude": 30.3159, "longitude": -97.8036 },
	"badges": ["Guest favorite"],
	"isGuestFavorite": true,
	"images": ["https://a0.muscache.com/im/pictures/..."]
}
```

Every field is always present; missing data is `null`, never an absent key.
New fields may be added in future versions; existing fields will not change
shape.

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

Pay per event: you are charged per listing returned. A search that returns
nothing costs nothing. See the actor's pricing on its store page.

### Limits, stated plainly

- **Search results only.** This actor returns the listings on a search
  (name, price, rating, location, photos). It does not open each room for
  full descriptions, amenities, host details, availability calendars, or
  review text. That is a deliberate, separate scope.
- **Depth.** Airbnb's search paginates about 18 listings per page up to
  roughly 270 results per query. To go beyond that, narrow the location or
  add filters (dates, price, property type) and run again. `maxListings`
  caps at 270.
- **Prices are what Airbnb shows on the card.** Without dates they are
  estimates; with check-in/check-out they are the total for that stay. The
  `qualifier` field tells you which ("night", "for 5 nights"). Taxes and
  fees follow Airbnb's own card display.
- **Currency is inferred from the price symbol** ($, EUR, GBP, ...). Set the
  `currency` input for an explicit code, and read `displayPrice` for the
  exact string Airbnb rendered.
- **Coordinates are Airbnb's approximate map position,** not an exact
  street address (Airbnb obscures precise location until booking).
- **This is public search data only.** No login, no private host data, no
  guest data, ever.

### FAQ

**Can it scrape a single listing's full details (amenities, host, reviews)?**
Not in this actor; it scrapes search results. A detail-level scraper is a
separate scope. Open an issue on the Issues tab if you need it.

**Do I need an Airbnb account or API key?**
No. Nothing to register, no key, no login.

**Can I filter by amenities or property type?**
Yes, indirectly: build the search on airbnb.com with the filters you want,
then paste that URL into `searchUrl`.

**Can I export to CSV or Excel?**
Yes. The dataset exports as CSV, Excel, JSON, NDJSON, or XML.

**Why enable the proxy?**
Airbnb rotates its bot defenses. Apify Proxy spreads requests across IP
addresses and keeps runs reliable.

# Actor input Schema

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

Where to search, as you would type it on Airbnb, e.g. "Paris, France" or "Austin, TX". Ignored if Search URL is provided.

## `searchUrl` (type: `string`):

Paste a full Airbnb search URL to control every filter yourself (map bounds, amenities, property type). Overrides Location and the guest/price fields below.

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

Optional ISO date (YYYY-MM-DD). Prices are estimates without dates and exact totals with them.

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

Optional ISO date (YYYY-MM-DD). Required alongside Check-in for exact prices.

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

Number of adult guests.

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

Number of children (ages 2-12).

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

Optional lower price bound, in the search currency.

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

Optional upper price bound, in the search currency.

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

ISO currency code for displayed prices, e.g. USD, EUR, GBP. Defaults to Airbnb's choice for the location.

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

Maximum listings to return. Airbnb's search paginates ~18 per page up to roughly 270 results per query; narrow the location or add filters to go deeper.

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

Recommended. Airbnb rotates bot defenses; Apify Proxy spreads requests across IPs.

## Actor input object example

```json
{
  "location": "Paris, France",
  "adults": 1,
  "maxListings": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped listings as JSON. Append ?format=csv or ?format=ndjson to change the export format.

# 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"
};

// Run the Actor and wait for it to finish
const run = await client.actor("virtual-constructs/airbnb-search-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" }

# Run the Actor and wait for it to finish
run = client.actor("virtual-constructs/airbnb-search-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"
}' |
apify call virtual-constructs/airbnb-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/aNg7t3JOQjFgkH8W3/builds/RVhOK2xGerAjkWSGK/openapi.json
