# Airbnb Listings Scraper — Prices, Hosts & Details ($0.50/1k) (`leadharbor/airbnb-listings-scraper`) Actor

Scrape Airbnb by city or search URL: nightly/total price, rating, reviews, coordinates, photos, badges. Optional details: description, amenities, house rules, host/superhost, beds/baths/guests, rating breakdown. Auto-splits by price band past Airbnb's ~270 cap. $0.50 per 1,000 listings.

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

## Pricing

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

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

Search Airbnb by city or by search URL and get back every listing — price,
rating, review count, coordinates and photos — with an optional switch to
enrich each one with its full detail page. No browser: it reads the JSON
payload Airbnb's own front-end renders, so it's fast and cheap to run.

### Who it's for

- Short-term-rental investors comparing nightly rates and occupancy signals
  across a city before buying
- Property managers and dynamic-pricing tools tracking competitor rates
- Market researchers mapping supply by property type, bedroom count and price

### What you get

| Field | What it is |
|---|---|
| `id` / `url` | Listing ID and link |
| `name` / `title` | Listing title |
| `propertyType` / `roomType` | Entire home, private room, etc. (detail) |
| `city` / `lat` / `lng` | Location |
| `pricePerNight` / `priceTotal` / `originalPrice` / `currency` | Pricing |
| `rating` / `reviewsCount` | Overall rating and review count |
| `ratingBreakdown` | Per-category rating (detail) |
| `isSuperhost` / `hostId` / `hostName` | Host info (detail) |
| `bedrooms` / `beds` / `bathrooms` / `maxGuests` | Space (search + detail) |
| `amenities` / `houseRules` | Full lists (detail) |
| `images` | Photo URLs — a few from search, all from detail |
| `description` / `highlights` | Listing text (detail) |
| `badges` | e.g. Superhost, Guest favorite (search) |
| `checkIn` / `checkOut` / `scrapedAt` | Dates the price applies to, timestamp |

Detail-only fields are `null` until `includeDetails` is on.

### Input

```json
{
  "locationQueries": ["Dubai"],
  "maxListingsPerQuery": 200,
  "currency": "USD",
  "includeDetails": false
}
```

Or paste an Airbnb search URL directly in `startUrls` to keep its filters.
`currency` matters — Airbnb otherwise guesses it from your proxy's country,
which mixes currencies across rows if you don't set it. Turn on
`includeDetails` to fetch each listing's full detail page (billed separately).
Airbnb caps a single search at roughly 270 results; `splitByPriceBands`
(on by default) automatically re-runs a saturated search across price bands
to go deeper.

### Pricing

**$0.50 per 1,000 listings scraped**, plus **$2 per 1,000 listing details**
when `includeDetails` is on and a listing's detail page was actually fetched.
1,000 listings with full details costs $2.50.

### How it compares

No browser means no Chromium to boot and no per-second compute charge — just
HTTP requests reading the same JSON payload Airbnb's page already loads. That
keeps a plain listing scrape cheap; detail enrichment costs more because it's
one extra request per listing, priced separately so you only pay for it when
you ask for it.

### Use with n8n / Make / Zapier

Add an Apify integration node, run this actor with your locations or URLs,
then read the finished dataset back into your workflow — the stable `id` and
`url` per listing make it easy to join against a pricing or alerting flow.

### FAQ

**Does it need a login or cookies?** No — everything comes from public pages.

**Does it use a browser?** No — plain HTTP requests against Airbnb's own
server-rendered JSON payload.

**Can I get every listing in a big city?** Turn on `splitByPriceBands` and
raise `maxListingsPerQuery`; for exhaustive coverage, feed one `startUrl` per
neighbourhood or map area.

**Why are `cancellationPolicy` and `instantBook` usually null?** Airbnb only
exposes those inside its booking flow, not on the listing page, so the actor
doesn't fabricate values for them.

