# Airbnb Listing Details (`drydock/airbnb-listing-details`) Actor

Full listing detail from Airbnb room URLs: the per-category rating breakdown, amenities with availability flags, house rules, host, and photos.

- **URL**: https://apify.com/drydock/airbnb-listing-details.md
- **Developed by:** [Drydock Data](https://apify.com/drydock) (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 $1.10 / 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?

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

Give it Airbnb room URLs, get back **the full listing record**: the per-category rating breakdown, every amenity with a flag for whether the listing actually has it, house rules, sleeping arrangements, host response stats, coordinates, and photos.

### Why this one

**The rating breakdown is the point.** An overall 4.9 can sit on top of a 4.3 for cleanliness, and the overall number is already in any search result. This Actor returns cleanliness, accuracy, check-in, communication, location and value as separate numbers, which is the thing you cannot get without opening the listing.

**Absent amenities stay in the data.** Airbnb's page lists what a place *doesn't* have as well as what it does. Scrapers that flatten amenities to a list of titles drop the unavailable ones — so a listing that says "Unavailable: Dryer" comes back looking like it has a dryer, by omission. Here every amenity carries `available: true` or `false`, and `amenityCount` counts only the real ones.

**A dead listing doesn't kill the run.** Listings get removed constantly. One 404 in a batch of 500 is logged, counted, left uncharged, and written to the `FAILED_LISTINGS` key-value record — so a short dataset is always explainable rather than mysterious.

### What it does not return

**No prices.** Airbnb renders listing facts into the room page but leaves price and availability to a later call, so anything price-shaped scraped from a room page is either empty or stale. Prices belong to a search, where they are real and where every listing can be priced for the same stay — that is what [Airbnb Search Scraper](https://apify.com/drydock/airbnb-scraper) is for. Its `url` field feeds straight into this Actor's input.

**No host contact details.** Name, superhost status and response stats, nothing more.

### How to use it

1. Paste room URLs or bare listing IDs into **Listing URLs or IDs**. Any regional domain works, and duplicates collapse so you are never charged twice for one listing.
2. Set **Language** if you want descriptions and amenities in something other than English.
3. Leave the Apify proxy on. Airbnb routes by exit IP and rate-limits hard.
4. Run it, then take the results as JSON, CSV, Excel, or straight from the API.

### Input

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/26844351",
    "29538827"
  ],
  "locale": "en",
  "includePhotos": true,
  "maxPhotos": 20,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

```json
{
  "id": "26844351",
  "url": "https://www.airbnb.com/rooms/26844351",
  "name": "Lisbon view",
  "propertyType": "APARTMENT",
  "spaceType": "ENTIRE_HOME",
  "personCapacity": 4,
  "rating": 4.92,
  "reviewsCount": 116,
  "categoryRatings": {
    "cleanliness": 4.9,
    "accuracy": 4.9,
    "checkin": 5.0,
    "communication": 4.9,
    "location": 4.9,
    "value": 4.8
  },
  "isGuestFavorite": true,
  "amenities": [
    { "group": "Bathroom", "title": "Hair dryer", "subtitle": null, "available": true },
    { "group": "Laundry", "title": "Dryer", "subtitle": null, "available": false }
  ],
  "amenityCount": 41,
  "houseRules": [
    { "type": "HOUSE_RULES_CHECK_IN_WINDOW", "title": "Check-in after 4:00 PM", "description": null }
  ],
  "host": {
    "name": "Sofia",
    "isSuperhost": true,
    "isVerified": true,
    "responseRate": "100%",
    "responseTime": "within an hour"
  },
  "latitude": 38.7185,
  "longitude": -9.1246,
  "isExactLocation": true,
  "photos": ["https://a0.muscache.com/im/pictures/..."],
  "scrapedAt": "2026-09-02T08:20:00.000Z"
}
```

### Fields

| Field | What it is |
|---|---|
| `id`, `url` | Airbnb listing ID and canonical room URL |
| `name`, `propertyType`, `spaceType` | Listing title, property type, whole-home vs private room |
| `personCapacity` | Maximum guests |
| `rating`, `reviewsCount` | Overall rating and how many reviews it rests on |
| `categoryRatings` | Cleanliness, accuracy, check-in, communication, location, value |
| `isGuestFavorite`, `isNewListing` | Airbnb's own badges |
| `amenities`, `amenityCount` | Every amenity with an `available` flag; the count is of available ones only |
| `sleepingArrangements` | Named spaces and what is in them |
| `houseRules`, `safetyAndProperty` | Check-in window, pets, cameras, and the rest |
| `host` | Name, superhost, verified, response rate and time, cohost count |
| `latitude`, `longitude`, `isExactLocation` | Coordinates, and whether Airbnb is showing the real pin or an approximate one |
| `description`, `descriptionShort`, `highlights` | Listing copy as plain text |
| `photos` | Photo URLs, capped by `maxPhotos` |
| `scrapedAt` | When the record was taken |

### Cost

You pay per listing returned. A failed or removed listing is not charged. Photos and description length do not change the price.

Runs are HTTP-only — no browser — so compute is a small fraction of the per-listing charge on any reasonable batch size.

### Tips

- Feed it `url` values straight from **Airbnb Search Scraper** to turn a search into full records.
- Set **Max listings** when testing against a long input list, so a typo costs a few cents rather than the whole batch.
- `isExactLocation` matters if you are mapping: when it is `false`, Airbnb is deliberately fuzzing the pin and the coordinates are approximate.
- Check `FAILED_LISTINGS` in the run's key-value store to see exactly which inputs failed and why.

### Support and limitations

Airbnb changes its page shape without notice. When it does, this Actor fails loudly rather than returning empty rows — a scraper that silently returns nothing is worse than one that stops. Runs are checked daily against a fixed listing, so breakage is usually found and fixed before anyone reports it.

Only public listing data is collected, and no host contact details. You are responsible for how you use scraped data, including compliance with Airbnb's terms and applicable law in your jurisdiction.

Something wrong or missing? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `listingUrls` (type: `array`):

Airbnb room URLs (https://www.airbnb.com/rooms/12345), bare listing IDs, or a mix of both. Any regional Airbnb domain works. Duplicates are collapsed, so the same listing is only scraped and charged once.

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

Language for descriptions, amenity names and house rules, e.g. en, fr, de, pt.

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

Currency code Airbnb should render the page in. This Actor returns no prices — see the README for why — but the setting still affects some localized copy.

## `includePhotos` (type: `boolean`):

Return photo URLs for each listing. Turn off for smaller records when you only need the facts.

## `maxPhotos` (type: `integer`):

How many photo URLs to keep per listing. Airbnb serves dozens; the first few are the ones that matter.

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

Stop after this many listings. Use it to cap the cost of a large input list.

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

Airbnb routes by exit IP and rate-limits aggressively, so a proxy is strongly recommended.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/26844351",
    "https://www.airbnb.com/rooms/29538827"
  ],
  "locale": "en",
  "currency": "USD",
  "includePhotos": true,
  "maxPhotos": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

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

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

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

```

## MCP server setup

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