# Airbnb Scraper — Listings, Prices, Calendar & Reviews (`cheapapi/airbnb-scraper`) Actor

Airbnb scraper without the 240-result cap: listings, prices for your dates, ratings, amenities, host stats, 12-month availability, occupancy and reviews.

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

## Pricing

Pay per event

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 — Listings, Prices, Calendar & Reviews

Scrape **Airbnb listings for any city with no 240-result cap**: every home with its name, link, type, bedrooms, beds, baths, rating, review count, location and the **price for your dates**. Turn on add-ons for **full listing details** (amenities, house rules, highlights, rating categories, host stats and languages, all photos with captions — and with your dates the **full price breakdown, availability and cancellation terms**), an **availability calendar (up to 12 months) with an occupancy estimate**, and **reviews**. Built for short-term-rental investors, property managers and market researchers. No Airbnb account, cookies or browser needed.

| Quick facts | |
|---|---|
| Price | $2.80 per 1,000 listings with full details on the Free plan, $0.35 on Gold+ — all-in: Apify platform usage and proxies included; no start fee |
| Depth | up to 10,000 listings per location — dense areas are split into smaller map areas automatically |
| Speed | about 1,800 listings per minute on the Apify platform (search only; 3,000 New York listings in 97 s, October 2026) |
| Add-ons | details (with your dates: price breakdown, availability, cancellation terms), prices with taxes, host profile, availability calendar + occupancy estimate, reviews |
| Languages | 28 display languages for names, descriptions, amenities, rules and reviews — numbers and facts are read the same in every language |
| Input | city or area names, Airbnb search URLs (with all their filters) or listing URLs |

**Pricing in one line:** you pay a few tenths of a cent per listing (from $0.000275 on Gold+ to $0.0028 on the Free plan), plus optional add-ons — platform usage and proxies are included, nothing is charged for failed or skipped listings, and never more than the maximum cost you set for a run.

