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

Collect customer reviews for any business on Yandex Maps; star rating, full text, date, reviewer name and the owner's public reply. Watch your own locations, benchmark how fast competitors answer, or search a category in a city and pull the reviews for every business it finds.

- **URL**: https://apify.com/apt\_marble/yandex-maps-reviews-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 review collecteds

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

## Yandex Maps Reviews Scraper

Collect customer reviews for any business listed on Yandex Maps — the star
rating, the full review text, the date it was published, the reviewer's public
display name and status, how many people found it useful, and the business
owner's public reply. Point it at one location or at a hundred, or search for a
category in a city and let it find the businesses for you. Built for reputation
teams, agencies, franchise operators and anyone who needs to know what customers
in Russia and the CIS are saying — and how well businesses answer them.

### What you can do with it

- **Monitor your own locations.** Run it on a schedule and get every new review
  for every branch in one table, with the date and the star rating.
- **Benchmark reply performance.** Every row says whether the owner answered,
  what they wrote and when — so you can compare your reply rate and reply speed
  against direct competitors.
- **Survey a whole category.** Search for "dentist" or "coffee" in a city and
  collect reviews for every business the search finds, in one run.
- **Feed a dashboard or a sentiment model.** Dated, rated, full-text reviews in
  a clean table, ready for analysis or for a large language model.
- **Investigate a rating drop.** Pull the recent reviews for one location and
  read exactly what changed.
- **Prepare a due-diligence or market-entry report** on how well served, and how
  well regarded, an area's businesses are.

### What you get

One row per review. An abridged example:

