# Yandex Maps Scraper - Places, Reviews, Phones & Coordinates (`parseforge/yandex-maps-scraper`) Actor

Scrape Yandex Maps places by keyword and city or by link: phones, websites, coordinates, hours, ratings, amenities, plus reviews with owner replies as separate rows. Goes past the 1,000 result cap. Export CSV, Excel, JSON or XML. No Yandex key needed.

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

## Pricing

from $1.90 / 1,000 place scrapeds

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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v3.webp)

## 📍 Yandex Maps Scraper

> 🚀 **Export Yandex Maps places and reviews in seconds.** Up to 46 fields per place plus one row per review, with phones, websites, coordinates, hours, ratings and owner replies. No Yandex account and no API key.

Yandex Maps is the map people use across Russia, Kazakhstan, Belarus and Turkey, and its listings are often richer than Google's there. This Actor reads the same JSON feed the Yandex Maps website uses. Give it a keyword and a city, a Yandex Maps link or a list of place IDs, and it returns one flat row per place and, if you ask for them, one row per review.

When a search fills the roughly 1,000 result slots Yandex serves, the Actor splits the map area into quarters and searches each one, so a single keyword can return several thousand places. In one verified Moscow run, a restaurant search came back with 2,671 unique places in five minutes.

| 🎯 Target Audience | 💡 Primary Use Cases |
| --- | --- |
| Sales and lead-gen teams | Business lists with phones, websites and Telegram or VK links for Russia, Kazakhstan, Belarus and Turkey |
| Market researchers | Count and rate every cafe, pharmacy or clinic in a city, with price levels |
| Reputation and CX teams | Every review of a chain's branches with owner replies, to track complaints |
| Local SEO agencies | Competitor listings, categories and review counts per district |
| Data and ML teams | Clean place and review tables for maps, sentiment and RAG pipelines |
| Travel and hospitality analysts | Hotels and restaurants with ratings, hours and nearby metro |

### 📋 What the Yandex Maps Scraper does

> 💡 **Why it matters:** a business listing tells you who is there. Phones, hours and reviews tell you whether to call, visit or avoid them. This Actor puts both in one export.

- Searches by keyword and location, in any language: Moscow, Москва, Алматы, Istanbul and Minsk all resolve to their map area.
- Accepts Yandex Maps links (yandex.com, .ru, .com.tr, .kz, .by) for a place page or a search page, and plain place IDs.
- Returns name, categories, full address, postal code, latitude, longitude, phones, website and social links.
- Returns opening hours as text and per weekday, an open-now flag and the timezone offset.
- Returns rating, number of ratings, number of written reviews, the Good Place award year and the verified-owner flag.
- Returns amenities such as Wi-Fi, takeout and payment methods as a name and value list.
- Returns reviews as their own rows with stars, text, language, date, author, likes and the owner's reply. Sort them newest, most relevant, highest or lowest, and filter by stars.
- Filters by minimum rating and the Good Place badge, sorts by distance, and can search around a coordinate point.
- Optional place details: photo links and total photo count, nearby metro stations, review topics with sentiment counts, and popular menu items with prices.

### 🎬 Full Demo

🚧 Coming soon.

### 📊 Output

Every row has a `type` column. `place` rows carry the business, `review` rows carry one review and point back to their place through `placeOid`. The columns marked details appear only when **Add place details** is on. `photosCount`, `nearbyMetro`, `reviewTopics`, `popularItems` and `photos` come from those details.

#### Place rows

