# Airbnb Listing Extractor (`schnellscrapers/airbnb-listing-extractor`) Actor

Extract Airbnb listings from destination search pages, including titles, room type, location, total stay price, average nightly price, ratings, review counts, photos, and booking URLs. Filter results before writing and pay per listing returned.

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

## Pricing

$1.49 / 1,000 listing records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Airbnb Listing Extractor do?

Airbnb Listing Extractor turns Airbnb destination search pages into clean listing records for market research, short-term-rental pricing, competitor checks, and travel datasets. Each row keeps the listing ID, title, room type, location, displayed stay price, average nightly price, guest rating, review count, and booking URL together.

### What data can you extract from Airbnb?

- Listing identity — listing ID, title, canonical listing URL, and primary image URL
- Price snapshot — total stay price, average nightly price, currency, and number of nights
- Guest signals — average rating, review count, room type, and location text
- Property counts — bedrooms, beds, and bathrooms when the search card shows them
- Source context — the Airbnb search URL and the ISO time of the rendered snapshot

The actor follows Airbnb's own search cursor when you allow more than one page. Filters are applied before records are written, so a rating or nightly-price threshold does not create billable rows for listings you excluded.

### How to use Airbnb Listing Extractor

1. Open Airbnb Listing Extractor and click **Try for free**.
2. Add a public Airbnb search URL, or enter a destination such as `Paris, France` in **Location queries**.
3. Set dates, guest counts, page limits, or filters if your snapshot needs them.
4. Click **Start** and review the listing rows in the Dataset tab.
5. Download JSON, CSV, Excel, or another Apify dataset format, or read the dataset through the API.

### How much does it cost?

The actor uses pay-per-event pricing at **$1.49 per 1,000 listing records**. One event is one valid record written to the default dataset. There is no separate actor free-result allowance; Apify account credits apply. The default run stops at 100 records and one search page, which keeps a small market snapshot inexpensive. Increase `maxPages` only when you need more coverage.

### Input

Use `startUrls` for saved Airbnb search URLs or `locationQueries` for destinations. `checkIn` and `checkOut` add stay dates to location-query searches. `minRating`, `minNightlyPrice`, `maxNightlyPrice`, and `roomType` filter records before the dataset write. Enable Apify Proxy only when direct access presents a challenge.

```json
{
  "locationQueries": ["New York, NY", "Brooklyn, NY"],
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-06",
  "maxItems": 50,
  "maxPages": 2,
  "minRating": 4.5,
  "maxNightlyPrice": 250
}
```

### Output

The default dataset returns one object per selected listing. Price fields reflect the stay dates shown on the search card; `averageNightlyPrice` is the displayed total divided by `stayNights`.

```json
{
  "listingId": "992970965790772607",
  "title": "Steps to Times Square | Full Kitchen. Pet-Friendly",
  "listingUrl": "https://www.airbnb.com/rooms/992970965790772607",
  "subtitle": "Hotel in New York",
  "roomType": "Hotel",
  "locationText": "New York",
  "totalPrice": 817,
  "averageNightlyPrice": 163.4,
  "currency": "USD",
  "stayNights": 5,
  "rating": 4.72,
  "reviewCount": 1818,
  "bedrooms": 1,
  "beds": 1,
  "bathrooms": 1,
  "imageUrl": "https://a0.muscache.com/im/pictures/prohost-api/Hosting-992970965790772607/original/b6f692d2-f4a7-44ee-a084-b66ba5ba1871.png?im_w=720",
  "sourceUrl": "https://www.airbnb.com/s/New-York--NY/homes",
  "scrapedAt": "2026-08-09T17:14:39.343Z"
}
```

### Integrations

