# Airbnb API: Listing Details Scraper (`s-r/airbnb-listing-details`) Actor

Collect public Airbnb listing details from room URLs or IDs: amenities, house rules, hosts, photos, ratings and optional stay prices with tax inclusion. One row per delivered listing.

- **URL**: https://apify.com/s-r/airbnb-listing-details.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Travel
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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 API for Listing Details

This Airbnb API collects the public details of the accommodation listings you already follow. Supply Airbnb room URLs or listing IDs and receive one dataset row per delivered listing, with amenities, house rules, host information, photos, ratings and optional stay prices. It suits short term rental research, property management and repeated snapshots of a fixed set of properties.

The actor works with public listing information. You can export its dataset as JSON, CSV or Excel and join snapshots by `accommodation_id`. The collection timestamp is `fetched_at`, so you can retain the date of each observation alongside the property record. Public listing content may change between runs, including names, photos, rules and prices.

### Input: room URLs, listing IDs and dates

Use `start_urls` for Airbnb room URLs, either as strings or as objects containing a `url` field. The alias `startUrls` also works. Supported room paths include ordinary rooms, Plus rooms and luxury listing URLs. Custom host shortcuts such as `/h/slug` are reported as invalid inputs because they do not identify a numeric listing directly.

Use `listing_ids` for an array of Airbnb identifiers. Store identifiers as strings, particularly long identifiers that can lose digits when converted to JavaScript numbers. Both input lists are combined and duplicate listing IDs are collected once. The order follows the URL list and then the ID list. The canonical snake case URL field takes precedence if both URL aliases are provided. Dates and guests embedded in a room URL are ignored; use the dedicated input fields for a consistent run.

Stay dates are optional. Set `check_in` and `check_out` together as valid YYYY-MM-DD dates, with check-out after check-in and check-in outside the past. The aliases `checkIn` and `checkOut` work as well; snake case has precedence. Without dates, listing details are still returned and price fields are null.

`adults` defaults to one and accepts 1–16. `children` accepts 0–15, while `infants` and `pets` accept 0–5; these three fields default to zero. `currency` defaults to USD and accepts supported ISO currency codes. Guest counts and travel dates are recorded with the quote, making later comparisons meaningful.

`max_photos` accepts 0–1000 and defaults to 1000. Set it to zero to omit the photo list. `max_listings` limits the combined unique inputs to 1–10,000; it defaults to 10,000. Large input lists are collected in successive pages automatically within the actor's available run time. If collection is interrupted, the output records partial delivery and continuation information.

### Airbnb API output fields

Each row has the listing ID in `accommodation_id`, its canonical `url`, the public listing `name` and `fetched_at`. Description text and description HTML are separate fields. Property and room types, guest capacity, bedrooms, beds, bathrooms and layout text describe the accommodation. Multi-unit properties and hotels can omit individual room counts; absent counts are null.

Amenities include their group, title and availability. Facilities explicitly marked unavailable are kept, which helps distinguish an unavailable kitchen from a missing amenities section. A flat `amenities_available` list provides only available facilities. House rules include check-in and checkout wording, pet rules, smoking rules and event rules. Safety information is returned separately.

Location includes the city, country name, country code, public coordinates and available location wording. Airbnb often shows approximate coordinates before booking; `is_exact_location` records what the listing reports. An exact street address is not guaranteed.

The `host` object includes the public name, identifier, Superhost and verification flags, profile picture, hosting duration, response wording and public introduction when available. Hosting duration is years and months, because the source does not supply an exact starting date. Overall rating uses a scale of five, with review count and category ratings for accuracy, cleanliness, check-in, communication, location and value. Photos retain URLs and captions.

### Stay prices and availability

With dates, `price` is the total for the requested stay and party size in `currency`. `price_nightly` records the nightly amount from the displayed breakdown when available, and can exclude additional fees. `price_breakdown` keeps individual amounts and labels. Hotel quotes refer to the default room offered by the listing, without a room-selection step.

The country selected for the quote can change whether taxes are included. The same stay may show an inclusive total in one country and a total before taxes in another. Read `price_includes_taxes` and `price_display_style` before comparing amounts. The recorded quote country is additional context, and currency remains the currency requested for the run.

Unavailable dates still return the listing details with `available:false`, a null price and `unavailable_reason`. A requested quote that could not be collected gives a partial row and a warning. If dates were omitted, null price fields are expected and do not create a warning. Quotes are snapshots and can change before booking.

### Pricing and delivery

