# Airbnb - Listings, Details & Reviews, No Login Needed (`ryyos/airbnb-scraper`) Actor

\[$0.9/1000] Search Airbnb listings by location and dates, pull full listing details (host, amenities, ratings, photos), and extract guest reviews - all without login or a browser.

- **URL**: https://apify.com/ryyos/airbnb-scraper.md
- **Developed by:** [Rio Dwi Saputra](https://apify.com/ryyos) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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/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

### What does Airbnb Scraper do?

**Airbnb Scraper** extracts structured data straight from [Airbnb](https://www.airbnb.com) - search results for any destination, full listing details, and guest reviews - without a login and without a browser. It reads the same JSON state Airbnb's own frontend renders from, so results are fast, accurate, and closely mirror what you'd see browsing the site yourself.

Run it on demand, on a schedule, or wire it into your pipeline via the [Apify API](https://docs.apify.com/api/v2) and integrations (Zapier, Make, Google Sheets, and more).

### Why use Airbnb Scraper?

- **Market and pricing research** - pull live prices, ratings, and availability for any destination to benchmark short-term rental markets.
- **Investment and property analysis** - collect amenities, host quality signals (Superhost status, review scores), and location data across many listings at once.
- **Reputation and guest-experience monitoring** - fetch full review text and host responses for listings you manage or track.
- **Dataset building** - export clean, structured JSON/CSV instead of scraping HTML yourself.

### How to use Airbnb Scraper

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Open the **Input** tab, keep **Mode** set to `search`, and enter a destination under **Location** (e.g. "Bali, Indonesia").
3. Optionally set check-in/check-out dates, guest counts, and **Max results**.
4. Click **Start** and wait for the run to finish.
5. Open the **Output** tab to preview results as a table, or export the dataset as JSON, CSV, Excel, or HTML.

Already have specific listing URLs? Switch **Mode** to `listing_detail` for full listing info, or `reviews` to pull guest reviews for those listings.

### Input

The Actor has three modes, selected via the **Mode** field:

| Mode | What it does | Key fields |
|---|---|---|
| `search` | Search Airbnb by location and return matching listings | `location`, `checkin`, `checkout`, `adults`, `maxResults` |
| `listing_detail` | Fetch full details for specific listings you already know | `listingUrls` |
| `reviews` | Fetch guest reviews for specific listings | `listingUrls`, `maxReviews` |

`proxyConfiguration` (optional, available in all modes) routes requests through [Apify Proxy](https://apify.com/proxy) - recommended for larger runs to reduce the chance of Airbnb rate-limiting requests.

See the **Input** tab or `.actor/input_schema.json` for the full field list and defaults.

Example input for `search` mode:

```json
{
  "mode": "search",
  "location": "Bali, Indonesia",
  "checkin": "2026-12-01",
  "checkout": "2026-12-05",
  "adults": 2,
  "maxResults": 50
}
```

Example input for `reviews` mode:

```json
{
  "mode": "reviews",
  "listingUrls": ["https://www.airbnb.com/rooms/1530784477084077413"],
  "maxReviews": 100
}
```

### Output

Each dataset item is one listing (modes `search`/`listing_detail`) or one review (mode `reviews`). You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "listingId": "1530784477084077413",
  "listingUrl": "https://www.airbnb.com/rooms/1530784477084077413",
  "title": "Suite Room with Mountain View",
  "propertyType": "Entire home",
  "avgRating": 4.97,
  "reviewCount": 67,
  "categoryRatings": { "CHECKIN": 4.96, "ACCURACY": 4.99, "LOCATION": 4.96 },
  "personCapacity": 2,
  "city": "Kintamani",
  "latitude": -8.26784,
  "longitude": 115.35285,
  "hostName": "Wayan",
  "hostIsSuperhost": true,
  "amenities": ["Wifi", "Kitchen", "Free parking on premises"],
  "highlights": ["Top 10% of homes", "Unwind in the hot tub"],
  "description": "Welcome to our elegantly designed guest room..."
}
```

#### Data table

| Field | Description |
|---|---|
| `listingId` / `listingUrl` | Airbnb's numeric listing ID and its canonical page URL |
| `title` / `subtitle` | Listing name (`search` mode also returns a generic location-based `title` plus the host-given `subtitle`) |
| `propertyType` / `roomTypeSummary` | Type of place and a bedrooms/beds/baths summary |
| `avgRating` / `reviewCount` / `categoryRatings` | Overall rating, review count, and per-category breakdown (`listing_detail` only) |
| `price` / `priceQualifier` | Displayed price and its qualifier (e.g. "for 5 nights") - `search` mode only, and only when dates are given |
| `personCapacity` | Maximum guests (`listing_detail` only) |
| `city` / `latitude` / `longitude` | Location |
| `hostName` / `hostIsSuperhost` / `hostIsVerified` | Host info (`listing_detail` only) |
| `amenities` / `highlights` / `description` | Full amenities list, highlight badges, and description text (`listing_detail` only) |
| `reviewId` / `rating` / `comment` / `reviewerName` / `reviewerLocation` / `reviewDate` / `hostResponse` | Review fields (`reviews` mode only) |

### Pricing / Cost estimation

Airbnb Scraper is priced at **$0.9 per 1,000 results** - competitive with other Airbnb scrapers on Apify Store. A `search` run collecting a few hundred listings, or a `reviews` run pulling a few hundred reviews, typically finishes within a minute or two of platform time.

### Tips and advanced options

- Leave check-in/check-out empty in `search` mode to browse listings without date-specific pricing (faster, and shows the default price Airbnb displays).
- Pricing is only available in `search` mode - `listing_detail` mode focuses on the listing's static info (host, amenities, ratings, description) and does not return a live price quote.
- Enable **Proxy configuration** for large multi-location runs to reduce the chance of temporary rate-limiting.
- `reviews` mode paginates automatically until `maxReviews` is reached or the listing runs out of reviews.

### FAQ, disclaimers, and support

This Actor only reads publicly accessible Airbnb pages and data - it does not require login credentials and does not access private or authenticated information. It is intended for legitimate market research, analytics, and dataset building. Always review [Airbnb's Terms of Service](https://www.airbnb.com/terms) and applicable local laws when reusing this data.

Airbnb occasionally changes its internal page structure or rotates the GraphQL query identifiers `reviews` mode depends on, which may require an update to this Actor. If you notice missing or malformed results, please report it via the **Issues** tab on this Actor's page. Need a custom version (extra fields, availability calendars, alternate locales)? Reach out through the Issues tab as well.

# Actor input Schema

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

Choose what to fetch. Other fields below only apply to the selected mode (see the '(mode: ...)' prefix on each field) - the Apify input schema does not support conditional show/hide.

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

(mode: search) Free-text destination to search, e.g. 'Bali, Indonesia' or 'Paris, France'.

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

(mode: search) Check-in date (YYYY-MM-DD). Leave empty to search without fixed dates.

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

(mode: search) Check-out date (YYYY-MM-DD). Leave empty to search without fixed dates.

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

(mode: search) Number of adult guests.

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

(mode: search) Number of children.

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

(mode: search) Number of infants.

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

(mode: search) Number of pets.

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

(mode: search) Maximum number of listings to fetch.

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

(mode: listing\_detail, reviews) Airbnb listing URLs (e.g. https://www.airbnb.com/rooms/1530784477084077413) or bare numeric listing IDs. Used by both 'listing\_detail' and 'reviews' modes.

## `maxReviews` (type: `integer`):

(mode: reviews) Maximum number of reviews to fetch per listing.

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

(mode: search) 3-letter currency code for displayed prices, e.g. USD, EUR, IDR.

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

Recommended for larger runs to reduce the chance of Airbnb rate-limiting requests. Leave off for small test runs.

## Actor input object example

```json
{
  "mode": "search",
  "location": "Bali, Indonesia",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "maxResults": 50,
  "listingUrls": [
    "https://www.airbnb.com/rooms/1530784477084077413"
  ],
  "maxReviews": 50,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runInfo` (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 = {
    "location": "Bali, Indonesia",
    "listingUrls": [
        "https://www.airbnb.com/rooms/1530784477084077413"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ryyos/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 = {
    "location": "Bali, Indonesia",
    "listingUrls": ["https://www.airbnb.com/rooms/1530784477084077413"],
}

# Run the Actor and wait for it to finish
run = client.actor("ryyos/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 '{
  "location": "Bali, Indonesia",
  "listingUrls": [
    "https://www.airbnb.com/rooms/1530784477084077413"
  ]
}' |
apify call ryyos/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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