| Field | Type | Description |
| --- | --- | --- |
| 🖼 `imageUrl` | string | Main photo of the place, or the review photo / reviewer avatar for review rows |
| 🏷 `type` | string | Row type: place or review |
| 🏷 `name` | string | Place name |
| 🆔 `oid` | string | Yandex organization ID |
| 🔗 `url` | string | Place page on Yandex Maps |
| 🏷 `category` | string | Main category |
| 🏷 `categories` | array | All categories |
| 📍 `address` | string | Full address |
| 📍 `city` | string | City or locality |
| 📍 `street` | string | Street |
| 📌 `house` | string | House number |
| 📍 `postalCode` | string | Postal code |
| 📍 `country` | string | Country |
| 🧭 `latitude` | number | Latitude |
| 🧭 `longitude` | number | Longitude |
| 📞 `phone` | string | First phone number |
| 📞 `phones` | array | All phone numbers |
| 🔗 `website` | string | Website |
| 🔗 `socialLinks` | array | Social and messenger links (type, url) |
| ⭐ `rating` | number | Yandex rating out of 5 |
| ⭐ `ratingCount` | number | Number of ratings |
| 💬 `reviewCount` | number | Number of written reviews |
| 💵 `priceRange` | string | Average bill or price range as Yandex shows it |
| ⏰ `workingHours` | string | Opening hours summary |
| ⏰ `openingHours` | object | Opening hours per weekday |
| ⏰ `isOpenNow` | string | Open at scrape time |
| ⏰ `openStatus` | string | Open/closed text as Yandex shows it |
| 📌 `status` | string | Business status |
| 📌 `features` | array | Amenities and attributes (name, value) |
| 📌 `goodPlaceAward` | string | Year of the Good Place award, or No |
| 📌 `verifiedOwner` | string | Owner verified on Yandex |
| 🏷 `chainName` | string | Chain name |
| 🆔 `chainId` | string | Chain ID |
| 🖼 `logoUrl` | string | Logo image |
| 🕒 `timezoneOffsetMinutes` | number | Timezone offset from UTC in minutes |
| 🆔 `geoId` | number | Yandex geo ID of the address |
| 📌 `searchQuery` | string | Search term that found the place |
| 📍 `searchLocation` | string | Location the search ran in |
| 🖼 `photosCount` | number | Total photos on Yandex (details option) |
| 📌 `nearbyMetro` | array | Nearby metro stations (details option) |
| 💬 `reviewTopics` | array | Topics reviewers mention with sentiment counts (details option) |
| 📌 `popularItems` | array | Popular menu items with prices (details option) |
| 🖼 `photos` | array | Photo links (details option) |
| 💬 `reviewsScraped` | number | Reviews collected for this place in this run |
| 🕒 `scrapedAt` | string | Scrape time (ISO 8601) |
| ❌ `error` | string | Error message, only on error rows |

#### Review rows

| Field | Type | Description |
| --- | --- | --- |
| 🖼 `imageUrl` | string | Main photo of the place, or the review photo / reviewer avatar for review rows |
| 🏷 `type` | string | Row type: place or review |
| 💬 `reviewId` | string | Review ID |
| 🆔 `placeOid` | string | oid of the reviewed place |
| 🏷 `placeName` | string | Reviewed place name |
| 💵 `placeUrl` | string | Reviewed place URL |
| ⭐ `rating` | number | Yandex rating out of 5 |
| 💬 `text` | string | Review text |
| 📌 `language` | string | Review language |
| 🕒 `publishedAt` | string | Review date (ISO 8601) |
| 🏷 `authorName` | string | Reviewer name |
| 📌 `authorLevel` | string | Reviewer Local Expert level |
| 💵 `authorProfileUrl` | string | Reviewer profile |
| 🖼 `authorAvatarUrl` | string | Reviewer avatar |
| 🔢 `likes` | number | Likes on the review |
| 🔢 `dislikes` | number | Dislikes on the review |
| 📌 `pinned` | string | Pinned by the owner |
| 🖼 `photos` | array | Photo links (details option) |
| 🔢 `videosCount` | number | Videos attached |
| 📌 `ownerReply` | string | Owner reply text |
| 🕒 `ownerReplyAt` | string | Owner reply date |
| 🕒 `scrapedAt` | string | Scrape time (ISO 8601) |
| ❌ `error` | string | Error message, only on error rows |

Three real records from a run (long lists shortened):

