# Yandex Maps Reviews Scraper (`khadinakbar/yandex-maps-reviews-scraper`) Actor

Scrape public Yandex Maps (Яндекс Карты) place reviews by org URL or business ID. Returns author, rating, text, date, photos, and business replies. Cookieless HTTP. MCP-ready. Do not use for place search — see yandex-maps-scraper.

- **URL**: https://apify.com/khadinakbar/yandex-maps-reviews-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Travel, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 review scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Yandex Maps Reviews Scraper

Scrape **public reviews** from Yandex Maps (Яндекс Карты) organization pages. Paste place URLs or numeric org IDs and get one dataset row per review: author, star rating, full text, date, photos, likes/dislikes, and business replies — with place name, address, and aggregate rating on every row.

Built for reputation teams, local SEO agencies, and AI agents covering **Russia, Turkey, Kazakhstan, and the CIS**, where Yandex Maps is a primary local-review surface.

### Best fit

Use this Actor when you already have Yandex Maps place URLs or org IDs and need public review text plus ratings in a flat, billable dataset for MCP, CRM, or spreadsheet workflows. It works well for monitoring customer feedback on known places, exporting reviews for sentiment analysis across a chain, and feeding agent pipelines with place context on every row.

Pair it with [Yandex Maps Scraper](https://apify.com/khadinakbar/yandex-maps-scraper) when you still need place search, phones, or websites before review export. For Google Maps review workflows, continue with [Google Maps Reviews Scraper](https://apify.com/khadinakbar/google-maps-reviews-scraper).

### Practical scenario

A restaurant group pastes a Tanuki reviews URL, sets `maxReviewsPerPlace` to `50`, and keeps Residential proxy on. The run returns up to 50 public reviews with author, rating, text, optional photos, and owner replies. Places that resolve with zero matching public reviews finish `SUCCEEDED` / `VALID_EMPTY` and skip `review-scraped` charges, then the team exports the dataset for ops follow-up.

### Quick start input

```json
{
  "startUrls": [
    { "url": "https://yandex.com/maps/org/tanuki/1036014863/reviews/" }
  ],
  "maxReviewsPerPlace": 5,
  "maxPlaces": 1,
  "reviewSort": "relevance",
  "includePhotos": true
}
```

`businessIds: ["1036014863"]` works the same when you already have org IDs from a place scrape.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `startUrls` | array | Yandex Maps org / reviews URLs (`yandex.ru`, `yandex.com`, `maps.yandex.ru`, …). |
| `businessIds` | array | Numeric organization IDs. Deduped with URLs. |
| `maxReviewsPerPlace` | integer | Cap per place (default 50, max 2000). Prefill 5 for cheap tests. |
| `maxPlaces` | integer | Cap on unique places after dedupe (default 50). |
| `reviewSort` | enum | `relevance` (Yandex order) or local re-sort: `newest` / `highest` / `lowest`. |
| `minRating` / `maxRating` | integer | Optional 1–5 filters after fetch (`0` = off). |
| `includePhotos` | boolean | Attach public photo URLs (default true). |
| `language` | enum | Default host for bare IDs: `en` / `ru` / `tr`. |
| `proxyConfiguration` | object | Optional Apify Proxy. Prefill uses Residential. |

### What data you receive

One dataset item is one public review.

| Field | Meaning |
|---|---|
| `reviewId`, `authorName`, `rating`, `text` | Core public review content. |
| `updatedTime`, `photoUrls`, `businessReply` | Freshness, media, and owner reply when present. |
| `placeName`, `placeUrl`, `placeAddress`, `placeRating`, `businessId` | Place context on every row. |
| `scrapedAt` | Collection time for provenance. |

```json
{
  "reviewId": "yqWNI5tPzbe4mbu_eZwQ5kVJnnEGSB_x",
  "authorName": "Елизавета",
  "rating": 5,
  "text": "Недавно посетил ресторан «Тануки»…",
  "updatedTime": "2026-03-18T12:55:09.331Z",
  "businessReply": "Здравствуйте, Елизавета…",
  "photoUrls": ["https://avatars.mds.yandex.net/.../orig"],
  "placeName": "Тануки",
  "placeUrl": "https://yandex.com/maps/org/tanuki/1036014863/",
  "placeAddress": "Moscow, Bolshoy Zlatoustinsky Lane, 1с1",
  "placeRating": 5,
  "businessId": "1036014863",
  "scrapedAt": "2026-09-10T12:00:00.000Z"
}
```

`OUTPUT` and `RUN_SUMMARY` in the default key-value store hold `outcome`, `itemsPushed`, `placesProcessed`, and `chargedEventCounts`.

### Pricing

This Actor uses **Pay per event** plus **platform usage**. Event prices below are the launch defaults; treat the live Pricing tab on the Actor page as the current source of truth, because platform usage (compute and proxy) is billed to the caller in addition to named events.

| Event | Price |
|---|---|
| `apify-actor-start` | $0.00005 |
| `review-scraped` (primary) | $0.004 per saved review |

Empty inputs and places with zero matching public reviews skip the `review-scraped` event. Worked example: `maxReviewsPerPlace: 5` on one place ≈ `$0.00005` start + `5 × $0.004` = about `$0.02005` in named events, plus platform usage.

### Best results

Provide complete org or reviews URLs, or numeric org IDs from a prior place discovery run. Start with `maxReviewsPerPlace` at 5–20 while validating a new market, then schedule larger caps once Residential proxy is confirmed for your target region. Keep `includePhotos` on when media evidence matters; turn it off for lean text-only exports. Sort modes other than `relevance` re-order the fetched window locally for the current page set — provide a higher `maxReviewsPerPlace` when you need a wider window before local ranking.

### How it works

Yandex Maps server-renders review pages with an embedded JSON state blob (about fifty reviews per `?page=N`). This Actor uses **Impit Chrome-TLS HTTP** (cookieless) to fetch those pages, parse `reviewResults`, and paginate until `maxReviewsPerPlace`.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~yandex-maps-reviews-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://yandex.com/maps/org/tanuki/1036014863/reviews/"}],"maxReviewsPerPlace":5}'
```

### Use with AI agents through Apify MCP

> Scrape the latest 20 public Yandex Maps reviews for org 1036014863. Return authorName, rating, text, updatedTime, and businessReply. Read the dataset plus OUTPUT for outcome and provenance, then confirm cost on the Pricing tab.

Connect via <https://mcp.apify.com>. Cost signal: about `$0.004` per saved review plus platform usage. Confirm current event prices on the Actor Pricing tab before large runs. Scope stays public review rows; pagination is controlled by `maxReviewsPerPlace`.

### Outcomes

| Outcome | Meaning |
|---|---|
| `COMPLETE` | At least one review saved. |
| `PARTIAL` | Some places produced rows; others were empty or hit a charge cap. |
| `VALID_EMPTY` | Places resolved but no public reviews matched filters. |
| `INVALID_INPUT` | No usable URLs or IDs were provided. |
| `UPSTREAM_FAILED` | Upstream transport or captcha with zero useful reviews. |

### Legal & responsible use

Use this Actor for **public** Yandex Maps review content you are authorized to process under applicable laws and site terms. Respect local privacy rules (including personal names in reviews) and rate limits. Keep use cases to legitimate reputation, research, and analytics workflows. Yandex is a trademark of its owner. This independent Actor is not affiliated with, associated with, or endorsed by Yandex.

### Builder's note

I found that plain `got-scraping` from some environments returned SmartCaptcha shell HTML instead of the SSR review state. Switching to Impit with `browser: 'chrome'` restored the full embedded JSON and reliable `?page=N` pagination. That Chrome-TLS route plus optional Residential proxy is the production path I kept after live probes against popular Moscow orgs.

# Actor input Schema

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

Yandex Maps organization URLs to scrape reviews from. Accepts https://yandex.com/maps/org/{name}/{id}/reviews/ and maps.yandex.ru org links. Up to 50 unique places per run after dedupe. NOT a place-search query — for discovery use yandex-maps-scraper.

## `businessIds` (type: `array`):

Numeric Yandex organization IDs when you already have them (for example 1036014863). Combined with startUrls and deduped by ID. Use this for batch jobs from yandex-maps-scraper output. Invalid non-numeric values are skipped.

## `maxReviewsPerPlace` (type: `integer`):

Upper bound of reviews to save per place. Defaults to 50 (one SSR page). Prefill 5 keeps quality tests fast and cheap. Maximum 2000. Each saved review costs $0.004.

## `maxPlaces` (type: `integer`):

Hard cap on unique places processed after URL/ID dedupe. Defaults to 50. Lower this to bound spend when pasting long URL lists.

## `reviewSort` (type: `string`):

Preferred review order. Yandex SSR pages are relevance-ordered; newest/highest/lowest re-sort the fetched window locally by updatedTime or rating. Prefer relevance for faithful Yandex order.

## `minRating` (type: `integer`):

Keep only reviews with this star rating or higher (1–5). Leave at 0 to include all ratings. Applied after fetch; may reduce billed rows below maxReviewsPerPlace.

## `maxRating` (type: `integer`):

Keep only reviews with this star rating or lower (1–5). Leave at 0 to include all ratings. Useful for complaint mining (set maxRating to 2).

## `includePhotos` (type: `boolean`):

When true, attach public review photo URL templates (size resolved to orig). Defaults to true. Set false for smaller rows when you only need text and ratings.

## `language` (type: `string`):

Chooses the default Yandex host for bare business IDs: en→yandex.com, ru→yandex.ru, tr→yandex.com.tr. Place URLs keep their own host. Does not translate review text.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy. Direct Impit Chrome-TLS usually works. Enable Apify Residential (RU preferred) if SmartCaptcha or HTTP 403 appears in cloud runs. This is not a Yandex account session.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://yandex.ru/maps/org/tanuki/1036014863/"
    }
  ],
  "businessIds": [
    "1036014863"
  ],
  "maxReviewsPerPlace": 5,
  "maxPlaces": 1,
  "reviewSort": "relevance",
  "minRating": 0,
  "maxRating": 0,
  "includePhotos": true,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per public review with place context.

## `output` (type: `string`):

Final outcome, itemsPushed, placesProcessed, and chargedEventCounts.

## `runSummary` (type: `string`):

Per-place outcomes, retries, blocked fetches, and billing counters.

# 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": [
        {
            "url": "https://yandex.com/maps/org/tanuki/1036014863/reviews/"
        }
    ],
    "maxReviewsPerPlace": 5,
    "maxPlaces": 1,
    "reviewSort": "relevance",
    "includePhotos": true,
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/yandex-maps-reviews-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": [{ "url": "https://yandex.com/maps/org/tanuki/1036014863/reviews/" }],
    "maxReviewsPerPlace": 5,
    "maxPlaces": 1,
    "reviewSort": "relevance",
    "includePhotos": True,
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/yandex-maps-reviews-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": [
    {
      "url": "https://yandex.com/maps/org/tanuki/1036014863/reviews/"
    }
  ],
  "maxReviewsPerPlace": 5,
  "maxPlaces": 1,
  "reviewSort": "relevance",
  "includePhotos": true,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call khadinakbar/yandex-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/yandex-maps-reviews-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/Qoc2aqxw6DLBUAiPh/builds/U8OeOA7hbbJeQrFAM/openapi.json
