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

Paste a Yandex Maps organisation URL and get its reviews: star rating, full text, author, date, likes, photos and the owner's reply where there is one. Every row also carries the place's name, address, category, overall rating and review count. $0.30 per 1,000. No key, no login.

- **URL**: https://apify.com/dami\_studio/yandex-maps-reviews-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Give it a Yandex Maps organisation URL and it returns that place's reviews: star rating, the full
text, the author, the date, likes and dislikes, any photos the reviewer attached, and the
business's own reply where there is one.

Every row also carries the place itself: name, address, category, overall rating, total review count
and back-links. One row stands on its own without a second lookup.

No Yandex account, no API key, no cookie, no browser.

### Price

$0.30 per 1,000 reviews, plus $0.001 to start a run. Same rate on every plan.

You're charged per review returned. Reviews removed by your filters are not charged. A run that
finds nothing costs the start fee and nothing else.

### What you get

| Field | Notes |
|---|---|
| `reviewId` | stable id, safe to diff on between runs |
| `rating` | 1–5 |
| `text`, `textLanguage`, `hasText` | the review body, verbatim, in whatever language it was written |
| `publishedAt`, `publishedAtTimestamp` | ISO 8601 and epoch ms |
| `authorName`, `authorId`, `authorLevel`, `authorAvatarUrl`, `authorProfileUrl` | `authorLevel` is Yandex's "Знаток города N уровня" contributor rank |
| `likes`, `dislikes` | reaction counts |
| `businessReplyText`, `businessReplyAt`, `hasBusinessReply` | the owner's reply, when there is one |
| `photoUrls`, `photoCount`, `videoCount` | attached media |
| `organizationId`, `organizationName`, `organizationAddress`, `organizationCategory` | the place |
| `organizationRating`, `organizationReviewCount` | the place's aggregate score |
| `organizationUrl`, `organizationReviewsUrl` | back-links |
| `isPinned`, `position`, `scrapedAt` | ordering and run metadata |

**How full those columns actually are depends on the business.** Two runs, side by side: a Moscow
dental clinic returned 12 reviews and the owner had replied to every one of them; a large Moscow
shopping centre returned 300 reviews and the owner had replied to none. Photos are the same story.
Of those 300 reviews, 107 carried at least one photo, 295 had an author avatar and all 300 had text.
Missing values come back `null` or empty, never guessed.

### Input

```json
{
  "startUrls": ["https://yandex.ru/maps/org/aviapark/1200353900/"],
  "maxItems": 300
}
```

| Field | What it does |
|---|---|
| `startUrls` | The organisation page (`https://yandex.ru/maps/org/<slug>/<id>/`), the reviews tab, or just the numeric id. A Yandex Maps search URL works too and gets expanded into its top organisations. |
| `maxReviewsPerOrganization` | Per place, 1–600. 600 is the ceiling because that's all Yandex serves. |
| `maxItems` | Budget stop across every organisation in the run. |
| `searchQueries` + `city` | Find places by name or category instead of pasting URLs — `"стоматология"` in `"Москва"`. Yandex indexes Russian-language names most completely. |
| `maxOrganizationsPerQuery` | How many places each search term contributes before its reviews get scraped. |
| `minRating` / `maxRating` | Star bounds. Set `maxRating` to 2 or 3 to pull complaints only. |
| `onlyWithText` | Skip star-only ratings with no written review. |
| `onlyWithBusinessReply` | Keep only reviews the business answered. |
| `newerThan` | ISO date. Only reviews published on or after it. |
| `language` | Language for the organisation name, address and category. Review text is always in the language the reviewer used. |
| `proxyConfiguration` | Leave it. The actor brings its own egress. |

Anything a filter removes is dropped before it's charged.

Run it with no input and you get one labelled sample row, uncharged, so you can see the shape first.

### How fast

A 300-review run on a busy Moscow shopping-centre listing finished in 27 seconds, container start
included. Yandex server-renders its map data into the page rather than exposing a public JSON API,
so this reads that embedded state directly. Nothing launches a browser, which is what keeps a run
that size under half a minute. That 300-review run cost $0.091 to buy: $0.09 of reviews and the
$0.001 start fee.

Yandex re-orders results between page requests, so reviews are de-duplicated as they're collected.
`maxItems` means unique reviews, not raw rows fetched.

### Limits