```json
[
  {
    "imageUrl": "https://avatars.mds.yandex.net/get-altay/20994058/2a000001a0dee585cb130adf69bbb160d3de/XXXL",
    "type": "place",
    "name": "Zdraste",
    "oid": "16246223071",
    "url": "https://yandex.com/maps/org/zdraste/16246223071/",
    "category": "Coffee shop",
    "categories": [
      "Coffee shop",
      "cafe"
    ],
    "address": "Moscow, Novomoskovskiy Administrative Okrug, Vnukovo District, Borisa Pasternaka Street, 10",
    "city": "Not Disclosed",
    "street": "Borisa Pasternaka Street",
    "house": "10",
    "postalCode": "108849",
    "country": "Russian Federation",
    "latitude": 55.637629,
    "longitude": 37.319872,
    "phone": "+7 (915) 016-50-13",
    "phones": [
      "+7 (915) 016-50-13"
    ],
    "website": "https://zdrastecafe.ru/",
    "socialLinks": [
      {
        "type": "telegram",
        "url": "https://t.me/zdrastecafe"
      },
      {
        "type": "vkontakte",
        "url": "https://vk.ru/zdrastecoffeebar"
      }
    ],
    "rating": 4.9,
    "ratingCount": 383,
    "reviewCount": 330,
    "priceRange": "Not Disclosed",
    "workingHours": "daily, 8:00 AM-10:00 PM",
    "openingHours": {
      "Monday": "08:00-22:00",
      "Tuesday": "08:00-22:00",
      "Wednesday": "08:00-22:00",
      "Thursday": "08:00-22:00",
      "Friday": "08:00-22:00",
      "Saturday": "08:00-22:00",
      "Sunday": "08:00-22:00"
    },
    "isOpenNow": "No",
    "openStatus": "Closed until 8:00 AM",
    "status": "open",
    "features": [
      {
        "name": "food delivery",
        "value": "Yes"
      },
      {
        "name": "coffee to go",
        "value": "Yes"
      }
    ],
    "goodPlaceAward": "No",
    "verifiedOwner": "Yes",
    "chainName": "Zdraste",
    "chainId": "42521361971",
    "logoUrl": "https://avatars.mds.yandex.net/get-altay/16823151/2a0000019962e2b1c7693ff77c5d4d0b093b/XXXL",
    "timezoneOffsetMinutes": 180,
    "geoId": 145714,
    "searchQuery": "coffee",
    "searchLocation": "Moscow",
    "photosCount": 126,
    "nearbyMetro": [
      {
        "station": "Rasskazovka",
        "distance": "1.23 km"
      },
      {
        "station": "Novoperedelkino",
        "distance": "2.79 km"
      },
      {
        "station": "Pykhtino",
        "distance": "2.83 km"
      }
    ],
    "reviewTopics": [
      {
        "topic": "Meal",
        "mentions": 225,
        "positive": 167,
        "neutral": 8,
        "negative": 50
      },
      {
        "topic": "Staff",
        "mentions": 188,
        "positive": 110,
        "neutral": 15,
        "negative": 63
      }
    ],
    "popularItems": [
      {
        "title": "Вафля с кремом и клубникой",
        "description": "Вафля со сливочным кремом, протертой клубникой и пудрой из малины.",
        "price": "550 ₽",
        "volume": ""
      },
      {
        "title": "Бифштекс с яйцом и пюре",
        "description": "Картофельное пюре, говяжья котлета, грибное рагу с яйцом-глазуньей и луком фри.",
        "price": "950 ₽",
        "volume": ""
      }
    ],
    "photos": [
      "https://avatars.mds.yandex.net/get-altay/20994058/2a000001a0dee585cb130adf69bbb160d3de/XXXL",
      "https://avatars.mds.yandex.net/get-altay/22321817/2a000001a0dee8808eb704d205f5a9c6623b/XXXL"
    ],
    "reviewsScraped": 3,
    "scrapedAt": "2026-10-23T21:28:03.224Z",
    "error": null
  },
  {
    "imageUrl": "https://avatars.mds.yandex.net/get-altay/16451941/2a0000019763e7f6606041649b51263a7d7b/XXXL",
    "type": "place",
    "name": "Surf Coffee x Flow",
    "oid": "69353267050",
    "url": "https://yandex.com/maps/org/surf_coffee_x_flow/69353267050/",
    "category": "Coffee shop",
    "categories": [
      "Coffee shop"
    ],
    "address": "Moscow, Strastnoy Boulevard, 8А",
    "city": "Moscow",
    "street": "Strastnoy Boulevard",
    "house": "8А",
    "postalCode": "107031",
    "country": "Russian Federation",
    "latitude": 55.766219,
    "longitude": 37.610433,
    "phone": "+7 (993) 337-56-86",
    "phones": [
      "+7 (993) 337-56-86"
    ],
    "website": "https://surfcoffee.ru/",
    "socialLinks": [
      {
        "type": "telegram",
        "url": "https://t.me/surfcoffeeru"
      }
    ],
    "rating": 4.9,
    "ratingCount": 1261,
    "reviewCount": 665,
    "priceRange": "Not Disclosed",
    "workingHours": "Mon-Fri 8:00 AM-11:00 PM; Sat,Sun 10:00 AM-11:00 PM",
    "openingHours": {
      "Monday": "10:00-23:00",
      "Tuesday": "08:00-23:00",
      "Wednesday": "08:00-23:00",
      "Thursday": "08:00-23:00",
      "Friday": "08:00-23:00",
      "Saturday": "08:00-23:00",
      "Sunday": "10:00-23:00"
    },
    "isOpenNow": "No",
    "openStatus": "Closed until 10:00 AM",
    "status": "open",
    "features": [
      {
        "name": "coffee to go",
        "value": "Yes"
      },
      {
        "name": "takeout",
        "value": "Yes"
      }
    ],
    "goodPlaceAward": "2026",
    "verifiedOwner": "Yes",
    "chainName": "Surf Coffee",
    "chainId": "200959754479",
    "logoUrl": "https://avatars.mds.yandex.net/get-altay/17783115/2a0000019d2b47e4c97d6cdf9ab0d89d32fe/XXXL",
    "timezoneOffsetMinutes": 180,
    "geoId": 120540,
    "searchQuery": "coffee",
    "searchLocation": "Moscow",
    "photosCount": 99,
    "nearbyMetro": [
      {
        "station": "Pushkinskaya",
        "distance": "155 m"
      },
      {
        "station": "Chekhovskaya",
        "distance": "191 m"
      },
      {
        "station": "Tverskaya",
        "distance": "340 m"
      }
    ],
    "reviewTopics": [
      {
        "topic": "Drinks",
        "mentions": 386,
        "positive": 314,
        "neutral": 16,
        "negative": 56
      },
      {
        "topic": "Staff",
        "mentions": 385,
        "positive": 313,
        "neutral": 25,
        "negative": 47
      }
    ],
    "popularItems": [
      {
        "title": "Вафельная трубочка со сгущенкой",
        "description": "",
        "price": "185 ₽",
        "volume": "1 pcs."
      },
      {
        "title": "Матча латте 0.3",
        "description": "",
        "price": "350 ₽",
        "volume": "300 ml"
      }
    ],
    "photos": [
      "https://avatars.mds.yandex.net/get-altay/16451941/2a0000019763e7f6606041649b51263a7d7b/XXXL",
      "https://avatars.mds.yandex.net/get-altay/16390227/2a000001987a05b3673143b57ae23974b017/XXXL"
    ],
    "reviewsScraped": 3,
    "scrapedAt": "2026-10-23T21:28:03.224Z",
    "error": null
  },
  {
    "imageUrl": "https://avatars.mds.yandex.net/get-altay/19838109/2a000001a14e0f43b7b5d12b029974763c81/XXXL",
    "type": "review",
    "reviewId": "kdL0PCDXEG5l4tj0DDpVy-5USZL-81w4L",
    "placeOid": "16246223071",
    "placeName": "Zdraste",
    "placeUrl": "https://yandex.com/maps/org/zdraste/16246223071/",
    "rating": 4,
    "text": "Приятное помещение, светло с высокими потолками. Приятный приветливый персонал.\nОтличный раф с хорошим балансом и приятным сливочным вкусом\nЯйцо бенедикт с форелью просто хорошее, порция небольшая, не хватило яркости вкуса, не зацепило. Яйцо хорошо приготовлено, растекается как надо. ",
    "language": "ru",
    "publishedAt": "2026-10-18T08:08:47.155Z",
    "authorName": "Павел Иванов",
    "authorLevel": "Level 30 Local Expert",
    "authorProfileUrl": "https://yandex.com/maps/user/zruuz.zenerzo/",
    "authorAvatarUrl": "https://avatars.mds.yandex.net/get-yapic/50595/RagMJQKW9NLDkcsH8dBnfmX8iMk-1/islands-200",
    "likes": 0,
    "dislikes": 0,
    "pinned": "No",
    "photos": [
      "https://avatars.mds.yandex.net/get-altay/19838109/2a000001a14e0f43b7b5d12b029974763c81/XXXL",
      "https://avatars.mds.yandex.net/get-altay/20760781/2a000001a14e0ea84873fe653d54d125f91d/XXXL"
    ],
    "videosCount": 0,
    "ownerReply": "Павел, здравствуйте!\n\nСпасибо за теплый отзыв и такие внимательные детали. Нам особенно приятно, что раф пришелся по душе - хороший баланс и сливочный вкус это то, к чему мы стремимся. Рады, что яйцо бенедикт приготовили как надо, и что вам было светло и уютно у нас. Спасибо, что...",
    "ownerReplyAt": "2026-10-19T11:46:28.056Z",
    "scrapedAt": "2026-10-23T21:28:03.224Z",
    "error": null
  }
]
```

