# Hotel Details & Photos Scraper - Booking, Airbnb, Google (`scrapercompany/hotel-details-scraper`) Actor

Scrape hotel and rental content, not prices: Booking.com details, photos, facilities and review summary, Airbnb listing details and photos, Google Hotels photos and nearby places, and Tripadvisor place details. Batch many properties per run. Made by ScraperCompany.

- **URL**: https://apify.com/scrapercompany/hotel-details-scraper.md
- **Developed by:** [ScraperCompany](https://apify.com/scrapercompany) (community)
- **Categories:** Travel, Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 property content requests

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

## Hotel Details & Photos Scraper - Booking, Airbnb, Google

**Hotel Details & Photos Scraper** by ScraperCompany collects property content (not prices) from four sources in nine modes. **Booking.com**: property details (ids, address, coordinates, stars, description, check-in and check-out, review score, languages, meals, house rules), the full photo gallery, facilities grouped with charges and policies, and the review summary (category scores with the city average, scores per traveller type, pros and cons). **Airbnb**: listing details (capacity, amenities, sleeping arrangements, house rules, host, location, ratings, cancellation policy for a stay) and every photo by room. **Google Hotels**: the photo gallery by category or source, and nearby places with travel times and location scores. **Tripadvisor**: place details with rating breakdown, ranking and sub-ratings. Pricing is pay-per-event: **$0.009 per Booking.com details or facilities request**, **$0.005 per other Booking.com, Airbnb or Google Hotels request** and **$0.003 per Tripadvisor place**; failed requests and empty answers are not charged.

**Nothing to set up:** no code, no login and no keys. Start a run, then export JSON, CSV or Excel, or pull the results through the Apify API. You pay only for results; failed and empty requests are free.

### What can this hotel details scraper do?

- **Booking.com details**: hotel id, address, coordinates, stars, property type, chain, description, check-in/out, review score, languages, meals, house rules; optional nearby list.
- **Booking.com photos** with captions, original size, tagged rooms and URLs in every size.
- **Booking.com facilities** by group with charges, most popular facilities and policies; **review summary** with category scores, traveller-type scores, pros and cons.
- **Airbnb listing details** (amenities, beds, rules, host, ratings, cancellation milestones for your dates) and **photos by room**.
- **Google Hotels photos** (paged, by category or owner/visitor) and **nearby places** with travel times and location scores.
- **Tripadvisor details**: address, coordinates, rating breakdown, ranking, sub-ratings, price range, contact, photos.
- Paste URLs or ids; batch many properties per run.

#### Modes

| Mode | What it returns | Price per request |
| --- | --- | --- |
| `booking-details` | Name, ids, address, coordinates, stars, description, check-in/out, review score, languages, meals, house rules | $0.009 |
| `booking-photos` | Every gallery photo with caption, size, upload time, tagged rooms and URLs per size | $0.005 |
| `booking-facilities` | Facilities by group with charges, most popular facilities, highlights, languages, policies | $0.009 |
| `booking-review-summary` | Review score and count, category scores with the city average, scores per traveller type, pros and cons, topics | $0.005 |
| `airbnb-listing` | Title, type, capacity, description, amenities, sleeping arrangements, house rules, host, location, ratings, cancellation policy | $0.005 |
| `airbnb-photos` | Every listing photo with its room, size, original URL and resized versions | $0.005 |
| `google-photos` | Photo gallery pages with caption, source (owner or visitor), size, upload date and URLs; category and source counts | $0.005 |
| `google-nearby` | Top sights, transit, airports and restaurants with travel times, neighbourhood and location scores | $0.005 |
| `tripadvisor-details` | Hotel, restaurant or attraction: address, coordinates, rating and breakdown, ranking, sub-ratings, price range, contact, photos | $0.003 |

### What makes it different?

| | **Hotel Details & Photos Scraper** | Many alternatives |
| --- | --- | --- |
| Setup | Nothing to configure: no login, no keys | Often your own accounts, cookies or network setup |
| You pay for | Successful results; failed and empty requests are free | Often run time, or every attempt |
| When a site pushes back | Retried and handled for you | Often an empty or failed run |

### Who uses hotel details data?

- **Travel sites and apps**: Fill property pages with descriptions, amenities, photos and house rules.
- **Hotel revenue and marketing teams**: Audit how your property and competitors are presented: photos, facilities, review scores.
- **Short-term rental managers**: Compare amenities, ratings and cancellation policies of nearby Airbnb listings.
- **Data teams**: Match properties across Booking.com, Airbnb, Google Hotels and Tripadvisor with coordinates and ids.

### What hotel details data can you extract?

| Field | Description |
| --- | --- |
| `name / hotel_id / address / gps_coordinates (Booking.com details)` | Identity and location |
| `star_rating / review_score / review_count / house_rules` | Stars, guest score and house rules |
| `photos[].caption / url_original / original_width / rooms` | Photos (Booking.com, Airbnb, Google Hotels) |
| `groups[].group / facilities (Booking.com facilities)` | Facilities by group, with charges |
| `category_scores[] / traveler_type_scores[] / summary (Booking.com review summary)` | Score breakdown, pros and cons |
| `title / amenities / host / rating / cancellation (Airbnb listing)` | Listing content, host, ratings and cancellation policy |
| `groups[].places[] / neighborhood / location_scores (Google nearby)` | Nearby places with travel times, neighbourhood, location scores |
| `details.rating / rating_breakdown / ranking / sub_ratings (Tripadvisor)` | Tripadvisor ratings and ranking |

Every dataset item also carries `input` (the options used for that request), `request_id` (quote it to support), `billed` and `scraped_at`.

### How to scrape hotel details, photos and facilities

1. Open Hotel Details & Photos Scraper in Apify Console and go to the **Input** tab.
2. Pick **What to scrape**, then fill the list for that source: Booking.com URLs or slugs, Airbnb links or listing ids, Google Hotels property tokens, or Tripadvisor URLs, ids or names.
3. Adjust the options if needed. Dates accept an exact date (`2026-12-01`) or a relative one (`30 days` from today), so saved tasks and schedules never go stale.
4. Click **Start** and wait for the run to finish.
5. Download the results from the **Output** tab as JSON, CSV, Excel or HTML, or fetch them with the Apify API.

### Input

| Input | Name | What it does |
| --- | --- | --- |
| `mode` | What to scrape | The source and the kind of content. Each source has its own list of properties below; only the list for the selected source is used. |
| `bookingHotels` | Booking.com hotels | .....com URL country. |
| `bookingCountry` | Booking.com URL country | ..html`). Applies to slugs; a full URL brings its own. |
| `includeNearby`| Include Booking.com nearby places (details) | .com's own list of nearby landmarks, transit, airports, restaurants and beaches with walking and driving distances. |
|`airbnbListings` | Airbnb listings | ..com/rooms/34397368`) or the numeric listing id (`34397368`). |
| `airbnb_domain` | Airbnb site | Airbnb country site. It sets the language and the default currency of the record. |
| `currency` | Airbnb currency (listing) | Listing details only: currency for any money text in the record. Leave empty for the site's default. |
| `check_in` | Stay check-in (listing cancellation policy) | Listing details only: Airbnb states cancellation deadlines only for a given stay. |
| `check_out` | Stay check-out (listing cancellation policy) | .g. `32 days`). Give both dates or neither. |
| `googleProperties` | Google Hotels property tokens | .g. `ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ`). Get tokens from the Google Hotels Search Scraper results. |
| `maxPages` | Photo pages per property (Google photos) | Google Hotels photos only: how many gallery pages to fetch per property (1-20). |
| `photosPerPage` | Photos per page (Google photos) | Google Hotels photos only: photos per page (1-100). The price per page is the same. |
| `photoCategory` | Photo category (Google photos) | Google Hotels photos only: one photo tab. Leave empty for all photos. Use a category or a source, not both. |
| `photoSource` | Photo source (Google photos) | Google Hotels photos only: only visitors' photos or only the owner's. Leave empty for both. |
| `gl` | Google country | Two-letter Google country for the request. |
| `hl` | Google language | .g. `en`, `fr`. |
| `tripadvisorPlaces` | Tripadvisor places | .g. `208453`), or a place name such as `Moxy Boston Downtown` (add a City to narrow names). |
| `tripadvisorCity` | City (for place names) | With place names only: the city, used to pick the right place when several share the name. |