Jump to [Pricing](#pricing) · [FAQ](#faq) · [Limitations](#limitations)

**Why this Actor**

- **Working links and stable ids:** every row has the listing's real Airbnb id and a working `https://www.airbnb.com/rooms/<id>` link — the same ids the details, calendar and reviews add-ons load successfully.
- **Tested on the Apify platform before release:** 22 of 22 test runs succeeded (up to 3,000 listings and 3,659 reviews per run), with zero lost map areas and rows delivered always equal to rows charged.
- **Support that answers:** open an issue with your run ID and we aim to reply within one working day.
- **No 240-result limit:** Airbnb shows at most ~280 homes per search; this Actor splits the map until every area shows all of its homes — in our platform tests 3,000 New York listings took 97 seconds with zero failed requests.
- **Listing fees at least 30% below the most-used Airbnb Actor on every plan:** $2.80 / $0.35 per 1,000 listings with full details (Free / Gold+) against $4.00 / $1.00 for its listings (its Diamond price is $0.50).
- **Investor data in one run:** prices for your dates, up to 12 months of availability, the share of unavailable days in the next 30/90 days and over the whole calendar (occupancy estimate), next available date and typical minimum stay — no separate calendar Actor.
- **Search filters included:** dates, guests, price range, type of place, bedrooms, beds, bathrooms — or paste any Airbnb search URL and all of its filters (amenities, property types…) are used.
- **Fair, transparent billing:** you pay per delivered listing, add-on and review; add-ons that are not available are free; your maximum cost per run is always respected (rows delivered always equal rows charged).
- **Privacy by default:** host and reviewer names, photos and locations are left out unless you turn them on (only co-hosts' first names, as shown on the listing page, are always included).

### Compared with alternatives

Actor fees of public Apify Store listings (Free plan / Gold plan), checked October 2026:

| Option | 1,000 listings, search data | 1,000 listings with details | 1,000 reviews | Results per search | Calendar / occupancy |
|---|---|---|---|---|---|
| **This Actor** | **$2.79 / $0.275** | **$2.80 / $0.35** | **$3.50 / $0.70** | up to 10,000 per location | yes (add-on) |
| Most-used Airbnb Actor (~17,500 users) | — (always loads details) | $4.00 / $1.00 ($0.50 Diamond) | separate Actor: $5.00 / $2.30 ($1.00 Diamond) | ~240 | no |
| Most-used Airbnb calendar Actor (~280 users) | — | — | — | — | $3.00 per 1,000 results, $10 per 1,000 priced dates |

**All-in prices on both sides:** like the most-used Actor, this Actor's prices include Apify platform usage and proxies — the fees above are the whole cost. Details cost just $0.01 per 1,000 listings on the Free, Bronze and Silver plans, so listings with details cost 30% less than that Actor's listings on every plan (Gold+: $0.35 vs its Diamond $0.50); search-only listings cost less again. With the host profile add-on, listings with details and host profile cost 30% less than that Actor's listings with host profiles on every plan (Gold+: $0.525 vs its Diamond $0.75).

### Not included

- **Experiences, Airbnb Luxe and long-term "monthly stays" search pages** — homes (stays) search only.
- **Booked vs host-blocked days** — Airbnb shows both as "unavailable"; the occupancy figure is an estimate (upper bound).
- **Revenue or ADR history** like paid analytics tools — this Actor gives today's live data you can build history from (schedule it).
- **Taxes Airbnb does not list** — with *Prices with taxes* you get what Airbnb shows visitors from Europe (taxes itemised); a stay without listed taxes has `quoteTaxesShown: false`.
- **Cancellation policy name** — Airbnb's current listing page gives the terms for your dates (`cancellationTerms`), and the policy name (`cancellationPolicy`) only sometimes.
- **Host contact details** (phone, e-mail) — Airbnb does not publish them.

### What data you get

Every row has `type` (`listing` or `review`). Listing rows:

| Field | Example | Notes |
|---|---|---|
| `id`, `url`, `name` | `7743405`, `https://www.airbnb.com/rooms/7743405`, `Chiado Luxury Apartment` | stable Airbnb listing id |
| `propertyType`, `area` | `Entire rental unit`, `Lisbon` | |
| `bedrooms`, `beds`, `bathrooms` | `3`, `4`, `2` | |
| `rating`, `reviewsCount`, `isGuestFavorite`, `isNewListing`, `badges` | `4.99`, `502`, `true` | |
| `latitude`, `longitude` | `38.7107`, `-9.1442` | |
| `priceTotal`, `pricePerNight`, `nights`, `priceOriginalTotal`, `priceLines`, `priceLabel`, `currency` | `2040`, `408`, `5` | for `checkIn`–`checkOut`, as Airbnb's search shows it (usually before taxes; the details add-on with dates gives the full breakdown) |
| `checkIn`, `checkOut`, `datesChosenByAirbnb` | `2026-12-07`, `2026-12-12`, `true` | without your dates Airbnb prices each home's next available nights |
| `thumbnailUrl`, `photos`, `searchQuery`, `position`, `scrapedAt` | | |
| **Details add-on:** `roomType`, `personCapacity`, `description`, `amenities`, `amenitiesNotIncluded`, `houseRules`, `checkInTime`, `checkOutTime`, `petsAllowed`, `sleepingArrangements`, `ratingCleanliness`, `ratingAccuracy`, `ratingCheckIn`, `ratingCommunication`, `ratingLocation`, `ratingValue`, `locationDescription`, `locationIsExact`, `locationDetails`, `city`, `neighborhood`, `neighborhoodSummary`, `country`, `locationPath`, `descriptionHtml`, `descriptionLanguage`, `highlights`, `amenityGroups`, `hostId`, `hostIsSuperhost`, `hostIsVerified`, `hostRating`, `hostReviewsCount`, `hostYearsHosting`, `hostLanguages`, `hostResponseRate`, `hostResponseTime`, `coHostsCount`, `photosCount`, `photoCaptions`, `photoOrientations`, `coHosts`, `homeTier`, `isLuxe`, `cancellationPolicy`, `pageTitle`, `metaDescription`, `appLink`, `iosLink`, `androidLink` (+ `hostName`, `hostPhotoUrl`, `hostAbout`, `hostLivesIn` only with *Include names and photos*) | `Entire home/apt`, `6`, `Check-in after 4:00 PM`, `["English", "Portuguese"]`, `100` | all photos in `photos` |
| **Prices with taxes add-on:** the `quote…` fields above as Airbnb shows them to visitors from Europe, `quoteTaxes`, `quoteTaxesShown` | `13.46`, `true` | total with taxes and the tax amount |
| **Host profile add-on:** `hostProfileUrl`, `hostListingsCount`, `hostListings` (id, url, name, type, rating, reviews, rooms), `hostReviewsFromGuestsCount`, `hostReviewsFromHostsCount`, `hostProfileRating`, `hostIdentityVerified`, `hostVerifications`, `hostVerifiedSince`, `hostMonthsHosting`, `hostMonthsOnAirbnb`, `hostTripsCount`, `hostIsBusiness`, `hostReviewsFromGuestsPreview`, `hostReviewsFromHostsPreview` (newest reviews on the profile) (+ `hostName`, `hostPhotoUrl`, `hostAbout`, `hostLivesIn`, `hostProfileFacts`, `hostInterests` only with *Include names and photos*) | `7`, `3465`, `125` | one request per host, shared by all of the host's listings |
| **Calendar add-on:** `availableDays30`, `availableDays90`, `availableDaysInCalendar`, `unavailablePercent30`, `unavailablePercent90`, `unavailablePercentInCalendar`, `nextAvailableDate`, `minNightsTypical`, `calendarFrom`, `calendarTo`, `calendarDaysCount` (+ `calendar` day list on request) | `5`, `83.3`, `2026-10-27`, `4` | occupancy estimate; "InCalendar" = today to the end of the loaded months (Airbnb gives at most 12 months = 336–365 days) |
| **Details with your dates (same request, no extra fee):** `isAvailable`, `instantBook`, `cancellationTerms`, `priceQuoteAvailable`, `priceQuoteNote`, `quoteCheckIn`, `quoteCheckOut`, `quoteNights`, `quoteGuests`, `quoteTotal`, `quoteOriginalTotal`, `quoteNightlyRate`, `quoteAveragePerNight`, `quoteCleaningFee`, `quoteServiceFee`, `quoteOtherFees`, `quoteTaxes`, `quoteDiscounts`, `quoteLines`, `quoteNote` | `true`, `Free cancellation before November 11`, `386.86`, `13.46` | for your dates and guests |
| `notes` | `Not available this time (not charged): calendar.` | only when an add-on could not be loaded |

Review rows: `listingId`, `listingUrl`, `id`, `rating`, `date`, `language`, `text`, `textTranslated` and `translatedFrom` (Airbnb's translation into the chosen language), `hostResponse`, `hostResponseTranslated`, `highlight`, `tripDetails`, `photos` (+ `reviewerName`, `reviewerPhotoUrl`, `reviewerLocation` only with *Include names and photos*).

The dataset has four views — **Listings, Listing details, Availability & occupancy, Reviews** — and every run saves a `RUN_SUMMARY` record (listings found and delivered, homes outside the boundary, map areas and pages searched, add-ons delivered, add-ons and prices for your dates not available, failed listings and places with reasons, requests and retries, whether the spending limit was reached).

### How to use

1. Open the Actor and click **Try for free**.
2. Type one or more **Locations** (e.g. `Lisbon, Portugal`), or paste Airbnb search or listing URLs.
3. Optionally set **Check-in / Check-out**, guests and filters, and **Max listings per location**.
4. Turn on the add-ons you need (details, calendar, reviews).
5. Click **Start** and download the results as JSON, CSV, Excel or HTML, or read them through the API.

Ready-to-paste input:

```json
{
    "locations": ["Lisbon, Portugal"],
    "maxResults": 500,
    "checkIn": "2026-12-07",
    "checkOut": "2026-12-12",
    "adults": 2,
    "roomType": "entire",
    "includeDetails": true,
    "includeCalendar": true
}
```

**API (curl):**

```bash
curl -X POST "https://api.apify.com/v2/acts/cheapapi~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Austin, TX"], "maxResults": 200, "includeCalendar": true}'
```

**JavaScript** (`npm install apify-client`):

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('cheapapi/airbnb-scraper').call({
    locations: ['Lisbon, Portugal'],
    maxResults: 500,
    includeCalendar: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.type === 'listing').length);
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("cheapapi/airbnb-scraper").call(run_input={
    "locations": ["Lisbon, Portugal"],
    "maxResults": 500,
    "includeCalendar": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["type"] == "listing":
        print(row.get("name"), row.get("pricePerNight"), row.get("unavailablePercent90"))
```

### Use cases

- **Short-term-rental investing:** find markets and properties with high occupancy and nightly rates before buying.
- **Dynamic pricing and revenue management:** compare your nightly rate with every competing home for the same dates and guests.
- **Market research:** count supply by neighbourhood, property type and size; track it monthly with a schedule.
- **Property management prospecting:** find active, well-reviewed listings in your area (host stats included; names only on request).
- **Travel and data products:** feed listings, photos and availability into dashboards or apps.
- **Review analysis:** collect guest reviews to study what guests praise or complain about.

### Advanced options

| Option | Default | What it does |
|---|---|---|
| `locations` | — | City, area or address names; each is searched across its whole map area (OpenStreetMap geocoding). |
| `startUrls` | — | Airbnb search URLs (all filters used; their map box is kept) and listing URLs (`/rooms/…`, always with details). |
| `maxResults` | 100 | Listings per location or search URL, 1–10,000. |
| `maxConcurrency` | 16 | Parallel requests, 1–32. 16 was the fastest setting without errors in our platform tests (more gave no speed-up; 32 started to see retries). |
| `stayInsideBoundary` | on | Drop homes outside the place's real boundary (the map search covers a rectangle; e.g. New Jersey homes when you search "Manhattan"). Dropped homes are free. |
| `checkIn` / `checkOut` | — | Stay dates; prices and availability follow them. |
| `adults`, `children`, `infants`, `pets` | 1, 0, 0, 0 | Guests. |
| `priceMin` / `priceMax` | — | Nightly price filter in your currency. |
| `roomType` | `any` | `entire`, `private`, `shared`, `hotel`. |
| `minBedrooms`, `minBeds`, `minBathrooms` | 0 | Size filters (0 = any). |
| `currency` | `USD` | Any 3-letter code. |
| `language` | `en` | Display language of the texts (28 languages); numbers, prices and facts are the same in every language. |
| `includeDetails` | off | Details add-on; with `checkIn`/`checkOut` it also gives the price breakdown, availability and cancellation terms. |
| `includeHostProfile` | off | Host profile add-on (turns on details). |
| `includeTaxes` / `taxCountry` | off / `DE` | Prices with taxes as Airbnb shows them to visitors from that European country (needs dates; turns on details). |
| `includeCalendar` | off | Availability + occupancy estimate add-on. |
| `calendarMonths` | 12 | 1–12 months starting this month (12 = 336–365 days from today, Airbnb's maximum). |
| `includeCalendarDays` | off | Also the day-by-day list (no extra charge). |
| `includeReviews` / `maxReviewsPerListing` | off / 20 | Newest reviews, 1–5,000 per listing. |
| `includePersonalData` | off | Host and reviewer names, photos and reviewer locations. |
| Proxy | Apify Proxy, included | Not an option: Apify's datacenter proxies are used and included in the price (they worked in every test). |

### Output example

Real rows from a run for `Lisbon, Portugal` without dates (so `datesChosenByAirbnb` is true), with details, calendar and reviews (October 2026; lists shortened; the review shown belongs to another listing of the same run):

```json
[
  { "type": "listing", "id": "7743405", "url": "https://www.airbnb.com/rooms/7743405", "name": "Chiado Luxury Apartment",
    "propertyType": "Entire rental unit", "area": "Lisbon", "bedrooms": 3, "beds": 4, "bathrooms": 2, "rating": 4.99,
    "reviewsCount": 502, "isGuestFavorite": true, "latitude": 38.7107, "longitude": -9.1442,
    "priceTotal": 2040, "nights": 5, "pricePerNight": 408, "priceLines": [{ "label": "5 nights x $407.95", "amount": 2039.74 }],
    "currency": "USD", "checkIn": "2026-12-07", "checkOut": "2026-12-12", "datesChosenByAirbnb": true,
    "roomType": "Entire home/apt", "personCapacity": 6, "ratingCleanliness": 5, "ratingValue": 4.9,
    "amenities": ["Bathtub", "Hair dryer", "Shampoo"], "houseRules": ["Check-in after 4:00 PM", "Checkout before 11:00 AM", "6 guests maximum"],
    "checkInTime": "Check-in after 4:00 PM", "petsAllowed": false,
    "sleepingArrangements": ["Bedroom 1: 1 queen bed", "Bedroom 2: 1 queen bed", "Bedroom 3: 2 single beds"],
    "hostId": "2446180", "hostIsSuperhost": true, "hostRating": 4.94, "hostReviewsCount": 4600, "hostYearsHosting": 14, "photosCount": 45,
    "availableDays30": 5, "availableDays90": 19, "availableDaysInCalendar": 220, "calendarDaysCount": 358, "unavailablePercent30": 83.3,
    "unavailablePercent90": 78.9, "unavailablePercentInCalendar": 38.5, "nextAvailableDate": "2026-10-27", "minNightsTypical": 4, "scrapedAt": "2026-10-08T16:46:07.329Z" },
  { "type": "review", "id": "1786859983026238954", "listingId": "1399853605326576581",
    "listingUrl": "https://www.airbnb.com/rooms/1399853605326576581", "rating": 5, "date": "2026-10-01", "language": "en",
    "text": "Super cute boutique hotel and neighborhood location. Very cute street with multiple small cafes that are lit up at night. Cute plaza for a beverage. Loved the location, hospitality and comfort of the bed!",
    "hostResponse": null, "highlight": "Stayed one night", "scrapedAt": "2026-10-08T16:46:07.329Z" }
]
```

### Pricing

Pay per event — you pay per delivered listing, add-on and review, with no start fee. **Apify platform usage and proxies are included in these prices** — nothing else is billed for this Actor.

| Event | Free | Bronze | Silver | Gold, Platinum, Diamond |
|---|---|---|---|---|
| Listing (`listing`) | $0.00279 | $0.00139 | $0.00104 | $0.000275 |
| Listing details add-on (`listing-details`) | $0.00001 | $0.00001 | $0.00001 | $0.000075 |
| Host profile add-on (`host-profile`) | $0.0014 | $0.000945 | $0.00084 | $0.000175 |
| Prices with taxes add-on (`price-with-taxes`) | $0.00029 | $0.00029 | $0.00029 | $0.00029 |
| Availability calendar add-on (`calendar`) | $0.0021 | $0.0018 | $0.0015 | $0.0012 |
| Review (`review`) | $0.0035 | $0.00287 | $0.00224 | $0.0007 |

- Add-ons are charged only when delivered; if one is not available for a listing, the row says so in `notes` and it is free. The price breakdown for your dates is part of the details (no separate fee).
- Listing URLs always include the details add-on (that is how their data is loaded).
- **Free:** invalid inputs, places the map does not know, homes outside the place's boundary, duplicate listings, listings that no longer exist, listing URLs whose data could not be loaded, and failed requests.

**Worked examples (Free / Gold):**

- **1,000 listings, search only:** **$2.79 / $0.275**, all-in.
- **1,000 listings with details:** **$2.80 / $0.35**, all-in.
- **1,000 listings with details and calendar:** **$4.90 / $1.55**, all-in.
- **100 listings with 20 reviews each:** **$7.28 / $1.43**.

Set **Maximum cost per run** in the run options to cap any run; the Actor stops cleanly at the limit.

**Apify Free plan:** up to **$2 of results per month** (about 700 listings at Free-plan prices) — Apify does not pass Free-plan fees on to developers while we pay the platform usage, so the Free plan has this monthly allowance. Any paid Apify plan removes the limit.

### Integrations

- **Google Sheets, Excel, CSV:** export the dataset or use the Google Sheets integration.
- **Make, Zapier, n8n:** start the Actor and receive listings in your scenarios.
- **Webhooks:** get a call when a run finishes.
- **Scheduling:** run weekly or monthly to track prices, supply and availability; listing `id`s are stable.
- **API and MCP:** call it from code (above) or from AI agents through Apify's MCP server.

### FAQ

**Is it legal?** The Actor reads public listing pages the same way a browser does, without logging in. Airbnb's terms restrict automated access, so use the data responsibly and in line with the laws that apply to you. Host and reviewer names, photos and locations are personal data — they are off by default; turn them on only with a lawful basis (e.g. under the GDPR).

**How fresh is the data?** Live: every run reads Airbnb at that moment.

**How do I export the results?** Open the run's **Output** or **Storage → Dataset** tab and download JSON, CSV, Excel, HTML or XML, or use the views (Listings, Listing details, Availability & occupancy, Reviews) to export only those columns. Through the API: `GET https://api.apify.com/v2/datasets/<datasetId>/items?format=csv&view=listings&token=<YOUR_TOKEN>`.

**How does it get more than 240 results?** Airbnb shows at most about 280 homes per search. The Actor checks how many homes each map area has and splits dense areas into four smaller ones until each area shows all of its homes.

**Why are prices for different dates in each row?** Without Check-in/Check-out, Airbnb prices every home for its own next available nights (`datesChosenByAirbnb: true`). Give dates to compare prices for the same stay.

**Is `unavailablePercent` the occupancy rate?** It is an estimate: Airbnb marks a day unavailable when it is booked *or* blocked by the host, so the real occupancy is equal or lower.

**Why did I get fewer listings than I asked for?** The area or your filters have fewer homes, listings are not available for your dates, or homes were outside the place's boundary (`outsideBoundarySkipped` in `RUN_SUMMARY`; turn off *Only homes inside the place's boundary* to keep them). A place the map does not know is skipped and reported.

**Why was I charged for a listing without some fields?** You are charged for the listing row; add-ons that were not available are free and named in `notes`.

**Do I need proxies?** No. Apify's proxies are used automatically and included in the price. If Airbnb ever refuses requests, the run stops with a clear message and nothing more is charged.

**Do I need an Airbnb account?** No.

### Support

Found a problem or need a field? Open an issue on the Actor's **Issues** tab with the run ID; we aim to answer within one working day.

### Limitations

- Homes (stays) only; experiences are not included.
- Occupancy is an estimate (booked and host-blocked days look the same).
- Locations are geocoded with OpenStreetMap; ambiguous names use the best match — add the country (e.g. `Paris, France`) or paste an Airbnb search URL with its map. Places it does not know are skipped (not searched worldwide).
- Up to 10,000 listings per location or search URL per run.
- Airbnb changes its website from time to time; the Actor finds the current search query automatically, other changes may need an update.
- Reviews come newest first; review text is in the original language.

# Actor input Schema

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

Cities, neighbourhoods, regions or addresses to search, one per line (e.g. "Lisbon, Portugal", "Brooklyn, New York"). Each one is searched across its whole map area, so you are not limited to the ~240 results Airbnb shows per search.

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

Paste Airbnb search URLs (all their filters are used, e.g. amenities or property types) and/or listing URLs (<code>https://www.airbnb.com/rooms/12345</code>). Listing URLs always include the listing details.

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

How many listings to collect for each location or search URL. Dense areas are split automatically into smaller map areas to go past Airbnb's ~240-per-search limit.

## `stayInsideBoundary` (type: `boolean`):

Locations are searched across their map rectangle; with this on, homes outside the place's real boundary (e.g. New Jersey when you search "Manhattan") are left out and not charged. Turn off to keep everything in the rectangle. Search URLs always use their own map.

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

Optional. With dates, every price is for your stay and only listings available for those dates are returned. Without dates, Airbnb shows each listing's price for its own next available nights (see checkIn/checkOut in each row).

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

Optional; needed together with Check-in.

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

Guests aged 13 or over.

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

Ages 2–12.

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

Under 2.

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

Only listings that allow pets when above 0.

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

In the chosen currency, per night (Airbnb's own price filter).

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

In the chosen currency, per night.

## `roomType` (type: `string`):

Airbnb's type-of-place filter.

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

0 = any.

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

0 = any.

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

0 = any.

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

3-letter currency code for all prices (USD, EUR, GBP, TRY…).

## `language` (type: `string`):

Language of the texts Airbnb returns: listing names and descriptions (Airbnb's translations), amenities, house rules, highlights, location texts and reviews. Numbers, prices and facts are the same in every language.

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

Adds description, all amenities (by group), house rules, check-in/out times, sleeping arrangements, highlights, neighbourhood texts, city and country, rating categories, host stats (superhost, rating, years hosting, languages, response rate and time) and all photos with captions. With Check-in/Check-out it also adds the full price breakdown (nightly rate, fees, taxes where Airbnb shows them, total), availability, instant booking and cancellation terms — same request, no extra fee. Almost free: $0.01 per 1,000 listings on the Free, Bronze and Silver plans, $0.075 per 1,000 on Gold and higher (see Pricing).

## `includeCalendar` (type: `boolean`):

Adds available days in the next 30 and 90 days and over the whole loaded calendar, the share of unavailable days (an occupancy estimate: Airbnb does not separate booked from host-blocked days), the next available date and typical minimum stay. Charged per listing.

## `calendarMonths` (type: `integer`):

Months of availability to read, starting this month (Airbnb gives at most 12, i.e. 336–365 days from today). The 30/90-day figures need at least 1/3 months.

## `includeCalendarDays` (type: `boolean`):

Also add the day-by-day list (date, available, minimum nights) to each listing. No extra charge.

## `includeHostProfile` (type: `boolean`):

Adds the host's public profile: number of listings and the list of them (name, type, rating, reviews), reviews from guests and from hosts, identity verification, months hosting, trips, profile languages. With 'Include names and photos' also the host's name, photo, about text, home town, profile answers and interests. One profile request per host is shared by all of that host's listings. Turns on the details add-on (the host comes from there).

## `includeTaxes` (type: `boolean`):

Needs Check-in/Check-out. Airbnb shows taxes (e.g. tourist tax) only to visitors from Europe; this reads each listing's price once more as a European visitor and gives the total with taxes and the tax amount (quoteTaxes). Turns on the details add-on.

## `taxCountry` (type: `string`):

2-letter code of the European country whose visitors' view is used (DE, FR, PT, ES, IT, NL…).

## `includeReviews` (type: `boolean`):

Adds the newest reviews of every listing as separate rows (rating, date, text, host response). Charged per review.

## `maxReviewsPerListing` (type: `integer`):

Newest first.

## `includePersonalData` (type: `boolean`):

Off by default to keep personal data out of your dataset. Turn on only if you have a lawful reason to process it (e.g. GDPR).

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

How many Airbnb requests run at the same time. The default is the fastest setting that ran without errors in our tests; lower it if you see many retries in RUN_SUMMARY.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "maxResults": 20,
  "stayInsideBoundary": true,
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "roomType": "any",
  "minBedrooms": 0,
  "minBeds": 0,
  "minBathrooms": 0,
  "currency": "USD",
  "language": "en",
  "includeDetails": false,
  "includeCalendar": false,
  "calendarMonths": 12,
  "includeCalendarDays": false,
  "includeHostProfile": false,
  "includeTaxes": false,
  "taxCountry": "DE",
  "includeReviews": false,
  "maxReviewsPerListing": 20,
  "includePersonalData": false,
  "maxConcurrency": 16
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

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

No description

## `availability` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `runSummary` (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": [
        "Lisbon, Portugal"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cheapapi/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": ["Lisbon, Portugal"],
    "maxResults": 20,
}

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

```

## MCP server setup

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