Fields Yandex does not publish for a place, such as a website or a price, read `Not Disclosed`. A review without an owner answer has `ownerReply` set to `N/A`. A row that could not be read carries only an `error` message and is never charged.

### ✨ Why choose this Actor

- **Past the thousand-result wall.** Yandex serves about 1,000 slots per search. The Actor splits the area into quarters and de-duplicates by place ID.
- **Reviews are their own rows.** Load places and reviews into two tables and join on `placeOid`. Yandex serves 600 reviews per place and ordering, and the Actor merges four orderings when you ask for more.
- **Any city, any language.** Names in Latin, Cyrillic and Turkish spelling resolve to the same area.
- **Filters Yandex applies itself.** Minimum rating and the Good Place badge are sent to Yandex, so only matching places are read and billed.
- **Pay for what you switch on.** Places, reviews and place details are separate pay-per-event items. Reviews and details are off unless you ask.
- **No browser, no key.** Plain HTTP, 512 MB of memory, and it rotates to a new session if Yandex ever shows its captcha.

### 📈 How it compares to alternatives

| | This Actor | Typical Yandex Maps scraper | Manual browsing |
| --- | --- | --- | --- |
| Places by keyword and city | ✅ | ✅ | ✅ one at a time |
| Place by link or ID | ✅ | ✅ | ✅ |
| Reviews as separate rows | ✅ any sort, star filters | Sometimes, capped near 50 | ✅ one at a time |
| Splits big areas to pass 1,000 results | ✅ | Not documented | ❌ |
| Rating and Good Place filters | ✅ | Sometimes | ✅ |
| Nearby metro, review topics, menu items | ✅ optional | Rarely | ✅ one at a time |
| Business emails | ❌ Yandex does not publish them | ❌ | ❌ |

