# Airbnb Listing Details Scraper: Full Data & Price by URL (`thelastscraper/airbnb-listing-details`) Actor

Full data of Airbnb listings from URLs or IDs: description, amenities, house rules, host, photos, registration/permit number and the exact price breakdown for your dates, as numbers.

- **URL**: https://apify.com/thelastscraper/airbnb-listing-details.md
- **Developed by:** [The Last Scraper](https://apify.com/thelastscraper) (community)
- **Categories:** Travel, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 listing pages

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 Listing Details Scraper

Turn Airbnb listing URLs or IDs into **complete, structured listing data**: title and
description, property type, capacity, amenities, house rules, cancellation policy, host
(Superhost, rating, years hosting), photos with room and caption, the **registration / permit
number**, and the **exact price for your dates as numbers** (nightly rate, discounts, taxes,
total, per night). **$1.50 per 1,000 listings** on the Free plan ($0.70 on Gold).

- **Prices you can put in a spreadsheet**, with every line Airbnb shows typed, and a flag that
  tells you cleaning and service fees are inside the nightly rate.
- **Automatic dates:** leave the dates empty and the Actor quotes 30 days from today for 5
  nights, so there is always a price (each record says so in `scrape.dates_auto`).
- **Photos:** the photo URLs with room and caption (never image files): a quick preview by
  default (up to 5 photos and the cover when Airbnb trims the gallery), or the whole gallery
  with **Photos: Full gallery** (one more request for each trimmed listing, so slower; same
  price).

### How to use it

```json
{
  "where": ["https://www.airbnb.com/rooms/614178316141803089", "23491570"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-15",
  "adults": 2,
  "currency": "AED"
}
```

Optional: children, infants and pets for the quote (like on airbnb.com: pets add the host's pet
fee, and a listing that cannot take your group says why in `unavailable_reason`); **Language of
the texts** to also get the title, description, amenities and house rules in one of Airbnb's 66
languages (one more page per listing, no extra charge); **Host profile**: the host's total
listings on Airbnb (default, free) or the whole public profile (`host-profile`, once per host).

### What you get

**Output format: Spreadsheet** (default): one flat row per listing with 98 curated columns (100
with a language) in a fixed order: the listing `url` first, `listing_id` as text (long ids
survive Excel), title and type, place, capacity, the price quote for your dates (nightly rate,
per night with and without taxes, discounts, taxes, total), ratings, host, cancellation, minimum
nights, Instant Book, permit number, key amenities as true/false, photo count and estimates
prefixed `est_`.

**Output format: Full JSON**: the same 200+ field record as the Airbnb Scraper: `identification`,
`location`, `capacity`, `price` (with `line_items`), `quality` (rating and the six category
ratings), `host`, `amenities`, `rules`, `photos`, `description`, `regulatory`, `estimates` and
`scrape`.

Every key is always present (`null` when unknown), so CSV columns stay stable.

### Price

Pay-per-event prices per 1,000 events, by Apify plan:

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| `listing-details`: per listing with its full page and price quote | $1.50 | $1.30 | $1.00 | $0.70 |
| `host-profile`: only with **Host profile: Full**, once per unique host | $1.00 | $0.80 | $0.60 | $0.50 |

Listings that fail are not charged.

### Related Actors

- [Airbnb Scraper](https://apify.com/thelastscraper/airbnb-scraper): search whole areas, with a free
  cost estimate, calendar and reviews.
- [Airbnb Calendar & Occupancy](https://apify.com/thelastscraper/airbnb-calendar-occupancy):
  availability, occupancy rate and revenue estimates.
- [Airbnb Reviews Scraper](https://apify.com/thelastscraper/airbnb-reviews): guest reviews, $0.50 per
  1,000.

Public data only, no login. Not affiliated with Airbnb.

# Actor input Schema

## `actorVariant` (type: `string`):

Internal: which Store Actor this is (do not change).

## `where` (type: `array`):

One per line: a listing URL (https://www.airbnb.com/rooms/123, any Airbnb domain) or a listing ID.

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

YYYY-MM-DD. Leave both dates empty for automatic dates (30 days from today, 5 nights): Airbnb only quotes a price for specific dates.

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

YYYY-MM-DD, after the check-in date. Empty with an empty check-in = automatic dates (each record says so in scrape.dates_auto).

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

Adult guests. Airbnb keeps the listings that accommodate at least this many people (4 also brings listings for 5, 6 or more guests) and quotes each price for exactly this party. 0 = any number of guests: no capacity filter, each price quoted for one guest (cannot be combined with Children).

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

Ages 2-12. They count toward the listing's capacity like adults and pay the extra-guest fee in the quote.

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

Under 2. They do not count toward capacity and stay free.

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

Only pet-friendly listings are returned, and the quote includes the host's pet fee (folded into the nightly rate).

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

ISO 4217 code (default USD). All amounts are returned as numbers in this currency.

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

Everything is collected and parsed in English. Another language adds one more listing page per listing (~28 KB, no extra charge) and fills the `localized` block: title, description, amenities and house rules in that language (Airbnb's machine translation when the host wrote in another one; the originals stay in the main fields). In Spreadsheet output, the columns title_localized and description_localized.

## `outputFormat` (type: `string`):

Spreadsheet (default): one flat row per listing with 98 curated columns (100 with a language) in a useful order (url first, listing_id as text, prices as numbers, key amenities as true/false, estimates prefixed est\_), ready for Excel, Google Sheets or CSV. Full JSON: the complete nested record of every listing (~2,800 fields once flattened: line items, every amenity and photo, description, field sources), for developers.

## `omitPersonalData` (type: `boolean`):

Set host and co-host names, photos, bios, 'lives in' and work to null, and replace the host's name with "the host" in Airbnb-generated texts (price-drop notice, listing highlights). GDPR-friendly. What stays: the numeric host id, business data (ratings, Superhost, years hosting, license numbers) and the listing description as the host wrote it.

## `photos` (type: `string`):

Photo URLs in each listing (the Actor never downloads image files). Full gallery: every photo; when Airbnb sends a listing with only its first 5 photos (common for regular homes at busy times), the Actor also reads the listing's web page: one more request and about 0.5-0.9 MB per such listing, so runs take longer. Preview: the photos Airbnb sends (up to 5 plus the cover when it trims the gallery; photo_count is then empty and photos_complete false), faster. None: no photo list (the cover photo stays). The price is the same either way. Empty = Preview.

## `estimateCleaning` (type: `boolean`):

Airbnb folds cleaning and service fees into the nightly rate. With this on, 2 extra price quotes per listing (different stay lengths) estimate the fixed per-stay part (estimates.cleaning_fee_estimated). Off by default: it adds 2 requests to the 3-4 of a listing (about +50 % run time) for a low-confidence estimate.

## `hostProfile` (type: `string`):

Count (default, free): one small request per unique host (~1.9 KB) for the host's total number of Airbnb listings, what tells an individual from a management company (it feeds the professional-host flag). Full: the host's whole public profile (~7 KB per unique host): listings, years on Airbnb, sign-up month, verifications and the business verification badge; charged as host-profile, once per unique host ($1.00 per 1,000 hosts on the Free plan). Languages, 'lives in', work and the business label come free from the listing page's host card when it shows them (it shows 2 of the host's lines at a time; 'lives in' and work are empty with Omit personal data). Off: no profile requests.

## `hostFeePct` (type: `string`):

Fraction Airbnb keeps from the host, used for estimates.revenue_net_of_platform_fee, e.g. 0.155. Empty = not computed.

## `proxyStrategy` (type: `string`):

Auto (recommended): starts with Apify datacenter proxies and switches to residential proxies only if Airbnb starts blocking (2 blocks in the last 50 requests: a request blocked on 2 datacenter IPs makes its third attempt through residential); after 300 clean requests on residential it tries datacenter once more. If residential proxies are not available to the run, it slows down instead. Datacenter / Residential: always that kind. Proxy traffic is not billed to you separately: the event prices include it. The log, the status message and the OUTPUT record show requests, blocks and estimated traffic per proxy level.

## `proxyCountry` (type: `string`):

Optional 2-letter country code for residential proxies. Empty = US, like the datacenter proxies: Airbnb shows totals before taxes to visitors outside the EU, so every run's prices mean the same. An EU country (e.g. DE) makes Airbnb show totals with taxes (the taxes column fills in). Prices are always in the selected currency.

## `retryLocationAb` (type: `boolean`):

Airbnb hides the neighborhood name and area text for about half of the sessions (an A/B test). When on, such listings are fetched again with a new session, up to 'Listing page retries' times (about +0.5 requests per listing and retry).

## `pdpRetryAttempts` (type: `integer`):

Airbnb sometimes (about 1 in 9 requests) sends a listing page with only 5 of its photos. Such pages are fetched again with a new session up to this many times and the most complete answer is kept (also used by the neighborhood-text retry above). 0 = never retry.

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

Listings scraped at the same time, each through its own Apify Proxy IP with its own pause (a listing's price quote, policies and calendar are requested together with its page, as a browser loads it). 20 to 32; the default, 32, scrapes about 5 listings a second with the default 4 GB of memory. The minimum keeps a run's duration, which the event prices include, bounded. With your own proxy URLs or without a proxy (one IP), the pause is shared and more parallel listings are not faster.

## `delaySeconds` (type: `integer`):

Minimum seconds between two requests from the same IP (plus up to 1 s of random jitter); a listing's quote, policies and calendar go out with its page. 1 (the default, the fastest) or 2. If Airbnb blocks, the Actor slows down and changes proxies by itself.

## `maxRequests` (type: `integer`):

Hard cap on requests to airbnb.com for the whole run (retries included). 0 = no cap.

## Actor input object example

```json
{
  "actorVariant": "listing-details",
  "where": [
    "https://www.airbnb.com/rooms/614178316141803089"
  ],
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "currency": "AED",
  "language": "en",
  "outputFormat": "spreadsheet",
  "omitPersonalData": false,
  "estimateCleaning": false,
  "hostProfile": "count",
  "proxyStrategy": "auto",
  "retryLocationAb": false,
  "pdpRetryAttempts": 1,
  "maxConcurrency": 32,
  "delaySeconds": 1,
  "maxRequests": 0
}
```

# Actor output Schema

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

One item per listing.

## `annotations` (type: `string`):

Fields that compare a listing with the rest of the run (host's listings in this run, shared license numbers), per listing_id: with incremental delivery they come here at the end.

## `summary` (type: `string`):

OUTPUT record: what was scraped, charged events, proxy levels and why the run stopped.

# 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 = {
    "where": [
        "https://www.airbnb.com/rooms/614178316141803089"
    ],
    "currency": "AED"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thelastscraper/airbnb-listing-details").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 = {
    "where": ["https://www.airbnb.com/rooms/614178316141803089"],
    "currency": "AED",
}

# Run the Actor and wait for it to finish
run = client.actor("thelastscraper/airbnb-listing-details").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 '{
  "where": [
    "https://www.airbnb.com/rooms/614178316141803089"
  ],
  "currency": "AED"
}' |
apify call thelastscraper/airbnb-listing-details --silent --output-dataset

```

## MCP server setup

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

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/hKiGm2tQqlNGEI9PE/builds/wW1hKBcQ1q1zJ1jG9/openapi.json
