# Airbnb Rooms URLs Scraper — Full Listing Details (`memo23/airbnb-rooms-urls-scraper`) Actor

Paste Airbnb listing URLs or IDs and get one flat, analysis-ready row per listing: nightly and total price, 40+ fields, amenities, host profile, GPS, photos, guest reviews, a per-day availability calendar and occupancy & revenue estimates. 14 languages, 20 currencies. Pure HTTP, no browser.

- **URL**: https://apify.com/memo23/airbnb-rooms-urls-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, Real estate
- **Stats:** 14 total users, 14 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 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.

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 Rooms URLs Scraper — Full Listing Details

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/bGCArSLXPJQcjuquS/records/airbnb-logo-2x.png" alt="Airbnb Rooms URLs Scraper" width="180" />
</p>

**Paste Airbnb listing URLs, get one flat, analysis-ready row per listing.** Nightly and total price, 140+ fields, structured amenities and house rules, host profile, GPS, photos, guest reviews, a per-day availability calendar, and occupancy & revenue estimates.

> Pure HTTP. No headless browser, no third-party Cloudflare-bypass service.

| You give it | You get back |
|---|---|
| `https://www.airbnb.com/rooms/28198214` | That listing's full record, one row |
| A bare listing ID (`28198214`) | The same row |
| 500 listing URLs from a spreadsheet | 500 rows, one run |

### Why Use This Scraper?

- **Built for the URL-in workflow.** You already have the listing IDs. Paste them, get rows. No search parameters to tune, no city to guess at.
- **Deeper rows than a details scraper.** Full **reviews** with host replies, deep **host profiles** (Superhost, response rate, years hosting, co-hosts), **structured amenities and house rules**, and a 6-dimension **rating breakdown**.
- **The per-day availability calendar.** Up to 12 months of day-by-day availability, min/max nights, check-in eligibility and nightly price per listing.
- **Occupancy and revenue estimates.** AirDNA-style occupancy rates over 30/90/365 days, booked vs available nights, and an estimated annual revenue figure.
- **Price the stay you care about.** Set check-in, check-out and guest counts once; every URL is quoted for that stay, including cleaning fees, service fees and taxes.
- **Localized.** 14 languages and 20 currencies, so descriptions and prices come back the way your market reads them.
- **Bare IDs accepted.** A column of numeric listing IDs pastes in directly — no need to build URLs first.

### Overview

This Actor is built for short-term-rental analysts, property managers, revenue managers and researchers who already know **which** listings they care about and need the full record for each one.

