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

Scrape Airbnb listings by city, search, or URL - prices, ratings, reviews, hosts, amenities, coordinates and photos. Just type a place, no dates or API key needed. Export JSON/CSV.

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

## Pricing

from $5.00 / 1,000 results

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?

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 Listings Scraper — Prices, Hosts, Reviews & Photos 🏠

**Scrape Airbnb listings by city, search, or listing URL** — get prices, ratings, reviews, hosts, amenities, coordinates, and photos as clean **JSON or CSV**. No API key, no login. Just **type a place** like `Paris` and run — no dates and no URLs required.

### What does Airbnb Listings Scraper do?

Type a destination (or paste an Airbnb search/listing URL) and get every matching listing as one structured row. It reads Airbnb's public listing data — no Airbnb API, no account, no token.

- **Search Airbnb by city / place** — just type `Paris`, `New York`, `Lisbon`
- **Scrape a search URL** — paste any `airbnb.com/s/...` results page
- **Scrape a single listing** — paste a `airbnb.com/rooms/...` URL
- **Listing details** — bedrooms, beds, host, rating, reviews, amenities, coordinates
- **No dates required** — browse a market without picking check-in/out
- Export to **JSON, CSV, Excel, or XML**

### How to scrape Airbnb without the API

Airbnb has no public listings API. This actor reads the public listing data the site already serves — so you get prices, ratings, hosts, and photos with **no API key and no login**. Just give it a place or a URL.

### What data can you extract from Airbnb?

| Field | Description |
|-------|-------------|
| `listingId`, `listingUrl` | Airbnb room id + canonical URL |
| `title`, `description`, `propertyType`, `roomType` | Listing name, blurb, type (entire home / private room) |
| `location`, `latitude`, `longitude` | Place + exact coordinates |
| `pricePerNight`, `totalPrice`, `currency` | Nightly + total price (clean decimals, your chosen currency) |
| `rating`, `reviewsCount`, `isSuperhost` | Guest rating, review count, superhost flag |
| `hostName`, `hostId` | Host details |
| `guestCapacity`, `bedrooms`, `beds`, `bathrooms` | Capacity + room counts |
| `amenities`, `imageUrls` | Amenity list + all photo URLs |
| `checkIn`, `checkOut`, `scrapedAt` | Dates used + scrape timestamp |

### Airbnb scraping use cases

- **Market & price research** — compare nightly prices across a city or neighborhood
- **Short-term rental analysis** — supply, room types, superhost share, ratings
- **Competitor / comp tracking** — monitor specific listings or areas over time
- **Real estate & investment** — gauge STR demand and pricing for a location
- **Travel tools & aggregators** — power a search or recommendation feature
- **AI / LLM pipelines** — clean listing data for search, RAG, or agents

### How to use

1. Click **Try for free**.
2. In **Search Airbnb**, type a place (`Paris, France`), or paste an Airbnb search or listing URL. Add as many as you want.
3. (Optional) Set dates, guests, price/output options under **Advanced** — or leave them blank.
4. Click **Start**. Export results as JSON, CSV, or Excel, or pull them via the API.

#### Example input

The dead-simple case — a place, nothing else:

```json
{ "search": ["Paris, France"], "maxListings": 100 }
```

Mixed sources + options:

```json
{
  "search": [
    "New York, NY",
    "https://www.airbnb.com/s/Lisbon/homes",
    "https://www.airbnb.com/rooms/12345678"
  ],
  "maxListings": 200,
  "currency": "EUR",
  "includeListingDetails": true,
  "useApifyProxy": true,
  "proxyGroups": ["RESIDENTIAL"]
}
```

### Output example

```json
{
  "listingId": "1701424376938535830",
  "listingUrl": "https://www.airbnb.com/rooms/1701424376938535830",
  "title": "Unique 2 bd Apartment - Grand place view",
  "roomType": "Entire home/apt",
  "location": "Brussels",
  "latitude": 50.8496,
  "longitude": 4.3507,
  "pricePerNight": 299.10,
  "currency": "USD",
  "rating": 5,
  "reviewsCount": 2,
  "isSuperhost": false,
  "hostName": "Camelia",
  "guestCapacity": 6,
  "bedrooms": 2,
  "beds": 4,
  "imageUrls": ["https://a0.muscache.com/im/pictures/..."],
  "scrapedAt": "2026-06-22T12:00:00Z"
}
```

### Input parameters