```json
{
  "orgId": "115736401897",
  "orgName": "Галки",
  "orgUrl": "https://yandex.com/maps/org/115736401897/",
  "orgAddress": "Москва, Страстной бульвар, 4, стр. 3",
  "orgCategory": "Ресторан",
  "orgRating": 4.9,
  "orgReviewCount": 5110,
  "reviewId": "yoggtVVpkXurP2fNfyJKWOaMBjMeFze",
  "rating": 4,
  "text": "Очень приятное место, персонал внимательный, кухня отличная.",
  "textLanguage": "ru",
  "publishedAt": "2026-02-27T09:52:58.380Z",
  "authorName": "Мария К.",
  "authorLevel": "Знаток города 6 уровня",
  "likeCount": 3,
  "dislikeCount": 1,
  "photoCount": 2,
  "isPinned": false,
  "hasOwnerReply": true,
  "ownerReplyText": "Спасибо за отзыв! Будем рады видеть вас снова.",
  "ownerRepliedAt": "2026-02-28T14:01:22.636Z",
  "regionId": 213,
  "regionName": "Москва",
  "searchQuery": null,
  "page": 1,
  "position": 9,
  "collectedAt": "2026-08-17T09:12:44.108Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `organizationUrls` | list of text | — | Addresses of the Yandex Maps business pages you want reviews for. Paste them straight from your browser; the descriptive words in the address are ignored. |
| `organizationIds` | list of text | — | The numeric id of a business, if you already have it. Can be combined with the addresses above. |
| `searchQuery` | text | — | Optional. A business name or a category. Every business found for it in the region below is added to the run. |
| `region` | choice | Moscow | The city or region the search runs in. Ignored when you supply businesses directly. |
| `maxReviewsPerOrganization` | whole number | 100 | How many reviews to collect for each business. Maximum 600. |
| `maxOrganizationsFromSearch` | whole number | 10 | How many businesses the search may add to the run. Maximum 200. |
| `businessesAtOnce` | whole number | 3 | How many businesses to work through side by side, from 1 to 8. |

You must supply at least one business address, one business id, or a search
phrase. If you supply none of them the run stops immediately and tells you so,
rather than finishing with an empty table.

### Output fields

| Field | What it is |
| --- | --- |
| `orgId` | The business's id on the source site |
| `orgName` | Business name as published |
| `orgUrl` | Link to the business page |
| `orgAddress` | Full street address as published |
| `orgCategory` | The business's main category |
| `orgRating` | The business's overall star rating at the moment of collection |
| `orgReviewCount` | How many reviews the source shows for the business |
| `reviewId` | Stable id of this review, useful for de-duplicating between runs |
| `rating` | Stars given by the reviewer, 1 to 5 |
| `text` | The review, in full |
| `textLanguage` | The language the review was written in, as the source itself detected it. Empty where the source could not tell — it says so on a small share of reviews, so treat an empty language as "not stated", not as a language of its own |
| `publishedAt` | When the review was last published or updated by its author, as a full date and time. The source keeps one timestamp per review and moves it when the author edits, so an edited review carries the date of the edit |
| `authorName` | The reviewer's public display name |
| `authorLevel` | The public contributor status shown next to the reviewer |
| `likeCount` | How many people marked the review as useful |
| `dislikeCount` | How many people marked it as not useful |
| `photoCount` | How many photos are attached to the review |
| `isPinned` | Whether the source pinned this review to the top |
| `hasOwnerReply` | Whether the business owner answered publicly |
| `ownerReplyText` | The owner's public answer, in full |
| `ownerRepliedAt` | When the owner answered |
| `regionId` / `regionName` | The region the business belongs to, exactly as the source reported it for that business — so branches outside the cities this actor can search still carry their own region name rather than a blank. The spelling follows the source's own, the same way business names and addresses do |
| `searchQuery` | The phrase that found this business, when a search was used |
| `page` / `position` | Where the review sat in the collected set |
| `collectedAt` | When this run collected the review |

A field the source does not publish comes back empty, never as a zero and never
as a guess, so the columns stay stable across every row of your table.

### Pricing

You pay per event, so the bill follows what you actually got.

| Event | Charged when | Price |
| --- | --- | --- |
| Review collected | For each review written to your results | $1.50 per 1,000 |
| Business scanned | Once for each business the actor successfully read, including one that turns out to have no reviews yet | $0.02 each |

A business the actor could **not** read is not charged at all.

**Worked example.** Twenty locations, 100 reviews each: 2,000 reviews at $1.50
per 1,000 is $3.00, plus 20 businesses scanned at $0.02 is $0.40 — **$3.40 for
the run**. A daily watch on five locations pulling 50 reviews each costs about
$0.48 a day.

### Limits & what this actor cannot do

- **Up to 600 reviews per business.** The source makes no more than that
  available for any one business, even where it displays a much larger review
  count on the business page. The actor returns what the source publishes and
  reports how much that was.
- **The order is the source's own, and it is not date order.** Reviews arrive in
  the order the source chooses to show them, which mixes recent and older
  reviews. You cannot change that order, so a run of 100 reviews is 100 of the
  reviews the source is willing to show, not the 100 newest.
- **The date is when the review was last written, not when it first appeared.**
  The source keeps a single timestamp per review and moves it forward when the
  author edits their text, and it publishes no separate original date — so an
  old review edited last week carries last week's date. If you compare runs on
  this column, treat a moved date as "this review changed", not as "this review
  is new".
- **Results are a snapshot** taken at the moment of collection. The source's own
  content changes continuously, and reviews can be edited or removed after you
  collect them.
- **Only what is published in public.** The actor does not sign in, sees nothing
  behind a login, and cannot reveal anything the source keeps private —
  including a reviewer's contact details, which are never published.
- **Star ratings and review counts are as published at collection time** and can
  lag behind the individual reviews.
- **Owner replies exist only where the owner wrote one.** Reply rates vary
  enormously: one business measured had answered 595 of its last 600 reviews,
  another had answered a handful. Rows for unanswered reviews come back empty
  rather than guessed — which is exactly what makes the comparison worth having.
- **Names and addresses arrive in the form the source serves.** Depending on the
  market it decides to serve, a business name, its address, its category and the
  reviewer's contributor status can come back in English rather than Russian —
  a measured run returned "Moscow, Strastnoy Boulevard, 4с3" and "Level 8 Local
  Expert" where the Russian page shows Cyrillic. The review text itself is
  always in the language the reviewer wrote it in, and never translated.
- **A business that cannot be read is reported as a failed business**, never as
  "no reviews found". A business that genuinely has no reviews yet is counted
  separately again, so you can always tell the two apart in the run summary.
- **The search covers the cities offered in the region list.** A whole country
  is not offered as a choice, because the source does not answer it with
  anything useful.
- **Speed depends on the size of the job** and on how quickly the source
  answers; no fixed throughput is promised.
- **Reviews are written by members of the public.** This actor collects only
  what the source shows publicly next to a review — the display name and the
  contributor status — and never attempts to identify anyone further. The
  source's terms govern automated access, and you are responsible for using the
  data lawfully, including under GDPR and Russian personal data law where they
  apply.

### FAQ

**Do I need an account on the source site?**
No. Nothing is needed except the actor itself.

**Does it need my login or password?**
No, and it will never ask for one. It sets itself up on every run.

**Can I schedule it?**
Yes. Put it on an Apify schedule — daily, weekly, hourly — and each run gives
you a fresh table. `reviewId` is stable, so you can compare runs and keep only
what is new.

**How many reviews can I get for one business?**
Up to 600. That is the ceiling the source itself applies, and no setting can
raise it. For most businesses it is far more than exists.

**Can I collect only the one-star reviews?**
Not at collection time — the source decides which reviews it shows and in what
order. Collect what you need and filter the resulting table, which is a single
step in a spreadsheet.

**What happens if a business page cannot be read?**
The run says so. It is counted as a failed business in the run summary **and
named there**, with the reason, so you can retry exactly those and nothing else.
It is never reported as a business with no reviews, because acting on a silent
zero is worse than knowing a read did not work. A business that was read and
then stopped answering part-way through is listed separately again, with how
many reviews did arrive.

**Does it work for businesses outside Russia?**
It works wherever the source lists businesses, which includes Belarus,
Kazakhstan and Uzbekistan. The city list for searching covers the largest
markets; direct business addresses work anywhere the source has a page.

# Actor input Schema

## `organizationUrls` (type: `array`):

Addresses of the Yandex Maps business pages you want reviews for. Paste the address straight from your browser — the extra words in it are ignored.

## `organizationIds` (type: `array`):

The numeric id of a Yandex Maps business, if you already have it. Use this instead of, or alongside, the addresses above.

## `searchQuery` (type: `string`):

Optional. A business name or a category — for example "dentist" or a chain's name. Every business found for it in the region below is added to the run, so you can benchmark a whole category at once.

## `region` (type: `string`):

The city or region the search above runs in. Ignored when you supply business addresses or ids directly.

## `maxReviewsPerOrganization` (type: `integer`):

How many reviews to collect for each business, in the order the source itself publishes them. The source makes at most 600 reviews available for any one business, so 600 is the ceiling.

## `maxOrganizationsFromSearch` (type: `integer`):

How many businesses the search above may add to the run. Ignored when you do not use the search.

## `businessesAtOnce` (type: `integer`):

How many businesses to work through side by side. Raise it to finish a long list sooner, lower it to be gentler on a big job. Three is a good balance.

## Actor input object example

```json
{
  "organizationUrls": [
    "https://yandex.com/maps/org/galki/115736401897/reviews/"
  ],
  "organizationIds": [
    "115736401897"
  ],
  "searchQuery": "стоматология",
  "region": "213",
  "maxReviewsPerOrganization": 100,
  "maxOrganizationsFromSearch": 10,
  "businessesAtOnce": 3
}
```

# Actor output Schema

## `reviews` (type: `string`):

Every review collected in this run.

## `reviewsOverview` (type: `string`):

The same reviews, arranged in the reading order of the overview table.

## `reviewsCsv` (type: `string`):

A spreadsheet of every review collected in this run.

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

How many businesses were read, how many had no reviews yet, and how many could not be read.

# 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 = {
    "organizationUrls": [
        "https://yandex.com/maps/org/galki/115736401897/"
    ],
    "maxReviewsPerOrganization": 100,
    "maxOrganizationsFromSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/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 = {
    "organizationUrls": ["https://yandex.com/maps/org/galki/115736401897/"],
    "maxReviewsPerOrganization": 100,
    "maxOrganizationsFromSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/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 '{
  "organizationUrls": [
    "https://yandex.com/maps/org/galki/115736401897/"
  ],
  "maxReviewsPerOrganization": 100,
  "maxOrganizationsFromSearch": 10
}' |
apify call apt_marble/yandex-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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