# Airbnb Scraper: Listings, Prices & Availability (`barefoot_grade/airbnb-stays-scraper`) Actor

Airbnb scraper for any city and dates: nightly price, stay total, discounts, the fees and taxes Airbnb states, rating, reviews, beds, baths, photos, coordinates and URL. Optional full listing detail adds amenities, house rules, host and guest capacity. $0.40 per 1,000 listings.

- **URL**: https://apify.com/barefoot_grade/airbnb-stays-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/barefoot_grade) (community)
- **Categories:** Real estate, Travel
- **Stats:** 2 total users, 1 monthly users, 70.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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: Listings, Prices & Availability

Get Airbnb listings and prices for any city, neighbourhood or region, for the dates and guests you choose. Each listing becomes one clean row: nightly price, the stay total, any discount Airbnb shows, the fees and taxes Airbnb states, rating, review count, bedrooms, beds, bathrooms, photos, map coordinates, the listing link and a booking link already opened on your dates. Turn on full detail to add amenities, house rules, host information and guest capacity.

Use it as a simple Airbnb API: send a place and dates, get back a dataset you can download as JSON, CSV or Excel, or read from your own code. Every run reads Airbnb live, so prices and availability are current. You pay only for the listings you get: **$0.40 per 1,000 listings**.

### Quick Start

```json
{
  "locationQueries": ["Lisbon, Portugal"],
  "checkIn": "2027-03-12",
  "checkOut": "2027-03-15",
  "adults": 2,
  "maxResults": 60
}
```

This run returns up to 60 Lisbon stays available for 2 guests from 12 to 15 March, each with its 3-night total, nightly price, rating and coordinates. Leave the dates out for a general search of the place, or paste a search link you already built on Airbnb into `startUrls`.

### Use cases

- **Short-term rental market research**: average nightly rates, demand signals such as review counts, and the mix of entire homes versus rooms for any city or neighbourhood.
- **Price monitoring**: run the same place and dates on a schedule and track how prices, discounts and availability move as the dates get closer.
- **Competitor analysis for hosts and property managers**: compare your listing with nearby stays of the same size, rating and price band.
- **Travel planning and deal finding**: find the best-rated places under a budget, or the cheapest month-long stay in a city.
- **Investment analysis**: estimate the revenue potential of a property type in an area before buying.
- **Datasets for maps, dashboards and models**: every row has latitude and longitude, numeric prices and a stable listing id.

### Input recipes

**A weekend for two in one city**

```json
{"locationQueries": ["Barcelona, Spain"], "checkIn": "2027-04-16", "checkOut": "2027-04-18", "adults": 2, "maxResults": 100}
```

**Several cities in one run, prices in euros**

```json
{"locationQueries": ["Paris, France", "Rome, Italy", "Amsterdam, Netherlands"], "checkIn": "2027-05-07", "checkOut": "2027-05-10", "currency": "EUR", "maxResults": 3000}
```

`maxResults` is the total for the whole run, and places are searched in the order given: a big city can use up the whole limit before the next place starts. For an even sample per city, run one place per run, for example one saved task per city.

**A family trip: entire place, 3 bedrooms, under $400 a night, pets allowed**

```json
{"locationQueries": ["Orlando, FL"], "checkIn": "2027-03-20", "checkOut": "2027-03-27", "adults": 4, "children": 2, "pets": 1, "entirePlaceOnly": true, "minBedrooms": 3, "priceMax": 400}
```

**A month somewhere warm, any time in November or December**

```json
{"locationQueries": ["Lima, Peru"], "flexibleMonths": ["november", "december"], "flexibleStayLength": "month", "entirePlaceOnly": true, "maxResults": 40}
```

**A three-month stay starting on a fixed date**

```json
{"locationQueries": ["Medellín, Colombia"], "monthlyStart": "2027-01-01", "monthlyLength": 3, "maxResults": 40}
```

Set `monthlyLength` to `1` or `2` for a one- or two-month stay.

**A search you set up on Airbnb, with full listing detail**

```json
{"locationQueries": [], "startUrls": ["https://www.airbnb.com/s/Austin--TX/homes"], "checkIn": "2027-03-12", "checkOut": "2027-03-15", "mode": "full", "maxDetails": 20, "maxResults": 20}
```

**Every listing in a large city**

