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

Search Airbnb listings by location and dates via the same embedded search data the website uses. Get name, type, rating, review count, price, GPS coordinates, photos, and badges (Superhost, Guest favorite) for up to 270 listings per search — no API key or account required.

- **URL**: https://apify.com/romy/airbnb-search-scraper.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.56 / 1,000 listing chargeds

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

### What does Airbnb Search Scraper do?

**Airbnb Search Scraper** searches Airbnb homes by destination and filters — dates, guests, price range, bedrooms/beds/bathrooms, room type, amenities, Instant Book, Guest favourites — and pushes every listing to the dataset, paginating automatically until it runs out of results or hits your `maxPages`/`maxItems` limit.

It talks directly to the same internal API the official [Airbnb](https://www.airbnb.com/) Android app uses (`api.airbnb.com`), reverse-engineered by live MITM capture against a real device — a real Apollo-style GraphQL persisted query the app itself sends (exact query hash captured live, never guessed). No Airbnb account, no API key, no scraping setup. This is the search slice of [Airbnb All-in-One API](https://apify.com/romy/airbnb-all-in-one-api), split out as its own focused Actor.

### Why use Airbnb Search Scraper?

- **Real, server-computed pricing in any currency** — pass `currency: "IDR"` (or any ISO code) and get genuine localized prices from Airbnb's own server, not a client-side conversion
- **Real filters** — price range, bedrooms/beds/bathrooms, room type, amenities, Instant Book, Guest favourite, host language — the same filter chips the app's own search screen uses
- **Automatic pagination** — Airbnb's own pagination quietly switches from `GET` to `POST` after page 1 (real gotcha, handled for you)
- **Global** — not tied to one country's data
- **No account needed** — every read request works fully anonymously
- **Use cases:** travel search products, price-comparison tools, market research, lead generation

### Input

| Field                             | Type          | Description                                                                                         |
| --------------------------------- | ------------- | --------------------------------------------------------------------------------------------------- |
| `query`                           | string        | Free-text destination, e.g. `Bali, Indonesia`. Required unless `placeId` is set.                    |
| `placeId`                         | string        | Exact Airbnb place id (from an autosuggest lookup) — more precise than `query`.                     |
| `checkin` / `checkout`            | string (date) | `YYYY-MM-DD`                                                                                        |
| `adults` / `children` / `infants` | integer       | Guest counts (default `adults: 1`)                                                                  |
| `priceMin` / `priceMax`           | integer       | Total trip price range, in whole units of `currency`                                                |
| `bedrooms` / `beds` / `bathrooms` | integer       | Minimum counts ("at least this many")                                                               |
| `roomType`                        | string        | `Entire home/apt` | `Private room` — the real strings the app sends                                |
| `amenities`                       | integer\[]     | Airbnb amenity ids. Only `4` (Wifi) and `7` (Pool) confirmed by hand — any other real id also works |
| `allowsPets`                      | boolean       | "Allows pets" filter chip — not a pet count                                                         |
| `instantBook`                     | boolean       | Only Instant Book listings                                                                          |
| `guestFavorite`                   | boolean       | Only "Guest favourite" listings                                                                     |
| `hostLanguages`                   | string\[]      | ISO-ish 2-letter host language codes, e.g. `["en"]`                                                 |
| `currency`                        | string        | ISO code, default `USD`                                                                             |
| `maxPages`                        | integer       | Stop after this many result pages (~8 listings/page). Default `10`.                                 |
| `maxItems`                        | integer       | Stop once this many listings have been pushed. Default: unbounded (bounded by `maxPages` instead).  |

Example:

```json
{
    "query": "Bali, Indonesia",
    "checkin": "2026-09-01",
    "checkout": "2026-09-05",
    "adults": 2,
    "priceMax": 3000000,
    "currency": "IDR",
    "maxPages": 5
}
```

### Output

One dataset row per listing, Airbnb's own `searchResults` item shape (trimmed example):

```json
{
    "title": "Villa in Tegalalang",
    "avgRatingA11yLabel": "New place to stay",
    "demandStayListing": { "id": "RGVtYW5kU3RheUxpc3Rpbmc6MTc0OTY2OTEzMTQ5MDM3NTU0Ng==" }
}
```

### Known limitations

- No destination autosuggest endpoint here — pass a plain-text `query` (Airbnb resolves it server-side) or supply a `placeId` you already have. For a dedicated autocomplete lookup, use [Airbnb All-in-One API](https://apify.com/romy/airbnb-all-in-one-api)'s `/autosuggest`.
- Listing detail, reviews, availability, host profiles, Experiences, and Services are separate spin-off Actors — this one is search-only.

### Pricing

Pay-per-event: $0.0020 per `listing` result pushed to the dataset (FREE plan price — BRONZE/SILVER/GOLD/PLATINUM/DIAMOND get automatic discounts based on your Apify plan). See the Actor's Pricing tab for current rates.

# Actor input Schema

## `query` (type: `string`):

Free-text destination, e.g. "Bali, Indonesia". Required unless placeId is set.

## `placeId` (type: `string`):

Exact Airbnb place id (from an autosuggest lookup) — more precise than query. Required unless query is set.

## `checkin` (type: `string`):

YYYY-MM-DD

## `checkout` (type: `string`):

YYYY-MM-DD

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

Adult guests.

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

Child guests.

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

Infant guests.

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

Minimum price to filter results.

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

Maximum price to filter results.

## `bedrooms` (type: `integer`):

Minimum number of bedrooms.

## `beds` (type: `integer`):

Minimum number of beds.

## `bathrooms` (type: `integer`):

Minimum number of bathrooms.

## `roomType` (type: `string`):

Room type filter, using the real values the app sends.

## `amenities` (type: `array`):

Numeric Airbnb amenity ids, e.g. \[4, 7] for Wifi + Pool. See README for known ids.

## `allowsPets` (type: `boolean`):

Only show listings that allow pets.

## `instantBook` (type: `boolean`):

Only show Instant Book listings.

## `guestFavorite` (type: `boolean`):

Only show Guest favourite listings.

## `hostLanguages` (type: `array`):

ISO-ish 2-letter codes, e.g. \["en", "fr"]

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

ISO 4217 currency code for returned prices.

## `maxPages` (type: `integer`):

Each page is ~8 listings.

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

Stop once this many listings have been pushed. Leave empty to only bound by maxPages.

## Actor input object example

```json
{
  "adults": 1,
  "children": 0,
  "infants": 0,
  "allowsPets": false,
  "instantBook": false,
  "guestFavorite": false,
  "currency": "USD",
  "maxPages": 10
}
```

# 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 = {};

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

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

```

## MCP server setup

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