### Input example

This is the default input; running the Actor without changes uses it.

```json
{
  "mode": "booking-details",
  "bookingHotels": [
    "newbury-guest-house"
  ],
  "bookingCountry": "us",
  "airbnbListings": [
    "34397368"
  ],
  "airbnb_domain": "airbnb.com",
  "googleProperties": [
    "ChUI6IWohK-tzZFIGgkvbS8wODZjXzUQAQ"
  ],
  "maxPages": 1,
  "photosPerPage": 50,
  "gl": "us",
  "hl": "en",
  "tripadvisorPlaces": [
    "17768161"
  ],
  "includeErrors": true,
  "maxConcurrency": 3,
  "maxRetries": 2
}
```

### Output example

One dataset item per request (trimmed here; real items contain all the fields):

```json
{
  "mode": "booking-details",
  "input": {
    "pagename": "newbury-guest-house",
    "country": "us"
  },
  "accessibility": {
    "isGeneralAccessible": true,
    "isPrivateBathroomInAllRooms": true,
    "isWheelChairAccessible": false
  },
  "accommodation_type_id": 204,
  "address": {
    "city": "Boston",
    "country_code": "US",
    "formatted": "261 Newbury Street, Back Bay, Boston, MA 02116, United States",
    "postal_code": "MA 02116",
    "region": "Massachusetts",
    "short": "261 Newbury Street, Back Bay, Boston, MA"
  },
  "breadcrumbs": [
    {
      "dest_id": "224",
      "dest_type": "country",
      "name": "United States",
      "type": "country"
    },
    {
      "dest_id": "2442",
      "dest_type": "region",
      "name": "Massachusetts (MA)",
      "type": "province"
    }
  ],
  "check_in": {
    "from": "3:00 PM"
  },
  "check_out": {
    "until": "12:00 PM"
  },
  "country": "us",
  "description": "This historic guest house is located in Boston's Back Bay district, only 2 minutes' walk from the Hynes Convention Center and various shops along Newbury Str...",
  "gps_coordinates": {
    "latitude": 42.3495598618534,
    "longitude": -71.08322203159332
  },
  "hotel_currency": "USD",
  "hotel_id": 236725,
  "house_rules": {
    "accepted_cards": [
      "American Express",
      "Visa"
    ],
    "cash_status": "PATP_PROPERTY_CASH_STATUS_UNKNOWN",
    "check_in": {
      "from": "3:00 PM"
    },
    "check_in_requirements": "Guests are required to show a photo ID and credit card at check-in.",
    "check_out": {
      "until": "12:00 PM"
    },
    "children": {
      "allowed": true,
      "cribs": false,
      "extra_beds": false,
      "min_age": 0,
      "rules": [
        {
          "age_from": 0,
          "age_to": 14,
          "price": "US$0",
          "price_mode": "PER_NIGHT",
          "price_type": "FREE",
          "type": "EXISTING_BED"
        }
      ]
    },
    "fine_print": [
      "Guests are required to show a photo ID and credit card upon check-in. Please note that all Special Requests are subject to availability and additional charge...",
      "Quiet hours are between 23:00:00 and 07:00:00."
    ],
    "group_limit_rooms": 3,
    "group_policy": "When booking more than 3 rooms, different policies and additional fees may apply.",
    "min_check_in_age": 21,
    "pets": {
      "allowed": "NO",
      "charge_mode": "NOT_APPLICABLE"
    },
    "quiet_hours": {
      "from": "11:00 PM",
      "until": "7:00 AM"
    }
  },
  "is_newly_opened": false,
  "languages_spoken": [
    "en",
    "es"
  ],
  "meals": [
    {
      "hours": {
        "from": "07:30",
        "until": "09:30"
      },
      "type": "BREAKFAST"
    }
  ],
  "name": "Newbury Guest House",
  "nearby": [
    {
      "best_commute": {
        "distance_m": 4566,
        "duration": "54 min",
        "mode": "ByFoot"
      },
      "category": "beaches",
      "driving": {
        "distance_m": 5129,
        "duration": "7 min"
      },
      "gps_coordinates": {
        "latitude": 42.32886704,
        "longitude": -71.04606142
      },
      "kind": "Beaches",
      "name": "Carson Beach",
      "straight_line_km": 3.803,
      "walking": {
        "distance_m": 4566,
        "duration": "54 min"
      }
    },
    {
      "best_commute": {
        "distance_m": 4941,
        "duration": "59 min",
        "mode": "ByFoot"
      },
      "category": "beaches",
      "driving": {
        "distance_m": 5693,
        "duration": "8 min"
      },
      "gps_coordinates": {
        "latitude": 42.32886559,
        "longitude": -71.03634792
      },
      "kind": "Beaches",
      "name": "M Street Beach",
      "straight_line_km": 4.28,
      "walking": {
        "distance_m": 4941,
        "duration": "59 min"
      }
    }
  ],
  "observed_at": "2026-10-03T05:20:00.000Z",
  "pagename": "newbury-guest-house",
  "property_type": "HOTEL",
  "review_count": 523,
  "review_scale": 10,
  "review_score": 9.1,
  "source": "booking",
  "star_rating": 3,
  "star_rating_kind": "STARS",
  "ufi": 20061717,
  "url": "https://www.booking.com/hotel/us/newbury-guest-house.html",
  "request_id": "req_3f9c0d6e2b8a4c1f9e7d5b3a1c0e8f6d",
  "billed": true,
  "scraped_at": "2026-10-01T14:03:27.512Z"
}
```

