# Airbnb Scraper — Listings, Prices & Ratings, Cheap (`fabrikit/airbnb-search-scraper`) Actor

Airbnb scraper for search results: listing name, type, area, GPS, price per night and total, rating, review count, beds, baths, badges and photos. Search by place or paste Airbnb search URLs; filter by dates, guests, price, room type. No login, no host personal data. Pay per result, no subscription.

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

## Pricing

from $1.50 / 1,000 listing scrapeds

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/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 — Listings, Prices & Ratings, Cheap

Collect Airbnb search results at scale: listing name, type, area, GPS coordinates, price per night and total for your dates, rating, review count, bedrooms/beds/bathrooms, badges (Superhost, Guest favourite) and photos. Search by place name or paste Airbnb search URLs. No login, no cookies, no browser, and no host personal data.

Pay per listing saved. See *How much does it cost to scrape Airbnb?* below.

### What it does

- Runs one search per location or URL and saves one row per listing.
- Works around Airbnb's cap of roughly 270 listings per search: when a search is exhausted, the Actor splits it by room type and then by nightly price bands, so a single run can return thousands of unique listings from a large city.
- Reads Airbnb's current API settings from the live site at the start of every run, so it keeps working when the site redeploys.
- Prices come in the currency and language you pick.
- Starts on Apify datacenter proxy and switches to residential proxy automatically if Airbnb blocks it.

### Who it is for

- **Hosts and property managers** benchmarking their nightly price, rating and badges against nearby listings for the same dates.
- **Short-term rental investors** sizing supply, price levels and review volume by neighbourhood before buying.
- **Travel startups and price-comparison sites** that need fresh Airbnb prices for given dates and guests.
- **Analysts, researchers and city planners** studying short-term rental density with GPS coordinates.
- **Agencies and data teams** feeding listing data into dashboards, spreadsheets or BI tools on a schedule.

### Key features

- **Search by place or by URL**: type `Lisbon, Portugal` or paste any airbnb.com search URL; dates, guests, price range, room type and map bounds in the URL are used as-is.
- **Real prices for your stay**: with check-in and check-out you get the nightly average and the total Airbnb quotes for those dates and guests.
- **Filters**: room type, nightly price range, minimum bedrooms, beds and bathrooms, adults, children, infants and pets.
- **Beyond the ~270 cap**: automatic splitting by room type and price bands (and map quadrants for map URLs), with duplicates removed by listing id.
- **Exact limits**: `maxItems` across all searches, `maxItemsPerSearch` per location, and your Apify spending limit are all respected.
- **Privacy by design**: no host names, no reviewer names, no review texts.

### Input

| Field | Meaning |
|---|---|
| `locations` | Places, e.g. `Lisbon, Portugal`. One search each. |
| `startUrls` | Airbnb search URLs (place, dates, guests, price, room type and map bounds are read from the URL). |
| `checkIn`, `checkOut` | `YYYY-MM-DD`. Without dates Airbnb quotes a default 5-night stay. |
| `adults`, `children`, `infants`, `pets` | Guests. |
| `priceMin`, `priceMax` | Nightly price range in the chosen currency (0 = none). |
| `roomTypes` | `entire_home`, `private_room`, `hotel_room`, `shared_room`. |
| `minBedrooms`, `minBeds`, `minBathrooms` | Size filters. |
| `currency`, `locale` | e.g. `EUR` and `es`. |
| `maxItems` | Total listings to save (default 50). |
| `maxItemsPerSearch` | Optional cap per location/URL. |

Example:

```json
{
  "locations": ["Lisbon, Portugal", "Porto, Portugal"],
  "checkIn": "2026-12-01",
  "checkOut": "2026-12-04",
  "adults": 2,
  "roomTypes": ["entire_home"],
  "priceMax": 150,
  "currency": "EUR",
  "maxItems": 500,
  "maxItemsPerSearch": 250
}
```

#### More input examples

Airbnb prices in Mexico City in US dollars (the "Airbnb prices in Mexico City" example task):

```json
{ "locations": ["Mexico City, Mexico"], "currency": "USD", "locale": "en", "maxItems": 50 }
```

Listings in Barcelona in euros (the "Airbnb listings in Barcelona" task):

```json
{ "locations": ["Barcelona, Spain"], "currency": "EUR", "locale": "en", "maxItems": 50 }
```

Family stays with 2+ bedrooms in Rio de Janeiro for New Year:

```json
{
  "locations": ["Rio de Janeiro, Brazil"],
  "checkIn": "2026-12-29",
  "checkOut": "2027-01-02",
  "adults": 4,
  "children": 2,
  "minBedrooms": 2,
  "roomTypes": ["entire_home"],
  "currency": "USD",
  "maxItems": 200
}
```

### Output

