# Airbnb Listing Details Scraper (by URL or ID) (`integraiia/airbnb-listing-details`) Actor

Full details for any Airbnb listing from its public page: name, property type, capacity, rating and review count, category ratings, description, amenities, house rules, safety features, sleeping arrangements, coordinates and photos. No login, no host data. Pay per listing.

- **URL**: https://apify.com/integraiia/airbnb-listing-details.md
- **Developed by:** [Will Vasquez](https://apify.com/integraiia) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 airbnb listings

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/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 (by URL or ID)

Turns any Airbnb listing URL or ID into one complete, structured record from the listing's public page: name, Airbnb's one-line summary, property type, guest capacity, star rating and review count, the six category ratings, full description, amenities grouped the way Airbnb groups them (with what is *not* included), house rules, safety features, sleeping arrangements, map coordinates and every photo URL. No login, no proxies, no host or guest data. Pay per listing.

### What it returns

One record per listing:

| Field | Meaning |
|---|---|
| `id`, `url` | Listing ID and page |
| `name` | Listing name |
| `summary` | Airbnb's one-liner, e.g. "Townhouse in Houston · ★4.97 · 1 bedroom · 1 bed · 1 bath" |
| `propertyType` | e.g. "Private room in townhouse" |
| `roomTitle` | e.g. "Room in Houston, Texas, United States" |
| `personCapacity` | Maximum guests |
| `facts` | Short facts such as "1 double bed" |
| `rating`, `reviewsCount` | Overall rating and number of reviews (null for new listings) |
| `isGuestFavorite`, `isNewListing` | Airbnb quality flags |
| `categoryRatings` | Cleanliness, Accuracy, Check-in, Communication, Location, Value |
| `location`, `city`, `latitude`, `longitude`, `isExactLocation` | Where it is (Airbnb shows an approximate point unless the host shares the exact address) |
| `description` | Full description as plain text |
| `highlights` | Airbnb's highlight cards (headline + body) |
| `amenities` | Groups of amenities as shown on the page, each with its items |
| `amenitiesAvailable`, `amenitiesUnavailable` | Flat lists |
| `houseRules`, `safety` | House rules and safety & property items |
| `sleepingArrangements` | Rooms with their beds |
| `images` | Photo URLs |
| `price` | Always null in this version: Airbnb loads prices after the page renders, and this Actor reads only the public page |

### Input

- `listingUrls` — listing page URLs (`https://www.airbnb.com/rooms/14186115`) or bare IDs, one per line.
- `currency` — ISO code sent to Airbnb, default USD.
- `maxItems` — stop after this many listings (default 100, max 10,000).

### Output sample

```json
{
  "id": "14186115",
  "url": "https://www.airbnb.com/rooms/14186115",
  "name": "Modern Midtown Space - Private Bedroom + Study",
  "summary": "Townhouse in Houston · ★4.97 · 1 bedroom · 1 bed · 1 private bath",
  "propertyType": "Private room in townhouse",
  "personCapacity": 2,
  "rating": 4.97,
  "reviewsCount": 763,
  "isGuestFavorite": true,
  "categoryRatings": { "Cleanliness": 5, "Accuracy": 5, "Check-in": 5, "Communication": 5, "Location": 4.9, "Value": 4.9 },
  "location": "Houston, Texas, United States",
  "latitude": 29.74,
  "longitude": -95.37,
  "amenitiesAvailable": ["Bathtub", "Hair dryer", "Kitchen", "Wifi"],
  "houseRules": ["Up to 2 overnight guests", "No pets"],
  "images": ["https://a0.muscache.com/im/pictures/..."]
}
```

### Pricing

Pay per listing. You are charged one `listing` event for each record written to the dataset, nothing for listings that are gone (404/410) or unreadable.

### Limits

- One request per listing, about one per 1.5 seconds, identified as `IntegraActor/1.0`; honors Airbnb's robots.txt and stops cleanly if Airbnb blocks or rate-limits it.
- Reads only the main listing page. Reviews, host profiles and prices are not collected.

# Actor input Schema

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

Airbnb listing page URLs (https://www.airbnb.com/rooms/14186115) or bare listing IDs, one per line.

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

ISO currency code requested from Airbnb (USD, EUR, GBP, ...).

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

Stop after this many listings. Each listing is one paid event. Default 100, maximum 10,000.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/14186115"
  ],
  "currency": "USD",
  "maxItems": 100
}
```

# Actor output Schema

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

All collected listings as JSON (one record per listing).

# 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/14186115"
    ],
    "currency": "USD"
};

// Run the Actor and wait for it to finish
const run = await client.actor("integraiia/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/14186115"],
    "currency": "USD",
}

# Run the Actor and wait for it to finish
run = client.actor("integraiia/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/14186115"
  ],
  "currency": "USD"
}' |
apify call integraiia/airbnb-listing-details --silent --output-dataset

```

## MCP server setup

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