The output is listing-shaped: one dataset row per URL you supply, with 140+ flat columns. It does **not** discover listings — there is no city search, no filtering by price or beds, no map area. If you need to find listings first, use [Airbnb Scraper](https://apify.com/memo23/airbnb-scraper), which searches by location and accepts the same listing URLs.

Fields are flat and dot-free (`pricing_total_price`, `host_is_superhost`, `review_cleanliness`), so a CSV export drops straight into a spreadsheet or a warehouse table without reshaping.

### Supported Inputs

#### URL types

| Input type | Pattern | Example |
|---|---|---|
| Listing URL | `airbnb.<tld>/rooms/<id>` | `https://www.airbnb.com/rooms/28198214` |
| Localized listing URL | any Airbnb country domain | `https://www.airbnb.co.uk/rooms/28198214` |
| Listing URL with tracking | query strings are ignored | `https://www.airbnb.com/rooms/28198214?check_in=2026-11-14&source_impression_id=p3_abc` |
| Bare listing ID | 6–20 digits | `28198214` |

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    "https://www.airbnb.com/rooms/28198214",
    "https://www.airbnb.co.uk/rooms/1703580897464514323",
    "50633380"
  ]
}
```

#### Unsupported inputs

- Search URLs (`airbnb.com/s/Paris--France/homes`) — use [Airbnb Scraper](https://apify.com/memo23/airbnb-scraper)
- Host / user profile URLs (`airbnb.com/users/show/12345`) — also in Airbnb Scraper
- Airbnb Experiences and Luxe-only flows
- Anything behind the Airbnb login wall (host dashboard, messages, payouts)

Unsupported entries are skipped, named in the run's status message, and never charged.

### Use Cases

| Audience | Use case |
|---|---|
| **Revenue managers** | Pull nightly rates, fees and taxes for a tracked competitive set on a schedule |
| **Property managers** | Audit their own portfolio's live pricing, amenities and house rules in one export |
| **Short-term-rental analysts** | Attach occupancy and revenue estimates to a known list of listings |
| **Real-estate investors** | Score candidate properties against comparable listings they already shortlisted |
| **Researchers** | Bulk-export listing records for housing, tourism or pricing studies |
| **Agencies** | Deliver client-ready Airbnb datasets without writing or maintaining a scraper |

### How It Works

![How It Works](https://api.apify.com/v2/key-value-stores/bGCArSLXPJQcjuquS/records/airbnb-how-it-works-2x.png)

1. **Input** — paste Airbnb listing URLs or bare listing IDs into `startUrls`
2. **Validate** — each entry is resolved to a listing URL; anything that is not a listing is reported and skipped, not charged
3. **Fetch** — listings are fetched in parallel batches over plain HTTP through built-in residential proxies
4. **Optional enrichment** — reviews, the per-day availability calendar, occupancy & revenue estimates, and host contact-email discovery are each opt-in
5. **Output** — one flat row per listing, exportable as JSON, CSV, Excel, HTML, JSONL or RSS

### Input Configuration

#### Input fields

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | `array<string>` | yes | Listing URLs or bare listing IDs, at least one |
| `checkIn` | `string` | optional | `YYYY-MM-DD`; prices are quoted for this stay |
| `checkOut` | `string` | optional | `YYYY-MM-DD`; must be after `checkIn` |
| `adults` | `integer` | optional | Defaults to `2` |
| `children` | `integer` | optional | Ages 2–12 |
| `infants` | `integer` | optional | Under 2 |
| `pets` | `integer` | optional | Affects pet fees where charged |
| `locale` | `string` | optional | Defaults to `en-US`; 14 languages |
| `currency` | `string` | optional | Defaults to `USD`; 20 currencies |
| `includeReviews` | `boolean` | optional | Defaults to `false` |
| `maxReviewsPerListing` | `integer` | optional | Defaults to `100`; `0` means every review |
| `calendarMonths` | `integer` | optional | `0`–`12`; `0` (default) is off |
| `includeRevenueEstimate` | `boolean` | optional | Defaults to `false`; fetches a 12-month calendar |
| `enrichEmails` | `boolean` | optional | Defaults to `false`; host/management contact discovery |
| `qualifyByPayment` | `boolean` | optional | Requires `enrichEmails` |
| `maxItems` | `integer` | optional | Defaults to `10000`; also a cost cap |
| `maxConcurrency` | `integer` | optional | Defaults to `10` |
| `minConcurrency` | `integer` | optional | Defaults to `1` |
| `maxRequestRetries` | `integer` | optional | Defaults to `3` |
| `proxy` | `object` | optional | Leave empty; built-in residential proxy is used |

#### Common scenarios

**1. Price a competitive set for a specific stay**

```json
{
  "startUrls": [
    "https://www.airbnb.com/rooms/28198214",
    "https://www.airbnb.com/rooms/50633380"
  ],
  "checkIn": "2026-11-14",
  "checkOut": "2026-11-18",
  "adults": 2,
  "currency": "EUR"
}
```

**2. Full record with reviews and a 6-month calendar**

```json
{
  "startUrls": ["https://www.airbnb.com/rooms/28198214"],
  "includeReviews": true,
  "maxReviewsPerListing": 200,
  "calendarMonths": 6
}
```

**3. Occupancy and revenue estimate for a shortlist**

```json
{
  "startUrls": ["28198214", "50633380", "1703580897464514323"],
  "includeRevenueEstimate": true,
  "maxItems": 3
}
```

### Output Overview

Each dataset item is one listing row, with roughly 140 flat fields grouped by prefix:

- **Core** — `id`, `title`, `listing_url`, `property_type`, `room_type`, `property_name`
- **Location** — city, country, latitude, longitude, neighborhood description, transit notes
- **Pricing** — per-night and all-in total for your dates, discounts, taxes, an itemized `pricing_fees_breakdown[]`, and `pricing_is_available` / `pricing_unavailable_reason` so a 0 is never ambiguous
- **Capacity** — guests, bedrooms, beds, bathrooms
- **Booking** — minimum and maximum nights, instant-book, pet policy, cancellation policy
- **Host** — id, name, Superhost and verified flags, response rate and time, years hosting, co-hosts
- **Ratings** — overall plus the six sub-scores (accuracy, cleanliness, check-in, communication, location, value)
- **Amenities** — a flat `amenities[]` list, a structured `amenities_structured[]` tree, and normalized `amenity_*` booleans
- **House rules** — structured rules plus normalized `house_rules_*` booleans
- **Media** — `main_image_url`, `images[]`, `photos_with_captions[]`
- **Availability** — requested check-in/check-out and whether the listing is available
- **Optional** — `reviews[]`, the per-day calendar, and occupancy/revenue estimates

Fields a given listing does not publish come back empty rather than missing, so the column set stays stable across rows.

### Output Samples

#### Listing URL start, hotel-type property, no enrichments

```jsonc
{
  "id": "1744240166940757035",
  "title": "Nemea Appart Hôtel Paris Levallois · ★New · Hotel in Levallois-Perret",
  "listing_url": "https://www.airbnb.com/rooms/1703580897464514323",
  "property_name": "Hotel in Levallois-Perret, France",
  "property_type": "Room in hotel",
  "room_type": "Private room",
  "location_city": "Levallois-Perret",
  "location_latitude": 48.8979,
  "location_longitude": 2.2916,
  "accommodation_guests": 2,
  "pricing_currency": "USD",
  "pricing_base_price": 169.44,
  "pricing_total_price": 847.2,
  "pricing_nights": 5,
  "pricing_is_available": true,
  "pricing_unavailable_reason": null,
  "pricing_fees_breakdown": [{ "label": "Taxes", "amount": 40 }],
  "booking_min_nights": 2,
  "review_overall_rating": 5,
  "review_count": 1,
  "review_cleanliness": 5,
  "review_location": 5,
  "amenity_wifi": true,
  "amenity_gym": true,
  "amenity_parking": true,
  "amenity_kitchen": false,
  "availability_check_in": "2026-09-01",
  "availability_check_out": "2026-09-06",
  "availability_is_available": true,
  "main_image_url": "https://a0.muscache.com/im/pictures/hosting/…",
  "meta_pdp_type": "HOTEL",
  "meta_scraped_at": "2026-08-28T08:24:34.932Z"
  /* …plus ~110 more fields: host_*, description_*, house_rules_*, images[], amenities_structured[], highlights[] */
}
```

#### Same listing with `includeReviews: true`

```jsonc
{
  "id": "1744240166940757035",
  "review_count": 1,
  "reviews": [
    {
      "rating": 5,
      "comments": "Clean, quiet and a two-minute walk from the station…",
      "createdAt": "2026-07-19",
      "reviewer": { "firstName": "…" },
      "response": "…"
    }
  ]
  /* review objects are appended to the same listing row, not pushed as separate rows */
}
```

### Key Output Fields

#### Listing core

- `id`, `title`, `listing_url`, `property_name`, `property_type`, `room_type`
- `android_link`, `ios_link`, `meta_pdp_type`, `meta_language`, `meta_scraped_at`

#### Pricing

- `pricing_base_price` (per night), `pricing_total_price` (all-in for your dates, after discounts), `pricing_nights`, `pricing_currency`
- `pricing_discounted_price`, `pricing_original_price`, `pricing_discount_total`, `pricing_monthly_price`, `pricing_monthly_discount`
- `pricing_taxes`, `pricing_cleaning_fee`, `pricing_service_fee`, and `pricing_fees_breakdown[]` — every fee and discount line as Airbnb labelled it, in your chosen language. Airbnb now folds cleaning and service fees into the nightly rate on most listings and itemizes only some charges, so read the breakdown when the individual fee columns are 0.
- `pricing_is_available`, `pricing_unavailable_reason` — Airbnb refuses to quote dates you cannot book and says why ("Minimum stay is 30 nights"), which separates that from a missing price
- `pricing_price_qualifier`, `pricing_source`

#### Booking

- `booking_min_nights`, `booking_max_nights` — filled on every listing
- `booking_can_instant_book`, `booking_allows_pets`, `booking_cancellation_policy`, `booking_cancellation_policy_name`

#### Location & capacity

- `location_city`, `location_country`, `location_latitude`, `location_longitude`
- `location_neighborhood_name`, `location_neighborhood_overview`, `location_public_transit`
- `accommodation_guests`, `accommodation_bedrooms`, `accommodation_beds`, `accommodation_bathrooms`

#### Host

- `host_id`, `host_name`, `host_profile_url`, `host_profile_picture_url`
- `host_is_superhost`, `host_is_verified`, `host_response_rate`, `host_response_time`
- `host_years_hosting`, `host_months_hosting`, `host_location`, `host_about`, `host_cohosts[]`

#### Ratings

- `review_overall_rating`, `review_count`, `review_visible_count`
- `review_accuracy`, `review_cleanliness`, `review_checkin`, `review_communication`, `review_location`, `review_value`

#### Amenities, rules & media

- `amenities[]`, `amenities_structured[]`, `amenity_wifi`, `amenity_kitchen`, `amenity_parking`, `amenity_pool` (and more)
- `house_rules_structured[]`, `house_rules_check_in_after`, `house_rules_pets_allowed`, `house_rules_self_check_in`
- `main_image_url`, `images[]`, `photos_with_captions[]`, `highlights[]`

#### Optional enrichments

- `reviews[]` — when `includeReviews: true`
- `availability_calendar[]` — when `calendarMonths` is 1–12
- `occupancy_rate_365d`, `booked_nights_365d`, `est_revenue_365d`, `avg_min_nights` — when `includeRevenueEstimate: true`

### FAQ

#### Which Airbnb URLs are supported?

Listing URLs only — `airbnb.<tld>/rooms/<id>` on any country domain, with or without query strings, plus bare numeric listing IDs. Search URLs and host profile URLs are not supported here; [Airbnb Scraper](https://apify.com/memo23/airbnb-scraper) handles those and listing URLs too.

#### Can I search by city instead of pasting URLs?

Not in this Actor. That is deliberate — this one is the URL-in tool. Use [Airbnb Scraper](https://apify.com/memo23/airbnb-scraper) to search by location, price, dates, beds or bathrooms.

#### What happens if I paste an unsupported URL?

It is skipped, counted, and named in the run's status message. It costs nothing, and the rest of your URLs still run.

#### Do the prices include fees and taxes?

`pricing_total_price` is the all-in figure for your dates. The individual fee columns often read 0 now, because Airbnb folds cleaning and service fees into the nightly rate and itemizes only some charges — `pricing_fees_breakdown[]` carries every line it does itemize, labelled the way Airbnb labels it. A 0 total is never ambiguous: `pricing_is_available` and `pricing_unavailable_reason` say whether Airbnb declined to quote those dates and why.

#### Are the dates required?

No. Without `checkIn` / `checkOut` you get the listing's default quote. With them, prices and `availability_is_available` reflect that specific stay.

#### How many reviews do I get?

100 per listing by default. Raise `maxReviewsPerListing` for more, or set it to `0` for every review — that is slower, since reviews page 20 at a time, and a very review-heavy batch can push a long run against its timeout.

#### Are host details always populated?

No. Airbnb omits host fields on some property types, notably hotel and professional rate-plan listings, where `host_id` and `host_name` come back empty. Consumer listings normally populate them.

#### Can I scrape private or login-gated data?

No. Only publicly visible listing pages are accessed — nothing behind the Airbnb login, and no host dashboard data.

#### What export formats are available?

JSON, CSV, Excel, HTML table, JSONL and RSS — anything an Apify dataset supports.

### Support

Found a bug or need a field that isn't here? Open an issue on the Actor's **Issues** tab. Include the input you ran and the listing URL so it's reproducible.

### Additional Services

Need a custom field, a scheduled feed into your warehouse, or contact enrichment on top of the listing rows? Custom scraping and data-pipeline work is available — reach out via the author profile.

### Explore More Scrapers

More scrapers by the same author on the [Apify Store](https://apify.com/memo23):

- [**Airbnb Scraper**](https://apify.com/memo23/airbnb-scraper) — search by location, price and dates; also takes listing and host URLs
- **Expedia Scraper** — hotel search, prices & availability
- **Zillow Agents Scraper** — agent profiles & contact data
- **Yelp Scraper** — business details & reviews

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/airbnb-rooms-urls-scraper`).

