# Airbnb Listing Details Scraper (`steadyscrape/airbnb-listing-details-scraper`) Actor

Turn Airbnb listing links into full listing data: the price for your dates, host profile, amenities, house rules, cancellation policy, ratings, photos, coordinates and availability calendar. Paste links or ids. Export to JSON, CSV or Excel, or via API. No login, no browser.

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

## Pricing

from $3.00 / 1,000 listing with details

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

### What does Airbnb Listing Details Scraper do?

**Airbnb Listing Details Scraper** turns **Airbnb listing links into full, structured data**: the **real price for your dates** (fees included), the host profile, every amenity, house rules, cancellation policy, category ratings, rating distribution, review tags, all photos with captions, sleeping arrangement, exact coordinates — and, if you want it, the listing's **availability calendar** for up to 12 months. Paste the links (or just the numbers at their end) of the listings you follow and get one clean row per listing.

It talks to the same API Airbnb's own site uses: **no login, no browser, no proxies**, about a second per listing.

### Why use it?

- 💲 **Track competitors' prices** — schedule it with your dates and see what the same listings charge for the same stay, every day.
- 🏠 **Audit a portfolio** — check your own listings or a client's: ratings by category, amenities, rules, cancellation terms, Superhost status.
- 📅 **Watch availability** — add calendar months and get each day's availability plus a summary of open and booked days.
- 🧾 **Enrich a list of listings** — you already have links from a spreadsheet, a CRM or another scraper: get everything Airbnb shows about each.
- 🤖 **Feed dashboards, sheets and AI agents** — JSON, CSV or Excel, or straight into Google Sheets, Slack or Make through Apify integrations.

### Features

- ✅ **Links or ids, any Airbnb domain** — `https://www.airbnb.com/rooms/11337562`, `airbnb.co.uk/rooms/…`, links with parameters, or just `11337562`. Repeats are read once.
- ✅ **Price for your dates** — total for the stay with Airbnb's fees, nightly rate, the price before a host discount, and whether the dates can be booked, in the currency you choose.
- ✅ **Everything on the page** — description, amenities (with the ones marked unavailable), host (Superhost, verified, rating, reviews, years hosting, response rate and time, co-hosts), house rules, safety, cancellation policy, instant book, pets, category ratings, rating distribution, review tags, neighborhood notes, photos with captions, beds per room.
- ✅ **Availability calendar** — optional, up to 12 months: each day's availability, check-in/check-out rules, minimum and maximum nights, and a summary from today (open days, booked or blocked days, their share, first open date).
- ✅ **Fair billing** — one charge per listing read. A link to a listing that no longer exists is reported in the run summary and **not charged**. No start fee.

### How to scrape Airbnb listing details