```json
{
  "id": "978163736844393100",
  "url": "https://www.airbnb.com/rooms/978163736844393100?check_in=2026-12-01&check_out=2026-12-04&adults=2",
  "name": "Alfama Village with Air Conditioning, door 19",
  "roomType": "Apartment",
  "area": "Santa Maria Maior",
  "city": "Lisbon",
  "latitude": 38.713,
  "longitude": -9.1295,
  "currency": "EUR",
  "pricePerNight": 66.9,
  "priceTotal": 201,
  "originalPriceTotal": null,
  "nights": 3,
  "priceLabel": "€201 for 3 nights",
  "rating": 4.84,
  "reviewsCount": 246,
  "bedrooms": 1,
  "beds": 1,
  "bathrooms": 1,
  "isSuperhost": false,
  "isGuestFavorite": true,
  "badges": ["Guest favorite"],
  "images": ["https://a0.muscache.com/im/pictures/..."],
  "checkIn": "2026-12-01",
  "checkOut": "2026-12-04",
  "searchQuery": "Lisbon, Portugal",
  "scrapedAt": "2026-10-13T11:58:48.933Z"
}
```

Notes on fields: `pricePerNight` is the average nightly rate after any discount, `priceTotal` is the quoted total for the stay shown on the search card (before taxes/fees Airbnb adds at checkout), and `originalPriceTotal` is set when the host lowered the price. `area` is the neighbourhood from the listing title and `city` comes from your search text. Rooms found through map-bounds URLs have no title, so `roomType`/`area` can be empty there. Bedroom/bath parsing is most complete with `locale: en`.

#### Output fields

| Field | Description |
|---|---|
| `id` / `url` | Airbnb listing id and link (with your dates and guests). |
| `name` | Listing title. |
| `roomType` | Kind of stay (Apartment, Home, Room…). |
| `area` / `city` | Neighbourhood from the title; city from your search. |
| `latitude` / `longitude` | Map position Airbnb shows for the listing. |
| `currency` | Currency of all prices. |
| `pricePerNight` | Average nightly rate after discounts. |
| `priceTotal` / `originalPriceTotal` | Total for the stay; original total when discounted. |
| `nights` / `priceLabel` | Number of nights and Airbnb's price text. |
| `rating` / `reviewsCount` | Average rating and number of reviews. |
| `bedrooms` / `beds` / `bathrooms` | Size of the listing. |
| `isSuperhost` / `isGuestFavorite` / `badges` | Airbnb badges. |
| `images` | Photo URLs. |
| `checkIn` / `checkOut` | Dates used for the quote. |
| `searchQuery` | The location or URL that found the listing. |
| `scrapedAt` | When the row was collected. |

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

| Event | When it is charged |
|---|---|
| `listing-result` | One listing saved |
| `apify-actor-start` | Once per run (a fraction of a cent) |

From 30 October 2026, 1,000 listings cost US$3 on the Apify Free plan; paid Apify plans pay less per listing — see the **Pricing** tab.

You are only charged for listings written to the dataset. The Actor stops cleanly if your spending limit is reached.

### FAQ

**Does it need a login or cookies?** No. It reads public search results only.

**Does it return host names or reviews?** No. Host names, reviewer names and review texts are deliberately not collected.

**Why did I get fewer listings than `maxItems`?** The place may simply have fewer listings for your filters and dates. A search with a place name Airbnb does not recognise returns Airbnb's generic results, so check spelling.

**Which currency are price filters in?** The `currency` you choose.

**Is the data live?** Yes, each run queries Airbnb at that moment; prices depend on the dates you give.

**How do I get every listing in a big city?** Set a high `maxItems` and leave `maxItemsPerSearch` at 0. When the ~270-result cap is hit, the actor splits the search automatically. For very large areas you can also paste several map-bounds search URLs, one per district.

**What happens if no listings come back?** The run fails with a message asking you to check the location spelling, the dates (check-out after check-in, in the future) and the filters, so a broken scheduled search does not look like an empty market.

**Can I track prices over time?** Yes. Save your input as a task with fixed dates and schedule it daily or weekly; compare `pricePerNight` and `priceTotal` per listing `id` across runs.

**Does it include taxes and cleaning fees?** `priceTotal` is the total shown on the search card for your dates. Taxes and fees added at checkout are not included.

### Use cases

- Short-term rental market and pricing analysis by neighbourhood.
- Competitor monitoring for hosts and property managers.
- Travel price comparison and deal alerts.
- Real-estate investment research (supply, ratings, occupancy proxies).

### Is it legal to scrape Airbnb?

This actor only collects listing information that Airbnb shows publicly in its search results, without logging in, and it deliberately leaves out host names, reviewer names and review texts. Listing titles or photos can still reveal personal details in some cases, so data-protection laws such as the EU GDPR, Chile's Ley 21.719 or the California CCPA may apply to how you store and use the data; you are responsible for having a lawful purpose. Photos belong to their owners, so do not republish them. You should also respect Airbnb's terms of service. This is general information, not legal advice.

### Integrations

Run the Airbnb Scraper from the Apify API or the JavaScript and Python clients, push results to your systems with webhooks, or schedule daily price checks in Apify Console. It works with n8n, Make and Zapier (for example, to append prices to Google Sheets), and with LangChain and LlamaIndex through their Apify integrations. AI agents in Claude, ChatGPT, Cursor and other MCP clients can find and run it through Apify's MCP server. Export as JSON, CSV or Excel, or read from the dataset API.

### Use with AI agents

