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

Scrape Airbnb listings by location or URL: prices for your dates, ratings, amenities, photos, house rules, coordinates, and host stats. Fast HTTP scraper with no browser and no 270-result cap.

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

## Pricing

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

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

Scrape Airbnb listings for any city, region, or neighborhood, or for search and listing URLs you paste in. For each listing you get the **price for your dates**, ratings, bedrooms and beds, amenities, house rules, photos, coordinates, and host stats. Results are ready to download as JSON, CSV, Excel, or HTML, or to pull through the Apify API.

The scraper sends plain HTTP requests with no browser, so it's fast and cheap to run. It also **gets past Airbnb's limit of about 270 results per search** by splitting large searches into price ranges.

### What can this Airbnb Scraper do?

- 🔎 **Search by location**: type "Lisbon", "Brooklyn, NY", or "Lake Tahoe" the way you would on Airbnb.
- 🔗 **Scrape from URLs**: paste Airbnb search URLs (your filters are kept) or individual `/rooms/` listing URLs.
- 💲 **Prices for your stay**: set check-in, check-out, and guests to get the total price, the price per night, discounts, and the fee breakdown. Relative dates such as `2 weeks` keep scheduled runs looking the same distance ahead.
- 🧮 **No 270-result cap**: large searches are split automatically by nightly price, so you can collect thousands of listings for a city.
- 🏠 **Full listing details**: description, amenities, house rules, sleeping arrangements, safety features, category ratings, and every photo.
- 🎛️ **Filters**: price range, type of place, minimum bedrooms, beds, and bathrooms, number of guests, and pets.
- 💱 **Any currency**: USD, EUR, GBP, JPY, and every other currency Airbnb supports.
- 🛡️ **Privacy by default**: host names, photos, and bios are only saved if you turn them on.

### What data can I extract from Airbnb?

| Listing                             | Price and availability                    | Details (with listing details on)           |
| ----------------------------------- | ----------------------------------------- | ------------------------------------------- |
| Listing ID and URL                  | Total price for the stay                  | Full description                            |
| Name and listing type               | Price per night                           | Amenities (included and not included)       |
| Rating and number of reviews        | Original price before discount            | House rules, check-in and check-out times   |
| Bedrooms, beds, bathrooms           | Fee and discount breakdown                | Category ratings (cleanliness, location...) |
| Coordinates                         | Free cancellation and other booking perks | Sleeping arrangements                       |
| Guest favorite and Superhost badges | Check-in and check-out dates used         | Safety and property notes                   |
| Thumbnail and photos                | Airbnb's suggested dates when none given  | Host stats: rating, response rate, years    |

### How do I use Airbnb Scraper?

1. Click **Try for free**.
2. Enter one or more **Locations**, or paste **Airbnb URLs**.
3. Optionally set **check-in and check-out dates**, guests, and filters.
4. Set **Maximum listings** to control how many results (and how much) you get.
5. Click **Start** and download your data from the **Output** tab when the run finishes.

