# Airbnb Listings Scraper (`santamaria-automations/airbnb-listings-scraper`) Actor

Scrape Airbnb listings for any city or region: price per night, rating, reviews, coordinates, photos, host type and room type. Optional details add description, bedrooms, beds, bathrooms and max guests. $0.003 per listing, $0.005 with details, $0.005 per run start.

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

## Pricing

Pay per event

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 Listings Scraper

Scrape stay listings from [Airbnb](https://www.airbnb.com) by city or area. Get prices per night and for the whole stay, ratings, review counts, coordinates, host type, badges, photos and, optionally, the description, bedrooms, beds and bathrooms of every listing. No login and no proxy needed.

### What data can you extract?

- **Listing id, URL, title, listing name** and property type (Apartment, Home, Cabin, Room in hotel ...)
- **Price for the stay and per night**, the original price when discounted, nights, check-in and check-out, in the currency you choose
- **Rating and number of reviews**
- **Latitude and longitude** as shown by Airbnb
- **Host type** (Individual or Business host, searches without dates), **Guest favorite** and **Superhost** badges
- **Bedrooms, beds and bathrooms** (searches with dates, or details mode)
- **Photo URLs**
- **Description, room type and maximum guests** (details mode)

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

```
https://mcp.apify.com?tools=santamaria-automations/airbnb-listings-scraper
```

**Example prompt once connected:**

> "Use `airbnb-listings-scraper` to find stays in Lisbon for 1-4 December for 2 adults and list the 10 cheapest per night with rating above 4.7."

Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via `add-actor`.

### How to use

```json
{
  "locations": ["Zurich, Switzerland", "Lisbon, Portugal"],
  "maxResults": 40,
  "checkIn": "2026-12-01",
  "checkOut": "2026-12-04",
  "adults": 2,
  "currency": "EUR",
  "includeDetails": false
}
```

An empty input `{}` also works and runs the defaults (Zurich, Switzerland, 10 listings).

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locations` | array | `["Zurich, Switzerland"]` | One place per entry. Enter one place per line: a single text value is split at commas |
| `maxResults` | integer | `10` | Maximum unique listings per location (1-1,000, Airbnb shows about 270 per search) |
| `checkIn`, `checkOut` | string | none | Optional dates, YYYY-MM-DD. Both are needed; otherwise Airbnb picks its own dates |
| `adults` | integer | `1` | Adult guests (1-16) |
| `currency` | string | `EUR` | Three-letter currency code |
| `includeDetails` | boolean | `false` | Open every listing page for description, room type, guests, bedrooms, beds, bathrooms |

A listing that matches several locations is returned once.

**Limit:** Airbnb returns 18 listings per page and about 15 pages per search. Use several or narrower locations (a district instead of a whole city) for more listings.

### Output example

```json
{
  "id": "1682111532175854289",
  "url": "https://www.airbnb.com/rooms/1682111532175854289",
  "title": "Cabin in Rheinau",
  "name": "Forest hut",
  "property_type": "Cabin",
  "location_label": "Rheinau",
  "rating": 4.78,
  "review_count": 23,
  "price_total": 483,
  "price_total_text": "€483",
  "price_per_night": 96.6,
  "original_price": null,
  "currency": "EUR",
  "nights": 5,
  "check_in": "2026-10-25",
  "check_out": "2026-10-30",
  "host_type": "Individual host",
  "is_guest_favorite": false,
  "is_superhost": true,
  "latitude": 47.62734,
  "longitude": 8.59823,
  "images": ["https://a0.muscache.com/im/pictures/hosting/Hosting-1682111532175854289/original/example.jpeg"],
  "search_query": "Zurich, Switzerland",
  "source_platform": "airbnb.com",
  "scraped_at": "2026-10-21T12:00:00Z",
  "details_included": false
}
```

Fields that Airbnb does not publish for a listing are `null`. New listings have no rating yet. Without dates, some results are priced per night only (`price_total` is then `null`).

### Pricing

Pay per result. You are charged one result event for every row saved to the dataset, plus a one-time start event per run.

| Event | Price | When |
|-------|-------|------|
| `airbnb-start` | $0.005 | Once per run, when the first listing is saved |
| `airbnb-result` | $0.003 | Per listing saved from search results |
| `airbnb-detail-result` | $0.005 | Per listing saved with listing page data |

The run stops saving listings once your maximum total charge per run is reached. Duplicates are never saved or charged twice, and a restarted run does not charge rows it already saved.

### Performance

- **Memory**: 128 MB (Go binary, HTTP only, no browser)
- **Speed**: 18 listings per search page; listing pages are fetched a few at a time with short pauses
- **Search only**: leave `includeDetails` off for the fastest and cheapest run

### Tips

- Add dates and guests to get the real price of your stay; without dates prices are for a short default stay
- Prices include taxes and fees as Airbnb shows them to a guest
- Pair with a spreadsheet or BI tool: `latitude`, `longitude`, `price_per_night` and `rating` are ready for a market map

### Related Actors

- [Website Email & Phone Scraper](https://apify.com/santamaria-automations/website-email-scraper) -- Extract emails and phones from company websites
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor) -- Extract team members and decision-makers

# Actor input Schema

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

One place per entry, for example a city with its country (Zurich, Switzerland). Each entry is searched separately and maxResults applies per entry. Enter one place per line: a single text value is split at commas. Defaults to Zurich, Switzerland when empty.

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

Maximum number of unique listings per location. Airbnb shows 18 listings per page and about 15 pages (roughly 270 listings) per search, so use several or narrower locations for more.

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

Optional, YYYY-MM-DD. Needs a check-out date too. Without dates Airbnb picks its own dates and prices a short stay.

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

Optional, YYYY-MM-DD, after the check-in date.

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

Number of adult guests (1-16). Changes availability and price.

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

Three-letter currency code for prices, for example EUR, USD, CHF or GBP.

## `includeDetails` (type: `boolean`):

Open every listing page for the description, room type, maximum guests, bedrooms, beds and bathrooms. Needs one extra request per listing, is slower and is billed at the detail rate.

## Actor input object example

```json
{
  "locations": [
    "Zurich, Switzerland"
  ],
  "maxResults": 10,
  "adults": 1,
  "currency": "EUR",
  "includeDetails": false
}
```

# Actor output Schema

## `businesses` (type: `string`):

Dataset containing scraped business data

# 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": [
        "Zurich, Switzerland"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "locations": ["Zurich, Switzerland"],
    "maxResults": 10,
}

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

```

## MCP server setup

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