# Airbnb Scraper (`w3crawler/airbnb-scraper`) Actor

Scrape rich public Airbnb listing search and detail data with explicit access-boundary diagnostics when the site is unavailable or challenged.

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

## Pricing

from $2.99 / 1,000 listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

### Airbnb Scraper

Scrape rich public Airbnb search-result cards or specific public listing pages. The Actor returns normalized listing rows with pricing, stay parameters, ratings, review counts, property details, host information, badges, amenities, images, policies, availability text, coordinates, category ratings, and bounded review samples when Airbnb exposes them to the public page.

The Actor supports Airbnb search pagination, multiple search sources, global deduplication, post-collection sorting, optional detail-page enrichment, an HTTP structured-data fallback, and explicit diagnostic rows when the public page is blocked or does not expose usable data.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Start here

1. Choose `search` mode for a city or one or more public `/s/...` URLs.
2. Choose `productUrl` mode for a bounded list of public `/rooms/<id>` URLs.
3. Set `maxItems` to the number of dataset rows you want.
4. Keep `deepScrape` enabled when host, amenities, policies, coordinates, or reviews are needed. Disable it for a fast card-only export.
5. Use `maxPages` to bound search pagination. `0` follows observed Airbnb next-page links until the source ends or the result budget is satisfied.

Target URL: [Airbnb](https://www.airbnb.com/)

#### What this Actor extracts

##### Search-card data

- Listing ID, canonical listing URL, title, marketing description, property type, room type, location, position, and source search page.
- Visible stay price, original price, currency, number of nights, check-in/check-out dates, and calculated price per night.
- Average rating, review count, Guest favourite/Superhost badges, free-cancellation label, and public thumbnail/image URLs.

##### Detail-page data

- Full public description, guest capacity, bedrooms, beds, bathrooms, sleeping arrangements, and public location/address text.
- Amenities and amenity count, images and image count, public coordinates when exposed, availability/calendar text, cancellation policy, house rules, checkout time, and listing highlights.
- Host name, profile URL, Superhost status, tenure, public biography, host rating, host review count, response rate, and response-time label when exposed.
- Rating-category values and a bounded sample of public review cards with author, author location, reviewer profile/avatar URL, rating, date, stay type, and text.

##### Provenance and diagnostics

Dataset rows are intentionally listing-focused. Listing rows contain the public listing facts, source/search context, `detailEnriched`, and `scrapedAt`; internal Actor state such as record IDs, access flags, extraction method, retry state, and quality/debug metrics is not written to the dataset. If detail enrichment fails after a usable search card was found, the listing row is retained with `detailEnriched: false`. If no listing data is available, the Actor writes one minimal diagnostic row containing only `url`, `error`, and `errorCode`.

#### Input examples

##### Fast search-card export

```json
{
  "mode": "search",
  "location": "Paris",
  "maxItems": 10,
  "maxPages": 1,
  "deepScrape": false,
  "includeReviews": false,
  "includeAmenities": false,
  "includeImages": true,
  "sortBy": "recommended"
}
```

##### Filtered and globally sorted search

```json
{
  "mode": "search",
  "location": "Paris",
  "keyword": "apartment",
  "minRating": 4.5,
  "minReviewCount": 10,
  "guestFavouriteOnly": true,
  "sortBy": "rating_desc",
  "maxItems": 25,
  "maxPages": 3,
  "deepScrape": true,
  "maxDetailItems": 10,
  "includeReviews": true,
  "maxReviews": 5
}
```

##### Multiple search sources

Each source receives its own `maxPages` budget. Results are merged, deduplicated by Airbnb listing ID, sorted once, and capped by the global `maxItems` value.

```json
{
  "mode": "search",
  "startUrls": [
    {"url": "https://www.airbnb.com/s/Paris/homes"},
    {"url": "https://www.airbnb.com/s/London/homes"}
  ],
  "maxItems": 50,
  "maxPages": 2,
  "deepScrape": false,
  "sortBy": "price_asc"
}
```

##### Specific listing details

```json
{
  "mode": "productUrl",
  "productUrls": [
    "https://www.airbnb.com/rooms/38637542",
    "https://www.airbnb.com/rooms/54337133"
  ],
  "maxItems": 2,
  "deepScrape": true,
  "includeDescription": true,
  "includeAmenities": true,
  "includeImages": true,
  "includeReviews": true,
  "maxReviews": 10
}
```

##### Developer controls

```json
{
  "mode": "search",
  "location": "Paris",
  "maxItems": 5,
  "maxPages": 1,
  "requestDelayMs": 500,
  "maxConcurrency": 1,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 120,
  "requestHandlerTimeoutSecs": 300,
  "includeDiagnostics": true
}
```

`requestTimeoutSecs` is the preferred timeout name. `navigationTimeoutSecs` remains as a backward-compatible alias; when both are present, `requestTimeoutSecs` takes precedence. `requestDelayMs`, `maxConcurrency`, and `maxRequestRetries` are bounded by the Actor input validator.

#### Input reference

##### Input sources

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` or `productUrl`. |
| `location` | string | `Paris` | City, region, or neighbourhood used to build a search URL. |
| `searchUrl` | string | — | One approved HTTPS Airbnb `/s/...` URL. |
| `startUrls` | array | `[]` | Additional approved search URLs; each may be a string or `{ "url": "..." }`. |
| `productUrls` | array | `[]` | Approved HTTPS `/rooms/<id>` URLs for `productUrl` mode. Maximum 500. |

##### Stay parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `checkIn` | string | — | `YYYY-MM-DD`; must be provided with `checkOut`. |
| `checkOut` | string | — | `YYYY-MM-DD`; must be after `checkIn`. |
| `guests` | integer | `2` | Adult guest count, 1–16. |
| `currency` | enum | `USD` | `USD`, `EUR`, `GBP`, `CAD`, `AUD`, `INR`, `JPY`, or `SGD`. |
| `locale` | string | `en-US` | Airbnb language or language-region code. |

##### Search filters and ordering

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `propertyType` | enum | `any` | Query filter: `any`, `entire_home`, `private_room`, or `shared_room`. |
| `priceMin` | number | — | Minimum visible price per night in the requested currency. |
| `priceMax` | number | — | Maximum visible price per night. |
| `keyword` | string | — | Case-insensitive match across title, description, property, location, neighbourhood, and amenities. |
| `minRating` / `maxRating` | number | — | Average rating bounds from 0 to 5. |
| `minReviewCount` | integer | — | Minimum public review count. |
| `guestFavouriteOnly` | boolean | `false` | Keep Guest favourite listings. |
| `superhostOnly` | boolean | `false` | Keep Superhost listings. |
| `freeCancellationOnly` | boolean | `false` | Keep listings visibly offering free cancellation. |
| `sortBy` | enum | `recommended` | `recommended`, `price_asc`, `price_desc`, `rating_desc`, `review_count_desc`, or `title_asc`. Sorting is global across collected pages/sources. |
| `deduplicate` | boolean | `true` | Deduplicate by listing ID across sources and cursor pages. |

##### Limits and detail enrichment

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `maxItems` | integer | `50` | Global maximum dataset rows, 1–500. |
| `maxPages` | integer | `0` | Search pages per source, 0–50; `0` follows observed next links. |
| `deepScrape` | boolean | `true` | Visit selected detail pages. |
| `maxDetailItems` | integer | `0` | Detail-page cap; `0` means every selected listing. |
| `includeDescription` | boolean | `true` | Include public descriptions. |
| `includeAmenities` | boolean | `true` | Collect visible/expanded amenities. |
| `includeImages` | boolean | `true` | Include public image URLs and counts. |
| `includeReviews` | boolean | `true` | Include bounded first-page public review cards. |
| `maxReviews` | integer | `10` | Review cards per listing, 0–50. |
| `includeDiagnostics` | boolean | `true` | Emit diagnostics when no listing data is available. |

##### Developer options and access

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `requestDelayMs` | integer | `0` | Delay before extraction, 0–15,000 ms. |
| `maxConcurrency` | integer | `1` | Concurrent browser requests, 1–5. |
| `maxRequestRetries` | integer | `3` | Crawlee retries, 0–10. |
| `requestTimeoutSecs` | integer | `120` | Browser/HTTP request timeout, 30–300 s. |
| `navigationTimeoutSecs` | integer | — | Legacy alias for `requestTimeoutSecs`; the preferred field takes precedence when both are supplied. |
| `requestHandlerTimeoutSecs` | integer | `300` | Per-page extraction timeout, 60–900 s. |
| `proxyConfiguration` | object | — | Optional Apify proxy configuration passed to browser requests. Credentials are never logged. |

#### Pagination, deduplication, and sorting behavior

The browser extractor follows an actual Airbnb pagination link (`Next`, `Next page`, `rel="next"`, or the next numbered link) and preserves the cursor and query parameters returned by Airbnb. It does not invent a cursor when the page does not expose a next link. Repeated URLs are skipped. `maxPages` is applied independently to every `searchUrl`/`startUrls` source.

When a non-default `sortBy` or a filter is used, the Actor collects eligible candidates across the allowed pages before selecting the global `maxItems` set. This prevents page-local sorting from returning the wrong records. Detail requests are created only for that final selected set.

With `deduplicate: true`, the first candidate for an Airbnb listing ID wins. A listing detail failure does not create a second row: the selected search row is retained with `detailEnriched: false`.

#### Output dataset

The dataset contains listing records and, only when public data is unavailable, minimal diagnostic records. Fields are optional because Airbnb can omit price, address, coordinates, review text, or other information depending on locale, dates, availability, and access state. Listing rows have `url`, `listingId`, `title`, and `scrapedAt`; diagnostic rows have exactly `url`, `error`, and `errorCode`.

##### Listing record field inventory

| Group | Fields |
| --- | --- |
| Identity and provenance | `url`, `listingId`, `listingUrl`, `source`, `sourceDomain`, `sourceUrl`, `locale`, `scrapedAt` |
| Search context | `searchUrl`, `searchLocation`, `searchPage`, `pageNum`, `position` |
| Listing | `url`, `listingId`, `listingUrl`, `title`, `description`, `propertyType`, `roomType`, `guests`, `bedrooms`, `beds`, `bathrooms` |
| Pricing and stay | `price`, `priceTotal`, `pricePerNight`, `cleaningFee`, `serviceFee`, `currency`, `priceFormatted`, `originalPriceTotal`, `originalPriceFormatted`, `nights`, `checkIn`, `checkOut` |
| Ratings and location | `rating`, `reviewCount`, `ratingBreakdown`, `location`, `address`, `latitude`, `longitude`, `neighborhood` |
| Host | `hostName`, `hostProfile`, `isSuperhost`, `hostJoined`, `hostYearsHosting`, `hostMonthsHosting`, `hostAbout`, `hostReviewCount`, `hostRating`, `hostResponseRate`, `hostResponseTime` |
| Amenities and media | `isGuestFavourite`, `amenities`, `amenityCount`, `images`, `imageCount`, `thumbnail`, `badges` |
| Stay policies | `availability`, `houseRules`, `cancellationPolicy`, `freeCancellation`, `sleepingArrangement`, `checkoutTime` |
| Reviews and detail status | `reviews`, `detailEnriched`, `scrapedAt` |

Each review object may contain `reviewId`, `author`, `authorLocation`, `reviewerProfile`, `reviewerAvatar`, `rating`, `date`, `stayType`, `text`, and `isTranslated`.

##### Example listing output

```json
{
  "url": "https://www.airbnb.co.in/rooms/38637542",
  "listingId": "38637542",
  "listingUrl": "https://www.airbnb.co.in/rooms/38637542",
  "source": "Airbnb public listings",
  "sourceDomain": "www.airbnb.co.in",
  "locale": "en-US",
  "searchLocation": "Paris",
  "title": "Private bedroom & bathroom 15 min away from Paris",
  "propertyType": "Room",
  "roomType": "Private room",
  "guests": 2,
  "beds": 1,
  "bathrooms": 1,
  "priceTotal": 480,
  "pricePerNight": 96,
  "currency": "USD",
  "nights": 5,
  "rating": 4.96,
  "reviewCount": 141,
  "ratingBreakdown": {"cleanliness": 4.9, "accuracy": 4.9, "checkIn": 4.9, "communication": 4.9, "location": 4.9, "value": 4.9},
  "location": "Asnières-sur-Seine, Île-de-France, France",
  "hostName": "Valentina",
  "hostProfile": "https://www.airbnb.co.in/users/show/123456",
  "isSuperhost": true,
  "hostJoined": "10 years hosting",
  "hostReviewCount": 144,
  "hostRating": 4.97,
  "hostResponseRate": 100,
  "hostResponseTime": "within an hour",
  "isGuestFavourite": true,
  "amenities": ["Kitchen", "Wifi", "Dedicated workspace", "Pets allowed", "TV"],
  "amenityCount": 18,
  "imageCount": 20,
  "badges": ["Guest favourite", "Top 10% of homes"],
  "freeCancellation": true,
  "detailEnriched": true,
  "reviews": [{"reviewId": "review-1", "author": "Example Guest", "rating": 5, "date": "July 2026", "text": "A comfortable stay."}],
  "scrapedAt": "2026-09-05T12:00:00.000Z"
}
```

##### Example diagnostic output

```json
{
  "url": "https://www.airbnb.com/s/Paris/homes",
  "error": "Airbnb public page presented a block or challenge",
  "errorCode": "BLOCKED_SOURCE"
}
```

#### Run summary and debug artifacts

The Actor writes `OUTPUT_SUMMARY` to the key-value store with `status`, `itemCount`, `successfulCount`, `diagnosticCount`, `blockedCount`, `searchPagesProcessed`, `filteredOutCount`, `detailRequested`, `detailSucceeded`, `detailFailed`, `startUrlCount`, `dataAvailable`, `fallbackUsed`, browser status flags, source, and `completedAt`. When a browser challenge is detected, a bounded `debug-blocked.html` artifact may be saved for troubleshooting.

#### Data availability and fallback behavior

The Actor uses public browser-rendered DOM evidence first, including stable Airbnb data-section and card attributes. It also reads public JSON-LD and deferred server-rendered state when the browser is unavailable. It does not bypass login, CAPTCHA, robots controls, or anti-bot challenges. If the browser returns no listing rows, the HTTP fallback is attempted; if that also fails, diagnostics explain the access boundary instead of inventing listing data.

Airbnb may intentionally generalize an address, hide coordinates, omit prices without dates, or vary content by locale and availability. Empty optional fields mean the public response did not expose that value during this run.

#### Cost and performance

The Actor's cost depends on Apify compute usage and the number of browser pages requested. Search pages and detail pages are the main cost drivers. Use `deepScrape: false`, `maxDetailItems`, `maxPages`, `maxItems`, low `maxConcurrency`, and a modest `maxReviews` value for economical runs. Higher concurrency can finish sooner but may increase traffic and challenge risk.

#### Proxy behavior

`proxyConfiguration` is passed to browser requests through Apify/Crawlee when supplied. The direct HTTP fallback does not replay proxy credentials; its provenance is labeled `http_ssr`. Do not place secrets in README examples or dataset fields.

#### Troubleshooting

##### The dataset contains diagnostics instead of listings

Check the diagnostic row's `errorCode` and the `OUTPUT_SUMMARY` key-value record. A `BLOCKED_SOURCE`, `REQUEST_TIMEOUT`, or `NO_PUBLIC_DATA` result is an explicit result of the public access boundary. Retry later, reduce concurrency, increase the timeout, or use a smaller page/detail budget. The Actor will not attempt to circumvent a challenge.

##### Search returns fewer rows than `maxItems`

Airbnb may expose fewer eligible listings after filters, duplicate removal, availability constraints, or pagination. Increase `maxPages`, relax filters, or use a broader location. Missing optional price/rating values are not fabricated to satisfy a filter.

##### Detail enrichment is partial

Inspect `detailEnriched`. The search card remains usable when a detail page is unavailable. Set `maxDetailItems` to control how many listings receive detail requests.

##### Pagination stops early

The Actor follows only observed Airbnb next links/cursors. A page with no next link, a repeated cursor, a source limit, or a public challenge ends that source safely. Check `searchPagesProcessed` and `debug-blocked.html` when diagnostics are enabled.

#### Support and legal

For support, include the Actor run ID, sanitized input, `OUTPUT_SUMMARY`, and representative `errorCode` values. Do not share credentials, cookies, private messages, or proxy secrets.

Use this Actor only for public data and in accordance with Airbnb's Terms of Service, robots rules, applicable law, and your contractual rights. Respect rate limits and personal-data obligations. This project is not affiliated with, endorsed by, or sponsored by Airbnb.

# Actor input Schema

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

Search one or more result pages, or scrape specific public listing URLs.

## `location` (type: `string`):

City, region, or neighbourhood used to create the public Airbnb search URL.

## `searchUrl` (type: `string`):

Optional HTTPS Airbnb /s/... URL. Its public filters and cursor are preserved; explicit input options are applied on top.

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

Optional list of HTTPS Airbnb /s/... URLs. Each source gets its own pagination budget and contributes to one global deduplicated result set.

## `productUrls` (type: `array`):

Public HTTPS Airbnb /rooms/<id> URLs. Used in productUrl mode; duplicate listing IDs are removed.

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

Optional stay date in YYYY-MM-DD format. Must be used with checkOut.

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

Optional stay date in YYYY-MM-DD format. Must be after checkIn.

## `guests` (type: `integer`):

Adult guest count included in the public Airbnb query.

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

Requested display currency for visible prices.

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

Airbnb language or language-region preference, for example en-US or fr-FR.

## `propertyType` (type: `string`):

Optional Airbnb room-type query filter.

## `priceMin` (type: `number`):

Optional lower bound in the requested currency. Applied to the visible price per night when available.

## `priceMax` (type: `number`):

Optional upper bound in the requested currency. Must be greater than or equal to priceMin.

## `keyword` (type: `string`):

Case-insensitive text match across title, description, property type, location, neighbourhood, and collected amenities.

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

Keep listings with an average public rating at or above this value.

## `maxRating` (type: `number`):

Keep listings with an average public rating at or below this value.

## `minReviewCount` (type: `integer`):

Keep listings with at least this many public reviews.

## `guestFavouriteOnly` (type: `boolean`):

Keep only cards/details visibly marked Guest favourite.

## `superhostOnly` (type: `boolean`):

Keep only listings whose public card/detail data marks the host as a Superhost.

## `freeCancellationOnly` (type: `boolean`):

Keep only records that visibly expose free cancellation.

## `sortBy` (type: `string`):

Global result order after all search pages and sources are collected. recommended preserves Airbnb order.

## `deduplicate` (type: `boolean`):

Deduplicate by Airbnb listing ID across pages and sources.

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

Global maximum dataset row count, including at most diagnostic rows when no listing data is available.

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

Maximum observed cursor/page links to visit per search source. 0 follows observed next links until the source ends or maxItems is satisfied.

## `deepScrape` (type: `boolean`):

Visit selected listing pages for descriptions, amenities, host, policies, coordinates, availability, and bounded reviews.

## `maxDetailItems` (type: `integer`):

Maximum selected listings to enrich. 0 enriches every selected listing; remaining selected rows are returned with detailEnriched=false.

## `includeDescription` (type: `boolean`):

Include public listing/host description text when exposed.

## `includeAmenities` (type: `boolean`):

Collect visible amenities and expand the public amenities dialog when possible.

## `includeImages` (type: `boolean`):

Include public image URLs, thumbnail, and imageCount.

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

Collect a bounded first-page sample of public review cards and rating categories.

## `maxReviews` (type: `integer`):

Maximum public review cards per detail page when includeReviews is enabled.

## `includeDiagnostics` (type: `boolean`):

When no listing rows are available, emit rich run\_diagnostic rows with access status, error codes, and fallback provenance.

## `requestDelayMs` (type: `integer`):

Delay before extracting a page. Increase for a gentler request profile.

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

Maximum concurrent browser requests. 1 is the gentlest setting.

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

Crawlee retries for failed navigations and extraction requests.

## `requestTimeoutSecs` (type: `integer`):

Preferred navigation timeout for browser and HTTP fallback requests.

## `navigationTimeoutSecs` (type: `integer`):

Backward-compatible alias for requestTimeoutSecs. requestTimeoutSecs takes precedence when both are supplied.

## `requestHandlerTimeoutSecs` (type: `integer`):

Maximum time for one page's extraction, modal expansion, and review parsing.

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

Optional Apify proxy configuration passed to browser requests. Credentials are never logged. HTTP fallback remains direct if the browser cannot use the proxy.

## Actor input object example

```json
{
  "mode": "search",
  "location": "Paris",
  "productUrls": [
    "https://www.airbnb.com/rooms/38637542"
  ],
  "guests": 2,
  "currency": "USD",
  "locale": "en-US",
  "propertyType": "any",
  "guestFavouriteOnly": false,
  "superhostOnly": false,
  "freeCancellationOnly": false,
  "sortBy": "recommended",
  "deduplicate": true,
  "maxItems": 50,
  "maxPages": 0,
  "deepScrape": true,
  "maxDetailItems": 0,
  "includeDescription": true,
  "includeAmenities": true,
  "includeImages": true,
  "includeReviews": true,
  "maxReviews": 10,
  "includeDiagnostics": true,
  "requestDelayMs": 0,
  "maxConcurrency": 1,
  "maxRequestRetries": 3,
  "requestTimeoutSecs": 120,
  "requestHandlerTimeoutSecs": 300
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing rich listing records; a blocked run emits a single { url, error, errorCode } record.

# 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 = {
    "productUrls": [
        "https://www.airbnb.com/rooms/38637542"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/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 = { "productUrls": ["https://www.airbnb.com/rooms/38637542"] }

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/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 '{
  "productUrls": [
    "https://www.airbnb.com/rooms/38637542"
  ]
}' |
apify call w3crawler/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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