### 🚀 How to use

1. Create a free Apify account. New accounts get $5 in free credit: [sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the Yandex Maps Scraper and click **Try for free**.
3. Enter search terms and locations, or paste Yandex Maps links or place IDs.
4. Set **Max Items** and, if you want reviews, **Reviews per place**.
5. Optionally set a minimum rating, the Good Place filter, a language or place details.
6. Click **Start** and watch the run log.
7. Open the **Storage** tab and download CSV, Excel, JSON or XML, or read the rows through the Apify API.

Input examples:

```json
{ "searchTerms": ["coffee"], "locations": ["Moscow", "Istanbul"], "minRating": "gt4.5", "maxItems": 500, "maxReviewsPerPlace": 5 }
```

```json
{ "placeIds": ["157006699286"], "maxReviewsPerPlace": 1000, "minReviewRating": 1, "maxReviewRating": 2 }
```

```json
{ "searchTerms": ["кофейня"], "coordinates": "37.6177,55.7558", "viewportSpan": "0.05,0.03", "language": "ru_RU", "includeDetails": true }
```

Free Apify plans return up to 10 places with up to 10 reviews each as a preview. Paid plans return as many as Yandex holds for your keywords and areas.

### 💼 Business use cases

#### Lead lists

Search pharmacy, dentist or auto service in any city and export names, phones, websites and Telegram, VK or WhatsApp links. Keep only places rated 4.5 and above.

#### Market mapping

Count and rate every cafe or clinic in a district. Set a search center and area size to work block by block, and read price ranges and amenities for segmentation.

#### Reputation tracking

Pull the newest reviews of every branch of a chain, or only the 1 and 2 star ones, and keep the owner's reply and its date.

#### Model training

Reviews arrive with language, stars and date, so they load straight into sentiment, topic and retrieval pipelines.

### 🔌 Automating Yandex Maps Scraper

- **Make and Zapier**: run the Actor on a schedule and push new low-star reviews into a sheet or a ticket.
- **Slack**: post an alert when a branch gets a 1 star review.
- **Airbyte**: sync places and reviews into a warehouse and join them on `placeOid`.
- **GitHub Actions**: run weekly and commit the CSV so a rating history builds itself.
- **Google Drive**: drop each export into a shared folder for the sales team.
- **Apify Scheduler**: run daily, weekly or hourly with no external tooling.

### 🌟 Beyond business use cases

- **Research**: study how rating, price level and amenities vary across districts.
- **Personal**: find the best rated coffee shop near a metro station before a trip.
- **Non-profit**: map pharmacies or clinics open on weekends for a community guide.
- **Experimentation**: build a Russian-language review corpus with star labels.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant:

> I am using the Yandex Maps Scraper on Apify. It returns place rows with name, address, latitude, longitude, phones, website, rating, ratingCount, reviewCount and openingHours, and review rows with rating, text, publishedAt, authorName and ownerReply linked by placeOid. Help me design an analysis that finds the best rated pharmacies per district in one city.

### ❓ Frequently Asked Questions

#### 🔑 Do I need a Yandex API key or account?

No. The Actor reads the public Yandex Maps feed. There is nothing to sign up for and no key to paste.

#### 🌍 Can I search a city by its name in any language?

Yes. Moscow, Москва, İstanbul and Алматы all work, and you can add several locations to one run.

#### 🔗 Can I paste a Yandex Maps link?

Yes. yandex.com, yandex.ru, yandex.com.tr, yandex.kz and yandex.by links work. A place page returns that place and a search page runs that search over the link's area. Short `yandex.com/maps/-/...` links are not supported.

#### 💬 Are reviews part of the place row?

No. Each review is its own row with `type` set to `review` and the place ID in `placeOid`.

#### ⭐ Can I get only the bad reviews?

Yes. Set the maximum review rating to 2 and, if you like, sort by lowest.

#### 📦 How many reviews can I collect per place?

Yandex serves at most 600 reviews per place in any one ordering. For a place with more, the Actor merges four orderings by review ID. One restaurant with 9,040 reviews gave 1,500 unique ones.

#### 🔢 Why do I get fewer places than I asked for?

Yandex returns about 1,000 slots per search and ranks results with signals that change between calls. A small district or a rare keyword simply has fewer places. Add more search terms, a wider area or more locations.

#### 🏙 Why does `city` sometimes read Not Disclosed?

Some Moscow addresses come from Yandex without a locality part. The `address` column always carries the full text.

#### 📧 Does it return business emails?

No. Yandex Maps does not publish business emails on the public place page.

#### 🛑 What if Yandex shows a captcha?

The Actor does not solve captchas. In cloud runs with no proxy, with datacenter proxies and with Russian residential proxies none appeared. If one does, the Actor opens a new session on a new address and reports how many it rotated.

#### 🖼 Why is `photos` limited to 10 links?

Yandex serves ten photo links with the place page. `photosCount` still reports the real total.

#### 💵 How is it billed?

Pay per event: one event per place, one per review and, only when switched on, one per place with details. Rows that carry an error are free. The current prices are on the Actor's Pricing tab.

### 🔌 Integrate with any app

Every run writes to an Apify dataset you can read over the REST API, stream into a webhook, or export as CSV, Excel, JSON or XML. Apify's integrations cover Make, Zapier, Airbyte, Slack, Google Drive, GitHub, Google Sheets and plain HTTP webhooks, so the rows land wherever your team already works.

### 🔗 Recommended Actors

- [Google Maps Scraper](https://apify.com/parseforge/google-maps-scraper) for places, phones, ratings and details from Google Maps.
- [Google Maps Reviews Scraper](https://apify.com/parseforge/google-maps-reviews-scraper) for review rows from Google Maps.
- [Yelp Scraper](https://apify.com/parseforge/yelp-scraper) for local business listings and reviews from Yelp.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more scrapers.

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** This is an independent tool and is not affiliated with, endorsed by, or connected to Yandex. It collects only publicly available data. You are responsible for using it in line with Yandex's terms and applicable laws, including GDPR. Do not use it to identify, profile or target individuals.

# Actor input Schema

## `searchTerms` (type: `array`):

What to look for, the way you would type it in the Yandex Maps search bar: 'coffee', 'pharmacy', 'hotel', 'кофейня'. Each term runs as its own search in every location.

## `locations` (type: `array`):

Cities, districts or countries to search in, in any language: 'Moscow', 'Istanbul', 'Алматы', 'Minsk'. The Actor resolves each name to its map area on Yandex Maps and searches inside it. Leave empty when you use coordinates.

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

Yandex Maps links (yandex.com, .ru, .com.tr, .kz or .by). Place pages (.../maps/org/name/1234567890/) return that place. Search links (.../maps/213/moscow/search/coffee/) run that search over the area of the link.

## `placeIds` (type: `array`):

Yandex organization IDs (the number at the end of a place link, for example 157006699286). One row per ID.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000. Counts places; reviews are added on top, per place, with the limit below.

## `coordinates` (type: `string`):

Optional exact center to search around, as longitude,latitude (for example 37.6177,55.7558 for central Moscow). Used together with the search area size below. Combines with Locations.

## `viewportSpan` (type: `string`):

Width and height of the area around the search center, in degrees. 0.01,0.01 is about 1 km (a block), 0.1,0.1 about 10 km (a city center). Default 0.2,0.15.

## `minRating` (type: `string`):

Only places with at least this Yandex rating (out of 5).

## `goodPlaceOnly` (type: `boolean`):

Only places holding Yandex's yearly 'Good Place' award.

## `sortBy` (type: `string`):

Relevance is Yandex's default ranking. Closest first orders results by distance from the center of the area (approximate) and turns off the automatic area splitting.

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

Language of addresses, categories, features and opening hours. Review texts stay in the language the reviewer wrote them in.

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

How many reviews to collect for each place. 0 turns reviews off. Each review is one extra row (type = review). Yandex serves at most 600 reviews per place per ordering; above that the Actor merges other orderings. Free users: up to 10 per place.

## `reviewsSort` (type: `string`):

Order in which Yandex serves each place's reviews. With a limit per place, this picks which ones you get.

## `minReviewRating` (type: `integer`):

Keep only reviews with at least this many stars (1 to 5). 0 keeps all.

## `maxReviewRating` (type: `integer`):

Keep only reviews with at most this many stars (1 to 5). 0 keeps all. Use 1 to 2 to collect complaints.

## `includeDetails` (type: `boolean`):

Opens each place's full page to add photos (up to 10 links and the total count), nearby metro stations, review topics with sentiment counts, popular menu items with prices and the Good Place award year. Billed as an extra event per place.

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

Yandex answers most addresses. If a run reports blocks, switch on Apify Proxy (residential works best).

## Actor input object example

```json
{
  "searchTerms": [
    "coffee"
  ],
  "locations": [
    "Moscow"
  ],
  "maxItems": 10,
  "viewportSpan": "0.2,0.15",
  "minRating": "",
  "goodPlaceOnly": false,
  "sortBy": "relevance",
  "language": "en_US",
  "maxReviewsPerPlace": 5,
  "reviewsSort": "newest",
  "minReviewRating": 0,
  "maxReviewRating": 0,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields of places and reviews

## `fullData` (type: `string`):

Complete dataset with all 63 fields

# 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 = {
    "searchTerms": [
        "coffee"
    ],
    "locations": [
        "Moscow"
    ],
    "maxItems": 10,
    "viewportSpan": "0.2,0.15",
    "maxReviewsPerPlace": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/yandex-maps-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 = {
    "searchTerms": ["coffee"],
    "locations": ["Moscow"],
    "maxItems": 10,
    "viewportSpan": "0.2,0.15",
    "maxReviewsPerPlace": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/yandex-maps-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 '{
  "searchTerms": [
    "coffee"
  ],
  "locations": [
    "Moscow"
  ],
  "maxItems": 10,
  "viewportSpan": "0.2,0.15",
  "maxReviewsPerPlace": 5
}' |
apify call parseforge/yandex-maps-scraper --silent --output-dataset

```

## MCP server setup

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