**Purpose:** Turns Airbnb listing URLs or bare listing IDs into one flat row per listing, with opt-in reviews, a per-day availability calendar, and occupancy/revenue estimates. URL-in only — it does not search.

**Minimal input:**

```json
{
  "startUrls": ["https://www.airbnb.com/rooms/28198214"],
  "maxItems": 5
}
```

**Output:** one row per listing — `id`, `title`, `listing_url`, `property_type`, `room_type`, `property_name`, `location_city`, `location_country`, `location_latitude`, `location_longitude`, `pricing_currency`, `pricing_base_price`, `pricing_total_price`, `pricing_nights`, `pricing_is_available`, `pricing_unavailable_reason`, `pricing_fees_breakdown[]`, `booking_min_nights`, `booking_max_nights`, `accommodation_guests`, `accommodation_bedrooms`, `accommodation_beds`, `accommodation_bathrooms`, `review_overall_rating`, `review_count`, `review_accuracy`, `review_cleanliness`, `review_checkin`, `review_communication`, `review_location`, `review_value`, `host_id`, `host_name`, `host_is_superhost`, `host_response_rate`, `host_years_hosting`, flat `amenities[]` plus normalized `amenity_*` booleans, `house_rules_structured[]`, `images[]`, `availability_is_available`, opt-in `reviews[]`, opt-in `availability_calendar[]`, opt-in `occupancy_rate_365d`/`booked_nights_365d`/`est_revenue_365d`.

