# Airbnb Search Scraper (`electrabot.info/airbnb-search-scraper`) Actor

Scrapes Airbnb search results with full filter support: dates, guests, price, room type, property type, amenities, booking options, and category tags.

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

## Pricing

from $2.00 / 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

Search **Airbnb listings** by location and filters — and get name, price (with
discounts), rating, review count, coordinates, room type, Superhost and
Guest-favourite badges, and photos — as JSON, CSV, or Excel.

No browser, no API key. Full filter support: dates, guests, price range,
bedrooms, beds, bathrooms, room type, Superhost.

**Pay per result** — you're charged per listing delivered.

***

### What can I use it for?

- **Market & pricing research** — what do comparable stays charge in a city, on your dates? Prices come parsed as numbers, not strings.
- **Short-let investment analysis** — ratings, review counts, and coordinates let you map supply, demand, and quality by neighbourhood.
- **Competitor monitoring** — track a market's listings, prices, and badges over time.
- **Travel and comparison sites** — build inventory feeds with images and deep links.
- **Data science / AI** — geo-coded, structured listing data ready for modelling.

***

### Input

| Field | Required | Description |
|-------|----------|-------------|
| **Location** | ◐ | e.g. `Lisbon, Portugal`. Provide this **or** a search URL. |
| **…or an Airbnb search URL** | ◐ | Paste a ready-made Airbnb search link (with your own filters or map bounds). |
| **Check-in / Check-out** | – | `YYYY-MM-DD`. **Prices are only exact when dates are set** — otherwise Airbnb shows indicative pricing. |
| **Adults / Children / Infants / Pets** | – | Guest counts (affects availability and price). |
| **Min / Max price** | – | Per-night price band. |
| **Min bedrooms / beds / bathrooms** | – | Size filters. |
| **Room types** | – | Entire home/apt, Private room, Shared room, Hotel room. |
| **Superhost only** | – | Restrict to Superhost listings. |
| **Currency** | – | ISO code (`USD`, `EUR`, `GBP`…). Default `USD`. |
| **Max listings** | – | 1–1,000 (default 100). Each listing is one billable result. |
| **Proxy configuration** | – | **Automatic by default:** datacenter proxy first, escalating to RESIDENTIAL only if Airbnb blocks it. |

### Output

One record per listing:

```json
{
  "listingId": "45307024",
  "url": "https://www.airbnb.com/rooms/45307024",
  "name": "THE miniPENTHOUSE terrace & SPA",
  "roomType": "Room in Lisbon",
  "locationLine": "Home Out 303 - Suite w/WC + balcony",
  "details": ["2 bedrooms", "12–17 Jan"],
  "rating": 4.93,
  "reviewsCount": 45,
  "priceLabel": "$1,079",
  "price": 1079.0,
  "originalPrice": 1199.0,
  "currency": "$",
  "priceQualifier": "for 5 nights",
  "isGuestFavorite": true,
  "isSuperhost": false,
  "badges": ["Guest favourite"],
  "latitude": 38.6929,
  "longitude": -9.298,
  "imageUrls": ["https://a0.muscache.com/im/pictures/..."],
  "thumbnailUrl": "https://a0.muscache.com/im/pictures/..."
}
```

| Field | Description |
|-------|-------------|
| `price` / `originalPrice` | **Parsed numbers**, not display strings — sort and average them directly. Discounted stays show both. |
| `rating` / `reviewsCount` | Parsed out of Airbnb's rating label |
| `latitude` / `longitude` | Map listings, cluster by neighbourhood, compute distances |
| `isGuestFavorite` / `isSuperhost` | Quality signals |
| `imageUrls` | Full-size photo URLs |

***

### Why this scraper is reliable

