# Airbnb Data Scraper: Listings, Prices, Ratings | $0.35 / 1K (`hridayrungta/airbnb-scraper`) Actor

Airbnb listings data without an API or login: search results with price for your dates, rating, reviews, bedrooms, coordinates, plus full listing details with rating breakdown and host info. From $0.35 per 1,000 listings.

- **URL**: https://apify.com/hridayrungta/airbnb-scraper.md
- **Developed by:** [Hriday Rungta](https://apify.com/hridayrungta) (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 $1.40 / 1,000 actor starts

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: Airbnb listings data, prices and ratings (no API key)

**Get Airbnb listings data without an Airbnb API, a login or a browser.** Search a city and get listings with price for your dates, rating, review count, bedrooms, beds, bathrooms, coordinates and links. Or give listing URLs and get the full record: description, property type, capacity, rating breakdown by category and host details.

Pay per event: **$0.00035 per search-result listing ($0.35 per 1,000)** and **$0.0005 per full listing-detail record ($0.50 per 1,000)**, plus a $0.002 start fee per run.

### What can you use Airbnb data for?

- **Airbnb market data**: average price, rating and bedroom mix by city or neighbourhood, for investors and hosts.
- **Competitor and pricing research**: see what comparable listings charge for specific check-in and check-out dates.
- **Maps and analysis**: latitude and longitude per listing for GIS, Google Sheets maps or BI tools.
- **Listing audits**: per-category ratings (cleanliness, accuracy, location...) and superhost flags for chosen listings.
- **Travel and relocation research**: compare areas across several cities in one run.

### Airbnb API alternative

Airbnb does not offer a public API for search or listing data; its API is limited to approved partners. This Actor reads the data Airbnb's own public pages carry, and returns it as JSON, CSV or Excel through the Apify API, schedules and integrations.

### What you get

- **Search mode**: for one or more locations, every listing Airbnb's search page returns: title, price for the given dates, rating, review count, bedrooms/beds/bathrooms, coordinates, cover image, listing URL. Paginated.
- **Listing mode**: for listing URLs or ids, the full record: description, property type, room type, person capacity, per-category rating breakdown (accuracy, check-in, cleanliness, communication, location, value), host name, superhost and tenure badges, coordinates, cover image.
- No incremental mode: Airbnb listings have no clean "new since last run" concept, so none is forced.

Output fields include `listingId`, `title`, `price`, `priceText`, `currency`, `rating`, `reviewCount`, `bedrooms`, `beds`, `bathrooms`, `personCapacity`, `latitude`, `longitude`, `imageUrl`, `listingUrl`, `searchLocation`, `hostName`, `isSuperhost` and `ratingBreakdown`. Some fields are filled only in one mode (see below) or are empty when Airbnb does not provide them.

### How to scrape Airbnb listings

1. Choose **Search** mode and add locations, for example `Lisbon` or `New York, NY`.
2. Optional: add check-in and check-out dates (`YYYY-MM-DD`, both needed) so prices are for that stay.
3. Set **Max items** and **Max pages per location** (about 18 listings per page).
4. Click **Start** and export the dataset.

Example input:

```json
{
  "mode": "search",
  "locations": ["Barcelona"],
  "checkin": "2027-03-12",
  "checkout": "2027-03-15",
  "maxItems": 50,
  "maxPagesPerLocation": 3
}
```

For listing details:

```json
{
  "mode": "listing",
  "listingUrls": ["https://www.airbnb.com/rooms/54337133"]
}
```

### Input

| Field | Description |
|---|---|
| `mode` | `"search"` (default) or `"listing"`. |
| `locations` | Required for search. One or more, e.g. `"Paris"`, `"Tokyo"`, `"New York, NY"`. |
| `checkin` / `checkout` | Optional, `YYYY-MM-DD`, search mode only. Both needed to affect pricing. |
| `listingUrls` | Required for listing mode. Listing URLs or bare ids. |
| `maxItems` | Cost cap, billed once per row saved across all locations/listings. |
| `maxPagesPerLocation` | Search mode only. Caps requests per location (about 18 listings per page). |
| `maxRetries` | Retries with backoff for network errors and 5xx/429 responses. |

### Pricing (pay per event)

| Event | Price | What it covers |
|---|---|---|
| Actor start | $0.002, once per run | Fixed per-run overhead |
| Listing | $0.00035 | One search-result row |
| Enriched Listing | $0.0005 | One full listing-detail row |

Worked examples:

- 54 search results (3 pages of one city): $0.002 + 54 x $0.00035 = **$0.0209**.
- 1,000 search results: $0.002 + $0.35 = **$0.352**.
- 100 full listing records by URL: $0.002 + 100 x $0.0005 = **$0.052**.

Set `maxItems` as a hard cost cap.

### Schedule it and connect it

Track a market over time with an [Apify Schedule](https://docs.apify.com/platform/schedules) (weekly or monthly) and send the dataset to **Google Sheets**, **Make**, **n8n**, **Zapier**, a **webhook** or your own database. The Apify API and MCP server let scripts and AI agents run it too.

### How it works (honestly)

Airbnb's own pages embed the JSON that the page is rendered from. This Actor requests the page with a plain HTTP GET and reads that JSON:

1. **Search mode** fetches `airbnb.com/s/<location>/homes`, extracts the search-result records and follows Airbnb's own page cursors.
2. **Listing mode** fetches `airbnb.com/rooms/<id>` and merges the listing record from the page's embedded data.

`www.airbnb.com` may hand a client off to a regional domain (for example `www.airbnb.co.in`) based on IP. The Actor detects this and re-requests the same page from the regional domain, one extra request, only when Airbnb does it.

No headless browser and no residential proxy: in our measurements requests came back HTTP 200 with data, and residential proxy traffic was 0 on every run.

### Known limits (please read)

- **Listing mode has no price.** Airbnb loads the live nightly price in the browser after page load, so it is not in the listing page's data. Use search mode (price for your dates) when you need price.
- **No reviews text and no amenities.** They are not in the pages' embedded data, so they are not included.
- **Search mode returns what Airbnb's search page returns** for the location, up to `maxPagesPerLocation` pages. Very broad locations are capped by Airbnb's own paging.
- Prices are those Airbnb shows for the dates and currency of the page it serves; without dates you get Airbnb's default dates.
- Airbnb can change its page structure, which can affect results until the Actor is updated.

### FAQ

**Is there an Airbnb API?** Not a public one for search or listing data (partners only). This Actor reads public pages.

**Do I need an Airbnb account or API key?** No.

**Can I get prices for specific dates?** Yes, in search mode with `checkin` and `checkout`.

**Can I scrape Airbnb reviews?** No, review text is not included. See the reviews Actor by tri_angle below.

**Can I get listing coordinates?** Yes, `latitude` and `longitude`, for mapping.

**Can I use it with ChatGPT or Claude?** Yes, through the Apify API or MCP server.

**Is it legal?** It collects publicly visible listing data. You are responsible for using it in line with Airbnb's terms and applicable laws (for example privacy rules for host data).

### Related Actors

- [Google Maps Places Scraper](https://apify.com/hridayrungta/google-maps-places-scraper) (own): local businesses and places around a listing.
- [Reddit Scraper](https://apify.com/hridayrungta/reddit-scraper) (own): travel and short-term-rental discussions.
- [Airbnb Scraper by tri_angle](https://apify.com/tri_angle/airbnb-scraper) (third party): another Airbnb search Actor.
- [Airbnb Rooms URLs Scraper by tri_angle](https://apify.com/tri_angle/airbnb-rooms-urls-scraper) (third party): listing details by URL.
- [Airbnb Reviews Scraper by tri_angle](https://apify.com/tri_angle/airbnb-reviews-scraper) (third party): review text, which this Actor does not return.

# Actor input Schema

## `mode` (type: `string`):

"search": scrape priced search-result listings for one or more locations. "listing": scrape the full detail record for one or more specific listing URLs/ids.

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

One or more locations to search, one per line (e.g. "Paris", "Tokyo", "New York, NY"). Required when mode is "search".

## `checkin` (type: `string`):

Optional, format YYYY-MM-DD. Only used in "search" mode - needs check-out too. Leave both blank to see Airbnb's default (next available) dates and pricing.

## `checkout` (type: `string`):

Optional, format YYYY-MM-DD. Only used in "search" mode - needs check-in too.

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

One or more Airbnb listing URLs (e.g. "https://www.airbnb.com/rooms/54337133") or bare listing ids, one per line. Required when mode is "listing".

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

Cost cap - you're billed once per row saved, across all locations/listings in this run.

## `maxPagesPerLocation` (type: `integer`):

"search" mode only. Each page is about 18 listings. Caps requests per location before moving to the next one.

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

Retries with backoff for network errors and 5xx/429 responses.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Paris"
  ],
  "checkin": "",
  "checkout": "",
  "listingUrls": [],
  "maxItems": 100,
  "maxPagesPerLocation": 3,
  "maxRetries": 3
}
```

# Actor output Schema

## `results` (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 = {
    "locations": [
        "Paris"
    ],
    "listingUrls": []
};

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

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

```

## MCP server setup

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