# Airbnb Scraper — Vacation Rental Listings (`solidcode/airbnb-com-scraper`) Actor

\[💰 $0.75 / 1K] Extract Airbnb stay listings by city or search URL. Get the total price for your dates, GPS coordinates, ratings and review counts, host and Superhost details, room breakdown, amenity categories and the full photo gallery — up to 39 fields per listing. Export to JSON, CSV or Excel.

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

## Pricing

from $0.75 / 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/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 Scraper — Vacation Rental Listings

Pull Airbnb stay listings at scale — the total price for the dates you search, GPS coordinates, ratings and review counts, host and Superhost signals, the room breakdown and the full photo gallery, up to 39 fields on every listing. Built for short-term-rental investors, revenue and pricing managers, and travel analytics teams who need one clean, analysis-ready row per property without babysitting a scraper through Airbnb's search pages.

### Why This Scraper?

- **GPS coordinates on 270 of 270 listings** — measured across five cities on three continents (London, Paris, Austin, Tokyo, Sydney) and three room types. Latitude and longitude ride on the search row itself, so you can map a whole market without a second request per property.
- **The price is the total for your dates, never a teaser rate** — every row carries the number, the display label it came from, and the exact `checkIn` / `checkOut` window it covers. All 270 sample rows came back priced, labelled and dated.
- **39 fields per listing across 6 groups** — 18 land on the search row; `enrichDetails` adds 21 more, including the full description, the plain-words room breakdown (`["2 guests", "1 bedroom", "1 bed", "1 bath"]`) and `maxGuests` as a real integer.
- **Ratings you can average, not a display string** — a numeric rating on the 5-point scale (4.34 to 5.00 across the sample) plus an integer review count, where a brand-new listing returns `null` instead of a fake 0-star score that would quietly drag your market averages down.
- **Host and Superhost signals on 45 of 45 detail records** — who hosts it, years hosting, Superhost status, their own review count, and the `Guest favorite` badge.
- **The complete photo gallery — up to 167 images on one listing** — against the 6 thumbnails a search card shows, plus 5 to 13 amenity categories per property.
- **11 distinct property-type labels and 4 room types in a 45-listing sample** — Tiny home, Entire rental unit, Room in hotel and the rest arrive as readable text, and an unrecognised code is dropped rather than dumped into your spreadsheet.
- **58 automated checks run against live Airbnb pages before every release** — the build fails if a listing ID stops resolving to a real room page, a rating drifts off the 5-point scale, or a price ever ships without the label that says which currency it is in.
- **100 listings in 12.5 seconds** — measured end to end on a cloud run, so a whole-city scan finishes while you are still reading the input form.

### Use Cases

#### Short-Term Rental Investment

- Underwrite a market from real total-stay prices, with coordinates precise enough to score by street, not by city.
- Measure Superhost and `Guest favorite` density in a neighbourhood before buying into it.
- Track supply by room type — entire home, private room, shared room, hotel room — to see what a market is actually made of.
- Spot brand-new inventory: listings flagged as new with zero reviews are the ones that just came online.

#### Revenue & Pricing Management

- Benchmark your own total price for the same dates against every competing listing in your area.
- Segment comparables by guest capacity and bed count so you compare like with like.
- Re-run on a schedule and diff on price to watch how the set around you moves week to week.
- Separate rated inventory from unrated new arrivals before computing an average rate.

#### Market Research & Analytics

- Build price distributions per city and room type across as many markets as you need.
- Compare amenity category mix and property-type mix between neighbourhoods.
- Quantify review depth — how many listings in a market carry hundreds of reviews versus none.
- Run the same search across several cities to compare markets on identical terms.

#### Data Enrichment & Integration

- Join to your own property records on the listing ID, which is stable and resolves to a live page.
- Pull the host name, photo and hosting history into a CRM or outreach list.
- Push straight into Google Sheets, a warehouse, or a BI dashboard — every row is flat.
- Feed descriptions, highlights and photo galleries into search, tagging or ML pipelines.

#### Travel Content & Product

- Build city guides and map views from coordinates, photos and ratings already in the row.
- Power a comparison or metasearch surface with fresh listing names, prices and images.
- Assemble editorial round-ups — highest-rated, most photographed, best-hosted — with no manual collection.

### Getting Started

#### Simplest run

```json
{
  "location": "London",
  "maxItems": 100
}
```

#### Paste a filtered search URL from the site

Set your filters on the site, then copy the address bar URL — every filter in it is
carried through.