- **Reads Airbnb's own structured data** — the actor parses the GraphQL payload Airbnb embeds in its search pages, so you get exactly the values the site shows, not text scraped off the screen.
- **No browser** — one request per page of 18 listings. Fast and cheap.
- **Fails loudly on format changes** — if Airbnb changes its page structure, the run reports **schema drift** explicitly instead of quietly returning an empty dataset. (A scraper that silently returns nothing when a site changes is worse than one that stops: you'd never know your data was wrong.) A daily automated check on our side catches this before you do.
- **Block-aware with automatic escalation** — datacenter proxy first, then residential, then a fresh IP, before ever giving up.
- **Prices parsed across locales** — `$1,234.50`, `€1.234,50`, `₹1,07,897` all become correct numbers.
- **Batch-safe** — listings are saved incrementally, deduplicated across pages, and runs are checkpointed: an interruption never loses finished work or double-charges you.

### Tips & limits

- **Set check-in/check-out dates for exact prices.** Without dates, Airbnb shows indicative pricing that can differ from a real booking quote.
- Airbnb's search returns roughly 270–300 listings per query. To cover a whole city, split it into neighbourhoods (or paste map-bounded search URLs) rather than raising **Max listings**.
- `price` reflects Airbnb's displayed total for the selected dates and guests (see `priceQualifier`, e.g. "for 5 nights").

### Use it from code

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("electrabot.info/airbnb-search-scraper").call(
    run_input={"location": "Lisbon, Portugal", "checkIn": "2026-09-01",
               "checkOut": "2026-09-05", "adults": 2, "maxResults": 200}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
avg = sum(r["price"] for r in rows if r["price"]) / len(rows)
print(f"average: {avg:.0f}")
```

### FAQ

**Why are some prices null?**
Occasionally a listing shows no price (unavailable for your dates). The record is still returned with everything else.

**Can I search a map area instead of a city name?**
Yes — draw the area on Airbnb, copy the URL, and paste it into **Airbnb search URL**.

**Does it get amenities / host details / full descriptions?**
Those live on each listing's own page, not in search results. Tell us in the Issues tab if you need a detail-page scraper.

**Is scraping Airbnb legal?**
This actor accesses only publicly available search results. You are responsible for complying with applicable laws and Airbnb's Terms of Service.

***

### Disclaimer

**This is an unofficial tool. It is not affiliated with, endorsed by, sponsored by,
or in any way officially connected to Airbnb, Inc.** "Airbnb" and related names,
marks, and logos are trademarks of their respective owners and are used here for
descriptive purposes only.

This actor accesses only **publicly available** information. You are responsible
for ensuring your use complies with applicable laws, Airbnb's Terms of Service,
and applicable rate-limiting rules. Use it ethically and at your own risk.

# Actor input Schema

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

Where to search, e.g. 'Lisbon, Portugal' or 'Paris'. Each listing found is one result.

## `startUrl` (type: `string`):

Paste a ready-made Airbnb search URL (with your own filters/map bounds) instead of a location.

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

YYYY-MM-DD. Prices are only exact when dates are set.

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

YYYY-MM-DD.

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

Number of adult guests. Affects availability and price.

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

Number of children (ages 2-12).

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

Number of infants (under 2).

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

Number of pets. Restricts results to pet-friendly stays.

## `minPrice` (type: `integer`):

Lowest nightly price to include, in the selected currency.

## `maxPrice` (type: `integer`):

Highest nightly price to include, in the selected currency.

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

Only listings with at least this many bedrooms.

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

Only listings with at least this many beds.

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

Only listings with at least this many bathrooms.

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

Restrict to these room types.

## `superhost` (type: `boolean`):

Only return listings hosted by Superhosts.

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

Currency for prices (ISO code, e.g. USD, EUR, GBP).

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

Maximum listings to return (1-1000). Each listing is one billable result.

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

Default (recommended): automatic tiering - cheap datacenter proxy first, auto-escalating to RESIDENTIAL only if Airbnb blocks it.

## Actor input object example

```json
{
  "location": "Lisbon, Portugal",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "superhost": false,
  "currency": "USD",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One record per video: full plain-text transcript, timed segments, language info, and video metadata.

## `runSummary` (type: `string`):

Requested/scraped/failed counts and per-video failure reasons.

# 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": "Lisbon, Portugal",
    "currency": "USD",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("electrabot.info/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": "Lisbon, Portugal",
    "currency": "USD",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("electrabot.info/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": "Lisbon, Portugal",
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call electrabot.info/airbnb-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zJjUqNPZ6ZQ46uJ8a/builds/Y0Nybpcx5JrpxEuvf/openapi.json