- **600 reviews per organisation is the ceiling.** That's Yandex's own limit — it won't page past
  that for anyone. A place with 4,000 reviews gives you its first 600 in Yandex's relevance order,
  newest and longest first.
- **Business replies are the business's doing, not the scraper's.** `hasBusinessReply` is false on
  every row for a place that never replies.
- No reviewer contact details. Yandex doesn't publish them.
- No review translation. Text comes back exactly as written.
- Photo URLs point at Yandex's own CDN. Fetch them during or soon after the run if you need to keep
  the images.

### Questions

**Do I need a Yandex account or API key?** No. Nothing to authenticate.

**What does 1,000 reviews cost?** $0.30, plus the $0.001 start fee.

**Can I scrape several places at once?** Yes. Pass multiple URLs in `startUrls`. Every row carries its
own `organizationId` and `organizationName`.

**Can I get only the complaints?** Set `maxRating` to 3 and `onlyWithText` to true. You get written
complaints and nothing else, and the reviews the filter drops aren't charged.

**Are the reviews in Russian?** Whatever the reviewer wrote. Russian dominates on Russian listings.
`textLanguage` tells you per row.

**How do I find the organisation URL?** Search the place on Yandex Maps and copy the address bar. It
looks like `https://yandex.ru/maps/org/<slug>/<id>/`. A bare id works too.

**Can I export to CSV or Excel?** Yes — Apify exports the dataset as JSON, CSV, Excel or XML, with a
REST endpoint for the same data.

# Actor input Schema

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

The organisations whose reviews you want. Paste the page URL (https://yandex.ru/maps/org/niki\_dent/55558183898/), the reviews tab (.../reviews/), or just the numeric organisation id (55558183898). A Yandex Maps search URL also works and is expanded into its top organisations.

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

How many reviews to take from each organisation (1-600). Yandex itself only serves the first 600 reviews of any organisation, so 600 is the ceiling. Reviews come in Yandex's own relevance order, newest and longest first. You are charged per review returned.

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

Hard cap across every organisation in this run. Use it as a budget stop when you pass in many organisations.

## `searchQueries` (type: `array`):

Optional. Find organisations by name or category and scrape their reviews, for example "стоматология" or "Osteria Mario". Combine with "City" below. Yandex indexes Russian-language names most completely.

## `city` (type: `string`):

City for the search terms above. English, Russian or local spelling all work ("Moscow", "Москва", "Almaty", "Istanbul"), as does a numeric Yandex geo id such as 213.

## `maxOrganizationsPerQuery` (type: `integer`):

How many organisations each search term contributes before its reviews are scraped.

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

Only return reviews rated at least this many stars. Filtered-out reviews are not charged.

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

Only return reviews rated at most this many stars. Set to 2 or 3 to pull complaints only.

## `onlyWithText` (type: `boolean`):

Skip star-only ratings with no written review.

## `onlyWithBusinessReply` (type: `boolean`):

Keep only reviews carrying an official reply from the organisation.

## `newerThan` (type: `string`):

ISO date, for example 2026-01-01. Only reviews published on or after this date are returned.

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

Language for the organisation name, address and category. Review text is always in the language the reviewer wrote it in.

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

Optional. The actor already uses its own egress; leave this alone unless you need to exit from a specific network.

## Actor input object example

```json
{
  "startUrls": [
    "https://yandex.ru/maps/org/niki_dent/55558183898/"
  ],
  "maxReviewsPerOrganization": 100,
  "maxItems": 500,
  "searchQueries": [],
  "maxOrganizationsPerQuery": 3,
  "onlyWithText": false,
  "onlyWithBusinessReply": false,
  "language": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per review in the default dataset: reviewer, stars, review text, publish date, likes, photos and the business reply. Blocked, empty or sample runs return a single uncharged row instead.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://yandex.ru/maps/org/niki_dent/55558183898/"
    ],
    "maxReviewsPerOrganization": 100,
    "maxItems": 500,
    "searchQueries": [],
    "city": "",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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": ["https://yandex.ru/maps/org/niki_dent/55558183898/"],
    "maxReviewsPerOrganization": 100,
    "maxItems": 500,
    "searchQueries": [],
    "city": "",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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": [
    "https://yandex.ru/maps/org/niki_dent/55558183898/"
  ],
  "maxReviewsPerOrganization": 100,
  "maxItems": 500,
  "searchQueries": [],
  "city": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dami_studio/yandex-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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