**Behaviors an agent should know:**

- Only `airbnb.<tld>/rooms/<id>` URLs and 6–20 digit listing IDs are accepted; search and `/users/` URLs are skipped, reported in the status message, and not charged. For search, call `memo23/airbnb-scraper` instead.
- `maxItems` defaults to 10000 — set it to the number of URLs supplied to get an exact cost ceiling.
- `checkIn`/`checkOut`/`adults`/`children`/`infants`/`pets` apply to every URL that doesn't carry its own dates, and change the price quoted.
- `includeReviews`, `calendarMonths` (0–12), `includeRevenueEstimate` and `enrichEmails` are each opt-in and add requests per listing. `maxReviewsPerListing` defaults to 100; `0` means every review and can run long.
- Host fields are empty on hotel and professional rate-plan listings; that is Airbnb's data, not a scrape failure.
- Pay-per-event billing — see the Pricing tab on the actor page.

### ⚠️ Disclaimer

This Actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Airbnb, Inc.** or any of its subsidiaries. "Airbnb" and related marks are trademarks of Airbnb, Inc. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Airbnb listing pages — no authenticated endpoints, paid features, or content behind the airbnb.com login wall. Users are responsible for ensuring their use complies with Airbnb's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

### SEO Keywords

airbnb scraper, scrape airbnb, airbnb url scraper, airbnb rooms scraper, airbnb listing scraper, airbnb API, airbnb.com scraper, Apify airbnb, airbnb listing details, airbnb price scraper, airbnb reviews scraper, airbnb calendar scraper, airbnb availability data, short term rental data, vacation rental scraper, str market analysis, airbnb occupancy data, airbnb revenue estimate, rental pricing intelligence, property data extraction, travel data scraping, real estate market data