1. Click **Try for free**.
2. Paste **listing links** (one per line) or listing numbers.
3. Set **check-in and check-out** to get the price for that stay. Choose your **currency**.
4. Optionally set **Availability calendar months**.
5. Click **Start** and download the rows as JSON, CSV or Excel. To track prices, add a [schedule](https://docs.apify.com/platform/schedules).

### Input example

```json
{
    "listingUrls": ["https://www.airbnb.com/rooms/29048719", "11337562"],
    "checkIn": "2026-11-18",
    "checkOut": "2026-11-21",
    "adults": 2,
    "currency": "USD",
    "calendarMonths": 2
}
```

### Output example

One item per listing (lists shortened here):

```json
{
    "id": "29048719",
    "url": "https://www.airbnb.com/rooms/29048719",
    "title": "Chiado River View",
    "placeType": "Condo in Lisbon",
    "searchLocation": "https://www.airbnb.com/rooms/29048719",
    "resolvedLocation": null,
    "latitude": 38.7086,
    "longitude": -9.1427,
    "rating": 4.84,
    "reviewsCount": 217,
    "isSuperhost": true,
    "isGuestFavorite": true,
    "badges": [],
    "bedrooms": 1,
    "beds": 1,
    "bathrooms": 1,
    "roomInfo": ["2 guests", "1 bedroom", "1 bed", "1 bath"],
    "price": { "total": 389, "originalTotal": null, "perNight": 129.43, "currency": "USD", "nights": 3, "checkIn": "2026-11-18", "checkOut": "2026-11-21", "label": "$389 USD for 3 nights" },
    "freeCancellation": true,
    "photos": ["https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MjkwNDg3MTk%3D/original/2af9e6db-86fc-4b5d-ae36-5f495a487651.jpeg"],
    "scrapedAt": "2026-10-04T20:07:33.383Z",
    "details": {
        "propertyType": "Entire condo",
        "description": "Situated in Chiado, the city's most fashionable neighborhood, with its old-school cafés, restaurants, and stores…",
        "personCapacity": 2,
        "overview": ["2 guests", "1 bedroom", "1 bed", "1 bath"],
        "highlights": [],
        "amenities": [{ "group": "Scenic views", "name": "River view", "available": true }],
        "host": { "id": "218909803", "name": "Ricardo", "isSuperhost": true, "isVerified": true, "reviewsCount": 424, "rating": 4.82, "yearsHosting": 8, "responseRate": "100%", "responseTime": "Responds within an hour", "about": "Olá Travelers…", "highlights": ["Lives in Lisbon, Portugal"], "coHosts": [] },
        "houseRules": ["Check-in: 4:00 PM - 7:00 PM", "Checkout before 10:00 AM", "2 guests maximum", "No pets", "Quiet hours (9:00 PM - 8:00 AM)"],
        "safety": ["Smoke alarm installed", "Must climb stairs"],
        "cancellationPolicy": "Free cancellation before October 19. Cancel before November 11 for a partial refund.",
        "canInstantBook": true,
        "petsAllowed": false,
        "categoryRatings": { "cleanliness": 4.9, "accuracy": 4.9, "checkin": 4.8, "communication": 4.9, "location": 5, "value": 4.7 },
        "ratingDistribution": { "1": 0, "2": 0.5, "3": 0.5, "4": 13.8, "5": 85.3 },
        "reviewTags": [{ "name": "LOCATION", "count": 167 }, { "name": "VIEW", "count": 131 }],
        "address": null,
        "locationDescriptions": [{ "title": "Lisbon, Portugal", "text": "Welcome to Chiado, the city's most fashionable neighborhood…" }],
        "locationVerified": false,
        "images": [{ "url": "https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MjkwNDg3MTk%3D/original/2af9e6db-86fc-4b5d-ae36-5f495a487651.jpeg", "caption": null }],
        "sleepingArrangement": [{ "room": "Bedroom", "beds": "1 queen bed" }],
        "isNewListing": false,
        "availableForDates": true
    },
    "calendar": [{ "date": "2026-10-05", "available": true, "availableForCheckIn": false, "availableForCheckOut": false, "minNights": 2, "maxNights": 90 }],
    "minNights": 2,
    "calendarSummary": { "from": "2026-10-04", "to": "2026-11-30", "days": 58, "availableDays": 34, "unavailableDays": 24, "unavailableShare": 0.414, "firstAvailableDate": "2026-10-05" }
}
```

### Output fields

| field | meaning |
|---|---|
| `id`, `url`, `title`, `placeType` | The listing, its page, its name and Airbnb's headline ("Condo in Lisbon"). |
| `searchLocation` | The link or number you gave, as you wrote it. `resolvedLocation` is always `null` here. |
| `latitude`, `longitude` | The listing page's coordinates. |
| `rating`, `reviewsCount`, `isSuperhost`, `isGuestFavorite` | Rating out of 5 (`null` for a new listing). |
| `bedrooms`, `beds`, `bathrooms`, `roomInfo` | From the listing summary; `bedrooms` is 0 for a studio. |
| `price` | With dates: `total` for the stay, fees included; `originalTotal` before a host discount; `perNight`; `nights`; `checkIn`/`checkOut`. `null` without dates, or when the dates cannot be booked. |
| `freeCancellation` | Whether the cancellation policy for your dates starts with free cancellation. |
| `photos` | Every photo's link; `details.images` adds captions. |
| `details` | Everything on the page: see the example above. `availableForDates` is `null` without dates. |
| `calendar`, `minNights`, `calendarSummary` | With **Availability calendar months**: every day from the current month, the smallest stay accepted, and the days from today counted (`unavailableDays` are booked or blocked: Airbnb does not tell them apart). |
| `scrapedAt` | UTC ISO 8601. |

The run's **SUMMARY** record lists any link that was not found or refused; those are not charged.

### Limits and tips

- **No dates, no price**: Airbnb prices a listing only for a stay. Give check-in and check-out to get it.
- Each listing is one request, plus one more with a calendar; 40 listings take about half a minute.
- Searching a whole city instead of known listings? Use [Airbnb Scraper](https://apify.com/steadyscrape/airbnb-scraper), which reads every listing of an area past Airbnb's 270-result limit. For reviews, use [Airbnb Reviews Scraper](https://apify.com/steadyscrape/airbnb-reviews-scraper).

### Is it legal to scrape Airbnb?

This Actor reads only data Airbnb shows publicly to anyone, without logging in, and does not collect personal data beyond what hosts publish on their listings. Scraping public data is generally legal; still, make sure your use complies with Airbnb's terms and the laws that apply to you, and use it responsibly. Read Apify's [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) guide.

### Your feedback

Missing a field? Open an issue on the **Issues** tab: issues are answered, and the Actor is checked against the live site so it keeps working when Airbnb changes.

# Actor input Schema

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

Airbnb listing links (<code>https://www.airbnb.com/rooms/11337562</code>) or just their numbers, one per line. Each one is read from its own page.

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

<code>YYYY-MM-DD</code>. With dates, each listing comes with the total for that stay, fees included, and whether it can be booked. Without dates there is no price: Airbnb prices a listing only for dates.

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

<code>YYYY-MM-DD</code>, after check-in.

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

Guests aged 13 or more.

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

Guests aged 2 to 12.

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

Guests under 2.

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

Pets travelling with the guests.

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

3-letter code for every price in the output: <code>USD</code>, <code>EUR</code>, <code>GBP</code>…

## `calendarMonths` (type: `integer`):

Read each listing's availability day by day for this many months from now (0 = none): available, check-in and check-out allowed, minimum and maximum nights. One extra request per listing.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/11337562",
    "https://www.airbnb.com/rooms/29048719"
  ],
  "adults": 1,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "currency": "USD",
  "calendarMonths": 0
}
```

# Actor output Schema

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

No description

## `summary` (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/11337562",
        "https://www.airbnb.com/rooms/29048719"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/airbnb-listing-details-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/1RbAXCoKgYJaviaN8/builds/FxHeslaGVgKN8eQgZ/openapi.json