Use this actor to get Airbnb listings for a place (or an Airbnb search URL) with nightly and total prices for given dates and guests, ratings, size and coordinates.

```json
{ "locations": ["Lisbon, Portugal"], "checkIn": "2026-12-01", "checkOut": "2026-12-04", "adults": 2, "maxItems": 30 }
```

Main output fields: `name`, `url`, `roomType`, `area`, `pricePerNight`, `priceTotal`, `currency`, `rating`, `reviewsCount`, `bedrooms`, `beds`, `bathrooms`, `latitude`, `longitude`. It is pay-per-event: an agent pays a small start fee plus a fixed price per listing saved, not for compute time.

### Related actors

- [Booking.com Scraper](https://apify.com/fabrikit/booking-hotels-scraper) — hotel prices and ratings for the same destination and dates.
- [Google Maps Scraper](https://apify.com/fabrikit/google-maps-places-scraper) — restaurants, shops and services around your listings.
- [Portal Inmobiliario Scraper](https://apify.com/fabrikit/portal-inmobiliario-scraper) — long-term rentals and sales in Chile.
- [Fincaraíz Scraper](https://apify.com/fabrikit/fincaraiz-scraper) — rentals and sales in Colombia.

#### Ready-made examples

- [Airbnb prices in Mexico City](https://apify.com/fabrikit/airbnb-search-scraper/examples/airbnb-mexico-city-prices)
- [Airbnb listings in Barcelona](https://apify.com/fabrikit/airbnb-search-scraper/examples/airbnb-barcelona-listings)
- [Airbnb in Rio de Janeiro](https://apify.com/fabrikit/airbnb-search-scraper/examples/airbnb-rio-de-janeiro)

### Changelog

- **2026-10-16** — README expanded: more input examples, output field table, FAQ, legal notes, integrations and example tasks.
- **2026-10-15** — Tiered pricing announced, effective 2026-10-30 (lower per-listing price on paid Apify plans).
- **2026-10-13** — Builds 0.1.1–0.1.3: initial release. Search by place or URL, automatic splitting beyond Airbnb's ~270-result cap, residential proxy fallback; build 0.1.3 fetches result pages in parallel for faster large runs.

### En español

Extrae listados de Airbnb por ciudad o por URL de búsqueda: nombre, tipo, zona, coordenadas, precio por noche y total, puntuación, número de reseñas, camas/baños, insignias y fotos. Sin login y sin datos personales de anfitriones. Divide automáticamente las búsquedas grandes por tipo de alojamiento y rangos de precio para superar el límite de ~270 resultados. Se cobra por listado guardado; el precio vigente para tu plan está en la pestaña Pricing.

# Actor input Schema

## `locations` (type: `array`):

Places to search, written like on Airbnb: `Lisbon, Portugal`, `Brooklyn, NY`, `Tokyo, Japan`. One search per entry. Add the country for small or ambiguous names.

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

Optional. Paste search URLs copied from airbnb.com (`/s/<place>/homes?...`). Place, dates, guests, price range, room type and map bounds in the URL are used as-is; the fields below only fill what the URL leaves out.

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

YYYY-MM-DD. Leave empty to see prices for Airbnb's default 5-night stay.

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

YYYY-MM-DD, after check-in. Both dates are needed for exact totals and availability.

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

Number of adult guests.

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

Guests aged 2-12.

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

Guests under 2.

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

Number of pets.

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

In the selected currency. 0 = no minimum.

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

In the selected currency. 0 = no maximum.

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

Only these kinds of stay. Leave empty for all.

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

0 = any.

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

0 = any.

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

0 = any.

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

ISO code for prices: USD, EUR, GBP, CLP, MXN ... Price filters are in this currency.

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

Airbnb language code: `en`, `es`, `fr`, `de`, `pt`, `it`... Titles and badges come back in this language; English gives the most complete bedroom/bath parsing.

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

Total listings to save across all searches. One Airbnb search shows at most ~270 listings, so for larger numbers the scraper automatically splits the search by room type and price bands.

## `maxItemsPerSearch` (type: `integer`):

Optional cap per location/URL so one big city does not use the whole budget. 0 = no per-search cap.

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

Starts on Apify datacenter proxy. If Airbnb blocks it, the Actor switches to residential proxy by itself for the rest of the run.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "startUrls": [],
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "priceMin": 0,
  "priceMax": 0,
  "roomTypes": [],
  "minBedrooms": 0,
  "minBeds": 0,
  "minBathrooms": 0,
  "currency": "USD",
  "locale": "en",
  "maxItems": 50,
  "maxItemsPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All listings collected during the run

# 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 = {
    "locations": [
        "Lisbon, Portugal"
    ],
    "startUrls": [],
    "currency": "USD",
    "locale": "en",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 = {
    "locations": ["Lisbon, Portugal"],
    "startUrls": [],
    "currency": "USD",
    "locale": "en",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/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 '{
  "locations": [
    "Lisbon, Portugal"
  ],
  "startUrls": [],
  "currency": "USD",
  "locale": "en",
  "maxItems": 50
}' |
apify call fabrikit/airbnb-search-scraper --silent --output-dataset

```

## MCP server setup

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