# Actor input Schema

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

Airbnb room/listing URLs to scrape, one per line — e.g. `https://www.airbnb.com/rooms/28198214`.

Any Airbnb domain works (`airbnb.com`, `airbnb.co.uk`, `airbnb.ba`, …), and tracking query strings are fine — paste the URL exactly as you copied it.

A bare listing ID (`28198214`) is accepted too.

**Searching by city instead?** This actor is URL-in only. Use [Airbnb Scraper](https://apify.com/memo23/airbnb-scraper) to search by location, price and dates.

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

Check-in date (YYYY-MM-DD). Prices and availability are returned for this stay. Applies to every listing URL that doesn't carry its own dates in its query string. Example: `2026-11-14`.

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

Check-out date (YYYY-MM-DD). Must be after the check-in date. Applies to every listing URL that doesn't carry its own dates. Example: `2026-11-18`.

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

Number of adults the price should be quoted for. Applies to every listing URL that doesn't specify its own. Default 2.

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

Number of children (ages 2-12) to include in the price quote. Optional; leave empty for none.

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

Number of infants (under 2) to include in the price quote. Optional; leave empty for none.

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

Number of pets to include in the price quote. Affects pet fees on listings that charge them. Optional; leave empty for none.

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

Language for listing descriptions and labels.

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

Currency for prices.

## `includeReviews` (type: `boolean`):

Fetch guest reviews for each listing, with ratings, dates, reviewer names and host replies.

## `maxReviewsPerListing` (type: `integer`):

Cap how many reviews are fetched per listing when Include reviews is on. Reviews page 20 at a time, so a review-heavy listing can take minutes on its own — this cap is what keeps a large run inside its timeout. Set 0 for every review (slow, and can time out on big runs).

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

Emit the full per-day availability calendar for each listing, 0–12 months ahead (0 = off). Each day includes date, availability, check-in/check-out eligibility, min/max nights, and nightly price. Adds one request per listing (shared with the occupancy estimate if that's also on).

## `includeRevenueEstimate` (type: `boolean`):

If checked, fetches each listing's 12-month availability calendar and adds occupancy rates (30/90/365 days), booked vs available nights, an estimated revenue (booked nights × nightly price), and average minimum-stay. Adds one extra request per listing, so runs are slower.

## `enrichEmails` (type: `boolean`):

If checked, the actor tries to discover a contact email for each listing's host/management company: it resolves the host name to a company website and harvests contact emails from it. Works best for professionally managed listings (villa companies, property managers, agencies) — individual private hosts usually have no findable business email and return empty. Adds a few requests per listing, so runs are slower.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

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

Hard cap on how many listing rows are produced. The run stops once it is reached, so it is also a cost cap. Default 10000; set it to the number of URLs you supplied if you want an exact ceiling.

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

How many listings are fetched at the same time. Default 10. Lower it if you see blocks; raise it for large URL batches.

## `minConcurrency` (type: `integer`):

Lower bound on parallel fetches. Default 1. Leave as is unless you are tuning throughput.

## `maxRequestRetries` (type: `integer`):

How many times a failed request is retried before that listing is given up on. Default 3.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.airbnb.com/rooms/28198214"
  ],
  "checkIn": "2024-06-29",
  "checkOut": "2024-07-05",
  "adults": 2,
  "locale": "en-US",
  "currency": "USD",
  "includeReviews": false,
  "maxReviewsPerListing": 100,
  "calendarMonths": 0,
  "includeRevenueEstimate": false,
  "enrichEmails": false,
  "qualifyByPayment": false,
  "maxItems": 10000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 3
}
```

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

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

# Run the Actor and wait for it to finish
run = client.actor("memo23/airbnb-rooms-urls-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 '{
  "startUrls": [
    "https://www.airbnb.com/rooms/28198214"
  ]
}' |
apify call memo23/airbnb-rooms-urls-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/airbnb-rooms-urls-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/hfHKQYJyjDZgkDkle/builds/qtjCf8Cc3Ly9x65aN/openapi.json