You can also start runs from your own code through the [Apify API](https://docs.apify.com/api/v2), schedule them, or connect the results to Google Sheets, Slack, Zapier, Make, and other tools with [integrations](https://apify.com/integrations).

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

You pay only for the listings you get. See the **Pricing** tab for the price per listing. To keep costs predictable:

- Use **Maximum listings** to cap the number of results.
- Set a **maximum cost per run** in the run options. The scraper stops scheduling new listings once your budget is used up.
- Turn off **Include listing details** if search-card data (price, rating, rooms, coordinates, photos) is enough. Runs finish several times faster.

### Input

All fields are optional except that you need at least one location or URL. Example:

```json
{
    "locationQueries": ["Lisbon, Portugal"],
    "checkIn": "2026-11-10",
    "checkOut": "2026-11-14",
    "adults": 2,
    "currency": "EUR",
    "roomTypes": ["Entire home/apt"],
    "minBedrooms": 1,
    "maxPrice": 250,
    "maxListings": 500,
    "includeDetails": true
}
```

See the **Input** tab for every option and its description.

### Output

Each listing is one item in the dataset. Example (shortened):

```json
{
    "id": "1581864126294988325",
    "url": "https://www.airbnb.com/rooms/1581864126294988325",
    "name": "Fabulous Apartment in a Vibrant Area!",
    "listingType": "Apartment in Prague",
    "propertyType": "Entire rental unit",
    "roomType": "ENTIRE_HOME",
    "price": {
        "label": "$324 for 3 nights, originally $409",
        "amount": 324,
        "originalAmount": 409,
        "perNight": 108,
        "nights": 3,
        "currency": "USD",
        "breakdown": [
            { "description": "3 nights x $136.31", "amount": 408.92 },
            { "description": "Long stay discount", "amount": -85.87 }
        ]
    },
    "checkIn": "2026-10-15",
    "checkOut": "2026-10-18",
    "rating": 4.77,
    "reviewsCount": 125,
    "ratings": {
        "accuracy": 4.7,
        "checkIn": 4.88,
        "cleanliness": 4.91,
        "communication": 4.94,
        "location": 4.65,
        "value": 4.77
    },
    "personCapacity": 3,
    "bedrooms": 0,
    "beds": 2,
    "bathrooms": 1,
    "location": "Prague, Czechia",
    "coordinates": { "latitude": 50.0873, "longitude": 14.4623 },
    "isGuestFavorite": false,
    "isSuperhost": true,
    "paymentMessages": ["Extended stay discount", "Free cancellation"],
    "description": "Apartment is located in a beautiful building with top-tier security...",
    "amenities": ["Wifi", "Kitchen", "Washer", "Dedicated workspace", "Elevator"],
    "houseRules": ["Check-in: 3:00 PM - 12:00 AM", "Checkout before 11:00 AM", "No pets", "No smoking"],
    "sleepingArrangements": [{ "room": "Bedroom area", "beds": "1 queen bed, 1 sofa bed" }],
    "host": {
        "isSuperhost": true,
        "rating": 4.88,
        "yearsHosting": 8,
        "responseRate": "100%",
        "responseTime": "Responds within an hour"
    },
    "thumbnail": "https://a0.muscache.com/im/pictures/hosting/...",
    "photos": ["https://a0.muscache.com/im/pictures/hosting/..."],
    "searchQuery": "Prague",
    "scrapedAt": "2026-10-01T11:41:35.814Z"
}
```

The **Output** tab has ready-made table views: **Overview**, **Prices**, and **Details**.

### Tips

- **Price monitoring**: schedule a daily run with relative dates such as check-in `30 days` and check-out `33 days` to track prices for the same lead time.
- **Market research**: leave **Maximum listings** at 0 with **Get more than ~270 results per search** on to collect every listing in a city.
- **Your own filters**: set up a search on airbnb.com with the filters you want (amenities, property types, and so on), then paste the URL into **Airbnb URLs**.
- **Blocked requests**: if the log shows many retries, switch **Proxy configuration** to the RESIDENTIAL group.

### FAQ

#### Can I scrape more than 270 listings per location?

Yes. Airbnb never shows more than 15 pages for one search. With **Get more than ~270 results per search** on (the default), the scraper splits large searches into smaller price ranges until each range fits within that limit.

#### Why is the price empty for some listings?

Prices come from Airbnb search results. Listings you add as `/rooms/` URLs are scraped from the listing page, which doesn't include a price, so `price` is `null`. To get prices, search for the location instead and set your dates.

#### Why don't I see the host's name?

Host names, profile photos, and bios are personal data, so they're off by default. Turn on **Include host personal details** if you have a lawful reason to process them.

#### Does it scrape reviews or the availability calendar?

Not at the moment. You get the overall rating, the number of reviews, and the six category ratings. If you need review texts or calendar data, open an issue in the **Issues** tab.

#### Is it legal to scrape Airbnb?

This scraper only collects data that anyone can see on Airbnb without logging in. Scraping public data is generally legal, but personal data is protected by regulations such as the GDPR, and you are responsible for how you use the data. If you're unsure, ask a lawyer. Read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Support

Found a bug or need a feature? Open an issue in the **Issues** tab and include your run ID.

# Actor input Schema

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

Cities, regions, or neighborhoods to search, written as you would type them on Airbnb, for example "Lisbon, Portugal" or "Brooklyn, NY".

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

Airbnb search result URLs (https://www.airbnb.com/s/...) or listing URLs (https://www.airbnb.com/rooms/...). Filters in a search URL are kept; input filters only fill in what the URL doesn't set.

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

Stop after saving this many listings in total. Set to 0 for no limit.

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

Open each listing page to add the description, amenities, house rules, category ratings, all photos, and more. Turn off for faster, cheaper runs with search-card data only.

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

Check-in date as YYYY-MM-DD, or relative to the run date such as "2 weeks". Leave empty to get Airbnb's suggested dates for each listing. Set together with check-out.

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

Check-out date as YYYY-MM-DD, or relative to the run date such as "16 days". Must be after check-in.

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

Number of adult guests (age 13+). Listings that can't host this many are excluded.

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

Number of children (ages 2-12).

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

Number of infants (under 2).

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

Number of pets. Any value above 0 keeps only pet-friendly listings.

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

Three-letter ISO currency code for prices, for example USD, EUR, GBP, or JPY.

## `minPrice` (type: `integer`):

Lowest nightly price in the selected currency. 0 means no minimum.

## `maxPrice` (type: `integer`):

Highest nightly price in the selected currency. 0 means no maximum.

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

Return only these types of place. Leave empty for all types.

## `minBedrooms` (type: `integer`):

Return only listings with at least this many bedrooms. 0 means any.

## `minBeds` (type: `integer`):

Return only listings with at least this many beds. 0 means any.

## `minBathrooms` (type: `integer`):

Return only listings with at least this many bathrooms. 0 means any.

## `includeHostDetails` (type: `boolean`):

Add the host's first name, profile URL and photo, 'about' text, and co-hosts. This is personal data: turn it on only if you have a lawful reason to process it. When off, only non-personal host information is saved (superhost status, rating, years hosting, response rate).

## `splitLargeSearches` (type: `boolean`):

Airbnb shows at most 15 pages (about 270 listings) for one search. When on, large searches are automatically split into price ranges so all listings can be reached.

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

Proxies used to reach Airbnb. Apify Proxy (automatic) works for most runs; switch to the RESIDENTIAL group if you see many blocked requests.

## `maxConcurrency` (type: `integer`):

Maximum number of pages loaded in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Upper limit on requests sent to Airbnb per minute, to stay polite and avoid blocking.

## `maxRequestRetries` (type: `integer`):

How many times a failed or blocked page is retried with a new proxy session before giving up.

## Actor input object example

```json
{
  "locationQueries": [
    "Prague"
  ],
  "startUrls": [],
  "maxListings": 20,
  "includeDetails": true,
  "checkIn": "14 days",
  "checkOut": "17 days",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "currency": "USD",
  "minPrice": 0,
  "maxPrice": 0,
  "roomTypes": [],
  "minBedrooms": 0,
  "minBeds": 0,
  "minBathrooms": 0,
  "includeHostDetails": false,
  "splitLargeSearches": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 20,
  "maxRequestsPerMinute": 240,
  "maxRequestRetries": 5
}
```

# Actor output Schema

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

No description

## `prices` (type: `string`):

No description

## `details` (type: `string`):

No description

## `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 = {
    "locationQueries": [
        "Prague"
    ],
    "maxListings": 20,
    "checkIn": "14 days",
    "checkOut": "17 days",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dtrungtin/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": ["Prague"],
    "maxListings": 20,
    "checkIn": "14 days",
    "checkOut": "17 days",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dtrungtin/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": [
    "Prague"
  ],
  "maxListings": 20,
  "checkIn": "14 days",
  "checkOut": "17 days",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dtrungtin/airbnb-listings-scraper --silent --output-dataset

```

## MCP server setup

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