A request that fails is saved with an `error` message instead (turn off **Include failed requests** to skip those). Failed requests are never charged.

### How much does it cost to scrape hotel details, photos and facilities?

This Actor uses **pay-per-event** pricing: you pay for successful requests, not for compute time.

| Event | Charged when | Price | Per 1,000 |
| --- | --- | --- | --- |
| `property-content` | One property's Booking.com photos or review summary, Airbnb listing or photos, or Google Hotels photos or nearby places (one page of Google photos). Answers with no photos, no places or no review score are free. | $0.005 | $5.00 |
| `booking-page` | One Booking.com hotel's details or facilities. These take longer to collect than the other content requests, so they are priced apart. | $0.009 | $9.00 |
| `tripadvisor-details` | One Tripadvisor hotel, restaurant or attraction: address, coordinates, rating breakdown, ranking, sub-ratings, contact and photos. | $0.003 | $3.00 |

**What a real run costs:**

- 100 requests: **$0.90**
- 1,000 requests: **$9.00**
- 10,000 requests: **$90.00**

Apify's $5 of free monthly usage covers about **555** `booking-page` events.

- Failed requests (errors, invalid input, a site refusing after retries) are **free**.
- Requests where the source returns nothing at all (no results, nothing priced) are saved but **not charged**.
- Set **Maximum cost per run** when you start a run and the Actor stops cleanly before going over it.