Schedule recurring snapshots, connect webhooks, or pull the default dataset through the [Apify API](https://docs.apify.com/api/v2). Use [Apify integrations](https://docs.apify.com/platform/integrations) with Make, Zapier, n8n, Google Sheets, Slack, or storage destinations.

### Related actors

- [Booking.com Review Monitor](https://apify.com/schnellscrapers/booking-review-monitor) — monitor recent hotel review records for reputation workflows.
- [Amazon Best Sellers Scraper](https://apify.com/schnellscrapers/amazon-best-sellers-scraper) — compare ranked retail products, prices, and ratings.

### FAQ

#### How does Airbnb Listing Extractor work?

It opens each public Airbnb destination search, reads the listing cards already displayed for that search, follows the next cursor only when requested, normalizes prices and counts, and writes only records that pass your filters.

#### Can I use Airbnb Listing Extractor as an API?

Yes. Start the actor with the Apify API, then read the run's default dataset from the dataset API or connect a webhook to the run. The API and dataset links are available in the actor's Integrations tab.

#### Can I use Airbnb Listing Extractor in Python or Node.js?

Yes. Use the official `apify-client` package to start a run and list its dataset items.

```js
const run = await client.actor('schnellscrapers/airbnb-listing-extractor').call({
  locationQueries: ['Lisbon, Portugal'],
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### What does this actor access?

It accesses public Airbnb destination search pages and the listing-card data shown on those pages. A login and Airbnb API key are not required. Individual room detail pages and host profiles are not requested by the default workflow.

#### Does the price represent a nightly rate?

The source card may show a total for a date range. `totalPrice` is that displayed stay amount, while `averageNightlyPrice` divides it by the displayed number of nights. Add dates when you need a date-specific comparison.

#### Is it legal to scrape Airbnb?

That depends on your use, location, and applicable laws. Use data you are authorized to collect, avoid using the output for prohibited purposes, and get professional advice for your specific situation.

### Your feedback

If a search page returns no cards, check the URL and try again with Apify Proxy enabled. Feature requests and reproducible source changes are welcome through the Issues tab on the actor page.

# Actor input Schema

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

Paste public Airbnb search URLs such as https://www.airbnb.com/s/Paris/homes. Use search pages, not individual room URLs.

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

Search destinations without building a URL (for example, "Paris, France" or "Austin, TX"). Each query becomes one Airbnb search.

## `maxItems` (type: `integer`):

Stop after this many filtered listing records. Keep the default at 100 for a predictable run budget.

## `maxPages` (type: `integer`):

Follow Airbnb cursor pages up to this limit per search URL. One rendered page is the lowest-cost default.

## `minRating` (type: `number`):

Keep listings with an average guest rating at or above this value, from 0 to 5. Filters run before dataset writes.

## `minNightlyPrice` (type: `number`):

Keep listings whose derived average nightly price is at least this amount in the page currency.

## `maxNightlyPrice` (type: `number`):

Keep listings whose derived average nightly price is no higher than this amount in the page currency. Leave empty to disable the cap.

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

Match text such as "entire home", "private room", or "hotel" against the listing card's room type.

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

Optional date in YYYY-MM-DD format. It is added to location-query searches so Airbnb can show stay-specific prices.

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

Optional date in YYYY-MM-DD format. Use a date after check-in for stay-specific prices.

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

Optional guest count for location-query searches. Airbnb uses it when calculating available stay prices.

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

Optional number of children for location-query searches.

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

Optional number of infants for location-query searches.

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

Optional number of pets for location-query searches.

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

Direct browser access is the lowest-cost default. If Airbnb presents a challenge, enable Apify Proxy with the RESIDENTIAL group; proxy transfer can affect run cost.

## `dryRun` (type: `boolean`):

Fetch and filter listing cards without writing dataset records. Logs report matched versus written counts.

## Actor input object example

```json
{
  "startUrls": [],
  "locationQueries": [
    "New York, NY"
  ],
  "maxItems": 100,
  "maxPages": 1,
  "minRating": 4.5,
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-06",
  "adults": 1,
  "proxyConfiguration": {
    "useApifyProxy": false,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Default dataset of Airbnb listing snapshots with total and average nightly prices, ratings, review counts, room type, location, image, and booking URL.

# 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 = {
    "startUrls": [],
    "locationQueries": [
        "New York, NY"
    ],
    "minRating": 4.5,
    "minNightlyPrice": 0,
    "maxNightlyPrice": 0,
    "roomType": "",
    "checkIn": "2026-09-01",
    "checkOut": "2026-09-06",
    "adults": 1,
    "children": 0,
    "infants": 0,
    "pets": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/airbnb-listing-extractor").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 = {
    "startUrls": [],
    "locationQueries": ["New York, NY"],
    "minRating": 4.5,
    "minNightlyPrice": 0,
    "maxNightlyPrice": 0,
    "roomType": "",
    "checkIn": "2026-09-01",
    "checkOut": "2026-09-06",
    "adults": 1,
    "children": 0,
    "infants": 0,
    "pets": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/airbnb-listing-extractor").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 '{
  "startUrls": [],
  "locationQueries": [
    "New York, NY"
  ],
  "minRating": 4.5,
  "minNightlyPrice": 0,
  "maxNightlyPrice": 0,
  "roomType": "",
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-06",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0
}' |
apify call schnellscrapers/airbnb-listing-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,schnellscrapers/airbnb-listing-extractor"
        }
    }
}

```

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/BNQCuu9hf5pCHYG5I/builds/rr97YIxjGSbUd6G9T/openapi.json