Billing uses one `listing` event for each listing row actually delivered. An unavailable date window still counts as a delivered listing because its property details were collected. Failed or missing listings produce error records and are not charged as listing rows. Empty results incur no listing charge and this actor has no separate start event. The current event price is shown in the actor's Pricing tab.

Non-paying users can process at most ten combined listing inputs per run. This limit applies across URL and ID lists together. Paying users can request up to 10,000 inputs, subject to their run time and spending limits. Billing follows delivered dataset rows rather than the length of the submitted list.

### FAQ

#### Do I need an Airbnb account?

No Airbnb login is needed for public listing information. Listings that are removed or no longer public are recorded as missing. The actor does not obtain private account or booking information.

#### Does this actor find listings in a city?

This actor collects a known set of listings supplied as room URLs or IDs. Use the separate Airbnb Scraper for location searches, then pass its listing identifiers here for fuller details.

#### Why is the price null?

Dates may have been omitted, the stay may be unavailable, or the requested quote could not be collected. Check `available`, `unavailable_reason`, row `partial` and the run warnings to tell these cases apart.

#### Are reviews and host profiles included in full?

The output includes review counts, average ratings and category ratings, plus the public host information on the listing. It does not collect individual review texts or a separate host profile history. Public host data can contain personal information; retain and use it only for your intended purpose and applicable obligations.

#### Is a daily availability calendar included?

The actor reports availability for the requested stay window. A day-by-day calendar is outside its current output. Repeat runs with a fixed listing set to build your own dated snapshots.

# Actor input Schema

## `start_urls` (type: `array`):

Airbnb room URLs or objects with a url field. URL query dates and guest counts are ignored. Canonical start_urls takes precedence over startUrls.

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

Airbnb room URLs or objects with a url field. URL query dates and guest counts are ignored. Canonical start_urls takes precedence over startUrls.

## `listing_ids` (type: `array`):

Numeric Airbnb listing IDs; use strings for large IDs to preserve every digit. Combined with the URL list and deduplicated in order.

## `check_in` (type: `string`):

Optional stay date (YYYY-MM-DD). Provide check-in and check-out together; check-in must not be in the past. Snake case takes precedence over its camel case alias.

## `check_out` (type: `string`):

Optional stay date (YYYY-MM-DD). Provide check-in and check-out together; check-in must not be in the past. Snake case takes precedence over its camel case alias.

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

Optional stay date (YYYY-MM-DD). Provide check-in and check-out together; check-in must not be in the past. Snake case takes precedence over its camel case alias.

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

Optional stay date (YYYY-MM-DD). Provide check-in and check-out together; check-in must not be in the past. Snake case takes precedence over its camel case alias.

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

Adult guests for the stay quote.

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

Child guests for the stay quote.

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

Infant guests for the stay quote.

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

Pets for the stay quote.

## `max_photos` (type: `integer`):

Maximum photo records per listing; zero omits photos.

## `max_listings` (type: `integer`):

Maximum combined unique listing inputs to process across all cursor pages. Non-paying users are capped at ten.

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

Supported ISO 4217 currency for stay prices; converted to uppercase.

## `proxy_country` (type: `string`):

ISO alpha-2 exit country for the quote. Defaults to the configured country. NL usually includes taxes, US usually excludes them; inspect price_includes_taxes.

## `cursor` (type: `string`):

Opaque next_cursor from a previous response with exactly the same inputs. Omit for the first request.

## Actor input object example

```json
{
  "listing_ids": [
    "1677381"
  ],
  "check_in": "2026-11-08",
  "check_out": "2026-11-11",
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "max_photos": 1000,
  "max_listings": 10000,
  "currency": "USD",
  "proxy_country": "NL"
}
```

# Actor output Schema

## `results` (type: `string`):

One row per delivered public listing.

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

Delivered count and actual listing charges.

## `errors` (type: `string`):

Uncollected inputs with an English error message.

# 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 = {
    "listing_ids": [
        "1677381"
    ],
    "check_in": "2026-11-08",
    "check_out": "2026-11-11",
    "proxy_country": "NL"
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/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 = {
    "listing_ids": ["1677381"],
    "check_in": "2026-11-08",
    "check_out": "2026-11-11",
    "proxy_country": "NL",
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/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 '{
  "listing_ids": [
    "1677381"
  ],
  "check_in": "2026-11-08",
  "check_out": "2026-11-11",
  "proxy_country": "NL"
}' |
apify call s-r/airbnb-listing-details --silent --output-dataset

```

## MCP server setup

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