**Are reviews included?** Not the review text — it lives behind a request
whose query hash Airbnb rotates per release, so it isn't included in this
version rather than ship something that breaks silently.

**What if Airbnb blocks the run?** If it serves a block page, the run logs
the page's title so you can see what came back instead of a silent empty
dataset. Use `RESIDENTIAL` proxy for larger runs.

### More from leadharbor

- [Google Maps Verified Email Scraper](https://apify.com/leadharbor/google-maps-verified-email-scraper)
- [Bulk Email Verifier](https://apify.com/leadharbor/bulk-email-verifier)
- [Website Contact Extractor](https://apify.com/leadharbor/website-contact-extractor)
- [E-commerce Price & Restock Monitor](https://apify.com/leadharbor/ecommerce-price-restock-monitor)
- [App Store Review Monitor](https://apify.com/leadharbor/app-store-review-monitor)
- [Local Review Booster](https://apify.com/leadharbor/local-review-booster)

# Actor input Schema

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

Cities, neighbourhoods or regions to search, exactly as you'd type them into Airbnb's search box. One per line.

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

Paste Airbnb search URLs (https://www.airbnb.com/s/...). Their filters are kept; anything you set below that the URL doesn't already specify is added on top. Combined and de-duplicated with the locations above.

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

YYYY-MM-DD. Leave both dates blank to get Airbnb's default flexible-date pricing.

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

YYYY-MM-DD. Must be after check-in.

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

Number of adults. Affects which listings Airbnb shows and the quoted price.

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

Number of children (ages 2-12).

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

Number of infants (under 2).

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

Lowest nightly price to include, in the currency below. Leave blank for no floor.

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

Highest nightly price to include. Leave blank for no ceiling.

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

Restrict to certain kinds of space. Leave empty for all.

## `minRating` (type: `integer`):

Drop listings rated below this (e.g. 4). Listings with no rating yet are always kept — they're new, not bad.

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

Three-letter code Airbnb should quote prices in. Airbnb otherwise guesses from the proxy's country, which is how price columns end up mixed — always set this.

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

Two-letter language code for titles, descriptions and amenity names.

## `maxListingsPerQuery` (type: `integer`):

How many listings to collect per location or start URL. Airbnb itself stops at about 270 results for a single search — ask for more and we automatically re-run the search split into price bands to go deeper.

## `splitByPriceBands` (type: `boolean`):

When a search saturates and you asked for more, re-run it across disjoint price bands and merge the results. Costs extra search requests but is the only way to get full coverage of a big city.

## `priceBandCount` (type: `integer`):

How many bands to slice a saturated search into. More bands = deeper coverage, more requests.

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

Open each listing's page for description, amenities, house rules, host name + superhost status, beds/baths/guests, rating breakdown and the full photo set. One extra request per listing, billed separately.

## `maxDetails` (type: `integer`):

Only enrich the first N listings. Handy for a cheap test run. Leave blank to enrich all of them.

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

Parallel detail requests. Raising this makes rate-limiting more likely.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on 429 and 5xx responses.

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

Airbnb rate-limits datacenter IPs fast. Apify Proxy is on by default; switch to RESIDENTIAL for large runs or if you see repeated 429s.

## Actor input object example

```json
{
  "locationQueries": [
    "Dubai",
    "Muscat, Oman"
  ],
  "adults": 1,
  "children": 0,
  "infants": 0,
  "roomTypes": [],
  "currency": "USD",
  "locale": "en",
  "maxListingsPerQuery": 100,
  "splitByPriceBands": true,
  "priceBandCount": 6,
  "includeDetails": false,
  "concurrency": 5,
  "maxRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per listing: price, rating, host, coordinates, optional details.

## `resultsUi` (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": [
        "Dubai",
        "Muscat, Oman"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leadharbor/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": [
        "Dubai",
        "Muscat, Oman",
    ] }

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

```

## MCP server setup

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