```json
{
  "searchUrls": [
    "https://www.airbnb.com/s/London/homes"
  ],
  "maxItems": 335
}
```

#### Everything, with full details

```json
{
  "searchUrls": [
    "https://www.airbnb.com/s/London/homes"
  ],
  "maxItems": 335,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Airbnb.com search result URLs. Set your filters on Airbnb.com, then paste the address bar URL here. Overrides the individual filters below when provided. |
| `location` | string | `London` | Area to search. Used only when Search URLs is empty. |
| `maxItems` | integer | `100` | Maximum listings per search URL (0 = collect everything each search returns). Airbnb.com pages through at most 335 listings per search, so use several narrower searches to collect more. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every listing is one dataset row. Enabling `enrichDetails` adds 21 further fields to the same row — there is no second record type to join.

This example is a real captured listing, with the host's name and profile photo replaced by placeholders and the photo and amenity arrays shortened for readability. Your dataset contains the full published values.

```json
{
  "id": "40786965",
  "url": "https://www.airbnb.com/rooms/40786965",
  "name": "Modern Cabin Retreat, Pool, Hot Tub, Goats & Emus!",
  "headline": "Tiny home in Austin",
  "listingFacts": ["1 bedroom", "1 queen bed", "1 bath"],
  "badges": ["Guest favorite"],
  "ratingSummary": "4.95 (468)",
  "latitude": 30.20062,
  "longitude": -97.93633,
  "photos": [
    "https://a0.muscache.com/im/pictures/a9ad0fe0-8b73-4a05-b818-d318a0cac50d.jpg",
    "https://a0.muscache.com/im/pictures/c8231241-2486-43b8-84c4-ee3d54e79270.jpg"
  ],
  "price": 665,
  "priceLabel": "€665 total",
  "priceQualifier": "total",
  "priceBasis": "Total for the stay",
  "priceNote": null,
  "checkIn": "2026-08-23T00:00:00",
  "checkOut": "2026-08-28T00:00:00",
  "hotelPropertyId": null,

  "canonicalUrl": "https://www.airbnb.com/rooms/40786965",
  "propertyType": "Tiny home",
  "roomType": "Entire home",
  "maxGuests": 2,
  "description": "Stay with us in our beautiful modern cabin at Eco Ranch. Relax on 85 acres of beautiful Texas Hill Country just 18 miles from downtown Austin. This private modern cabin offers 350 sq ft with a queen bed, full kitchen, full bathroom, and cozy living space.",
  "roomBreakdown": ["2 guests", "1 bedroom", "1 bed", "1 bath"],
  "propertySummary": "Tiny home in Austin, Texas, United States",
  "highlights": ["Top 10% of homes", "Self check-in", "Beautiful area"],
  "rating": 4.95,
  "reviewsCount": 468,
  "isNewListing": false,
  "isGuestFavorite": true,
  "city": "Austin",
  "area": "Austin",
  "hostLabel": "Hosted by [host name]",
  "hostFacts": ["Superhost", "7 years hosting"],
  "isSuperhost": true,
  "hostPhoto": "https://a0.muscache.com/im/pictures/user/[host-photo].jpg",
  "hostReviewsCount": 490,
  "photoGallery": [
    "https://a0.muscache.com/im/pictures/a9ad0fe0-8b73-4a05-b818-d318a0cac50d.jpg",
    "https://a0.muscache.com/im/pictures/45cae55a-a445-4e7d-a346-85cd4fe9903e.jpg",
    "https://a0.muscache.com/im/pictures/610b5cde-d67e-404f-83dc-4c353eaa353a.jpg"
  ],
  "amenityGroups": [
    "Scenic views", "Bathroom", "Bedroom and laundry", "Entertainment",
    "Heating and cooling", "Kitchen and dining", "Outdoor", "Parking and facilities"
  ]
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Listing ID |
| `url` | string | Listing URL |
| `name` | string | Listing name |
| `headline` | string | Property type and area |
| `listingFacts` | array | Card facts |
| `badges` | array | Badges |
| `ratingSummary` | string | Rating summary |

#### Price, Dates, Location & Photos

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Price |
| `priceLabel` | string | Price as displayed |
| `priceQualifier` | string | Price qualifier |
| `priceBasis` | string | What the price covers |
| `priceNote` | string | Price note |
| `checkIn` | string | Check-in |
| `checkOut` | string | Check-out |
| `latitude` | number | Latitude |
| `longitude` | number | Longitude |
| `photos` | array | Card photos |
| `hotelPropertyId` | string | Hotel property ID |

#### With `enrichDetails` enabled

| Field | Type | Description |
|-------|------|-------------|
| `canonicalUrl` | string | Canonical listing URL |
| `propertyType` | string | Property type |
| `roomType` | string | Room type |
| `maxGuests` | number | Max guests |
| `description` | string | Description |
| `roomBreakdown` | array | Room breakdown |
| `propertySummary` | string | Property summary |
| `highlights` | array | Highlights |
| `rating` | number | Rating |
| `reviewsCount` | number | Reviews |
| `isNewListing` | boolean | New listing |
| `isGuestFavorite` | boolean | Guest favourite |
| `city` | string | City |
| `area` | string | Area |
| `hostLabel` | string | Host |
| `hostFacts` | array | Host facts |
| `isSuperhost` | boolean | Superhost |
| `hostPhoto` | string | Host photo |
| `hostReviewsCount` | number | Host reviews |
| `photoGallery` | array | Photo gallery |
| `amenityGroups` | array | Amenity categories |

### Tips for Best Results

- **Plan around the 335-per-search ceiling** — Airbnb pages through at most about 335 listings for any one search, no matter how many match it. To cover a dense city, split it into narrower searches — one neighbourhood, one price band, or one room type at a time — and paste every URL into `searchUrls`. The run de-duplicates across them, so a listing that matches two searches arrives once and is billed once.
- **Read the currency off `priceLabel`, not off `price`** — Airbnb quotes prices in the currency it serves your run, so `price` is a bare number and `priceLabel` (`"€665 total"`) is the only record inside the row of which currency that number is in. Keep both, or normalise on the label.
- **`price` covers the whole stay, not one night** — `priceBasis` says so explicitly and `checkIn` / `checkOut` give the exact date range it was quoted for. Divide by the number of nights before comparing against a nightly rate from anywhere else.
- **Set your filters on Airbnb first, then copy the address bar** — dates, guest count, price band, room type and amenity filters are all encoded in the URL and carried through, so even a heavily filtered search needs no extra configuration here.
- **Turn on `enrichDetails` for anything host- or review-related** — the numeric rating, review count, Superhost status, years hosting, full description and complete photo gallery exist only on the enriched row. A search row carries the rating as a display string such as `4.95 (468)` or `New`.
- **Treat a `null` rating as "no reviews yet", not as missing data** — new listings deliberately return `null` rather than a 0 that would look like a zero-star property; `isNewListing` and `reviewsCount` confirm which it is.
- **Pin your dates in the search URL for a price time series** — when the URL does not specify them, `checkIn` and `checkOut` follow Airbnb's own rolling default window and move between runs, so week-over-week prices would not be comparing the same stay.

### Pricing

**From $0.75 per 1,000 results** (search only) or **from $1.75 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.075 | $0.175 |
| 1,000 | $0.75 | $1.75 |
| 10,000 | $7.50 | $17.50 |
| 100,000 | $75.00 | $175.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $0.90 | $2.10 |
| Bronze | $0.85 | $2.00 |
| Silver | $0.80 | $1.85 |
| **Gold and above** | **$0.75** | **$1.75** |

Per 1,000 results.

A "result" is any listing row in the output dataset. When you run several searches at once, a listing matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same listing. The full-details rate applies only to rows that actually came back enriched — if a listing's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Airbnb.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Airbnb.com's Terms of Service.

Results may include personal data such as contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them.

# Actor input Schema

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

Airbnb.com search result URLs. Set your filters on Airbnb.com, then paste the address bar URL here. Overrides the individual filters below when provided.

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

Area to search. Used only when Search URLs is empty.

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

Maximum listings per search URL (0 = collect everything each search returns). Airbnb.com pages through at most 335 listings per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.airbnb.com/s/London/homes"
  ],
  "location": "London",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each listing.

## `financial` (type: `string`):

Price & Value for each listing.

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

Location for each listing.

## `contact` (type: `string`):

Contacts for each listing.

## `media` (type: `string`):

Media for each listing.

## `meta` (type: `string`):

Details & Timestamps for each listing.

# 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 = {
    "searchUrls": [
        "https://www.airbnb.com/s/London/homes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/airbnb-com-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 = { "searchUrls": ["https://www.airbnb.com/s/London/homes"] }

# Run the Actor and wait for it to finish
run = client.actor("solidcode/airbnb-com-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 '{
  "searchUrls": [
    "https://www.airbnb.com/s/London/homes"
  ]
}' |
apify call solidcode/airbnb-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/aVuzHPNLgs4zkNIWP/builds/ocXh4dJLIkBOk8l2J/openapi.json
