# Ostrovok Hotels Search Scraper (`stealth_mode/ostrovok-hotels-search-scraper`) Actor

Scrape hotel search results from Ostrovok.ru — Russia's leading booking platform. Collect names, ratings, prices, room groups, geo-data, and 35+ fields per property. Perfect for travel analysts, price monitors, and OTA researchers.

- **URL**: https://apify.com/stealth\_mode/ostrovok-hotels-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Ostrovok.ru Hotel Search Scraper: Extract Hotel Listings & Rates
---

### What Is Ostrovok.ru?

Ostrovok.ru is one of Russia's largest online travel agencies (OTAs), offering hotel and accommodation bookings across Russia and the CIS region. Its search results pages aggregate rich property data including pricing, ratings, amenities, and availability — making it a valuable source for competitive analysis, market research, and travel tech applications.

Manually collecting this data across hundreds of search pages is impractical. The **Ostrovok.ru Hotel Search Scraper** automates extraction from search result URLs, returning structured records ready for analysis.

---

### Overview

The **Ostrovok Hotel Scraper** is built for anyone working with Russian hospitality market data:

- **Travel analysts** monitoring hotel supply and pricing by city or region
- **OTA developers** aggregating inventory data from Russian platforms
- **Revenue managers** benchmarking competitors' rates and star ratings
- **Researchers** studying accommodation density, metro proximity, and geo-distribution

The scraper handles paginated search URLs, respects item limits, and continues gracefully through URL failures — making it reliable for large-scale runs.

---

### Input Format

The scraper accepts a simple JSON configuration:

