# Airbnb Scraper: Every Stay, Past the 15-Page Limit (`luzivanlt/airbnb-listings-scraper`) Actor

Every stay of an Airbnb search, past the 15 pages Airbnb shows, checked against its count. $0.20 per 1,000 listings. 848 of 848 in McCall, Idaho. Dates, guests.

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

## Pricing

from $0.14 / 1,000 listings

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: Every Stay, Past the 15-Page Limit

Get every stay of an Airbnb search, not just the 15 pages Airbnb shows you:
for a city, region or neighborhood, with your dates and guests or without,
or from any Airbnb search link with your own filters. The run's last message
checks the listings saved against Airbnb's own count for each search. No
Airbnb account, login or cookies needed.

Tested daily. Latest check: McCall, Idaho, all 848 stays Airbnb counted for
four nights in December (857 saved, as the count moved), in 4 minutes.

### What does this Actor do?

You give it places (as you would type them in Airbnb's search box) or links to
Airbnb searches. For each search it saves one row per listing, until it has
every stay Airbnb counts for that search or reaches your limit.

Airbnb's own site stops at 15 pages of 18 stays (270) for any search. This
Actor keeps going until it has every stay in the search, so a whole town or
city comes back in one run, and its final message says, per search, whether
it got all of Airbnb's count.

Each row comes with:

- the listing id, its link, its name, and its type and area as Airbnb titles
  it ("Cabin in McCall")
- the rating, the number of reviews, and whether it is new
- badges: Superhost, Guest favorite, the top guest favorites
- bedrooms, beds and baths, and the card's room lines as shown
- the price for the stay, the price before a discount, the price per night
  and the number of nights, the whole price breakdown (nights, discounts,
  taxes, total) and the host's price notes
- highlights such as free cancellation, and promotions
- the card's photos and its cover photo
- its latitude and longitude
- the dates and guests the price is for (Airbnb's own pick when you give no
  dates)
- the search it came from and Airbnb's count for the search

### Why use it?

- **Every stay, not 270.** A search with more stays than Airbnb shows is read
  to its end; the run tells you for each search how many of Airbnb's count it
  saved.
- **Prices for your trip.** Give dates and guests and every price is for that
  stay, with the breakdown; leave them out and you still get a price for
  every listing.
- **Any search link.** Set filters on Airbnb (type of place, rooms, amenities,
  price), copy the link and paste it.
- **$0.20 per 1,000 listings**, and nothing per search.

### How to use it

1. Type one or more places under **Locations**, with dates and guests if you
   want prices for a trip, or paste Airbnb search links under **Search
   links**.
2. Set **Max listings per search** (1,000 by default). To get a whole search,
   set it above the number Airbnb shows for it.
3. Start the run, then download the listings as JSON, CSV or Excel.

Run it with no input to see a sample: up to 100 stays in McCall, Idaho, charged
as usual.

### Input

| Field                                   | What it is                                                                  |
| --------------------------------------- | --------------------------------------------------------------------------- |
| `locations`                             | Places, one per line: `McCall, Idaho`, `Lisbon, Portugal`, a neighborhood   |
| `startUrls`                             | Airbnb search links for stays; each keeps its own dates, guests and filters |
| `checkIn`, `checkOut`                   | Dates of the stay, `YYYY-MM-DD`, for the locations                          |
| `adults`, `children`, `infants`, `pets` | Guests, for the locations                                                   |
| `minPrice`, `maxPrice`                  | A price range, for the locations                                            |
| `currency`                              | `USD` by default; `EUR`, `GBP` and the rest                                 |
| `maxListingsPerSearch`                  | 1 to 50,000, default 1,000                                                  |

Example:

```json
{
  "locations": ["McCall, Idaho", "Lisbon, Portugal"],
  "checkIn": "2026-12-10",
  "checkOut": "2026-12-14",
  "adults": 2,
  "maxListingsPerSearch": 5000
}
```

A link to one listing, an experience or a service is refused before the run
starts, with the link named.

### Output

One row per listing. Fields Airbnb does not show for a listing are `null` or
an empty list.

| Field                                                                                                           | What it is                                                                               |
| --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `listing_id`, `url`                                                                                             | Airbnb's id for the listing and its page                                                 |
| `name`, `title`, `place_type`, `place_area`, `subtitle`                                                         | The listing's name; Airbnb's title ("Cabin in McCall") and its two parts; a hotel's line |
| `latitude`, `longitude`                                                                                         | Where it is, as Airbnb places it on the map                                              |
| `rating`, `reviews_count`, `rating_text`, `rating_label`, `is_new`                                              | The rating and reviews; "New" for a listing with none yet                                |
| `badges`, `badge_types`, `is_superhost`, `is_guest_favorite`, `is_top_guest_favorite`                           | The card's badges                                                                        |
| `details`, `bedrooms`, `beds`, `baths`, `is_studio`                                                             | Rooms and beds                                                                           |
| `price`, `price_text`, `price_original`, `price_original_text`, `price_qualifier`, `price_label`, `price_style` | The price as the card shows it ("$1,050 total, originally $1,200")                       |
| `currency`, `nights`, `price_per_night`                                                                         | The currency, the nights priced and the nightly rate                                     |
| `price_lines`, `price_notes`, `price_details_note`                                                              | The price breakdown, line by line, and the notes under it                                |
| `highlights`, `highlight_types`, `has_free_cancellation`, `promotions`                                          | Free cancellation, pay nothing today, credits                                            |
| `photos`, `photo_ids`, `photo_count`, `cover_photo_url`                                                         | The card's photos                                                                        |
| `property_id`                                                                                                   | A hotel's id, for a room in one                                                          |
| `name_language`                                                                                                 | The language of the listing's name                                                       |
| `dates_text`, `check_in`, `check_out`, `adults`, `children`, `infants`, `pets`                                  | The stay the price is for                                                                |
| `search_location`, `search_place_id`, `search_url`, `search_total`                                              | The search the row came from and Airbnb's count for it                                   |

Hosts' first names can appear in the price notes, and listing photos can show
people: check that your use is allowed where you are.

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

This Actor is priced per listing saved:

- **$0.20 per 1,000 listings** ($0.0002 a listing). Each listing is charged
  once per run.
- No start fee, and nothing per search.

So 1,000 listings cost $0.20. If you set a maximum cost for a run, the Actor
stops when it reaches it and keeps every listing saved so far.

### How long does a run take?

857 listings took 4 minutes in a test. A search over 270 stays takes more
pages than its stays alone would. For a search of several thousand listings,
raise the run's timeout under **Run options** before you start.

### Good to know

- **Airbnb's count.** The final message compares the listings saved with
  Airbnb's count for each search.
- **Listings are read in English**, whatever the search link's language;
  names stay as their hosts wrote them. Airbnb's count moves by a few stays from
  one minute to the next, so a whole read can save a few more than it.
- **A listing in two of your searches** (a town and its region, say) is saved
  once, under the first search that reached it.
- **Order.** A small search comes back in Airbnb's order; a larger one in no
  particular order.
- **Listing pages are not read.** You get what Airbnb's search results show
  for each listing, not its own page (description, amenities, house rules,
  host profile, reviews).
- **Stays only**: experiences and services are not read.

### More Actors from us

- [Alibaba Products Scraper: Price Tiers & Suppliers](https://apify.com/luzivanlt/alibaba-products-scraper): Alibaba.com products by keyword or link, with price tiers in US dollars on every row.
- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Woolworths Coles ALDI Scraper: AU Grocery Prices](https://apify.com/luzivanlt/au-supermarkets-scraper): Woolworths, Coles and ALDI products for any search in one run, every results page to the end.
- [Bilibili Video Scraper: Search & Channel Videos](https://apify.com/luzivanlt/bilibili-videos-scraper): Bilibili videos from searches or whole channels, each with its full detail page's data.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~airbnb-listings-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "locations": ["McCall, Idaho"],
  "maxListingsPerSearch": 100
}
```

Its inputs, in the order of the input form:

| Input                                            | What it takes                                                                                                                                                                                          | Default |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
| `locations` (Locations)                          | Places to search, one per line, as you would type them in Airbnb's search box: a city, a region, a neighborhood (McCall, Idaho; Lisbon, Portugal).                                                     | —       |
| `startUrls` (Search links)                       | Airbnb search results links for stays (airbnb.com/s/\<place>/homes) from any Airbnb site (airbnb.co.uk, airbnb.de, …), copied from your browser after you set the dates, guests and filters you want. | —       |
| `checkIn` (Check-in)                             | Check-in date for the locations, YYYY-MM-DD; give it with the check-out date.                                                                                                                          | —       |
| `checkOut` (Check-out)                           | Check-out date for the locations, YYYY-MM-DD.                                                                                                                                                          | —       |
| `adults` (Adults)                                | Adult guests, for the locations, from 1 to 16.                                                                                                                                                         | —       |
| `children` (Children)                            | Children (ages 2 to 12), for the locations, from 0 to 15.                                                                                                                                              | —       |
| `infants` (Infants)                              | Infants (under 2), for the locations, from 0 to 5.                                                                                                                                                     | —       |
| `pets` (Pets)                                    | Pets, for the locations, from 0 to 5.                                                                                                                                                                  | —       |
| `minPrice` (Minimum price)                       | For the locations: only places priced at least this much, in the currency below, a whole number from 0 to 1,000,000.                                                                                   | —       |
| `maxPrice` (Maximum price)                       | For the locations: only places priced at most this much, in the currency below, a whole number from 1 to 1,000,000.                                                                                    | —       |
| `currency` (Currency)                            | Three-letter currency code for the prices (USD, EUR, GBP, …), for the locations and the search links.                                                                                                  | —       |
| `maxListingsPerSearch` (Max listings per search) | Stop each search after this many listings, from 1 to 50,000 (1,000 by default).                                                                                                                        | `1000`  |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/airbnb-listings-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/airbnb-listings-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

A real run's output, unedited: [the sample dataset](https://api.apify.com/v2/datasets/X7eMMTdEyCePkxcHK/items?format=html\&clean=true).

Charged per listing delivered; the sample input above costs at most $0.02.

### FAQ

**Can I get every listing in a big city?** Yes. Set **Max listings per
search** above Airbnb's count; the final message tells you how many of
Airbnb's count were saved.

**Can I use my own filters?** Yes. Set them on Airbnb, copy the link from
your browser and paste it under **Search links**.

### Is it legal to scrape Airbnb?

This Actor reads pages anyone can open without an account. Check Airbnb's
terms and the laws where you are before you use the data, especially any
personal data.

### Support

Open an issue on the Actor's page and describe the search and what you
expected.

# Changelog

This Actor's version history is a separate document: https://apify.com/luzivanlt/airbnb-listings-scraper/changelog.md

# Actor input Schema

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

Places to search, one per line, as you would type them in Airbnb's search box: a city, a region, a neighborhood (McCall, Idaho; Lisbon, Portugal). Each place is one search, up to 120 characters. The dates, guests and price range below apply to them. A link here is refused: paste it under Search links. Example: Lisbon, Portugal

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

Airbnb search results links for stays (airbnb.com/s/<place>/homes) from any Airbnb site (airbnb.co.uk, airbnb.de, …), copied from your browser after you set the dates, guests and filters you want. Each link is read from its first page and keeps its own dates, guests and filters; the fields below apply to the locations only, except the currency. Example: https://www.airbnb.com/s/Lisbon/homes?adults=2

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

Check-in date for the locations, YYYY-MM-DD; give it with the check-out date. It cannot be in the past, and a stay can be at most a year long. With dates, prices are for that stay and only places free on those dates are listed. Without, Airbnb picks a short stay to price each place. Example: 2026-12-10

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

Check-out date for the locations, YYYY-MM-DD. Give it with the check-in date: it must come after it, at most a year later. Search links keep their own dates. Leave both empty to search without dates. Example: 2026-12-14

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

Adult guests, for the locations, from 1 to 16. Give dates and guests and every price is for that stay. Leave it empty to search without a guest count. Search links keep their own guests. Example: 2

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

Children (ages 2 to 12), for the locations, from 0 to 15. Leave it empty or at 0 to search without children. Give dates and guests and every price is for that stay. Search links keep their own guests. Example: 1

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

Infants (under 2), for the locations, from 0 to 5. Leave it empty or at 0 to search without infants. Give dates and guests and every price is for that stay. Search links keep their own guests. Example: 1

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

Pets, for the locations, from 0 to 5. With pets, only places that allow them are listed. Leave it empty or at 0 to search without pets. Search links keep their own guests and filters. Example: 1

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

For the locations: only places priced at least this much, in the currency below, a whole number from 0 to 1,000,000. Airbnb filters on the whole stay's price when you give dates. Leave it empty for no minimum. Search links keep their own price range. Example: 100

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

For the locations: only places priced at most this much, in the currency below, a whole number from 1 to 1,000,000. It must be above the minimum price. Leave it empty for no maximum. Search links keep their own price range. Example: 500

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

Three-letter currency code for the prices (USD, EUR, GBP, …), for the locations and the search links. USD by default; a search link keeps its own currency unless you set one here. The minimum and maximum price are in this currency. Example: EUR

## `maxListingsPerSearch` (type: `integer`):

Stop each search after this many listings, from 1 to 50,000 (1,000 by default). Airbnb's own site shows at most 15 pages of a search; this Actor goes past that to every place Airbnb counts, so set this above Airbnb's count to get them all. You pay per listing saved ($0.20 per 1,000), so this also caps what each search costs. Example: 5000

## Actor input object example

```json
{
  "locations": [
    "McCall, Idaho"
  ],
  "maxListingsPerSearch": 100
}
```

# Actor output Schema

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

Every listing the run saved, one row each.

## `allFields` (type: `string`):

The same rows with every field.

## `runReport` (type: `string`):

What happened to each input: items saved, nothing found, refused by the site, stopped at your limit, or the error.

# 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": [
        "McCall, Idaho"
    ],
    "maxListingsPerSearch": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/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 = {
    "locations": ["McCall, Idaho"],
    "maxListingsPerSearch": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/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 '{
  "locations": [
    "McCall, Idaho"
  ],
  "maxListingsPerSearch": 100
}' |
apify call luzivanlt/airbnb-listings-scraper --silent --output-dataset

```

## MCP server setup

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