# Airbnb Scraper - Listings, Prices, Ratings for Any City (`unbrowseai/airbnb-listings-scraper`) Actor

Scrape Airbnb search results for any city, neighbourhood or search URL: total and nightly price for your dates, rating, review count, room type, beds, bedrooms, coordinates, photos, Guest favourite and Superhost badges. Filters for guests, price and rooms. Half the usual price.

- **URL**: https://apify.com/unbrowseai/airbnb-listings-scraper.md
- **Developed by:** [Unbrowse AI](https://apify.com/unbrowseai) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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.
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?

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 and Ratings for Any City

Get Airbnb search results as clean, structured data: the real total price for your dates and the nightly rate, rating and review count, room type and neighbourhood, bedrooms and beds, exact coordinates, all listing photos, and the Guest favourite and Superhost badges. Search any city, neighbourhood or region, or paste Airbnb search URLs with your filters already set.

### What people use it for

- **Short-term rental market research** – average nightly rates, occupancy signals and supply by neighbourhood.
- **Pricing for hosts and property managers** – compare your listing with nearby competitors for the same dates.
- **Travel and trip planning tools** – feed live listings, prices and photos into your app or spreadsheet.
- **Real-estate investment analysis** – estimate revenue potential before buying.
- **Price tracking** – run on a schedule and watch prices change for holidays and events.

### How to use it

1. Enter one or more **locations** (for example `Lisbon`, `Brooklyn`, `Lake Tahoe`), or paste **Airbnb search URLs**.
2. Add **check-in and check-out** dates to get the real total price for the stay (recommended).
3. Optionally set guests, pets, price range, minimum bedrooms, beds and bathrooms, and the **currency**.
4. Set **Max listings per location** (Airbnb shows up to about 270 per search; split large cities into neighbourhoods to get more).
5. Run, then export as JSON, CSV or Excel, or read the dataset through the API.

### Output example

```json
{
  "id": "15629885",
  "url": "https://www.airbnb.com/rooms/15629885?check_in=2026-11-10&check_out=2026-11-12",
  "name": "Romantic and cosy studio in the heart of Lisbon.",
  "title": "Serviced apartment in Campo de Ourique",
  "roomType": "Serviced apartment",
  "neighborhood": "Campo de Ourique",
  "rating": 4.94,
  "reviewsCount": 319,
  "isGuestFavorite": true,
  "isSuperhost": false,
  "badges": ["Guest favourite"],
  "price": { "total": 198, "perNight": 98.99, "originalTotal": null, "currency": "USD", "nights": 2, "label": "$198 USD for 2 nights" },
  "bedrooms": 1,
  "beds": 1,
  "bedInfo": ["1 bedroom", "1 king bed"],
  "latitude": 38.7188,
  "longitude": -9.1576,
  "thumbnail": "https://a0.muscache.com/im/pictures/miso/Hosting-15629885/original/1efd05f3-….jpeg",
  "photos": ["https://a0.muscache.com/im/pictures/…"],
  "paymentNotes": ["Pay $0 today", "Free cancellation"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "searchQuery": "Lisbon"
}
```

`price.originalTotal` is filled when Airbnb shows a discount (the struck-through price).

### Pricing

One price per listing:

| Apify plan | Price per 1,000 listings |
|---|---|
| Free | $2.00 |
| Starter | $1.00 |
| Scale | $0.75 |
| Business | $0.50 |
| Enterprise | $0.25–$0.38 |

About half of what the most used Airbnb scrapers charge per listing. Searches that fail or return nothing are free. A small fee applies to each run start. Set a maximum cost per run and the scraper stops cleanly at that limit.

### FAQ

**Why do some prices differ from the Airbnb website?** Prices depend on dates, guests and currency. Set check-in, check-out and guests to match what you compare against.

**Can I get more than 270 listings for a city?** Airbnb caps each search. Run several searches for neighbourhoods, or narrow by price range, and duplicates are removed within a run.

**Does it include reviews text, amenities or host details?** Not yet: it returns what the search results show. Open an issue if you need listing details.

**Is it legal?** It collects publicly visible listing information. You are responsible for how you use the data, including Airbnb's terms and data protection law.

Missing a field or filter? Open an issue on the Issues tab.

# Actor input Schema

## `locationQueries` (type: `array`):

Cities, neighbourhoods or regions as you would type them in Airbnb's search box (e.g. Lisbon, Brooklyn, Lake Tahoe).

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

Optional. Airbnb search result URLs (airbnb.com/s/...), with any filters already applied.

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

Airbnb shows at most about 270 listings per search (15 pages). Split big cities into neighbourhoods for more.

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

Arrival date (YYYY-MM-DD). With dates, prices are the real total for your stay.

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

Departure date (YYYY-MM-DD).

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

Number of adult guests.

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

Children aged 2–12.

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

Infants under 2.

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

Pets; only pet-friendly listings are shown.

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

In the chosen currency.

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

In the chosen currency.

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

Minimum number of bedrooms.

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

Minimum number of beds.

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

Minimum number of bathrooms.

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

Three-letter currency code for prices (USD, EUR, GBP, ...).

## Actor input object example

```json
{
  "locationQueries": [
    "Lisbon"
  ],
  "startUrls": [],
  "maxResults": 10,
  "adults": 1,
  "currency": "USD"
}
```

# Actor output Schema

## `listings` (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 = {
    "locationQueries": [
        "Lisbon"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("unbrowseai/airbnb-listings-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 = {
    "locationQueries": ["Lisbon"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("unbrowseai/airbnb-listings-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 '{
  "locationQueries": [
    "Lisbon"
  ],
  "maxResults": 10
}' |
apify call unbrowseai/airbnb-listings-scraper --silent --output-dataset

```

## MCP server setup

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