| Field | Type | Description |
|-------|------|-------------|
| `search` | array | **Primary input.** Place names, Airbnb search URLs, or listing URLs — auto-detected. |
| `maxListings` | integer | Max records to save (1–500). Default 50. |
| `checkIn` / `checkOut` | string | Optional `YYYY-MM-DD` dates. |
| `adults` / `children` / `infants` / `pets` | integer | Optional guest counts. |
| `currency` | string | Price currency (USD, EUR, GBP…). |
| `includeListingDetails` | boolean | Visit listing pages for richer fields. Default `true`. |
| `includeImages` / `includeAmenities` / `includeHostInfo` / `includeReviewsSummary` | boolean | Field toggles. |
| `useApifyProxy` / `proxyGroups` | object/array | Proxy settings (use `RESIDENTIAL`). |

You can also use the legacy `searchUrls`, `listingUrls`, and `locations` fields — but the single `search` field above covers all three.

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

Cost is mostly Apify platform compute + residential proxy traffic. Airbnb requires a **residential proxy** (it blocks datacenter IPs), so most of the per-listing cost is proxy bandwidth. Start with the free trial to measure your exact volume, then scale.

### FAQ

**Do I need dates to search?**
No. Type a place and run — you get listings without picking check-in/out. Add dates only if you want date-specific pricing.

**Do I need an Airbnb account or API key?**
No. The actor reads public listing data — no login, no token.

**Can I scrape a whole city?**
Yes — the scraper pages through Airbnb's search results automatically (~570 listings per city/area). For even broader coverage, add several searches (neighborhoods or nearby places); set `maxListings` up to 5000.

**Why do I need a residential proxy?**
Airbnb blocks datacenter IPs. Residential proxies (`proxyGroups: ["RESIDENTIAL"]`) look like real users and keep runs reliable.

**Can I scrape a single listing?**
Yes — paste the `airbnb.com/rooms/...` URL into the Search field.

**What export formats are supported?**
JSON, CSV, Excel, and XML — from the Storage tab or the Apify API.

### Related actors

Combine Airbnb data with other travel, real-estate, and review scrapers in the Apify Store to build market dashboards and price-monitoring pipelines.

# Actor input Schema

## `search` (type: `array`):

What to scrape. Type a place — 'Paris, France', 'New York', 'Lisbon' — and that's it. You can also paste an Airbnb search URL or a listing URL (https://www.airbnb.com/rooms/...). Add as many as you want. No dates required.

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

Optional. YYYY-MM-DD. Leave empty to scrape without dates (you still get listings, just no date-specific total price).

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

Optional. YYYY-MM-DD.

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

Number of adult guests.

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

Number of child guests.

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

Number of infant guests.

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

Number of pets.

## `maxListings` (type: `integer`):

Maximum listing records to save (across all searches). The scraper pages through Airbnb's results (~570 per city); add more places to go higher.

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

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

## `includeListingDetails` (type: `boolean`):

Visit each listing page for richer fields (bedrooms, beds, host, reviews).

## `includeImages` (type: `boolean`):

Include listing image URLs.

## `includeAmenities` (type: `boolean`):

Include amenities when available on listing pages.

## `includeHostInfo` (type: `boolean`):

Include host name, ID, and superhost status when available.

## `includeReviewsSummary` (type: `boolean`):

Include rating and review-count fields when available.

## `searchUrls` (type: `array`):

Optional. Explicit Airbnb search-result URLs (advanced). Most users can ignore this and use the Search field above.

## `listingUrls` (type: `array`):

Optional. Direct Airbnb listing URLs (https://www.airbnb.com/rooms/...).

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

Optional. Place queries (same as typing them in the Search field).

## `useApifyProxy` (type: `boolean`):

Route requests through Apify Proxy. Recommended for cloud runs (Airbnb blocks datacenter IPs — use a residential group).

## `proxyGroups` (type: `array`):

Optional Apify Proxy groups, e.g. RESIDENTIAL. Leave empty for the default pool.

## Actor input object example

```json
{
  "search": [
    "Paris, France"
  ],
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "maxListings": 50,
  "currency": "USD",
  "includeListingDetails": true,
  "includeImages": true,
  "includeAmenities": true,
  "includeHostInfo": true,
  "includeReviewsSummary": true,
  "useApifyProxy": true
}
```

# Actor output Schema

## `records` (type: `string`):

All Airbnb listing records produced by this run.

## `overview` (type: `string`):

Dataset presented in Apify Console.

# 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 = {
    "search": [
        "Paris, France"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = { "search": ["Paris, France"] }

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

```

## MCP server setup

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