# Yandex Maps Reviews Scraper: Ratings, Replies, Place Summary (`amitaviv/yandex-maps-reviews-scraper`) Actor

Scrape Yandex Maps reviews by place URL, id or search: stars, text, date, likes, photos and the business's reply, with the place on every row. Newest first, star and date filters, optional per-place summary (topics, reply rate, recent averages), new-review monitoring. Reviewer names only on request.

- **URL**: https://apify.com/amitaviv/yandex-maps-reviews-scraper.md
- **Developed by:** [Amit Aviv](https://apify.com/amitaviv) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 reviews

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Yandex Maps Reviews Scraper: Ratings, Replies, Place Summary

Reviews of Yandex Maps places, newest first: star rating, text, date, likes, photos and the business's reply, with the place's name, address and rating on every row. Give place URLs or ids, or a search term and a city. It works over plain HTTP (no browser), so a run of a few hundred reviews takes seconds; you pay only for reviews delivered, and a run that delivers nothing because of an error or a block ends as Failed, not as a green empty run.

### What you get

- One record per review: stars (1-5), full text and its language, date, likes and dislikes, number of photos and their URLs, number of videos, the business's reply and its date, Yandex's reviewer level (for example "Level 6 Local Expert").
- On every review: the place's Yandex id, name, link, address, categories, coordinates, Yandex rating, number of ratings and number of reviews, so each row stands alone in a spreadsheet.
- Optional, one summary record per place (`includePlaceSummary`): Yandex's rating and counts, the topics Yandex extracts from the reviews ("Quality of treatment", "Waiting time", …) with positive, neutral and negative mentions, and figures over the reviews the run read: their star distribution, average, share answered by the business, median reply delay, number and average rating of reviews in the last 30, 90 and 365 days.
- Newest first by default; also Yandex's own order, highest rated first or lowest rated first.
- Filters: minimum and maximum stars, and "only reviews newer than" a date or a period. Reviews left out by a filter are not charged.
- "Only new reviews" monitoring: scheduled runs deliver and charge only reviews that are new since earlier runs.
- A run summary (`OUTPUT_SUMMARY` in the run's key-value store): reviews delivered per place and why each place stopped, events charged, places found by a search, what was left out and why, requests made, proxy used.

What it does not return by default: reviewers' names, avatars and profile links (see "Reviewer names"). Never: anything behind a login, reviewers' contact data.

### How to use

1. Open the place on Yandex Maps (yandex.com, yandex.ru, yandex.com.tr, yandex.kz or another Yandex site) and copy the URL from the browser, for example `https://yandex.com/maps/org/caffe_la_vita/117242594967/`. The reviews tab URL, the link the Share button gives (`https://yandex.ru/maps/-/…`), the map URL with the place open on it, and the bare id (`117242594967`) work too.
2. Paste it into **Places**. Several places are fine. Or type a **Search term** and a **Location** (`dentist`, `Almaty`) to take the first places Yandex lists for it.
3. Set **Max reviews per place** and press Start.
4. Download the results from the Output tab, or read them from the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `places` | list of text | empty | Place URLs from any Yandex Maps domain, Share-button links (`/maps/-/…`, followed once at the start), map links with `oid=` or `poi[uri]=`, `yandex.ru/profile/<id>` pages, numeric place ids, or Yandex Maps search URLs (their first places are read). A place given twice, or also found by a search in the same run, is read once; entries that are none of these are listed in the summary. |
| `searchQuery`, `location` | text | empty | A search such as `dentist` and a city such as `Almaty`: the reviews of the first places Yandex lists for "dentist Almaty". |
| `maxPlaces` | number | 5 | How many places a search contributes (1-100). Permanently closed places are skipped. |
| `maxReviewsPerPlace` | number | 100 | Reviews delivered per place (1-10,000). See "Limits" for what happens past 600. |
| `sort` | choice | `newest` | `newest`, `relevance` (Yandex's default order), `highest`, `lowest`. |
| `minRating`, `maxRating` | number | empty | Only reviews with at least / at most this many stars. |
| `reviewsNewerThan` | text | empty | A date (`2026-01-01`) or a period (`30 days`, `12 weeks`, `6 months`, `1 year`). In newest-first order the run stops reading a place at the first older review. |
| `includePlaceSummary` | yes/no | no | Add one summary record per place (charged as a place summary). With `onlyNew`, only for places with new reviews in that run. |
| `includeReviewerNames` | yes/no | no | Deliver reviewer names, avatars and profile links, and texts as written. Personal data: see "Reviewer names". |
| `includeIndividuals` | yes/no | no | Also read places that are a person working under their own name (a notary or lawyer listed by surname, for example). |
| `language` | choice | `en` | `en`, `ru`, `tr`, `uk` or `kk`: language of place names, addresses and categories. Review text is always as the reviewer wrote it. |
| `onlyNew` | yes/no | no | Deliver and charge only new reviews. See "Monitoring". |
| `monitorKey` | text | empty | Name of the "only new" memory, to keep two schedules apart. |
| `proxyConfiguration` | proxy | off | Not needed. See the FAQ. |

Runs use 512 MB by default; the largest run so far peaked at 70 MB.

This input was run as `voLe1ent381hirVLo` and `buo8h6khEVl97muP5` (2026-10-20), `PQxRmoo8jkS7oAcje` and `NDiNFrgdgLCNBfhM8` (2026-10-24):

```json
{
  "searchQuery": "dentist",
  "location": "Almaty",
  "maxPlaces": 3,
  "maxReviewsPerPlace": 50,
  "includePlaceSummary": true
}
```

Runs of this input end in under 10 seconds with about 100 reviews and 3 summaries: `Scraped 96 reviews from 3 places — 3 place summaries delivered` on 2026-10-20, 97 reviews in `PQxRmoo8jkS7oAcje` and in `NDiNFrgdgLCNBfhM8` (7.9 seconds) on 2026-10-24 (two of the three clinics have fewer than 50 reviews). The count grows as the clinics get reviews.

### Example result

A review from run `voLe1ent381hirVLo` on 2026-10-20, unedited. The business's reply opened with the reviewer's first name, which is replaced by `[name]` because reviewer names were not requested:

```json
{
  "recordType": "review",
  "id": "O7Tyv_j9zRb-IRfsBIQN2eYg0Al65x",
  "placeId": "98078498741",
  "placeName": "Dobro Dent",
  "placeUrl": "https://yandex.com/maps/org/dobro_dent/98078498741/",
  "placeAddress": "Almaty, Naýaı kóshesi, 210/2",
  "placeCategories": [
    "Dental clinic"
  ],
  "placeRating": 5,
  "placeRatingCount": 429,
  "placeReviewCount": 148,
  "placeLatitude": 43.204177,
  "placeLongitude": 76.886255,
  "searchQuery": "dentist Almaty",
  "rating": 5,
  "text": "Отличная стоматология, высокий сервис ",
  "textLanguage": "ru",
  "publishedAt": "2025-07-28T04:31:15.798Z",
  "likes": 0,
  "dislikes": 0,
  "photoCount": 0,
  "photoUrls": [],
  "videoCount": 0,
  "businessReply": "[name], добрый день! Спасибо большое за такой позитивный отзыв о работе нашей клиники🙏 Мы очень рады, что Вы остались довольны!\n\nЖелаем Вам и Вашим близким крепкого здоровья💚\nС уважением, Dobro Dent 🦷",
  "businessReplyAt": "2025-08-07T12:54:04.249Z",
  "reviewerLevel": "Level 6 Local Expert",
  "reviewerName": null,
  "reviewerAvatarUrl": null,
  "reviewerProfileUrl": null,
  "reviewerNamesIncluded": false,
  "nameRedactedInText": true,
  "order": "newest",
  "language": "en",
  "scrapedAt": "2026-10-20T13:22:07.862Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Yandex's id of the review; stable between runs. |
| `placeId`, `placeUrl` | Yandex's id of the place and its page. |
| `placeRating`, `placeRatingCount`, `placeReviewCount` | The place's Yandex rating (1-5), number of ratings and number of written reviews when the run read it. |
| `publishedAt` | The review's date as Yandex gives it; a review its author edited carries the date of the edit. |
| `photoUrls` | Full-size links of the photos attached to the review. |
| `businessReply`, `businessReplyAt` | The business's public answer and its date; `null` when there is none. |
| `reviewerLevel` | Yandex's rank of the reviewer ("Level 3 Local Expert"), not a name. |
| `reviewerName`, `reviewerAvatarUrl`, `reviewerProfileUrl` | Only with `includeReviewerNames`; otherwise `null`. |
| `nameRedactedInText` | `true` when a name in the text or the reply was replaced by `[name]`. |
| `order` | The list the review came from: your chosen order (`newest`, …), or `topic` / another order for reviews read past the first 600 (see "Limits"). |
| `searchQuery` | The search that found the place; `null` for a place given directly. |

The summary record of the same place from the same run (topics cut to three here):

```json
{
  "recordType": "placeSummary",
  "id": "summary-98078498741",
  "placeId": "98078498741",
  "placeName": "Dobro Dent",
  "placeRating": 5,
  "placeRatingCount": 429,
  "placeReviewCount": 148,
  "aspects": [
    { "topic": "Quality of treatment", "mentions": 49, "positive": 43, "neutral": 1, "negative": 5 },
    { "topic": "Waiting time", "mentions": 16, "positive": 13, "neutral": 0, "negative": 3 },
    { "topic": "Teeth removal", "mentions": 15, "positive": 12, "neutral": 1, "negative": 2 }
  ],
  "reviewsRead": 50,
  "readAllReviews": false,
  "readOrder": "newest",
  "newestReviewAt": "2026-10-06T13:20:09.353Z",
  "oldestReviewReadAt": "2024-08-23T18:08:53.934Z",
  "ratingDistributionRead": { "1": 2, "2": 0, "3": 1, "4": 3, "5": 44 },
  "averageRatingRead": 4.74,
  "replyRate": 0.98,
  "medianReplyDelayDays": 23.2,
  "reviewsLast30Days": 2,
  "averageRatingLast30Days": 3,
  "reviewsLast90Days": 3,
  "averageRatingLast90Days": 3.67,
  "reviewsLast365Days": 15,
  "averageRatingLast365Days": 4.67
}
```

(The record also carries the place fields shown on the review, `language` and `scrapedAt`.) `aspects` are Yandex's own counts over all reviews of the place. The other figures are over the `reviewsRead` reviews this run read for the place, newest first, filtered or not: `ratingDistributionRead` is the star count of those reviews, not of the whole place (Yandex publishes no star histogram), unless `readAllReviews` is `true`. A period figure (`reviewsLast90Days`, …) is given only when the run's newest-first list read back past the start of the period, or the run read every review; otherwise it is `null`, not a guess. `readAllReviews` is `false` when Yandex kept failing part-way through the place's reviews (the status message says so). Raise **Max reviews per place** to cover a longer period. A place whose reviews the run did not get to read before its timeout gets no summary (and no charge for one).

Fields Yandex does not provide are `null` (or an empty list), never missing.

### Pricing

Pay per event. You pay for what is delivered, not for time or memory.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Actor start (once per run) | $0.003 | $0.003 | $0.003 | $0.003 |
| Review delivered | $0.0018 | $0.0015 | $0.00135 | $0.0012 |
| Place summary delivered (only with `includePlaceSummary`) | $0.0018 | $0.0015 | $0.00135 | $0.0012 |

That is $1.50 per 1,000 reviews on the Bronze plan.

Worked example: 5 places with 100 reviews each on the Bronze plan cost 500 × $0.0015 + $0.003 = $0.753; with a summary per place, 5 × $0.0015 more, $0.7605. On the Free plan the 500 reviews cost 500 × $0.0018 + $0.003 = $0.903. A scheduled "only new" run on Bronze that finds 3 new reviews in one place costs 3 × $0.0015 + $0.003 = $0.0075 (plus $0.0015 for that place's summary, if you asked for summaries); one that finds nothing new costs $0.003, summaries or not.

- Reviews left out by your star or date filter, and reviews already delivered in the same run, are not charged.
- The start event is charged by Apify when a run starts (once per run at up to 1 GB of memory), also when the run then fails on unusable input, and again when you resurrect a run.
- The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so. With a limit of $0.0121 a run delivered exactly 6 reviews and charged $0.012 (`TluwNEfeus5bBFXUi`, 2026-10-24).

### Reviewer names

Reviews are written by private persons. By default the actor delivers no reviewer name, avatar or profile link, and replaces with `[name]`, in the review text and the business's reply:

- the reviewer's name and its case forms ("Люция" also catches "Люцию", "Люции");
- the person a reply opens with, greets or thanks, anywhere in the text ("Даша, ваш отзыв …", "… Здравствуйте, Айгуль!", "Спасибо, Айдар!", "Ирина, спасибо!"): businesses often address the reviewer by a first name spelled differently from the display name;
- about 720 common first names (Russian, Ukrainian, Tatar, Kazakh, Caucasian, Turkish and English, in Cyrillic and Latin letters) in any case form, anywhere in the text, with the surname next to them ("к Ринату Загилуллину", "Ксению Истомену", "Алсу Мередова");
- names written with a patronymic, or a surname with initials ("врача Темирлана Алибековича", "Скворцов В.А.", "Х. М. Ал-Шахина");
- a name right after a staff role word or a relative, alone or in a pair: "официант Артур", "управляющей Зуле", "ребятам Артуру и Нине", "помощнику Абдулазизу", "our waitress Anna", "Dr. Smith", "дочку Соню", and a name right before "(самый) лучший" and a role word ("Салианат лучший стоматолог");
- the people a thank-you names ("Спасибо Анне и Олегу", "Thanks to Maria"), a surname after "к" or "у" ("записалась к Понетайкину"), and a woman's or declined surname after an unknown first name or mid-sentence ("Адиба Давронова", "у хваленной Гумеровой").

Words of the place's own name are left alone (a café called "Мария"), and so are names that are also common words or places ("Вера", "Надежда", "Роза", "Маргарита", "Шереметьево"), a first name in a street, church or monarch's name ("ул Толе би", "Собора Св Софии", "император Михаил VII"), and "доктор Айболит".

This is best effort, not a guarantee. Measured on build 0.1.13 (2026-10-24) on the Store example input (`NDiNFrgdgLCNBfhM8`, 97 reviews of three Almaty dental clinics), by reading every replacement against the original texts and checking by hand every capitalised word left in the middle of a sentence: 0 of the 97 reviews still name a private person, and all 62 replacements are people's names. On the same 97 reviews build 0.1.10 (`PQxRmoo8jkS7oAcje`) left a staff member's first name in 2 ("Салианат лучший стоматолог", "помощнику Абдулазизу") and replaced 3 things that are not names ("ул \[name] би" for Tole bi street, "доктор Айболит", and the role word in "Терапевт Рауан Досжанович"). With the same rules, read the same day with the actor's code outside the platform: 1 of 300 reviews of three Kazan dental clinics still names a person (a name written in lower case, "у Амира хусейна"), 0 of 200 café reviews, and 0 of 300 reviews of the Galata Tower in Istanbul, where historical names ("император Михаил VII", "султан Мехмед") are now kept. Applied to earlier datasets, the same rules leave 0 of 611 café reviews (`3srkBsQk4gXqi8MVC`) and 0 of 1,500 airport reviews (`FcZBomi7rANCzDalH`) naming a private person; public figures such as Khrushchev are kept. Expect up to a few in a hundred for clinics, where reviews name staff most often: a rare first name at the start of a sentence or written in lower case, or a surname alone, can still be missed. A few words that are not names are replaced as well: a brand after "спасибо" ("Аэрофлоту"), the novel "Евгения Онегина", and a public figure written with initials, other than the best-known ones ("А.С. Пушкина" is kept).

With **Include reviewer names** on, `reviewerName`, `reviewerAvatarUrl` and `reviewerProfileUrl` are filled and texts are delivered as written. Turning it on, you confirm that you have a lawful basis under the GDPR (or the law that applies to you) to process those names.

Places that look like one person working under their own name (a notary, lawyer or psychologist listed by surname and initials, a title that says self-employed) are skipped by default, because their reviews are about a person. The recognition is the one of our Yandex Maps Scraper and is a heuristic.

### Reliability and failure behaviour

| What happened | Run status | Status message |
|---|---|---|
| Reviews delivered | Succeeded | `Scraped 97 reviews from 3 places — 3 place summaries delivered` (`NDiNFrgdgLCNBfhM8`) |
| A place with no reviews | Succeeded | `0 results: Yandex Maps has no reviews for this place` (offline test) |
| The only place is an individual practitioner | Succeeded | `0 results: the place was skipped as an individual practitioner — 1 place of individual practitioners skipped (turn on "Include individual practitioners" to get them)` (offline test) |
| A search that finds no places | Succeeded | `0 results: the search found no places on Yandex Maps` (`OVBKdacnbR9mkSCdu`) |
| Some places worked, some failed | Succeeded | `Scraped 5 reviews from 1 place — 1 of 2 places failed ("https://yandex.com/maps/org/35193114937/": this place does not exist on Yandex Maps (anymore))` (`XfiHqcrWJbSCpGnpb`) |
| Yandex kept failing part-way through a place | Succeeded | `Scraped 100 reviews from 1 place — Yandex Maps kept failing part-way through a review list of "…" (stopped at page 3 of 6 after 3 attempts: …); the reviews before it were delivered` (offline test) |
| Nothing delivered because of errors or blocking | **Failed** | `No reviews delivered: Yandex Maps blocked every attempt; try again later. No reviews were charged (the start fee applies).` (offline test) |
| Input the actor cannot use | **Failed**, within seconds | `Nothing to do: none of the 1 entries in "places" is usable (…). Add a Yandex Maps place URL … No reviews were charged (the start fee applies).` (`U4FzbzAVBjVagufHd`, 1.4 s) |
| Maximum charge reached | Succeeded | `Scraped 6 reviews from 1 place — stopped at the maximum charge set for this run` (`TluwNEfeus5bBFXUi`, limit $0.0121) |
| Maximum charge below the start fee plus one review | **Failed** | `The maximum charge set for this run ($0.004) does not cover the start fee plus one review, …` (offline test) |
| Run timeout close | Succeeded | `Scraped 496 reviews from 1 place — stopped just before the run timeout; raise the timeout to get the rest; 1 place summary delivered` (`GsdhT9JRWYpgz7CDX`, 12-second timeout, 2 places: the second was not started and got no summary) |
| Run timeout before any review was read | **Failed** | `No reviews delivered before the run timeout: raise the run timeout and try again. No reviews were charged (the start fee applies).` No place summary is charged either (offline test) |

- Requests are retried up to 3 times with increasing pauses on network errors, HTTP 429 and 5xx, and when Yandex answers with its captcha (as a page or as JSON).
- Now and then the reviews API answers one request with an internal error and the same request a moment later with the reviews. Such an answer is asked again twice (after 1.5 and 3 seconds). In `oLuV2gfdUbllsM2gx` one such answer was retried and nothing was lost. If it keeps failing on a place's first page, that place fails; if it keeps failing further on, the reviews read so far are delivered and the status message names the place.
- When no proxy is set and Yandex answers with its captcha, the retries and the rest of the run go through Apify Proxy: datacenter addresses first, residential addresses after 3 blocked answers. `OUTPUT_SUMMARY` names the proxy group under `proxy`. The price stays the same. (This path is tested offline only: no test run on the platform was blocked.)
- The run stops starting new work shortly before its timeout (20% of the timeout, between 5 and 60 seconds) and always makes its first request, so even a short timeout returns what it could and says why it stopped.
- Reviews are saved and charged page by page (50 reviews a request), so a run that stops early keeps what it delivered, and a resurrected run delivers and charges nothing twice. A resurrected run counts the reviews it delivered for each place before against **Max reviews per place**, also those Yandex's list no longer shows where they were: `QO6SQ5yt6okvgJGWB` (400 reviews, resurrected after it had finished) made no new request and charged no review again.
- Measured from the Apify platform without a proxy: 30 test runs on builds 0.1.1 to 0.1.6 (2026-10-20), 3 on 0.1.7 and 19 on 0.1.8 and 0.1.9 (2026-10-24), none blocked. In every run the charged reviews and place summaries equalled the dataset items, read a minute or more after the run ended.

### Limits

- **600 reviews per list.** Yandex Maps lists at most 600 reviews of a place in one order. Up to 600, newest first is exact. Asked for more, the run also reads Yandex's other orders (lowest rated first, highest rated first, relevance) and the lists of reviews that mention each topic Yandex extracted for the place (most mentioned first), and keeps what it has not delivered yet. For a place with up to 1,200 reviews the other orders come first; for a larger place the topic lists do, because they reach further. That reaches well past 600 but not always every review, and those reviews are not in your chosen order (`order` says which list they came from). Measured: a café with 2,377 reviews gave 1,983 different reviews in 184 requests and 229 seconds (`oLuV2gfdUbllsM2gx`); reading only Yandex's four orders, an earlier build got 1,120 of them (`OHwJwfzL9a2QfhRr1`). A place with 611 reviews gave all 611 in 34 review requests and 33 seconds (`3srkBsQk4gXqi8MVC`; 96 requests and 69 seconds before the other orders were read first).
- "Only new reviews" reads newest first only, so it sees the newest 600 reviews of a place: enough for any schedule, as long as a place does not get more than 600 reviews between two runs.
- Speed: 20 reviews in 3.3 seconds (`0P08gbW7ohPjl9yhr`), 97 reviews of 3 places found by a search in 6.3-7.9 seconds (`P7UEtGZmR105OF0AI`, `NDiNFrgdgLCNBfhM8`). Past 600 reviews per place it slows down, because the extra lists mostly repeat reviews already delivered (about 9 reviews a second in `oLuV2gfdUbllsM2gx`).
- A search takes the places in the order Yandex lists them for the text "term location", the way you would type it into Yandex Maps; it is not a full list of an area (use our Yandex Maps Scraper for that, then pass the place URLs here).
- Star or date filters do not lower the number of requests: the run still reads the place's reviews in order to find matching ones (`vI04LiMRCX3kSIIUL`: 14 one- and two-star reviews of the last year, 400 reviews read).
- Coverage follows Yandex Maps: tested on places in Kazan (Russia) and Almaty (Kazakhstan).

### Monitoring: only new reviews

1. Turn on **Only new reviews** and save the input as a task.
2. Schedule the task (daily is plenty for most places).
3. The first run delivers the newest reviews of each place, up to the maximum. Every later run reads newest first, stops at the first page that holds a review seen before, and delivers and charges only the new ones; a run with nothing new ends as Succeeded with `0 new reviews in 2 places (no reviews charged; the start fee applies)` and costs the start event only.

What counts as new: a review that no earlier run of the same monitor delivered or saw, and that is not dated more than 3 days before the newest review earlier runs saw. Yandex's newest-first list is not perfectly stable: between two runs, reviews weeks old come and go on its first page. Those are remembered without being delivered (`lateOrOld` in `OUTPUT_SUMMARY`). A review that Yandex publishes a few days after it was written (moderation) still counts as new within those 3 days; one published later than that with an older date is missed.

When a later run has more new reviews for a place than **Max reviews per place** (or stops at your charge limit or the run timeout), it delivers the newest ones and the next runs deliver the rest: the 3-day rule then counts from where the unfinished run started. Tested with a monitor set up as if its last run had come before the 20 newest reviews of an airport (5 days of reviews), 5 reviews per place: `oS84yRy9cayrjHfur` delivered the newest 5, `aWBCwYAhcpqbMIxnJ` the next 5, `brT6RcuvkK1Ss8Tte` (maximum 50) the remaining 10 and stopped at the reviews seen before: all 20 once, none taken for old.

With **Add a summary record per place** on, a monitoring run adds a summary only for the places that have new reviews in that run.

Tested on a large Moscow shopping centre and an airport (40,000-70,000 reviews each, several new ones a day), 10 reviews per place, monitor `v016`, three runs a few minutes apart: `ruMtVwaimrhBOF3LQ` delivered 20 reviews and 2 summaries; `bdFIBcDyc4t8rhW2N` delivered 1 review dated within the window (it was not in the first run's list) and 1 summary, and recognised 1 older review as old; `tNIGsGNtdcWygfCcN` delivered nothing, charged only the start, and recognised 2 older reviews as old.

The memory is a key-value store named `yandex-maps-reviews-scraper-monitor` in your own account (one record per place and monitor name). Delete the store or change **Monitor name** to start over. Reviews cut off by the maximum or by your charge limit on a first run are remembered as seen (the first run sets the starting point); on later runs the rest is delivered by the next runs, as above.

### FAQ

**Do I need a proxy?** No. Leave it off: requests go directly, which is fastest, and if Yandex blocks them the run switches to Apify Proxy on its own.

**Why did I get fewer reviews than the place shows?** Yandex counts written reviews only (`placeReviewCount`; star ratings without text are in `placeRatingCount`); your star or date filter left some out (the status message says how many); or the place has more than 600 and you asked for 600 or fewer (the status message says so).

**Where do I get place URLs in bulk?** From our [Yandex Maps Scraper](https://apify.com/amitaviv/yandex-maps-scraper): its `url` field is a place URL this actor accepts.

**Can I run it from code?** Yes: the API and the Apify clients for JavaScript and Python. The Output tab shows the URLs.

**What happens when Yandex Maps changes?** Runs fail with a message that says so instead of returning empty data. Report the run id under Issues.

### Legal and responsible use

This actor collects reviews that Yandex Maps shows publicly to any visitor without a login, by the same requests Yandex's own web page makes for an anonymous visitor. Reviews are written by private persons: their names, avatars and profiles are left out unless you ask for them, and names in the texts are replaced as described under "Reviewer names", which is best effort. Review texts can still mention people, so data-protection law can apply to how you use them.

Yandex's terms of use for Maps say the service's information is for personal, non-commercial use. You are responsible for how you use the data: respect the site's terms, copyright and database rights (review texts are their authors' work), and data-protection law (GDPR, Russian Federal Law 152-FZ and others) in your country and the country of the data. Do not use the output to contact or profile reviewers. If you are unsure, ask a lawyer before you build on it.

### Related actors

- [Yandex Maps Scraper](https://apify.com/amitaviv/yandex-maps-scraper): business listings from Yandex Maps for a search and an area (name, address, phones, website, hours, rating). Use it to build the list of places, then read their reviews here.

### Changelog

- 2026-10-24, 0.1.13: more names replaced in texts ("помощнику Абдулазизу", a name before "лучший стоматолог", a surname with initials before or after it, with or without dots, "Ал-Шахин", a first name run together with the word before it); fewer words replaced that are not people (a first name in a street, church or monarch's name, "Айя-София", "доктор Айболит", "Приветствуем Вас", "спасибо Всевышнему", "P. S.", the role word before a patronymic); `replyRate` in the place summary rounded to 2 decimals like the other figures (it had 3).
- 2026-10-24, 0.1.10: README and input-schema texts only.
- 2026-10-24, 0.1.9: many more people's names replaced in review texts and replies (common first names anywhere, with their surnames; people a thank-you names; greetings anywhere in a reply); "only new" no longer loses new reviews that a later run's maximum left over; a resurrected run keeps to the maximum per place; no place summary for a place whose reviews were not read before the timeout; places with 601-1,200 reviews read faster (other orders before topic lists); the summary field `ratingDistribution` is now `ratingDistributionRead`; the status message says when the only place was skipped as an individual practitioner.
- 2026-10-20, 0.1.6: error answers of the reviews API asked again; a JSON captcha counts as a block; "only new" no longer delivers old reviews that move up the list, and adds summaries only for places with new reviews; staff first names after a role word replaced; Share links, `poi[uri]` map links and profile pages accepted; a place found by a search and also given directly is read once.
- 2026-10-20, 0.1: first version.

### Support

Open an issue on the actor's **Issues** tab with the run id.

# Actor input Schema

## `places` (type: `array`):

The places whose reviews you want: a Yandex Maps place URL (https://yandex.com/maps/org/caffe_la_vita/117242594967/ or its /reviews/ tab, from any Yandex domain: yandex.ru, yandex.com.tr, yandex.kz, …), the link of the Share button (https://yandex.ru/maps/-/…), a map URL with the place open on it (oid=… or poi\[uri]=…), the place's yandex.ru/profile/… page, or the numeric place id (117242594967). A Yandex Maps search URL also works: the reviews of its first places (see Max places per search) are read. A place given twice, or given directly and also found by a search, is read once.

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

Find places by a search on Yandex Maps, as you would type it (e.g. dentist, кофейня, kuaför, or a business name), and read the reviews of the first places it lists. Use with Location.

## `location` (type: `string`):

City or district for the search term (e.g. Kazan, Almaty, Kadıköy Istanbul). It is added to the search text, the way you would type "dentist Almaty" into Yandex Maps.

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

How many places a search (search term or search URL) contributes, in the order Yandex Maps lists them, 1 to 100 (default 5). Permanently closed places are skipped.

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

How many reviews to deliver per place, 1 to 10,000 (default 100). You are charged only for delivered reviews. Yandex Maps lists at most 600 reviews of a place in one list. Above 600 the run also reads Yandex's other orders and the lists of reviews that mention each topic Yandex extracted for the place (for places with up to 1,200 reviews the other orders first, for larger ones the topic lists first), and keeps the reviews it has not delivered yet: a large place gets well over 600 different reviews, but not always all of them, and those past the first 600 are not in your chosen order (their order field says which list they came from).

## `sort` (type: `string`):

The order in which reviews are read, the same choice the place's reviews tab offers: newest first (default), Yandex's default (most relevant), highest rated first, lowest rated first. "Only new reviews" always reads newest first.

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

Deliver only reviews with at least this many stars (1 to 5). Reviews left out are not charged. Empty: all.

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

Deliver only reviews with at most this many stars (1 to 5), e.g. 2 for complaints only. Reviews left out are not charged. Empty: all.

## `reviewsNewerThan` (type: `string`):

A date (2026-01-01) or a period back from now (30 days, 12 weeks, 6 months, 1 year). Only reviews dated on or after it are delivered; in newest-first order the run stops reading a place at the first older review. Empty: no date limit.

## `includePlaceSummary` (type: `boolean`):

Adds one record per place (recordType: placeSummary, charged as a place summary): Yandex's rating, rating and review counts, the topics Yandex extracts from reviews with positive/neutral/negative mention counts, and figures over the reviews the run read: their star distribution (ratingDistributionRead), average, share with a business reply, median reply delay, and the number and average rating of reviews in the last 30, 90 and 365 days (given only when the run read back that far, so read newest first with enough reviews). With "Only new reviews", a summary is added only for places that have new reviews in that run; none is added (or charged) for a place whose reviews the run did not get to read before its timeout.

## `includeReviewerNames` (type: `boolean`):

Off (default): the reviewer's name, avatar and profile link are not delivered, and in the review text and the business's reply \[name] replaces the reviewer's name, the name a reply opens with or addresses, names written with a patronymic, first names after a staff role word or a relative ("официант Артур", "our waitress Anna", "дочку Соню"), the people a thank-you names, and about 720 common first names (Russian, Tatar, Kazakh, Caucasian, Turkish, English) in any case form anywhere, with the surname next to them. This is best effort: rare names and surnames written alone can stay in the text. On: reviewerName, reviewerAvatarUrl and reviewerProfileUrl are filled and texts are delivered as written. Reviewer and staff names are personal data of private persons: by turning this on you confirm that you have a lawful basis under the GDPR (or the law that applies to you) to process them.

## `includeIndividuals` (type: `boolean`):

Off (default): places that are a person working under their own name (a notary, lawyer, psychologist or tutor listed by surname, or a title that says self-employed) are skipped and not charged; reviews of such a place are about a person. The recognition is the one of our Yandex Maps Scraper and is a heuristic. On: their reviews are delivered; turn it on only if you have a lawful basis.

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

Language of place names, addresses and categories, as far as Yandex Maps has them: en (default), ru, tr, uk or kk. Review text is always delivered as the reviewer wrote it (textLanguage says which language).

## `onlyNew` (type: `boolean`):

Deliver and charge only new reviews: reviews that earlier runs of this actor in your account have not delivered for the same place. The first run delivers the newest reviews up to the maximum per place; later runs read newest first and stop at the first page that holds a review seen before. An unseen review dated more than 3 days before the newest review earlier runs saw is an old review that Yandex moved up the list, not a new one: it is remembered and not delivered. When a later run stops at the maximum per place (or the charge limit, or the timeout) before all new reviews are delivered, the next runs deliver the rest. Run it on a schedule to be told about new reviews. The memory is a key-value store named yandex-maps-reviews-scraper-monitor in your account; delete it to start over.

## `monitorKey` (type: `string`):

Only with "Only new reviews". A free-text name (e.g. weekly-clinics). Runs with the same place and monitor name share one memory; give two schedules different names to keep their memories apart.

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

Leave off (default). The actor sends requests directly and, when Yandex Maps answers with its captcha page, switches to Apify Proxy on its own: datacenter addresses first, residential after 3 blocked answers. Set a proxy here only to force every request through it from the start.

## Actor input object example

```json
{
  "places": [
    "https://yandex.com/maps/org/caffe_la_vita/117242594967/"
  ],
  "maxPlaces": 5,
  "maxReviewsPerPlace": 20,
  "sort": "newest",
  "includePlaceSummary": false,
  "includeReviewerNames": false,
  "includeIndividuals": false,
  "language": "en",
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One JSON object per delivered review (recordType review): id, placeId, placeName, placeUrl, placeAddress, placeCategories, placeRating, placeRatingCount, placeReviewCount, rating, text, textLanguage, publishedAt, likes, dislikes, photoCount, photoUrls, videoCount, businessReply, businessReplyAt, reviewerLevel, order, scrapedAt (reviewer name fields only with includeReviewerNames). With includePlaceSummary also one record per place (recordType placeSummary).

## `resultsCsv` (type: `string`):

The same records as a CSV file.

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

JSON record OUTPUT_SUMMARY: reviews delivered per place and why each place stopped, events charged, places found by a search, places and reviews left out and why, requests made, proxy used, failed or ignored inputs.

# 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 = {
    "places": [
        "https://yandex.com/maps/org/caffe_la_vita/117242594967/"
    ],
    "maxReviewsPerPlace": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("amitaviv/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 = {
    "places": ["https://yandex.com/maps/org/caffe_la_vita/117242594967/"],
    "maxReviewsPerPlace": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("amitaviv/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 '{
  "places": [
    "https://yandex.com/maps/org/caffe_la_vita/117242594967/"
  ],
  "maxReviewsPerPlace": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call amitaviv/yandex-maps-reviews-scraper --silent --output-dataset

```

## MCP server setup

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