### Run it on a schedule

Use Apify **Schedules** to repeat a run hourly, daily or weekly and compare results over time, and **webhooks** or the **Integrations** tab to push new results to Make, Zapier, n8n, Google Sheets, Slack or your own warehouse.

### Use it with AI agents

Results are structured JSON, so they are easy to feed to a model. AI agents such as Claude can run this Actor and read its results through the [Apify MCP server](https://mcp.apify.com).

### FAQ

#### Do I need an account on the site, or an API key?

No. The Actor is ready to run as is, and you only pay the per-event prices above.

#### Does this Actor return prices or availability?

No. It returns property content: details, photos, facilities, review scores and nearby places. For prices use the rate scrapers listed below.

#### How do I identify a property?

Each source uses its own id: a Booking.com URL or slug, an Airbnb listing link or id, a Google Hotels property token, or a Tripadvisor URL, location id or name. Only the list for the selected source is used.

#### Why does the Airbnb cancellation policy say needs_dates?

Airbnb states cancellation deadlines only for a given stay. Set the stay check-in and check-out to get the refund milestones.

#### How many Google Hotels photos do I get?

Up to 100 per page; set *Photo pages per property* to page through the gallery. Each page is charged separately.

#### Is there a review histogram for Booking.com?

Booking.com does not publish a 1-10 histogram; the review summary returns the overall score, category scores and scores per traveller type instead.

#### Is it legal to scrape hotel details, photos and facilities?

The Actor collects publicly available information that anyone can see without logging in. You are responsible for how you use the results: respect the source site's terms, copyright and privacy law (such as GDPR) and do not collect personal data without a lawful basis. If in doubt, ask a lawyer.

#### What happens when a request is blocked or rate-limited?

Temporary errors are retried automatically. If a request still fails it is saved with the error message and not charged, and the rest of the batch keeps going. A run only fails when every request failed.

#### Why did a request return an error?

Read the `error` field: it says what was wrong with the input, for example a malformed date or an unknown id. Fix it and run again; failed requests cost nothing.

#### How many requests can I run at once?

Any number per run. The Actor sends up to 3 requests in parallel by default (change it under **Run options**); larger batches simply take longer.

### Use it from your code

Call the Actor from any language through the [Apify API](https://docs.apify.com/api/v2). With the JavaScript client (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('scrapercompany/hotel-details-scraper').call({
    "mode": "booking-details",
    "bookingHotels": [
        "newbury-guest-house"
    ]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

With Python (`pip install apify-client`):

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("scrapercompany/hotel-details-scraper").call(run_input={
    "mode": "booking-details",
    "bookingHotels": ["newbury-guest-house"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Related scrapers

- [Hotel Reviews Scraper](https://apify.com/scrapercompany/hotel-reviews-scraper): full guest reviews from Google, Booking.com, Expedia and Tripadvisor
- [Booking.com Hotel Rates Scraper](https://apify.com/scrapercompany/booking-hotel-rates-scraper): room prices for a stay on Booking.com
- [Airbnb Search Scraper](https://apify.com/scrapercompany/airbnb-search-scraper): find Airbnb listings and their ids
- [Google Hotels Search Scraper](https://apify.com/scrapercompany/google-hotels-search-scraper): find hotels and their Google property tokens

### Support

Questions, a field you need, or a site that stopped working? Open an issue on the **Issues** tab. Include the `request_id` from the dataset item so we can trace the request.

# Changelog

This Actor's version history is a separate document: https://apify.com/scrapercompany/hotel-details-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

The source and the kind of content. Each source has its own list of properties below; only the list for the selected source is used.

## `bookingHotels` (type: `array`):

One hotel per line: a Booking.com property URL (<code>https://www.booking.com/hotel/gb/the-savoy.html</code>), or the slug from that URL (<code>the-savoy</code>) with its <i>Booking.com URL country</i>.

## `bookingCountry` (type: `string`):

Two-letter segment before the slug in the Booking.com URL (<code>gb</code> in <code>/hotel/gb/the-savoy.html</code>). Applies to slugs; a full URL brings its own.

## `includeNearby` (type: `boolean`):

Property details only: also return Booking.com's own list of nearby landmarks, transit, airports, restaurants and beaches with walking and driving distances. Same price.

## `airbnbListings` (type: `array`):

One listing per line: an Airbnb listing link (<code>https://www.airbnb.com/rooms/34397368</code>) or the numeric listing id (<code>34397368</code>).

## `airbnb_domain` (type: `string`):

Airbnb country site. It sets the language and the default currency of the record.

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

Listing details only: currency for any money text in the record. Leave empty for the site's default.

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

Listing details only: Airbnb states cancellation deadlines only for a given stay. Give a check-in and check-out (<code>YYYY-MM-DD</code> or relative, e.g. <code>30 days</code>) to get the refund milestones; leave both empty to skip.

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

Listing details only: the stay's check-out date (<code>YYYY-MM-DD</code> or relative, e.g. <code>32 days</code>). Give both dates or neither.

## `googleProperties` (type: `array`):

One Google Hotels property token per line (starts with <code>Ch</code>, e.g. <code>ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ</code>). Get tokens from the Google Hotels Search Scraper results.

## `maxPages` (type: `integer`):

Google Hotels photos only: how many gallery pages to fetch per property (1-20). Each page is a separate request and is charged separately; paging stops at the last page.

## `photosPerPage` (type: `integer`):

Google Hotels photos only: photos per page (1-100). The price per page is the same.

## `photoCategory` (type: `string`):

Google Hotels photos only: one photo tab. Leave empty for all photos. Use a category or a source, not both.

## `photoSource` (type: `string`):

Google Hotels photos only: only visitors' photos or only the owner's. Leave empty for both.

## `gl` (type: `string`):

Two-letter Google country for the request.

## `hl` (type: `string`):

Language for captions and labels, e.g. <code>en</code>, <code>fr</code>.

## `tripadvisorPlaces` (type: `array`):

One hotel, restaurant or attraction per line: a Tripadvisor page URL, its numeric location id (the digits after <code>-d</code> in the URL, e.g. <code>208453</code>), or a place name such as <code>Moxy Boston Downtown</code> (add a <i>City</i> to narrow names).

## `tripadvisorCity` (type: `string`):

With place names only: the city, used to pick the right place when several share the name.

## `customRequests` (type: `array`):

Optional list of JSON objects, one request each, using the field names shown above. Each object is merged over the options above, so you only need to give what differs. Use <code>"mode"</code> to pick the mode per object, with that source's id field (<code>pagename</code> or <code>url</code>, <code>listing_id</code>, <code>property_token</code>, <code>location_id</code>). Example: <code>{"mode":"booking-photos","url":"https://www.booking.com/hotel/gb/the-savoy.html"}</code>

## `includeErrors` (type: `boolean`):

When on, a request that fails (for example an unknown property id) is saved as a dataset item with an <code>error</code> message so you can see what went wrong. Failed requests are never charged.

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

How many requests run at the same time (1-8). Parallel runs share one limit, so extra requests wait for a free slot instead of failing.

## `maxRetries` (type: `integer`):

How many times a request that failed for a temporary reason is tried again. Invalid input is never retried.

## Actor input object example

```json
{
  "mode": "booking-details",
  "bookingHotels": [
    "newbury-guest-house"
  ],
  "bookingCountry": "us",
  "includeNearby": false,
  "airbnbListings": [
    "34397368"
  ],
  "airbnb_domain": "airbnb.com",
  "googleProperties": [
    "ChUI6IWohK-tzZFIGgkvbS8wODZjXzUQAQ"
  ],
  "maxPages": 1,
  "photosPerPage": 50,
  "gl": "us",
  "hl": "en",
  "tripadvisorPlaces": [
    "17768161"
  ],
  "includeErrors": true,
  "maxConcurrency": 3,
  "maxRetries": 2
}
```

# Actor output Schema

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

One dataset item per request.

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

Counts of succeeded, failed, skipped and charged requests.

# 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 = {
    "bookingHotels": [
        "newbury-guest-house"
    ],
    "airbnbListings": [
        "34397368"
    ],
    "googleProperties": [
        "ChUI6IWohK-tzZFIGgkvbS8wODZjXzUQAQ"
    ],
    "tripadvisorPlaces": [
        "17768161"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapercompany/hotel-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 = {
    "bookingHotels": ["newbury-guest-house"],
    "airbnbListings": ["34397368"],
    "googleProperties": ["ChUI6IWohK-tzZFIGgkvbS8wODZjXzUQAQ"],
    "tripadvisorPlaces": ["17768161"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapercompany/hotel-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 '{
  "bookingHotels": [
    "newbury-guest-house"
  ],
  "airbnbListings": [
    "34397368"
  ],
  "googleProperties": [
    "ChUI6IWohK-tzZFIGgkvbS8wODZjXzUQAQ"
  ],
  "tripadvisorPlaces": [
    "17768161"
  ]
}' |
apify call scrapercompany/hotel-details-scraper --silent --output-dataset

```

## MCP server setup

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