# 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Search Scraper",
        "description": "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).",
        "version": "0.0",
        "x-build-id": "RVhOK2xGerAjkWSGK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/virtual-constructs~airbnb-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-virtual-constructs-airbnb-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/virtual-constructs~airbnb-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-virtual-constructs-airbnb-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/virtual-constructs~airbnb-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-virtual-constructs-airbnb-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Where to search, as you would type it on Airbnb, e.g. \"Paris, France\" or \"Austin, TX\". Ignored if Search URL is provided."
                    },
                    "searchUrl": {
                        "title": "Search URL (advanced)",
                        "type": "string",
                        "description": "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": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Optional ISO date (YYYY-MM-DD). Prices are estimates without dates and exact totals with them."
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Optional ISO date (YYYY-MM-DD). Required alongside Check-in for exact prices."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Number of adult guests.",
                        "default": 1
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of children (ages 2-12)."
                    },
                    "priceMin": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional lower price bound, in the search currency."
                    },
                    "priceMax": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional upper price bound, in the search currency."
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO currency code for displayed prices, e.g. USD, EUR, GBP. Defaults to Airbnb's choice for the location."
                    },
                    "maxListings": {
                        "title": "Max listings",
                        "minimum": 1,
                        "maximum": 270,
                        "type": "integer",
                        "description": "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.",
                        "default": 40
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Recommended. Airbnb rotates bot defenses; Apify Proxy spreads requests across IPs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