```json
{
  "ignore_url_failures": true,
  "max_items_per_url": 200,
  "urls": [
    "https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"
  ]
}
````

#### Field Descriptions

| Field | Type | Description |
|---|---|---|
| `urls` | `array` of strings | Search result page URLs from Ostrovok.ru. Each URL should be a hotel listing/search page. You can add multiple URLs one by one or paste a bulk list. Example format includes destination, dates, guest count, and page number as query parameters. |
| `max_items_per_url` | integer | Maximum number of hotel records to extract per URL. Default: `20`. Set higher (e.g., `200`) for full-page collection. |
| `ignore_url_failures` | boolean | If `true`, the scraper continues running when a URL fails instead of stopping the entire run. Recommended: `true` for multi-URL batches. |

> **Tip:** To collect multiple pages, add each paginated URL separately (e.g., `&page=1`, `&page=2`, ...). Include your desired check-in/check-out dates and guest count directly in the URL as Ostrovok encodes these into the search query.

***

### Output Format

#### Sample Record

```json
{
  "ostrovok_id": 0,
  "city": "Moscow",
  "address": "26A, 3rd Yamskogo Polya St., Moscow",
  "country": "Russia",
  "geoblock_v2": {
    "pois_nearby": [
      {
        "region_id": 965826134
      },
      {
        "region_id": 965829607
      },
      {
        "region_id": 965824124
      },
      {
        "region_id": 965826105
      },
      {
        "region_id": 965833530
      },
      {
        "region_id": 6001934
      },
      {
        "region_id": 965826250
      },
      {
        "region_id": 965824697
      },
      {
        "region_id": 965879047
      },
      {
        "region_id": 965833532
      },
      {
        "region_id": 965822744
      },
      {
        "region_id": 965848857
      },
      {
        "region_id": 965845988
      },
      {
        "region_id": 965845972
      }
    ],
    "neighbourhood_serp_filters": [
      {
        "region_id": 6297386
      },
      {
        "region_id": 965836214
      }
    ]
  },
  "images": [
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/60/55/605524622d640133c9fd003bf25395f5253db91b.jpeg",
      "relative_path": "/t/{size}/extranet/60/55/605524622d640133c9fd003bf25395f5253db91b.jpeg",
      "height": 2000,
      "width": 3000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/6d/65/6d657ef408c80c659c7a971efa8e255a2307f8dc.jpeg",
      "relative_path": "/t/{size}/extranet/6d/65/6d657ef408c80c659c7a971efa8e255a2307f8dc.jpeg",
      "height": 2000,
      "width": 3000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/6e/69/6e6970571b25dd79adc230c411ce83d72a083eda.jpeg",
      "relative_path": "/t/{size}/extranet/6e/69/6e6970571b25dd79adc230c411ce83d72a083eda.jpeg",
      "height": 2000,
      "width": 3000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/ff/18/ff18b7bdbc1692ba9abcea344d1f3b65f9fd99e0.JPEG",
      "relative_path": "/t/{size}/extranet/ff/18/ff18b7bdbc1692ba9abcea344d1f3b65f9fd99e0.JPEG",
      "height": 4942,
      "width": 4942
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/5e/07/5e0798ba4baa5ebe355eb0db3015a2bc68a6483e.JPEG",
      "relative_path": "/t/{size}/extranet/5e/07/5e0798ba4baa5ebe355eb0db3015a2bc68a6483e.JPEG",
      "height": 1335,
      "width": 2000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/8c/37/8c37a81303a51352d7c109744acb8993f039b675.JPEG",
      "relative_path": "/t/{size}/extranet/8c/37/8c37a81303a51352d7c109744acb8993f039b675.JPEG",
      "height": 1335,
      "width": 2000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/56/ba/56ba74273ee76ad8cc2b1733ff4d356b2a806702.JPEG",
      "relative_path": "/t/{size}/extranet/56/ba/56ba74273ee76ad8cc2b1733ff4d356b2a806702.JPEG",
      "height": 1333,
      "width": 2000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/0e/43/0e43e553b444c1d8aa7befd867ad0441b49b6272.jpeg",
      "relative_path": "/t/{size}/extranet/0e/43/0e43e553b444c1d8aa7befd867ad0441b49b6272.jpeg",
      "height": 2667,
      "width": 4000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/7c/b1/7cb170bb6eb6ad8eeee6ee8d39e40a7770e00419.jpeg",
      "relative_path": "/t/{size}/extranet/7c/b1/7cb170bb6eb6ad8eeee6ee8d39e40a7770e00419.jpeg",
      "height": 1250,
      "width": 2000
    },
    {
      "tmpl": "https://cdn.worldota.net/t/{size}/extranet/81/25/81250077a745db4d1831f3e9b9246ac7a948c905.JPEG",
      "relative_path": "/t/{size}/extranet/81/25/81250077a745db4d1831f3e9b9246ac7a948c905.JPEG",
      "height": 1335,
      "width": 2000
    }
  ],
  "is_priority": null,
  "kind": "Hotel",
  "lang": "en",
  "latitude": 55.78303,
  "longitude": 37.579353,
  "master_id": 7858838,
  "name": "Radisson Blu Belorusskaya Moskva Hotel",
  "name_en": "Radisson Blu Belorusskaya Moskva Hotel",
  "nearest_subways": [
    {
      "distance": 646,
      "name": "Belorusskaya (Koltsevaya)",
      "region_id": 965826134
    },
    {
      "distance": 665,
      "name": "Belorusskaya (Zamoskvoretskaya)",
      "region_id": 965829607
    },
    {
      "distance": 1224,
      "name": "Mendeleyevskaya",
      "region_id": 965826250
    }
  ],
  "awards": [],
  "otachain_id": 18,
  "otahotel_id": "redisson_belorusskaia_moskva",
  "rating": {
    "count": 601,
    "total": 8.7
  },
  "region_catalog_slug": "russia/moscow",
  "region_id": 2395,
  "region_name": "Moscow",
  "room_groups": [
    {
      "rg_hash": "3202",
      "room_group_id": 11,
      "name_struct": {
        "main_name": "Standard room"
      }
    },
    {
      "rg_hash": "3202302",
      "room_group_id": 90,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Standard Double room"
      }
    },
    {
      "rg_hash": "3202402",
      "room_group_id": 91,
      "name_struct": {
        "bedding_type": "twin beds",
        "main_name": "Standard Double room"
      }
    },
    {
      "rg_hash": "3502",
      "room_group_id": 12,
      "name_struct": {
        "main_name": "Superior room"
      }
    },
    {
      "rg_hash": "35020000005",
      "room_group_id": 18395748,
      "name_struct": {
        "main_name": "Superior room with city view"
      }
    },
    {
      "rg_hash": "3502302",
      "room_group_id": 123,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Superior Double room"
      }
    },
    {
      "rg_hash": "35023020005",
      "room_group_id": 20591204,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Superior Double room with city view"
      }
    },
    {
      "rg_hash": "3502402",
      "room_group_id": 124,
      "name_struct": {
        "bedding_type": "twin beds",
        "main_name": "Superior Double room"
      }
    },
    {
      "rg_hash": "3A02",
      "room_group_id": 13,
      "name_struct": {
        "main_name": "Premium room"
      }
    },
    {
      "rg_hash": "3A020000005",
      "room_group_id": 18395940,
      "name_struct": {
        "main_name": "Premium room with city view"
      }
    },
    {
      "rg_hash": "3A02302",
      "room_group_id": 159,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Premium Double room"
      }
    },
    {
      "rg_hash": "3A023020005",
      "room_group_id": 20591396,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Premium Double room with city view"
      }
    },
    {
      "rg_hash": "3A02402",
      "room_group_id": 160,
      "name_struct": {
        "bedding_type": "twin beds",
        "main_name": "Premium Double room"
      }
    },
    {
      "rg_hash": "3A024020005",
      "room_group_id": 20624164,
      "name_struct": {
        "bedding_type": "twin beds",
        "main_name": "Premium Double room with city view"
      }
    },
    {
      "rg_hash": "4002",
      "room_group_id": 33,
      "name_struct": {
        "main_name": "Junior Suite"
      }
    },
    {
      "rg_hash": "5002",
      "room_group_id": 32,
      "name_struct": {
        "main_name": "Suite"
      }
    },
    {
      "rg_hash": "5802",
      "room_group_id": 66,
      "name_struct": {
        "main_name": "Executive Suite"
      }
    },
    {
      "rg_hash": "5802302",
      "room_group_id": 202,
      "name_struct": {
        "bedding_type": "full double bed",
        "main_name": "Executive Double Suite"
      }
    },
    {
      "rg_hash": "5902",
      "room_group_id": 38,
      "name_struct": {
        "main_name": "Presidential Suite"
      }
    }
  ],
  "rooms_number": 264,
  "serp_filters": [
    "has_internet",
    "has_kids",
    "has_fitness",
    "has_meal",
    "has_disabled_support",
    "has_busyness",
    "has_spa",
    "air-conditioning",
    "has_pets",
    "has_smoking"
  ],
  "special_flags": [
    4,
    16
  ],
  "star_rating": 40,
  "ta_rating": {
    "num_reviews": 0,
    "rating": 0
  },
  "type": null,
  "region": {
    "locative_where": "Moscow",
    "locative_where_en": "Moscow",
    "is_beach_region": false,
    "is_ski_region": false
  },
  "search_region_center_distance": 3.8547397,
  "metro_nearby": true,
  "rating_total": 8.7,
  "is_guru_hotel": true,
  "has_secure_deposit": false,
  "is_superhost": false,
  "rates": [
    {
      "hash": "sr-019e6871-b1db-7d1c-b4cf-02c5c69e69f1",
      "shash": "s-4e875335-c9ba-5611-95d3-f393a5a079c1",
      "contract": "",
      "provider_id": 0,
      "hotel_id": "redisson_belorusskaia_moskva",
      "occupancy": 2,
      "loyalty": {
        "types": [
          {
            "name": "ostrovok_gurupoints_rub",
            "amount_total": "0",
            "currency_type": "dreams",
            "currency_code": "RUB",
            "spend_enabled": false,
            "spend_disabled_reason": "postpay"
          }
        ]
      },
      "payment_options": {
        "allowed_payment_types": [
          {
            "type": "hotel"
          }
        ],
        "payment_types": [
          {
            "type": "hotel",
            "is_need_cvc": true,
            "is_need_credit_card_data": true,
            "is_need_single_use_card": false,
            "amount": "8500.00",
            "currency_code": "RUB",
            "is_enabled": true,
            "is_enabled_reason": "b2c_default",
            "average_show_price_per_day": "8500.00",
            "show_amount": "8500.00",
            "show_currency_code": "RUB",
            "payment_gate_type": "",
            "pay_before": null,
            "perks": {},
            "cancellation_penalties": [
              {
                "amount_charge": 0,
                "amount_show": 0
              },
              {
                "amount_charge": 8500,
                "amount_show": 8500
              }
            ],
            "public_tracking": {
              "amount_rub": 8500,
              "amount_usd": 118.74,
              "amount_eur": 101.97
            }
          }
        ]
      },
      "cancellation_info": {
        "policies": [
          {
            "start_at": null,
            "end_at": "2026-05-29T21:00:00Z",
            "penalty": {
              "amount": "0.00",
              "currency_code": "RUB",
              "currency_rate_to_rub": "1"
            }
          },
          {
            "start_at": "2026-05-29T21:00:00Z",
            "end_at": null,
            "penalty": {
              "amount": "8500.00",
              "currency_code": "RUB",
              "percent": "100.00",
              "currency_rate_to_rub": "1"
            }
          }
        ],
        "free_cancellation_before": "2026-05-29T21:00:00Z"
      },
      "no_show": {
        "penalty": {
          "amount": "8500.00",
          "currency_code": "RUB",
          "night_count": 1,
          "percent": "100.00",
          "currency_rate_to_rub": "1"
        },
        "from_time": "12:00:00",
        "b2b_recommended_penalty": "0.00"
      },
      "sort_scores": {
        "rate": 0,
        "hotel": 0,
        "avail_score": 0,
        "good_hotel": false
      },
      "rooms": [
        {
          "room_name": "Standard room",
          "allotment": 34,
          "meal_data": {
            "meals": [
              {
                "value": "nomeal",
                "has_breakfast": false,
                "no_child_meal": true
              }
            ]
          },
          "room_data_trans": {
            "en": {
              "main_room_type": "Standard room",
              "main_name": "Standard room",
              "bathroom": "",
              "bedding_type": "",
              "misc_room_type": "",
              "beds": null
            }
          },
          "bedding_data": [
            "nobedding"
          ],
          "amenities_data": [
            "non-smoking"
          ],
          "rg_hash": "3202",
          "meal": [
            "nomeal"
          ],
          "serp_filters": [
            "has_bathroom",
            "has_internet"
          ],
          "size": 30
        }
      ],
      "room_name": "Standard room",
      "allotment": 34,
      "meal_data": {
        "meals": [
          {
            "value": "nomeal",
            "has_breakfast": false,
            "no_child_meal": true
          }
        ]
      },
      "room_data_trans": {
        "en": {
          "main_room_type": "Standard room",
          "main_name": "Standard room",
          "bathroom": "",
          "bedding_type": "",
          "misc_room_type": "",
          "beds": null
        }
      },
      "bedding_data": [
        "nobedding"
      ],
      "meal": [
        "nomeal"
      ],
      "serp_filters": [
        "has_bathroom",
        "has_internet"
      ],
      "trans": {
        "en": {
          "taxes": []
        }
      }
    }
  ],
  "marketing_badges": [
    {
      "rate_hash": "sr-019e6871-b1db-7d1c-b4cf-02c5c69e69f1",
      "discount": {
        "should_use": true,
        "percent": 10,
        "amount": -850,
        "payment_type": "hotel",
        "base_price": {
          "amount": 8500,
          "currency": "RUB"
        },
        "discount_price": {
          "amount": 7650,
          "currency": "RUB"
        },
        "discount_taxes": null
      }
    }
  ],
  "from_url": "https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"
}
```

Each hotel record contains 35+ fields organized across several categories:

#### Identity & Classification

| Field | Meaning |
|---|---|
| `Ostrovok ID` | Unique internal identifier for the property on Ostrovok |
| `Master ID` | Parent/master property ID (used for hotel groups or duplicates) |
| `OTA Hotel ID` | The hotel's ID in the OTA system |
| `OTA Chain ID` | Chain identifier if the property belongs to a hotel group |
| `Name` | Hotel name in the local language (Russian) |
| `Name EN` | English transliteration or translation of the hotel name |
| `Kind` | Property classification (e.g., hotel, hostel, apartment) |
| `Type` | Accommodation type descriptor |
| `Star Rating` | Official star rating (1–5) |
| `Is Priority` | Whether the property has priority placement in search results |
| `Is Guru Hotel` | Ostrovok's "Guru" quality badge flag |
| `Is Superhost` | Superhost status flag (applicable for some property types) |

#### Location & Geography

| Field | Meaning |
|---|---|
| `City` | City where the property is located |
| `Address` | Full street address |
| `Country` | Country of the property |
| `Latitude` | Geographic latitude coordinate |
| `Longitude` | Geographic longitude coordinate |
| `Region` | Region object with metadata |
| `Region ID` | Internal region identifier |
| `Region Name` | Name of the region/district |
| `Region Catalog Slug` | URL-friendly region identifier |
| `Nearest Subways` | List of nearby metro/subway stations with distance |
| `Metro Nearby` | Boolean or summary flag for metro accessibility |
| `Search Region Center Distance` | Distance from the center of the searched region (useful for sorting by centrality) |
| `Displayed Location` | Human-readable location label shown in search results |
| `Geoblock V2` | Geo-restriction metadata for the property |

#### Ratings & Reviews

| Field | Meaning |
|---|---|
| `Rating` | Ostrovok guest rating score |
| `Rating Total` | Total number of reviews contributing to the rating |
| `TA Rating` | TripAdvisor rating, if available |
| `Awards` | Any awards or recognition the property has received |

#### Pricing & Availability

| Field | Meaning |
|---|---|
| `Rates` | Available rate plans including price, meal plan, cancellation policy, and room type |
| `Room Groups` | Grouped room types available for the property |
| `Rooms Number` | Total number of rooms in the property |
| `Has Secure Deposit` | Whether the property requires a security deposit |

#### Media & Presentation

| Field | Meaning |
|---|---|
| `Images` | Array of property image URLs |
| `Language` | Language of the listing content |
| `Marketing Badges` | Promotional badges shown in search (e.g., "Great Deal", "Popular") |
| `Special Flags` | Internal flags for special conditions or promotions |
| `SERP Filters` | Filter tags associated with the property in search results |

***

### How to Use

1. **Build your search URL** — Go to Ostrovok.ru, search for your target city/dates/guests, then copy the results page URL.
2. **Configure input** — Paste one or more URLs into the `urls` array. Adjust `max_items_per_url` based on how many results you expect per page (typically up to 20–30 per page on Ostrovok).
3. **Enable failure tolerance** — Set `ignore_url_failures: true` for multi-URL runs.
4. **Run and export** — Start the scraper and download results as JSON or CSV.

**Best practices:**

- Include explicit pagination in URLs (`&page=1`, `&page=2`) rather than relying on automatic pagination.
- Always include dates and guest count in the URL — Ostrovok requires these parameters to return rate data.
- For city-wide collection, vary the `q` parameter across neighborhoods or districts.

**Common issues:**

- No rates returned → check that dates and guest count are present in the URL.
- Empty results → verify the URL returns results in a regular browser session first.

***

### Use Cases & Business Value

- **Price monitoring:** Track nightly rates across Moscow, St. Petersburg, or other cities over time
- **Market sizing:** Count active hotel inventory by star rating, district, or type
- **Competitive benchmarking:** Compare your property's rating and pricing against nearby alternatives
- **Travel app development:** Populate accommodation databases with structured Russian OTA data
- **Academic research:** Study urban accommodation distribution and metro accessibility patterns

***

### Conclusion

The **Ostrovok.ru Hotel Search Scraper** turns Russia's leading booking platform into a structured data source — no manual browsing, no copy-pasting. With 35+ fields covering location, pricing, ratings, and availability, it delivers the depth needed for serious travel market analysis. Configure your search URLs, run the scraper, and get actionable hotel data in minutes.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the hotels list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/ostrovok-hotels-search-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 = {
    "urls": ["https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/ostrovok-hotels-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://ostrovok.ru/hotel/russia/moscow/?q=2395&dates=30.05.2026-31.05.2026&guests=2&search=yes&page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/ostrovok-hotels-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/ostrovok-hotels-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Ostrovok Hotels Search Scraper",
        "description": "Scrape hotel search results from Ostrovok.ru — Russia's leading booking platform. Collect names, ratings, prices, room groups, geo-data, and 35+ fields per property. Perfect for travel analysts, price monitors, and OTA researchers.",
        "version": "0.0",
        "x-build-id": "UQsCTKYhOdb0pxxIU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~ostrovok-hotels-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-ostrovok-hotels-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~ostrovok-hotels-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-ostrovok-hotels-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~ostrovok-hotels-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-ostrovok-hotels-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the hotels list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the hotels list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