```json
{"locationQueries": ["London, United Kingdom"], "checkIn": "2027-02-05", "checkOut": "2027-02-07", "maxResults": 2000}
```

### Input

| Field | Type | Default | What it does |
|---|---|---:|---|
| `locationQueries` | array | `["San Francisco, CA"]` | One or more places, e.g. `San Francisco, CA`. Each is searched separately. |
| `startUrls` | array | — | Advanced: run exact Airbnb search URLs. Empty `locationQueries` when you use it, or those places are searched too. |
| `checkIn` | string | — | Stay check-in date (`YYYY-MM-DD`). Provide with `checkOut` for stay totals. |
| `checkOut` | string | — | Stay check-out date (`YYYY-MM-DD`). |
| `flexibleMonths` | array | — | Months a flexible stay can happen in: month names (`november`) or `YYYY-MM` (`2026-11`), up to 12. A `YYYY-MM` value keeps only the month and searches its next occurrence; the year is advisory. Cannot be combined with `checkIn`/`checkOut` or `monthlyStart`. |
| `flexibleStayLength` | string | `month` | With `flexibleMonths`: `weekend`, `week`, or `month` (about four weeks). |
| `monthlyStart` | string | — | Start date (`YYYY-MM-DD`, a real calendar date) of a monthly stay. Cannot be combined with `checkIn`/`checkOut` or `flexibleMonths`. |
| `monthlyLength` | integer | `3` | Months to search from `monthlyStart`, from `1` to `12`. The stay ends on the same day of the month, `monthlyLength` months later (or on that month's last day). |
| `entirePlaceOnly` | boolean | `false` | Only entire homes and apartments, excluding private/shared rooms and hotels. |
| `adults` | integer | `2` | Adult guests. |
| `children` | integer | `0` | Children. |
| `infants` | integer | `0` | Infants. |
| `pets` | integer | `0` | Pets. |
| `priceMin` | integer | `0` | Lowest price to include. In flexible-date and monthly searches this applies to the price Airbnb displays for the window: the monthly price for month-long and longer windows, the stay total for a weekend or week. |
| `priceMax` | integer | — (no cap) | Optional. Highest price to include, in the run's `currency`. Leave it empty to include listings at any price. For dated searches it is a nightly price; for a dated stay of 28+ nights it is converted to Airbnb's monthly price basis. In flexible and monthly searches it caps the price Airbnb displays for the window: the monthly price for month-long and longer windows, the stay total for a weekend or week. |
| `minBedrooms` | integer | `0` | Minimum bedrooms (`0` = no filter). |
| `minBeds` | integer | `0` | Minimum beds (`0` = no filter). |
| `minBathrooms` | integer | `0` | Minimum bathrooms (`0` = no filter). |
| `mode` | string | `search` | `search` = fast result rows; `full` = also open each listing for amenities, house rules, host and guest capacity. |
| `maxResults` | integer | `60` | Stop after this many listings across all places. |
| `maxDetails` | integer | `20` | In `full` mode, how many listings to open for the extra detail. |
| `maxPagesPerQuery` | integer | `15` | Result pages read per place and price range. |
| `currency` | string | `USD` | Currency for returned prices (`USD`, `EUR`, `GBP`, `MXN`, `BRL`, ...). |
| `locale` | string | `en` | Supported search language: English (`en`). Legacy values such as `pt`, `es`, `fr` and `en-US` are accepted but fall back to `en` with a warning. Currency is unchanged. |
| `strictLocation` | boolean | `true` | Reject unresolved or broader place matches and listings outside Airbnb's returned map area. The map area is not an exact neighbourhood boundary. |
| `requestDelaySecs` | number | `0.5` | Pause between result pages. |

Provide at least one place in `locationQueries` or a search URL in `startUrls` (with `locationQueries` empty, see below). Up to 50 places or links per run.

### Pasting an Airbnb search URL

Set up a search on airbnb.com with the map area and filters you want, copy the link from the address bar and paste it into `startUrls`. The run reads that search, place and map area included, page by page.

Empty the places list when you paste links (`"locationQueries": []` in the API, or remove the entries in the input form). If you leave the field out, the default place (San Francisco) is searched too, and first.

The input fields still decide the dates, guests, currency, price range and bedroom, bed and bathroom minimums: they replace the values in the link. Set `checkIn`/`checkOut`, `adults` and any price or room limits in the input as well, so the run searches exactly the stay you want. Links that use Airbnb's flexible or monthly date picker keep their date settings unless you set new ones.

Limit: a pasted link that carries its own dates of 28 nights or more is sent as is, so a `priceMax` you set there is applied by Airbnb to the monthly price.

### Large cities and complete coverage

Airbnb shows a limited number of result pages for any one search. When a place has more listings than that, the Actor automatically searches narrower price bands and merges them, removing repeats, so a run can return far more listings than a single search shows for a city like London or Paris. Every price is included unless you set `priceMax`; raise `maxResults` to collect more of them.

### Flexible-date and monthly stays

Some trips are "a month, sometime in November or December" rather than fixed dates. Use `flexibleMonths` with `flexibleStayLength` for that, or `monthlyStart` with `monthlyLength` to use Airbnb's Months picker. Set `entirePlaceOnly` to keep just entire homes and apartments.

`flexibleMonths` accepts month names or `YYYY-MM` values. A `YYYY-MM` value keeps only the month: Airbnb's picker always searches the next occurrence of that month, so the year is advisory (`2026-11` and `2027-11` both search the next November).

Airbnb prices each flexible or monthly search as a whole window, and every listing gets its own window. Each row therefore reports the window it is priced for: `stayCheckIn`, `stayCheckOut` and `stayNights`, plus `bookingUrl` (the listing page opened on those exact dates) and `pricePerNightEffective` (`totalPrice / stayNights`). That makes a 28-night quote directly comparable with a 31-night or multi-month one.

A flexible month window is about 28 nights. A monthly search covers exactly `monthlyLength` months from `monthlyStart`: one month (Airbnb's monthly stays start at 28 nights), two, three or more. The actual dates and nights are always in the row rather than assumed.

For any stay of 28 nights or more, including dated ones, Airbnb shows an average monthly price rather than a stay total. The row keeps that figure in `pricePerMonth`. For a window of one month or less it is also `totalPrice`; for a longer window `totalPrice` is `pricePerMonth` times the months in the window (whole calendar months, otherwise nights divided by 365/12), and `pricePerNightEffective` follows from it. A multi-month `totalPrice` is therefore an estimate built from Airbnb's monthly average; the listing page shows the exact total.

### Modes

**Search (default)** is the fast mode: one row per listing with price, fees, rating, beds/baths, coordinates, photos and URL.

**Full detail** also opens each listing (up to `maxDetails`) to add `amenities`, `houseRules` (check-in window, pets, smoking, events, quiet hours and more), `host` (name, superhost/verified flags, profile picture and host review stats) and `maxGuests` (guest capacity), plus the structured `propertyType` and `spaceType`.

### What it returns

Each row includes `listingId`, `url`, `bookingUrl`, `name`, `roomType`, `location`, `tagline`, `pricePerNight`, `pricePerNightEffective`, `originalPricePerNight`, `discountAmount`, `totalPrice`, `pricePerMonth`, `stayCheckIn`, `stayCheckOut`, `stayNights`, `currency`, `feeBreakdown`, `rating`, `reviewCount`, `bedrooms`, `beds`, `bathrooms`, `maxGuests` (full-detail mode), `latitude`, `longitude`, `images`, `host`, `amenities`, `houseRules`, `resolvedLocation`, `locationVerified`, `query`, `mode`, `source` and `scrapedAt`.

| Field | Meaning |
|---|---|
| `listingId`, `url`, `bookingUrl` | Airbnb's listing id, the listing page, and the listing page opened on the searched dates and guests. |
| `name`, `tagline`, `roomType`, `location` | The listing title, its short description, type of stay (`Apartment`, `Room`, `Home`, ...), and an unverified place label from the listing card. `location` is not necessarily a neighbourhood; obvious codes or missing labels become `null`. Use `resolvedLocation` and coordinates for location checks. |
| `pricePerNight`, `pricePerNightEffective` | Airbnb's nightly price, and the stay total divided by the nights. |
| `originalPricePerNight`, `discountAmount` | The nightly price before a discount, and the discount Airbnb states. `null` when there is no discount. |
| `totalPrice`, `stayCheckIn`, `stayCheckOut`, `stayNights`, `currency` | The stay total and the exact stay it is for. |
| `pricePerMonth` | Airbnb's average monthly price for stays of 28 nights or more; `null` for shorter stays. |
| `feeBreakdown` | The fee and tax lines Airbnb states for the search, each with `label`, `amount` and `currency`. |
| `rating`, `reviewCount` | Guest rating out of 5 and the number of reviews. |
| `bedrooms`, `beds`, `bathrooms`, `maxGuests` | Size of the place. `maxGuests` is filled in full-detail mode. |
| `latitude`, `longitude`, `images` | Map position and photo links. |
| `host`, `amenities`, `houseRules`, `propertyType`, `spaceType` | Full-detail fields. |
| `resolvedLocation`, `locationVerified`, `query`, `mode`, `source`, `scrapedAt` | The place Airbnb matched, whether the match and row coordinates passed the location checks, what was searched, and when (UTC). |

### Output example

A real row from a Lisbon search for 2 guests, 4 to 7 December 2026 (photo list shortened to two links). This stay was discounted: $164 a night before the discount, $310 for the three nights after it.

```json
{
  "listingId": "1492589232021457643",
  "url": "https://www.airbnb.com/rooms/1492589232021457643",
  "bookingUrl": "https://www.airbnb.com/rooms/1492589232021457643?check_in=2026-12-04&check_out=2026-12-07&adults=2&currency=USD&locale=en",
  "name": "Alfama terrace with rooftop river views",
  "roomType": "Apartment",
  "location": "Santa Maria Maior",
  "tagline": "Alfama terrace with rooftop river views",
  "propertyType": null,
  "spaceType": null,
  "pricePerNight": 103.17,
  "pricePerNightEffective": 103.33,
  "originalPricePerNight": 164,
  "discountAmount": 182,
  "totalPrice": 310,
  "pricePerMonth": null,
  "stayCheckIn": "2026-12-04",
  "stayCheckOut": "2026-12-07",
  "stayNights": 3,
  "currency": "USD",
  "feeBreakdown": [],
  "rating": 4.92,
  "reviewCount": 63,
  "bedrooms": 1,
  "beds": 2,
  "bathrooms": 1,
  "maxGuests": null,
  "latitude": 38.7118,
  "longitude": -9.129,
  "images": [
    "https://a0.muscache.com/im/pictures/hosting/Hosting-1492589232021457643/original/99597430-5632-43a1-b258-67202629a8e4.jpeg",
    "https://a0.muscache.com/im/pictures/hosting/Hosting-1492589232021457643/original/1db645da-7275-4262-8f7f-40d3994448d3.jpeg"
  ],
  "host": null,
  "amenities": [],
  "houseRules": [],
  "resolvedLocation": "Lisbon",
  "locationVerified": true,
  "query": "Lisbon, Portugal",
  "mode": "search",
  "source": "airbnb",
  "scrapedAt": "2026-10-20T00:54:12.881322+00:00"
}
```

### Use it as an Airbnb API

Run it from your own code with the Apify API and read the results straight back. For example, with `curl`:

```bash
curl -X POST "https://api.apify.com/v2/acts/barefoot_grade~airbnb-stays-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locationQueries": ["Lisbon, Portugal"], "checkIn": "2027-03-12", "checkOut": "2027-03-15", "maxResults": 20}'
```

The same works from the Apify Python and JavaScript clients, from Make, Zapier and n8n, and on a schedule from the Apify Console. Results can also go straight to Google Sheets, a webhook or cloud storage.

### FAQ

**Is there an official Airbnb API for listings and prices?** Airbnb's own API is only open to approved partners. This Actor gives you the same listings and prices a guest sees on airbnb.com, as structured data, with no partner account.

**How fresh is the data?** Every run reads Airbnb at run time, so prices and availability are current as of the run rather than a stored copy.

**How many listings can I get?** As many as Airbnb lists for the place, up to `maxResults` (5,000 per run). Large cities return many more listings than one search page; see "Large cities and complete coverage" above.

**Which places can I search?** Anything Airbnb's own search box understands: a city, a neighbourhood, a region, an island or a country. Add the country or state to avoid look-alike names (`Paris, France`, not `Paris`). With `strictLocation` on, broader place matches and rows outside Airbnb's returned map area are dropped. That area is not an exact neighbourhood boundary.

**Can I get prices in my currency and language?** Set `currency` to any currency Airbnb offers (`EUR`, `GBP`, `MXN`, `BRL`, `JPY`, ...). The supported search locale is English (`en`) only. Other locale values are still accepted for compatibility but produce a clear warning and use English instead, without changing your requested currency or place. Listing text is source-provided and may still contain local-language text.

**Why is the price sometimes a stay total?** The Actor uses Airbnb’s displayed total when available, or derives a total from the displayed nightly price and stay length. `pricePerNight` is populated when Airbnb exposes a nightly amount; it can be `null` even when a total is available. A total derived from the nightly price excludes any fees, taxes and length-of-stay discounts that Airbnb did not state, and `feeBreakdown` only contains the lines Airbnb exposes for that search — an absent line is not a zero.

**How are discounts reported?** When Airbnb shows a discounted stay, `pricePerNight` is the effective nightly price after the discount (the discounted stay amount divided by the nights), never the pre-discount rate. If the stay length or the discount amount cannot be derived (no check-in/check-out dates, qualifier, nightly explanation line or discount evidence), `pricePerNight` is `null` on a discounted listing rather than the pre-discount rate. `originalPricePerNight` is the pre-discount nightly rate from Airbnb's nightly price explanation, not the headline original total, which can include taxes and fees. `discountAmount` is the discount Airbnb states: a discount explanation line (for example a special offer or a stay discount) or the headline original/discounted price pair; a negative fee or tax credit is not a discount. Both `originalPricePerNight` and `discountAmount` are `null` when Airbnb states no discount. Taxes and fees are not part of `pricePerNight`.

**Why are there two nightly prices?** `pricePerNight` is Airbnb's own per-night quote when it gives one. `pricePerNightEffective` is the displayed stay total divided by the exact number of nights in `stayNights`, so quotes for different window lengths (28 nights, 31 nights, three months) can be compared on the same basis. It is `null` when the total or the nights are unknown.

**Is there a default price cap?** No. Without `priceMax` a run includes listings at any price, in every date mode. If you set `priceMax` on a dated search it is a nightly limit. If you set it on a flexible or monthly run, it becomes the cap on the price Airbnb displays for the window: the monthly price for month-long and longer windows. The same applies to `priceMin`. For a dated stay of 28 nights or more, Airbnb filters on the monthly price, so the Actor converts the nightly `priceMin` and `priceMax` to the matching monthly amount.

**What does `locationVerified` mean?** `true` means Airbnb returned a resolved place without a known broader fallback and the row's coordinates are inside Airbnb's returned map area. Aliases and translated place names are accepted. With `strictLocation` on, rows outside that map area are dropped. That map area is not an exact administrative boundary; use coordinates for neighbourhood-level checks. A broader match (such as a country for a neighbourhood) is not verified. Unverified pages are dropped by default; `strictLocation: false` allows them through with `locationVerified: false`.

**Are all fields always present?** Fields Airbnb does not publish for a listing come back as `null`; `amenities`, `houseRules`, `images` and `feeBreakdown` come back as empty arrays when absent. In search rows, `host`, `maxGuests`, `propertyType` and `spaceType` come back as `null`. In search rows, `amenities` and `houseRules` come back as empty arrays. Full-detail mode populates `host`, `maxGuests`, `propertyType`, `spaceType`, `amenities` and `houseRules`.

**Can I get reviews or calendar availability per night?** Not in this Actor. Each row has the rating and review count, and the price and availability for the dates you searched. To see availability across dates, run the same place for each date range you care about.

**Does it collect personal data?** It returns what Airbnb shows publicly on the search and listing pages. In full-detail mode that includes the host's public display name and profile photo. Use the data in line with the laws that apply to you and Airbnb's terms.

### What changed (October 2026)

- Monthly searches now return the length you ask for: 1 and 2 months give 1 and 2 months (before, they returned 3).
- For stays of 28 nights or more, the new `pricePerMonth` field holds Airbnb's monthly price, and `totalPrice`, `pricePerNight` and `pricePerNightEffective` cover the whole stay. Before, a multi-month window reported one month's price as the total.
- There is no default maximum price any more. Leave `priceMax` empty to see every price, including expensive places and large homes; set it to cap results.

### Price

**$0.40 per 1,000 listings** ($0.0004 per row), plus **$0.00005 per run start**. A start is charged once per GB of memory, so the default 512 MB run is one start. Runs that find no listings add no row charge. Platform usage is included in these prices.

### Support

For questions, a missing field or a place that does not return results, open an issue on the Actor's Issues tab or contact Apify support from the Actor page.

# Actor input Schema

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

One or more places, e.g. 'San Francisco, CA' or 'Paris, France'. Each place is searched separately; results are combined and de-duplicated. Add a price range below to reach past a place's first page of results.

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

Advanced: paste one or more Airbnb search URLs to run exactly those searches. Leave empty to search the places above.

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

Stay check-in date (YYYY-MM-DD). Provide with Check-out for stay totals; leave both empty for a general place search.

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

Stay check-out date (YYYY-MM-DD). Must be after check-in.

## `flexibleMonths` (type: `array`):

Search a stay that can happen in any of these months: month names such as 'november' or YYYY-MM such as '2026-11'. A YYYY-MM value keeps only the month and searches its next occurrence; the year is advisory. Up to 12 months. Leave empty unless using flexible dates; do not combine with checkIn/checkOut or monthlyStart.

## `flexibleStayLength` (type: `string`):

How long the flexible stay is: a weekend, a week, or about a month.

## `monthlyStart` (type: `string`):

Start date (YYYY-MM-DD) for a monthly stay. Must be a real calendar date. Searches a stay of monthlyLength months from this date and reports the actual dates and total for each listing. Do not combine with checkIn/checkOut or flexibleMonths.

## `monthlyLength` (type: `integer`):

How many months to search from monthlyStart, from 1 to 12 (Airbnb's monthly stays start at 28 nights, so 1 is a one-month stay). The stay ends on the same day of the month that many months later; each result reports the actual stay dates and number of nights.

## `entirePlaceOnly` (type: `boolean`):

Only include entire homes and apartments, excluding private rooms, shared rooms and hotels.

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

Number of adult guests (1-16).

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

Number of children (0-16).

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

Number of infants (0-16).

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

Number of pets (0-16).

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

Lowest price to include. In flexible-date and monthly searches Airbnb prices the whole window, so this value is applied to the price Airbnb displays there: the monthly price for month-long and longer windows. For a dated stay of 28+ nights the nightly value is converted to Airbnb's monthly price basis. The Actor automatically expands dense searches across this price range.

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

Optional. Highest price to include, in the run currency. Leave empty to include listings at any price (no cap). For dated searches this is a nightly price; for a dated stay of 28+ nights it is converted to Airbnb's monthly price basis. Flexible-date and monthly searches are priced as a whole window, so there it caps the price Airbnb displays for the window (the monthly price for month-long and longer windows).

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

Only listings with at least this many bedrooms (0 = no filter).

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

Only listings with at least this many beds (0 = no filter).

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

Only listings with at least this many bathrooms (0 = no filter).

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

Search results are fast and cover the core fields. Full listing detail also visits each listing page for amenities, house rules, host information and guest capacity.

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

Stop after this many listings across all places.

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

In full-detail mode, the number of listings to open for amenities, house rules and host. The rest keep their search-result fields.

## `maxPagesPerQuery` (type: `integer`):

How many result pages to read per location/price bucket before moving on.

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

Three-letter currency code for the returned prices, e.g. USD, EUR, GBP.

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

Supported search language: English (en). Legacy non-English locale inputs fall back to en with a warning; currency is unchanged.

## `strictLocation` (type: `boolean`):

Drop listings outside the resolved place boundary (recommended). Turn off to also keep nearby recommendations.

## `requestDelaySecs` (type: `number`):

Polite pause between page requests.

## Actor input object example

```json
{
  "locationQueries": [
    "Lisbon, Portugal"
  ],
  "flexibleStayLength": "month",
  "monthlyLength": 3,
  "entirePlaceOnly": false,
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "priceMin": 0,
  "minBedrooms": 0,
  "minBeds": 0,
  "minBathrooms": 0,
  "mode": "search",
  "maxResults": 60,
  "maxDetails": 20,
  "maxPagesPerQuery": 15,
  "currency": "USD",
  "locale": "en",
  "strictLocation": true,
  "requestDelaySecs": 0.5
}
```

# 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 = {
    "locationQueries": [
        "Lisbon, Portugal"
    ]
};

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

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

```

## MCP server setup

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