# Yandex Maps Scraper | Парсер Яндекс Карт - Leads & Reviews (`zen-studio/yandex-maps-scraper`) Actor

Unofficial Yandex Maps API. Scrape business data, phone numbers, emails, reviews, photos, and posts from Russia, Turkey, and CIS. Export 80 fields to Excel, JSON, or CSV. No browser needed — fast, unlimited, and pay-per-result. Includes AI review summaries and full menu prices.

- **URL**: https://apify.com/zen-studio/yandex-maps-scraper.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Lead generation, Automation, Travel
- **Features:** Limited permissions
- **Stats:** 1,323 total users, 133 monthly users, 99.8% runs succeeded, 10 bookmarks
- **User rating**: 3.59 out of 5 stars

## Pricing

from $4.99 / 1,000 places

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 Scraper — Phones, Emails & Reviews | Парсер Яндекс Карт (2026)

[![Yandex Maps. Phones. Emails. Leads.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/yandex-maps-scraper-readme-hero-v1.png)](https://console.apify.com/actors/fRSgBvgbsRB4o7t30/input)

От <strong>Zen Studio</strong> — создателей парсеров <a href="https://apify.com/zen-studio/yandex-market-scraper-parser">Yandex</a>, <a href="https://apify.com/zen-studio/2gis-places-scraper-api">2GIS</a>, <a href="https://apify.com/zen-studio/ozon-scraper-pro">Ozon</a>, <a href="https://apify.com/zen-studio/avito-listings-scraper">Avito</a>, <a href="https://apify.com/zen-studio/wildberries-scraper">Wildberries</a>.<br>From Zen Studio, creators of scrapers across these leading Russian platforms.

### Почему этот актор? / Why choose this actor?

<strong>Контакты для вашей базы. / Contacts for your lead list.</strong><br>Получайте телефоны, сайты, адреса и социальные ссылки. Включите сбор дополнительных данных для email, опубликованных организацией.<br>Get phone numbers, websites, addresses and social links. Enable business enrichment to collect published email addresses where available.

<strong>Несколько запросов, одна база. / Multiple keywords. One deduplicated list.</strong><br>Ищите организации по нескольким запросам в одном городе. Повторно найденное место возвращается и оплачивается один раз за запуск.<br>Search several keywords in your target city. A place found by multiple queries is returned and billed once per run.

<strong>Все филиалы сети по всей стране. / Every branch of a chain, nationwide.</strong><br>Один запуск вместо десятков по городам. Укажите сеть и выберите «Вся страна» — актор обойдёт города и посёлки по всей России и соберёт филиалы в один список без дублей.<br>One run instead of one per city. Name the chain, set <strong>Search area</strong> to <em>Whole country</em>, and the actor works through towns across Russia, merging every branch it finds into a single deduplicated list.

<strong>№1 по запросам «Yandex», «Ozon» и «Avito». / #1 for “Yandex”, “Ozon” and “Avito”.</strong><br>Акторы Zen Studio заняли первое место по каждому из этих запросов в Apify Store по релевантности. По запросу «Yandex Maps» первые два места заняли этот актор и наш <a href="https://apify.com/zen-studio/yandex-maps-reviews-scraper">Yandex Reviews</a>.<br>Zen Studio actors have ranked first for each of these searches by Apify Store relevance. For “Yandex Maps”, this actor and our Reviews scraper have occupied both top positions.

<a href="https://console.apify.com/actors/fRSgBvgbsRB4o7t30/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/yandex-maps-scraper-readme-cta-v1.svg" width="320" height="48" alt="Найти контакты / Find contacts"/></a>

### Быстрый старт / Quick start

Email включён в примере и оплачивается дополнительно. Телефоны и email доступны не у всех организаций. Отзывы отключены для компактной выгрузки контактов.<br>Email enrichment is enabled and costs extra. Phone numbers and emails depend on what each business publishes. Reviews are disabled for a compact contact export.

```json
{
  "query": [
    "кафе",
    "кофейня"
  ],
  "location": "Moscow",
  "maxResults": 10,
  "enrichBusinessData": true,
  "includeReviews": false
}
```

<a href="https://console.apify.com/actors/fRSgBvgbsRB4o7t30/input">Открыть ввод / Open actor input</a>. Укажите свои запросы и город. / Set your keywords and city.

Лимит 10 мест общий для всех запросов. Бесплатный тариф: до 10 мест за запуск и 100 мест за всё время; после этого нужен платный тариф Apify.<br>The 10-place limit is shared across both queries. Free plans allow up to 10 places per run and 100 lifetime; further collection requires a paid Apify plan.

<table><tr><td colspan="3" style="padding:10px 14px;background:#FF4433;color:#171717;font-size:13px;font-weight:700">Zen Studio · Maps &amp; Business Data</td></tr><tr><td style="padding:10px 12px;border:1px solid #E7E5E4;background:#FFDED8;vertical-align:top;width:33.33%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-fRSgBvgbsRB4o7t30-UkaIbH1Yhq-yandex-maps-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/yandex-maps-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Yandex Maps</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Вы здесь</span></td><td style="padding:10px 12px;border:1px solid #E7E5E4;background:#FFF0EE;vertical-align:top;width:33.33%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-dzSQ0CtgXCkq4plWf-XSrOzhkglt-yandex-maps-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/yandex-maps-reviews-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Yandex Reviews</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Reviews &amp; replies</span></td><td style="padding:10px 12px;border:1px solid #E7E5E4;background:#FFF0EE;vertical-align:top;width:33.33%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-5bSvAQKSK3LPq9OXb-AgVhcT1mQC-apple-maps-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/zen-studio/apple-maps-scraper-pro" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Apple Maps</a></span><br><span style="color:#57534E;font-size:12px;white-space:nowrap">Business contacts</span></td></tr></table>

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
zen-studio/yandex-maps-scraper on Apify: Yandex Maps places in Russia, Turkey and the CIS, 80 fields per place including phones, address, hours, rating and 50 reviews. Search with query (array) plus location (a city in any language; Moscow when omitted; coordinates overrides it); one run covers one city, so run once per city for several. maxResults (default 100) is a budget for the whole run shared by all queries, 0 = unlimited. For specific places use businessIds or startUrls instead of query. For a company's branches set filterChainId to chain names such as Пятёрочка, or to a Yandex Maps URL of any one of its branches; list several companies there to get them all in one run, and raise maxResults enough to cover all of them because they share one budget and a starved company returns no rows. For a company's branches across all of Russia rather than one city set searchScope=country (needs filterChainId; Location must be a Russian city; reviews stay on unless includeReviews=false and should be turned off at this volume, the off-by-default only applies when the field is omitted entirely; moreResultsAvailable is null on every row because completeness is not knowable; a RUN_SUMMARY record in the key-value store gives placesReturned, stopReason and any companies that returned nothing). For certain categories set filterCategories to slugs from the input schema enum such as dental_clinic or hotel, not numeric IDs. Emails, AI review summary, full menu and related places need enrichBusinessData=true, charged extra per place, and email only appears where the business lists one. language (ru, en, tr, uk, kk) sets output language; set includeReviews=false for large runs; photos and posts need maxPhotos or maxPosts above 0; excludeBusinessIds skips places you already have. Charged per place (from $0.00699, less on higher Apify plans) plus a small start fee; free plans get 10 places per run and 100 in total. Input schema and README: https://api.apify.com/v2/actors/zen-studio~yandex-maps-scraper/builds/default · Pricing: https://apify.com/zen-studio/yandex-maps-scraper/pricing To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### What You Get

**Contacts and B2B Leads** — phone numbers, email addresses (via enrichment), website URLs, and social media links for every business. **Export Yandex Maps to Excel** or CSV for direct CRM import.

**80 fields per place** — identity, location, contacts with dialable numbers, ratings, working hours, 100+ business features, categories, chain/franchise info with branch counts, booking links, metro stations, legal entity data (company name + tax ID), promotions, promoted products, events, and street panoramas with preview images.

| Category | Key Fields | Description |
|----------|------------|-------------|
| **IDs & Metadata** | `businessId`, `url`, `type` | Unique identifiers and Yandex Maps URLs |
| **Contact Info** | `phones`, `phonesDetailed`, `website`, `socialLinks` | Direct contact details, each phone also as a dialable number with its department label. Emails via enrichment |
| **Categories & Chain** | `categories`, `categoryIds`, `chainName`, `chainId`, `chainBranchesInCity` | Category names with matching IDs, chain membership and branch counts |
| **Location** | `address`, `city`, `latitude`, `longitude` | Precise coordinates and structured address (country, region, city, street, house) |
| **Performance** | `rating`, `reviewCount`, `ratingCount`, `viewCount` | Popularity and feedback metrics — `reviewCount` (text reviews) vs `ratingCount` (total star ratings) |
| **Content** | `reviews`, `photos`, `posts` | User-generated content, photos, and news posts |
| **Features** | `features` object | 100+ attributes: Wi-Fi, delivery, credit cards, outdoor seating, etc. |
| **Schedule** | `workingHours`, `isOpenNow` | Structured weekly schedule and current status |
| **Legal** | `legalInfo` | Tax ID (INN) and official legal entity name (OOO/IP) |

**50 reviews per place** (included by default, set `includeReviews: false` to skip) — full text, author name, rating, photos, videos, business reply, like/dislike counts. Sorted by relevance. Language setting controls which reviews surface first.

**Photos and posts** (optional) — high-resolution photo URLs with tags and dimensions. Business posts/news with full text, publication dates, and attached media.

**Whole-country chain collection** (optional) — name a chain and set **Search area** to *Whole country* to collect its branches across Russia in one deduplicated run, instead of running once per city. Russia only for now.

**Enrichment** (optional) — email address, AI-generated review summary, full delivery menu with prices, related businesses nearby, hourly foot traffic patterns, booking availability, and trust/sentiment breakdown.

***

### Quick Start — Быстрый старт

#### Minimal — one input, that's it

```json
{
    "query": ["restaurant"],
    "location": "Moscow"
}
```

#### With filters — top-rated cafes with Wi-Fi and delivery in Istanbul

```json
{
    "query": ["cafe"],
    "location": "Istanbul",
    "maxResults": 500,
    "filterRating": "gt4.5",
    "filterWifi": true,
    "filterDelivery": true,
    "language": "tr"
}
```

#### With reviews, photos, and enrichment

```json
{
    "query": ["hotel"],
    "location": "Sochi",
    "maxResults": 200,
    "maxPhotos": 20,
    "maxPosts": 10,
    "enrichBusinessData": true,
    "language": "en"
}
```

#### From Yandex Maps URLs — paste and scrape

```json
{
    "startUrls": [
        {"url": "https://yandex.com/maps/org/pushkin/1018907821/"},
        {"url": "https://yandex.com/maps/213/moscow/search/sushi/"}
    ],
    "maxResults": 100,
    "maxPhotos": 10
}
```

#### Direct business IDs — no search needed

```json
{
    "businessIds": ["1018907821", "1017517628"],
    "enrichBusinessData": true,
    "maxPhotos": 50
}
```

***

### Парсинг Яндекс Карт — сбор базы организаций, телефонов, отзывов

Этот инструмент заменяет ручной сбор данных из Яндекс Карт. Вместо покупки устаревших баз или копирования вручную, вы получаете актуальные данные: телефоны, email, сайты, адреса, рейтинги, отзывы, фото и меню доставки — в структурированном JSON или CSV, готовом для CRM-импорта или аналитики.

Покрытие: Россия, Турция, Казахстан, Беларусь, Украина, Узбекистан, Грузия, Азербайджан и другие страны СНГ и Центральной Азии. Поиск работает на любом языке — русском, английском, турецком, казахском, украинском.

#### Türkiye'de İşletme Verileri — Yandex Harita Kazıyıcı

Yandex Harita, Türkiye'nin en çok kullanılan navigasyon uygulamasıdır ve 5,6 milyondan fazla kullanıcıya sahiptir. Bu araç, Yandex Harita'daki tüm işletme verilerini otomatik olarak toplar — telefon numaraları, e-posta adresleri, adresler, puanlar, yorumlar, fotoğraflar ve çalışma saatleri dahil. 63 alan, işletme başına 50 yorum otomatik olarak dahildir.

**Desteklenen şehirler:** İstanbul, Ankara, Antalya, İzmir, Bursa, Adana, Gaziantep, Konya, Mersin ve Türkiye genelindeki tüm şehirler.

**Kullanım alanları:**

- **Müşteri adayı oluşturma** — Restoran, kuaför, oto tamir gibi kategorilerde telefon ve e-posta toplayın. CSV olarak dışa aktarın, CRM'inize aktarın.
- **Rakip analizi** — Belirli bir bölgedeki tüm rakip işletmelerin puanlarını, yorumlarını ve fiyatlarını karşılaştırın.
- **Yerel SEO** — Şehirdeki tüm işletmeleri indirerek pazar büyüklüğünü ve boşlukları analiz edin.

Tarayıcı veya Yandex hesabı gerekmez. JSON, CSV veya Excel olarak dışa aktarın. Dil ayarını `"tr"` yaparak Türkçe adres, kategori ve yorumları alın.

```json
{
    "query": ["restoran"],
    "location": "Istanbul",
    "language": "tr",
    "maxResults": 500
}
```

***

### Input Parameters — Входные параметры

#### Search — Поиск

| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `query` | array | Search queries. Put **all your keywords in one run**: results are merged and deduplicated across queries, so a place found by three keywords is returned once and billed once | **Required** |
| `category` | string | Quick category dropdown — adds an optimized query for best results | None |
| `startUrls` | array | Yandex Maps URLs — business pages, short share links (`/maps/-/CODE`), or search result URLs | None |
| `businessIds` | array | Direct numeric business IDs from Yandex Maps URLs | None |
| `excludeBusinessIds` | array | Business IDs to skip. Pass what you already collected in earlier runs to get, and pay for, only places that are new to you | None |
| `maxResults` | integer | Max places for the **whole run**, shared across all queries, not per query. 10 queries with `maxResults: 100` return 100 places in total, not 1,000. `0` = unlimited | `100` |

30 quick categories available: Restaurants, Cafes, Fast food, Coffee shops, Bars, Sushi, Pizza, Hotels, Pharmacies, Banks, Gas stations, Beauty salons, Fitness, Hospitals, Dentists, and more.

#### Location — Местоположение

| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `location` | string | City name in any language — Moscow, Стамбул, München, all work | `"Moscow"` |
| `coordinates` | string | Exact center as `longitude,latitude`. Overrides location | None |
| `viewportSpan` | string | Search area size as `dLon,dLat` (e.g. `0.5,0.3`) | Auto |
| `language` | string | Output language: `ru`, `en`, `tr`, `uk`, `kk` | `"ru"` |

#### Filters — Фильтры

20+ filters available: `filterRating` (gt4.9 to gt3.0), `filterOpenNow`, `filterOpen24h`, `filterDelivery`, `filterTakeaway`, `filterWifi`, `filterCardPayment`, `filterParking`, `filterPetFriendly`, `filterWheelchairAccess`, `filterGoodPlace`, `filterMichelin`, `filterBusinessLunch`, `filterSummerTerrace`, `filterCuisine` (array — italian, japanese, georgian...), `filterPriceCategory` (low/average/above_average/high), `filterPriceMin`/`filterPriceMax`, `filterCategories` (pick from 1,650+ categories by name, e.g. `dental_clinic`, `beauty_salon`, `hotel`), `filterChainId` (chain names like `Пятёрочка`), and `customFilters` for raw key:value filter strings.

#### Sort — Сортировка

| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `sortBy` | string | `distance` or empty for relevance | Relevance |
| `sortOrigin` | string | Origin point for distance sort (`lon,lat`) | None |

#### Enrichment — Обогащение данных

| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `includeReviews` | boolean | Include 50 most-relevant reviews per place. Turn off for large runs (1000+ places) to keep dataset size manageable for n8n, Google Sheets, etc. | `true` |
| `enrichBusinessData` | boolean | Fetch email, AI review summary, full menu, related places, foot traffic | `false` |
| `maxPhotos` | integer | Photos per place. `0` = skip | `0` |
| `maxPosts` | integer | Posts/news per place. `0` = skip | `0` |

Reviews (50 most relevant) are included automatically at no extra cost. Set `includeReviews: false` if you only need business data and want a smaller dataset.

***

### Search Tips — Как искать правильно

Think like a user searching on Yandex Maps. The scraper works best with **Category + City** or **Specific Intent** queries.

| Goal | Query Example | Notes |
|------|---------------|-------|
| **Broad Category** | `restaurants in Moscow` | Good for bulk data. Returns mixed results. |
| **Specific Niche** | `specialty coffee near Nevsky Prospect` | Highly targeted. Good for finding competitors. |
| **Chain Business** | `Dodo Pizza Astana` | Finds all locations of a specific chain. |
| **Service & Area** | `dentist in Besiktas Istanbul` | Excellent for service-based lead gen. |
| **Multiple Types** | `bars and pubs in Minsk` | You can combine terms. |
| **Russian Queries** | `строительные магазины, Екатеринбург` | Native language queries yield **20-30% more results**. |

💡 **Pro Tip:** Always include the city or district name in your `query` or `location` field.

#### Collect every branch of a chain

Put the chain name in **Chains** (`filterChainId`) and every result is a branch of that chain. Names are matched automatically, no ID lookup needed:

```json
{
  "query": ["Пятёрочка"],
  "location": "Moscow",
  "filterChainId": ["Пятёрочка"],
  "maxResults": 2000
}
```

Branches come back as separate rows with their own address, phone, hours, rating and reviews. Each row also carries `chainName`, `chainId` and `chainSlug`. **`chainId` is the join key**: it is what ties every branch row back to the company it belongs to, so keep it when you split the dataset per company. Large chains additionally report `chainBranchesInCity`, the branch count in the searched city, which tells you how high to set **Max results**; smaller chains leave it empty. Pass `chainId` instead of the name when you want an exact match.

Note that **Start URLs** and **Business IDs** return only the places you listed, not their chains. To go from a page to its chain, put the URL in **Chains** instead — see below.

#### Branches for many companies in one run

**Chains** also accepts a Yandex Maps page of any one branch. Paste one URL per company and a single run returns every company's branches, each row labelled with `chainName` and `chainId`. No ID lookup, and no separate run per company:

```json
{
  "query": ["магазин"],
  "location": "Moscow",
  "filterChainId": [
    "https://yandex.com/maps/org/leningradskiye_kukhni/80416719747/",
    "Додо Пицца",
    "6003206"
  ],
  "maxResults": 2000
}
```

Branch URLs, chain names and `chainId` values can be mixed in the same list.

**Telling the results apart afterwards:** group the rows by `chainId`, which every row carries. To know which of your input lines a `chainId` belongs to, read the run log: each company is reported as it resolves, a pasted URL by the business ID it contains (`Chain from 35556554440 matched 'Лайв Сервис' (chainId 20084089835)`) and a name or ID by what you typed. A company that returned nothing has no rows to group, so the log is also the only place it appears. A **Search query** is still required, but it barely narrows anything once **Chains** is set, so a broad word like `магазин` or `shop` works for any kind of business.

⚠️ **Max results is one budget for the whole run, shared by every company in the list.** Results come back ranked, so a large chain can spend the entire budget before a small one is reached, and that company returns no rows at all. Set it to roughly the total number of branches you expect across all the companies. The run log names any company that came back empty, so check it before concluding a company has no branches in the area.

#### Branches across the whole country

**One run instead of one per city.** A chain like Пятёрочка has branches in thousands of Russian towns. A normal search is anchored to one city, so collecting them all means running the actor once per city and choosing the cities yourself, with no way to know which towns you missed.

Set **Search area** to *Whole country* and the actor works through town centres across Russia instead, merging everything it finds into one deduplicated list. You get the chain's national footprint in a single dataset: every branch with its own address, phone, coordinates, rating, working hours and `chainId`.

It needs **Chains**, and **Location** only decides which country is searched, not which part of it, so any Russian city will do.

```json
{
  "query": ["магазин"],
  "location": "Moscow",
  "searchScope": "country",
  "filterChainId": ["Теремок"],
  "maxResults": 2000
}
```

Before you start a large one:

- **Set Max results and a maximum cost per run.** A whole-country run returns far more places than a city run and takes much longer.
- **Turn reviews off.** The **Include reviews** toggle is on by default, and 50 reviews per place is a great deal of work at this volume: it slows the run considerably and can mean fewer branches found before the run reaches its limits. Calling the actor from code without the field at all already defaults it off for whole-country runs.
- **Available in Russia only** for now.

What the run tells you when it finishes:

- **A `RUN_SUMMARY` record** is saved to the key-value store, outside your results. It records how many places came back, why the run stopped, and which requested companies returned nothing.
- **It never claims to have found everything.** `coverageStatus` is always `unverified` and `moreResultsAvailable` is `null` on every row, both deliberately: a whole-country run cannot tell "this company has no more branches" from "no town we searched was near one", so it does not answer the question rather than answering it wrongly.

#### Maximize coverage

On Yandex Maps, "кафе" is an umbrella category that includes restaurants, cafes, bars, and coffee shops. Searching "кафе" in Moscow returns **23,000+ unique places** — 3x more than "рестораны" (7,500).

| Query | Moscow results | Notes |
|-------|---:|-------|
| `кафе` | ~23,000 | Broadest food/drink term — includes restaurants |
| `рестораны` | ~7,500 | Subset of кафе (91% overlap) |
| `аптеки` | ~5,000+ | Pharmacies |
| `стоматология` | ~3,000+ | Dentists |

Use multiple queries for **distinct** categories (e.g., `["аптеки", "стоматология", "медицинский центр"]`). `maxResults` is the budget for the run as a whole, so raise it when you add keywords — the queries run in order and share it. For overlapping categories ("рестораны" + "кафе"), the second query adds <3% extra. Set `maxResults` to `0` for unlimited. The `category` dropdown automatically uses optimized Russian queries.

#### Don't pay twice for the same place

Put every keyword in **one run**, not one run per keyword. Results are merged and deduplicated across all queries in a run, so a place that three keywords return is delivered once and charged once.

```json
{
  "query": ["аптека", "аптечная сеть", "аптека 24 часа"],
  "location": "Владивосток",
  "maxResults": 0
}
```

Running those three keywords as three separate runs returns the overlap three times, and charges for it three times.

Coming back later with new keywords? Pass the IDs you already have in `excludeBusinessIds`. Those places are skipped before they are scraped, so `maxResults` is spent only on places that are new to you, and you are not charged for the ones you already own.

```json
{
  "query": ["аптека дежурная"],
  "location": "Владивосток",
  "excludeBusinessIds": ["1031731359", "1018907821"]
}
```

Each search result also carries `moreResultsAvailable`:

- **`false`** — the search was exhausted. You have every place Yandex serves for that query and area, and running again returns nothing new.
- **`true`** — more results may remain, so running again with a higher `maxResults` (and the IDs you already have in `excludeBusinessIds`) is worth doing. This covers hitting your `maxResults`, hitting your cost limit, and the rarer case where the source stops serving results before the area is fully covered. It is deliberately cautious: where a run cannot be certain it finished, it says `true`, so an occasional re-run comes back empty. `false` is the value that is never guessed.
- **`null`** — the record came from a direct business ID or URL lookup, which has no search behind it and therefore nothing to exhaust.

⚠️ **The value belongs to the query that produced the row, not to the whole run.** With several search queries in one run, each one answers for itself, so a dataset can legitimately contain both values: one keyword ran out while another still had more. Read it per `searchQuery` rather than taking any single row as the answer for the run.

***

### Output Example — Пример выходных данных

Each place produces a structured JSON record with 80 fields. Real output for [Cafe Pushkin](https://yandex.com/maps/org/pushkin/1018907821/) (enrichment enabled, 10 photos, 5 posts):

```json
{
  "businessId": "1018907821",
  "title": "Pushkin",
  "rating": 4.9,
  "reviewCount": 5913,
  "ratingCount": 15055,
  "phones": ["+7 (495) 739-00-33"],
  "website": "https://cafe-pushkin.ru/",
  "email": "banquet@cafe-pushkin.ru",
  "legalInfo": {
    "name": "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"МОНЕ\"",
    "taxId": "7703210406"
  }
  // + 71 more fields...
}
```

```json
{
  "businessId": "1018907821",
  "title": "Pushkin",
  "description": "Moscow, Tverskoy Boulevard, 26А",
  "type": "business",
  "url": "https://yandex.com/maps/org/pushkin/1018907821/",
  "searchQuery": "direct",
  "moreResultsAvailable": null,
  "longitude": 37.60493,
  "latitude": 55.763722,
  "address": "Moscow, Tverskoy Boulevard, 26А",
  "country": "Russian Federation",
  "region": "",
  "city": "Moscow",
  "street": "Tverskoy Boulevard",
  "house": "26А",
  "postalCode": "125009",
  "status": "open",
  "isOpenNow": true,
  "isVerifiedOwner": true,
  "rating": 4.900000095367432,
  "ratingsCount": 5913,
  "ratingCount": 15055,
  "reviewAspects": [
    {
      "id": "3502043738",
      "name": "Meal",
      "count": 4145,
      "positive": 3449,
      "neutral": 203,
      "negative": 493
    },
    {
      "name": "Staff",
      "count": 2708,
      "positive": 1945,
      "neutral": 253,
      "negative": 510
    },
    {
      "name": "Atmosphere",
      "count": 2028,
      "positive": 1830,
      "neutral": 63,
      "negative": 135
    }
  ],
  "categories": [
    "Restaurant",
    "banquet hall",
    "cafe"
  ],
  "categoryIds": [
    "184106394",
    "184106146",
    "184106390"
  ],
  "phones": [
    "+7 (495) 739-00-33"
  ],
  "phonesDetailed": [
    {
      "number": "+7 (495) 739-00-33",
      "dialable": "+74957390033",
      "type": "phone",
      "label": "Reception"
    }
  ],
  "website": "https://cafe-pushkin.ru/",
  "socialLinks": [
    {
      "type": "telegram",
      "url": "https://t.me/cafepushkin_official",
      "readableHref": "@cafepushkin_official"
    }
  ],
  "workingHoursText": "Mon-Thu 9:00 AM–12:00 AM; Fri-Sun 24 hours",
  "schedule": [
    {
      "day": "Monday",
      "hours": "24 hours"
    },
    {
      "day": "Tuesday",
      "hours": "09:00–00:00"
    },
    {
      "day": "Wednesday",
      "hours": "09:00–00:00"
    },
    {
      "day": "Thursday",
      "hours": "09:00–00:00"
    },
    {
      "day": "Friday",
      "hours": "09:00–00:00"
    },
    {
      "day": "Saturday",
      "hours": "24 hours"
    },
    {
      "day": "Sunday",
      "hours": "24 hours"
    }
  ],
  "features": {
    "average_bill2": "3500–4500 ₽",
    "food_delivery": true,
    "coffee_to_go": true,
    "takeaway": true,
    "price_category": "high",
    "gift_certificate": true,
    "uslugi_banketnyj_zal": "wedding reception",
    "sobytiya": [
      "Business meeting",
      "Family dinner",
      "Company party",
      "The Banquet"
    ],
    "ultima_guide_included": true,
    "caring_for_couriers_tea": true,
    "car_park": true,
    "payment_method": [
      "prepayment",
      "cash",
      "payment by card",
      "online"
    ],
    "caring_for_couriers_coffee": true,
    "breakfast": true
  },
  "featureNames": {
    "average_bill2": "average bill",
    "food_delivery": "food delivery",
    "coffee_to_go": "coffee to go",
    "takeaway": "takeout",
    "price_category": "prices",
    "gift_certificate": "gift certificate",
    "uslugi_banketnyj_zal": "services",
    "sobytiya": "Events",
    "caring_for_couriers_tea": "Tea",
    "car_park": "parking",
    "payment_method": "payment method",
    "caring_for_couriers_coffee": "Coffee",
    "breakfast": "breakfast",
    "music": "music",
    "promotions": "promotions",
    "caring_for_couriers_charging_station": "Charging station",
    "business_lunch": "business lunch",
    "toilet": "toilet",
    "online_takeaway": "Pre-order online",
    "caring_for_couriers_wc": "WC",
    "preliminary_registration": "preliminary registration",
    "elevator_wheelchair_accessible": "Elevator wheelchair accessible",
    "payment_by_credit_card": "Credit card payment",
    "special_menu": "special menu",
    "caring_for_couriers_water": "Water",
    "type_cuisine": "cuisine",
    "wheelchair_access": "wheelchair accessibility",
    "parking_attendant": "parking attendant",
    "wi_fi": "Wi-Fi",
    "type_public_catering": "type of place",
    "wheelchair_accessible_vocabulary": "wheelchair accessible",
    "features_institution": "features institution",
    "dimmed_lights": "dimmed lights",
    "types_of_delivery": "types of delivery",
    "summer_terrace": "summer terrace"
  },
  "photoCount": 499,
  "photoUrlTemplate": "https://avatars.mds.yandex.net/get-altay/492546/2a0000015ed06603416cd0917f53e431490e/%s",
  "videoCount": 42,
  "videos": [
    {
      "url": "https://runtime.strm.yandex.ru/player/video/vplv2mockqzgzhvexkkb",
      "thumbnail": "https://avatars.mds.yandex.net/get-vh/6275370/2a00000189b59841b9f790192e2e123fd57c/orig",
      "width": 1920,
      "height": 1080
    },
    {
      "url": "https://runtime.strm.yandex.ru/player/video/vplvfxfov5bae4gckytz",
      "thumbnail": "https://avatars.mds.yandex.net/get-vh/6919792/2a00000189cf650e85920c8d9df64e2207ea/orig",
      "width": 1080,
      "height": 1920
    }
  ],
  "logoUrl": "https://avatars.mds.yandex.net/get-altay/6333331/2a0000018052d8b0661546e94a8e044b6254/XXXL",
  "chainName": "",
  "chainId": "",
  "chainSlug": "",
  "chainBranchesInCity": null,
  "bookingLinks": [
    {
      "type": "booking",
      "url": "https://www.restoran.ru/booking-widget-form.php?id=387205&name=%D0%9A%D0%B0%D1%84%D0%B5+%D0%9F%D1%83%D1%88%D0%BA%D0%B8%D0%BD%D1%8A"
    }
  ],
  "nearbyMetro": [
    {
      "id": "station__9858590",
      "name": "Pushkinskaya",
      "distance": "80 m",
      "distanceValue": 80.815,
      "type": "metro",
      "lineColor": "#4f8242"
    },
    {
      "name": "Tverskaya",
      "distance": "101 m",
      "distanceValue": 101.202,
      "type": "metro"
    }
  ],
  "nearbyStops": [
    {
      "name": "Tverskaya Street",
      "distance": "39 m",
      "distanceValue": 39.1125,
      "type": "common"
    },
    {
      "name": "Pushkinskaya Square",
      "distance": "247 m",
      "distanceValue": 247.656,
      "type": "common"
    }
  ],
  "badges": [],
  "awards": null,
  "snippet": null,
  "regionId": 213,
  "geoId": 120540,
  "shortTitle": "Pushkin",
  "timezoneOffset": 10800,
  "panorama": {
    "id": "1298062764_673119416_23_1689344339",
    "longitude": 37.604728,
    "latitude": 55.763718,
    "previewUrl": "https://static-pano.maps.yandex.ru/v1/?panoramaId=1298062764_673119416_23_1689344339",
    "heading": -21.7,
    "tilt": 9.9
  },
  "eventsCount": 33,
  "bounds": {
    "sw": [
      37.600936,
      55.761386
    ],
    "ne": [
      37.609146,
      55.766015
    ]
  },
  "entrances": [
    {
      "longitude": 37.60491658,
      "latitude": 55.76371858,
      "azimuth": 298.8682933857268,
      "tilt": 0
    }
  ],
  "popularityHistogram": {
    "wednesday": [
      0,
      0,
      0,
      0,
      0,
      0
    ]
  },
  "sources": [
    {
      "name": "Advizzer",
      "url": "http://advizzer.com/places.html",
      "id": "advizzer"
    },
    {
      "name": "GreatList",
      "url": "https://greatlist.ru/",
      "id": "greatlist"
    }
  ],
  "references": [
    {
      "id": "1541936387",
      "source": "nyak"
    },
    {
      "id": "52b13cfa-13c4-4e18-959a-7efbf94b0dce",
      "source": "yandex-eda"
    }
  ],
  "featureGroups": [
    {
      "name": "Achievements",
      "features": [
        "michelin",
        "ultima_guide_included"
      ]
    },
    {
      "name": "Prices",
      "features": [
        "price_category",
        "average_bill2"
      ]
    }
  ],
  "menu": {
    "source": "",
    "sourceName": "Representative of the organization",
    "sourceUrl": "",
    "sourceType": "",
    "disclaimer": "",
    "menuLastUpdated": "2026-06-11T07:16:23.570141Z",
    "totalItems": 130,
    "items": [
      {
        "title": "Морские гребешки с карпаччо из форели",
        "description": "Бланшированные морские гребешки, соус (горчица зёрнами, светлый бальзамик, сок лимона, шафран, ваниль, табаско, фундучное масло), карпаччо из форели, маринад (белое вино, сок лимона, мёд, петрушка, эстрагон, кервель, табаско), редис, огурец, лук-с...",
        "price": "1690",
        "currency": "₽",
        "volume": "",
        "photoUrl": "https://avatars.mds.yandex.net/get-sprav-products/2790747/2a0000019a95287fff43d32ca62e36fae4a6/medium",
        "sourceUrl": "https://dellos-delivery.ru/dostavka-cafe-pushkin/kholodnye-zakuski/17961/",
        "sourceId": "",
        "category": "Холодные закуски"
      },
      {
        "title": "Тартар из тунца с авокадо",
        "description": "Тунец и авокадо, приправленные трюфельным и оливковым маслами, под пеной из васаби",
        "price": "1790",
        "currency": "₽",
        "volume": "",
        "photoUrl": "https://avatars.mds.yandex.net/get-sprav-products/2733259/2a000001995d4d96b277f9809e2d57fce651/medium",
        "sourceUrl": "https://dellos-delivery.ru/dostavka-cafe-pushkin/kholodnye-zakuski/17962/",
        "sourceId": "",
        "category": "Холодные закуски"
      },
      {
        "title": "Заливное из щуки, судака и лосося",
        "description": "Заливное из трёх видов рыб в сочетании со стружкой хрена. Особый вкус придаёт соус на основе взбитых сливок со свекольным соком и хреном",
        "price": "1790",
        "currency": "₽",
        "volume": "",
        "photoUrl": "https://avatars.mds.yandex.net/get-sprav-products/2808945/2a000001995d4d977fec0d0fa2de574680bb/medium",
        "sourceUrl": "https://dellos-delivery.ru/dostavka-cafe-pushkin/kholodnye-zakuski/17963/",
        "sourceId": "",
        "category": "Холодные закуски"
      }
    ]
  },
  "additionalAddress": "",
  "bookingPartner": {
    "partner": "Яндекс Еда",
    "url": "https://eda.yandex/business/reservation",
    "logo": "https://avatars.mds.yandex.net/get-bunker/994123/63ddad855b3011f1b472bedb9054bb4b/orig",
    "originalId": "eats__731cd9a4-3d75-4193-8734-650e3ab7974f",
    "bookingType": "restaurant"
  },
  "legalInfo": {
    "name": "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"МОНЕ\"",
    "taxId": "7703210406"
  },
  "actionButtons": [
    {
      "type": "url",
      "title": "Reserve",
      "url": "https://cafe-pushkin.ru/rezerv/?utm_source=yandexsprav&utm_medium=cpc&utm_campaign=button_rezerv"
    }
  ],
  "promo": null,
  "productCatalog": [
    {
      "title": "Завтраки",
      "url": "https://cafe-pushkin.ru/menyu/shampan-zavtrak/?utm_source=yandexsprav&utm_medium=cpc&utm_campaign=vitrina_zavtrak&erid=3MtFQRkqfB2huzBcHHttGQaUjyoCBy",
      "imageUrl": "https://avatars.mds.yandex.net/get-tycoon/18833297/2a0000019a2f5e53404b39f978d5f58bc8b6/M_height",
      "price": "",
      "priceValue": null,
      "currency": ""
    },
    {
      "title": "Деловые обеды",
      "url": "https://cafe-pushkin.ru/menyu/?utm_source=yandexsprav&utm_medium=cpc&utm_campaign=vitrina_obed&erid=3MtFQRkqfB2huzBcHHttGQaUjyoXbP",
      "imageUrl": "https://avatars.mds.yandex.net/get-tycoon/17770680/2a0000019a2f601e99d55e5d12dc1d1dd106/M_height",
      "price": "",
      "priceValue": null,
      "currency": ""
    },
    {
      "title": "Банкеты",
      "url": "https://cafe-pushkin.ru/banket-v-restorane/?utm_source=yandexsprav&utm_medium=cpc&utm_campaign=vitrina_banket&erid=3MtFQRkqfB2huzBcHHttGQaUjyoXyS",
      "imageUrl": "https://avatars.mds.yandex.net/get-tycoon/14390846/2a0000019a2f622ba164363c0d7444798719/M_height",
      "price": "",
      "priceValue": null,
      "currency": ""
    }
  ],
  "email": "banquet@cafe-pushkin.ru",
  "neurosummary": "Отличный атмосферный ресторан с живой музыкой 😍",
  "relatedPlaces": [
    {
      "oid": "1133929046",
      "name": "Armenia"
    },
    {
      "oid": "1106897219",
      "name": "Turandot"
    }
  ],
  "visitsHistogram": {
    "fri": {
      "00": 0.003623401012,
      "01": 0.00229440493,
      "02": 0.001601446674,
      "03": 0.001321481306,
      "04": 0.001219312334,
      "05": 0.001212437114
    }
  },
  "trustFeatures": [
    {
      "name": "Meal",
      "aspectId": 3502043738,
      "positive": 3449,
      "neutral": 203,
      "negative": 493,
      "isTrusted": true
    },
    {
      "name": "Kitchen",
      "aspectId": 3502044248,
      "positive": 2531,
      "neutral": 79,
      "negative": 418,
      "isTrusted": false
    },
    {
      "name": "Service",
      "aspectId": 3502046347,
      "positive": 2080,
      "neutral": 75,
      "negative": 553,
      "isTrusted": false
    }
  ],
  "discoveryCollections": null,
  "bookingAvailability": {
    "available": true,
    "url": "https://eda.yandex/business/reservation"
  },
  "mobileVideos": [
    {
      "id": "vplv2mockqzgzhvexkkb",
      "playerUrl": "https://runtime.strm.yandex.ru/player/video/vplv2mockqzgzhvexkkb",
      "previewUrl": null,
      "duration": 56705,
      "width": 1920,
      "height": 1080
    }
  ],
  "mobilePosts": [
    {
      "id": 65094008,
      "text": "Ресторан «Кафе Пушкинъ» запустил большой спецпроект «Романовы», приуроченный к юбилейным датам коронаций Николая II, Николая I и Александра ...",
      "publicationTime": 1775516998310,
      "photos": [
        {
          "size": {
            "width": 1280,
            "height": 625
          },
          "url_template": "https://avatars.mds.yandex.net/get-sprav-posts/20318488/2a0000019d650ebd24eeb7ac813f5798f417/%s"
        }
      ]
    }
  ],
  "reviews": [
    {
      "reviewId": "MycGdzyXWM5d-D4Rpn6yG5qiFpg6xsJG",
      "rating": 5,
      "text": "Я даже удивлена, что еще не писала отзыв об этом ресторане ) \nПотому что впервые побывала здесь еще лет 10 назад. И крайне рада тому, что ресторан работает. Ран…",
      "date": "2026-03-20T22:10:13.274Z",
      "authorName": "@katerina_blacksi",
      "authorId": "3enkexprk2jx95h3rv2gyam7qr",
      "authorAvatarUrl": "https://avatars.mds.yandex.net/get-yapic/37154/dNwW3RH3qABFSKOyPo0XcZsMgU-1/islands-200",
      "authorLevel": "Дегустатор 6 уровня",
      "likeCount": 6,
      "dislikeCount": 0,
      "businessComment": "Благодарим за отзыв! Рады, что все понравилось! Ждем новой встречи)",
      "businessCommentDate": "2026-03-23T07:35:07.063Z",
      "photos": [
        "https://avatars.mds.yandex.net/get-altay/15394162/2a0000019d0d4c9078b48cea213388fcb10a/XXXL",
        "https://avatars.mds.yandex.net/get-altay/17681761/2a0000019d0d4caa4335831b6f67259929b6/XXXL",
        "https://avatars.mds.yandex.net/get-altay/19595165/2a0000019d0d4c9dd67fed53a3cfd18ae28e/XXXL"
      ],
      "photoDetails": [
        {
          "url": "https://avatars.mds.yandex.net/get-altay/15394162/2a0000019d0d4c9078b48cea213388fcb10a/XXXL",
          "id": "15394162_2a0000019d0d4c9078b48cea213388fcb10a",
          "width": 3024,
          "height": 4032,
          "createdTime": "2026-03-20T22:10:16.664Z",
          "moderationStatus": "ACCEPTED",
          "likeCount": 0,
          "dislikeCount": 0,
          "copyright": ""
        }
      ],
      "videos": [],
      "textTranslations": [
        {
          "language": "TR",
          "text": "Bu restoran hakkında henüz yorum yazmadığıma bile şaşırdım) \nÇünkü burayı ilk kez 10 yıl önce ziyaret etmiştim. Ve restoranın açık olmasına son derece sevindim. Eskiden burası her zaman kulüplerden sonra sabah 6-7'de buluştukları yerdi) Sanırım birçok insan onu o zamanlardan hatırlıyor. \n\nKurum çok hoş. Her zaman iyi hizmet. Garsonlar çoğunlukla yetişkin erkekler ve iletişim tarzları her zaman en üst düzeyde olmuştur. Bu, başarının anahtarıdır çok büyük )). Çok güzel hizmet. \n\nMutfakta da şikayet yok. Mutfak miktar olarak oldukça çeşitlidir ve kaliteye göre lezzetlidir. Bu sefer göreve geldim ve kötü bir seçim değildim. Her zaman ve her yerde olduğu gibi - salata suyunun varlığı memnun oldu ve harika kızarmış patatesler vardı. Burada ana menüden çok lezzetli bir Napolyon olduğunu biliyorum ( öyle görünüyor). \n\nRestoranın içi havalı. İddialı görünüyor, ama son derece rahat. Konumu da çok başarılı. "
        }
      ],
      "textLanguage": "RU",
      "textLanguageName": "Русский",
      "isAnonymous": false,
      "isPublicRating": true,
      "commentCount": 1,
      "bold": [],
      "keyPhrases": [],
      "trustedLikeCount": 0,
      "isPinned": false,
      "reviewType": "YANDEX",
      "authorProfileUrl": "https://reviews.yandex.ru/user/3enkexprk2jx95h3rv2gyam7qr",
      "authorAchievements": [],
      "authorProfessions": []
    },
    {
      "reviewId": "YfaCY70v7y3SqiiBgU3IloMtB9XhCG",
      "rating": 5,
      "text": "Отличное место для встреч с друзьями,  вкусная еда, приятная атмосфера. ",
      "date": "2026-06-17T07:03:23.193Z",
      "authorName": "Анна Б.",
      "authorId": "zavc08ugm2u7r80hadu5qwk43m",
      "authorAvatarUrl": "https://avatars.mds.yandex.net/get-yapic/17910871/mYEaf0hBomojJAT6ydiJnLeu8-1/islands-200",
      "authorLevel": "Знаток города 2 уровня",
      "likeCount": 0,
      "dislikeCount": 0,
      "businessComment": "",
      "businessCommentDate": "",
      "photos": [],
      "photoDetails": [],
      "videos": [],
      "textTranslations": [],
      "textLanguage": "RU",
      "textLanguageName": "Русский",
      "isAnonymous": false,
      "isPublicRating": true,
      "commentCount": 0,
      "bold": [],
      "keyPhrases": [],
      "trustedLikeCount": 0,
      "isPinned": false,
      "reviewType": "YANDEX",
      "authorProfileUrl": "https://reviews.yandex.ru/user/zavc08ugm2u7r80hadu5qwk43m",
      "authorAchievements": [],
      "authorProfessions": []
    }
  ],
  "photos": [
    {
      "url": "https://avatars.mds.yandex.net/get-altay/492546/2a0000015ed06603416cd0917f53e431490e/XXXL",
      "width": 958,
      "height": 639,
      "tags": [
        {
          "id": "Interior",
          "name": "Interior"
        }
      ],
      "id": "urn:yandex:sprav:photo:6271186",
      "copyright": "Яндекс",
      "showReactions": true
    },
    {
      "url": "https://avatars.mds.yandex.net/get-altay/9237948/2a00000188f531b6143e54f75a76a7a928ef/XXXL",
      "width": 904,
      "height": 597,
      "tags": [
        {
          "id": "Interior",
          "name": "Interior"
        }
      ],
      "id": "urn:yandex:sprav:photo:9237948-2a00000188f531b6143e54f75a76a7a928ef",
      "copyright": "kudago.com",
      "showReactions": true
    }
  ],
  "posts": [],
  "reviewCount": 5913
}
```

***

### Pricing — Pay Per Event (PPE) — Тарифы

Transparent per-event pricing. You only pay for what you extract.

#### Events

| Event | What triggers it | Price / 1,000 |
|-------|-----------------|---------------|
| **place_scraped** | Each place extracted (includes 50 reviews) | $6.99 |
| **place_enriched** | Each place enriched (email, AI-generated review summary, menu) | $1.50 |

Enrichment is optional. If `enrichBusinessData` is off, you only pay `place_scraped`. **You never pay for duplicates** — results are automatically deduplicated across all queries, URLs, and business IDs in a single run.

#### Controlling what you spend

| Lever | What it does |
|-------|--------------|
| `maxResults` | Your main control. A place costs $0.00699, so `maxResults: 100` is ~$0.70 and `maxResults: 1000` is ~$7. |
| **Maximum cost per run** | A hard ceiling, set when you start the run (Console: *Maximum cost per run*; API: `maxTotalChargeUsd`). The run stops as soon as it is reached. |
| `excludeBusinessIds` | Continue a job across runs without paying twice. Pass the IDs you already collected and only new places are scraped and billed. |
| `searchScope` | `city` (default) or `country`. Country needs `filterChainId` and returns far more places. |
| `moreResultsAvailable` | Tells you whether it is worth running again: `true` means results were left behind, `false` means the search was exhausted. |

⚠️ **`maxResults: 0` means unlimited.** A big city can hold tens of thousands of places, so an unlimited run keeps scraping until it reaches the maximum cost per run for that run. If no maximum cost is set, it keeps going until the search runs out. Set `maxResults` to a number unless you genuinely want every place.

**Fetching in batches (pay as you go):**

```json
{ "query": ["кафе"], "location": "Moscow", "maxResults": 500 }
```

Then feed the IDs you received into the next run to get the next 500, with nothing billed twice:

```json
{ "query": ["кафе"], "location": "Moscow", "maxResults": 500,
  "excludeBusinessIds": ["1018907821", "1017517628", "..."] }
```

Repeat until `moreResultsAvailable` comes back `false` for every query in the run, which means the city is exhausted for those keywords. With several keywords, check them one query at a time: they finish at different points.

💡 Use batches **above 200**. At 200 or below the Actor searches a single map viewport, which serves only its top results, so small batches sample the same shallow pool and dry up early. Above 200 it sweeps the city zone by zone and reaches everything.

#### Apify Store Subscription Discounts

Higher subscription tiers get cheaper per-event pricing:

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| **place_scraped** | $6.99 / 1k | $6.49 / 1k | $5.99 / 1k | $4.99 / 1k |
| **place_enriched** | $1.50 / 1k | $1.20 / 1k | $1.00 / 1k | $0.80 / 1k |

#### Cost Calculator — Калькулятор стоимости

Examples at base price. Subscribers pay up to 29% less.

**Lead generation — 1,000 businesses with contacts and reviews:**

| What | Count | Cost |
|------|-------|------|
| Places (+ 50 reviews each) | 1,000 | $6.99 |
| **Total** | | **$6.99** |

**Market research — 500 restaurants with enrichment:**

| What | Count | Cost |
|------|-------|------|
| Places | 500 | $3.50 |
| Enrichment (email, AI summary, menu) | 500 | $0.75 |
| **Total** | | **$4.25** |

Photos and posts are included in the `place_scraped` event — no additional charge.

***

### How to Scrape Yandex Maps Data in Python — Парсинг Яндекс Карт на Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")

run = client.actor("zen-studio/yandex-places-scraper").call(run_input={
    "query": ["restaurant"],
    "location": "Moscow",
    "maxResults": 100,
    "enrichBusinessData": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} — {item['rating']} — {item['phones']}")
```

### How to Scrape Yandex Maps Data in JavaScript

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('zen-studio/yandex-places-scraper').call({
    query: ['restaurant'],
    location: 'Moscow',
    maxResults: 100,
    enrichBusinessData: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    console.log(`${item.title} — ${item.rating} — ${item.phones}`);
});
```

***

### FAQ — Часто задаваемые вопросы

**Q: How many places can I scrape from Yandex Maps?**
A: Set `maxResults` to `0` for unlimited. Broad queries like "кафе" return **23,000+ results** in Moscow in under 40 minutes. Use the broadest relevant Russian term and the scraper automatically covers the full city. Run multiple queries for distinct categories — results are deduplicated.

**Q: Do I need a Yandex account?**
A: No. No login, no cookies, no browser. Works immediately.

**Q: Нужен ли браузер для работы?**
A: Нет. Парсер работает без запуска браузера — это означает высокую скорость и низкое потребление ресурсов.

**Q: Which countries does Yandex Maps cover? / Какие страны покрывает Яндекс Карты?**
A: Russia, Turkey, Kazakhstan, Belarus, Ukraine, Uzbekistan, Georgia, Azerbaijan, Armenia, Kyrgyzstan, Tajikistan, and select Middle Eastern regions. Coverage is strongest in Russia and Turkey.

**Q: Can I search in English?**
A: Yes. Location accepts any language — type "Moscow", "Москва", or "Moskova". Search queries work in any language too, though Russian queries return the most results for Russian cities.

**Q: How do reviews work?**
A: 50 most relevant reviews are included with every place at no extra cost. The `language` setting controls which reviews surface first — Turkish locale returns Turkish reviews first, English returns English reviews first. Set `includeReviews: false` to skip them for large runs (1000+ places) where the embedded reviews would bloat the dataset past what tools like n8n, Google Sheets, or Airtable can handle.

**Q: What does enrichment add?**
A: Email address, AI-generated review summary, full delivery menu with prices and photos, related businesses nearby, hourly foot traffic patterns, booking availability, and detailed sentiment analysis. Costs an additional $1.50/1,000 places.

**Q: Как собрать телефоны и email организаций из Яндекс Карт?**
A: Телефоны извлекаются автоматически. Для email включите `enrichBusinessData`. Экспортируйте результаты в CSV для импорта в CRM.

**Q: Can I scrape specific businesses by URL or ID?**
A: Yes. Use `startUrls` to paste Yandex Maps URLs directly, or `businessIds` to pass numeric organization IDs. Both skip search and fetch the business directly.

**Q: Сколько стоит парсинг?**
A: $6.99 за 1000 мест (включая 50 отзывов на место). Обогащение данных (email, нейросаммари, меню) — дополнительно $1.50 за 1000 мест. Фото и посты — без дополнительной платы.

**Q: What filters are available?**
A: 20+ filters — rating threshold, open now, 24/7, delivery, takeaway, Wi-Fi, card payment, parking, pet-friendly, wheelchair access, Michelin, cuisine type, price range, chains by name, 1,650+ categories by name, and more.

**Q: Does this work for Turkey? / Bu Türkiye için çalışıyor mu?**
A: Yes. Yandex Maps is the #1 navigation app in Turkey with 5.6M+ users. The scraper covers Istanbul, Ankara, Antalya, İzmir, Bursa, and all Turkish cities on Yandex Maps. Set `language` to `"tr"` for Turkish addresses, categories, and reviews.

**Q: Türkiye'deki işletmelerin verilerini nasıl toplayabilirim?**
A: Arama sorgunuzu girin (ör. "restoran", "kuaför", "eczane"), şehri seçin ve çalıştırın. Telefon numaraları, adresler, puanlar ve yorumlar otomatik olarak toplanır. E-posta için `enrichBusinessData` seçeneğini etkinleştirin. Sonuçları CSV veya Excel olarak dışa aktarın.

**Q: Bu aracın maliyeti nedir?**
A: 1.000 işletme için $6,99 (her işletme için 50 yorum dahil). Veri zenginleştirme (e-posta, AI yorum özeti, menü) — ek $1,50 / 1.000 işletme. Fotoğraflar ve gönderiler ücretsizdir.

**Q: Hangi Türk şehirleri destekleniyor?**
A: İstanbul, Ankara, Antalya, İzmir, Bursa, Adana, Gaziantep, Konya, Mersin ve Yandex Harita'daki tüm Türk şehirleri. Yandex, Türkiye'de 2025'te işletme kayıtlarında %162 büyüme kaydetti.

**Q: How do I generate leads from Yandex Maps?**
A: Set your query (e.g. "restoran" or "kuaför"), pick a city, enable `enrichBusinessData` for emails, and export to CSV. You'll get phone numbers, emails, websites, and addresses ready for CRM import or cold outreach.

**Q: Is this a Google Maps alternative for Russia and Turkey?**
A: Yes. For Russian and Turkish cities, Yandex Maps has significantly more business listings than Google Maps. This scraper extracts the same data types (name, phone, address, rating, reviews) but from Yandex's larger local database.

***

### More Zen Studio scrapers for maps & local data

- [Yandex Maps Reviews Scraper](https://apify.com/zen-studio/yandex-maps-reviews-scraper)
- [Baidu Maps Scraper](https://apify.com/zen-studio/baidu-maps-scraper)
- [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper)
- [Google Maps Directions & Routes API](https://apify.com/zen-studio/google-maps-directions-api)
- [Apple Maps Scraper](https://apify.com/zen-studio/apple-maps-scraper-pro)

Also from the same studio (name, then `account/slug` for the URL `https://apify.com/account/slug`):

- Apple Maps Directions & Route API (`zen-studio/apple-maps-directions-route-api`)
- 2GIS Places Scraper (`zen-studio/2gis-places-scraper-api`)
- 2GIS Reviews Scraper (`zen-studio/2gis-reviews-scraper`)
- Naver Map & Place Scraper (`zen-studio/naver-place-scraper`)
- Bing Maps Scraper (`zen-studio/bing-maps-scraper`)

Full directory: [Zen Studio on Apify](https://apify.com/zen-studio)

### Supported Countries — Покрытие стран

| Country | Cities | Notes |
|---------|--------|-------|
| Russia | 1,000+ | Full coverage — Moscow, St. Petersburg, all regions |
| Turkey | 80+ | Istanbul, Ankara, Antalya, İzmir, Bursa, and more |
| Kazakhstan | 20+ | Almaty, Astana, Shymkent |
| Belarus | 10+ | Minsk, Gomel, Brest |
| Uzbekistan | 10+ | Tashkent, Samarkand |
| Georgia | 5+ | Tbilisi, Batumi |
| Azerbaijan | 5+ | Baku |
| And more... | — | Armenia, Kyrgyzstan, Tajikistan, Ukraine |

***

### Disclaimer

Data is collected from publicly available sources and provided "as is" for informational purposes. Users are responsible for compliance with Yandex' terms of service and applicable regulations in their jurisdiction.

***

[**Start Scraping Yandex Maps Now — Начать парсинг Яндекс Карт**](https://console.apify.com/actors/fRSgBvgbsRB4o7t30)

***

*Structured business data from the largest map service in Russia, Turkey, and CIS — extracted in minutes.*

# Actor input Schema

## `query` (type: `array`):

Search queries to run. Each query runs as a separate search. <strong>Add several keywords here instead of starting several runs:</strong> results from all queries in a run are merged and deduplicated, so a place found by three keywords is returned once and billed once. The queries run in order and share the Max results limit below, so raise it when you add keywords. A <b>Whole country</b> search takes one query only — run other keywords as separate runs. | Добавьте несколько запросов в один запуск: результаты объединяются и дедуплицируются, дубликаты не оплачиваются. Запросы делят общий лимит «Max results».

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

City or area to search in. Type <strong>any city name in any language</strong> — works with English, Russian, Turkish, local scripts, etc. (e.g. <code>München</code>, <code>Стамбул</code>, <code>東京</code>).

## `category` (type: `string`):

Select a common category. This adds an optimized search query in Russian for best results. You can combine this with custom queries above.

## `maxResults` (type: `integer`):

Maximum number of places for the <strong>whole run</strong>, shared across all your queries, not per query. 10 queries with 100 here return 100 places in total, not 1,000, so raise it when you add keywords. This is your main cost control: a place costs $0.00699, so 100 places is ~$0.70 and 1,000 is ~$7. <strong>0 means unlimited</strong>, and a big city can hold tens of thousands of places, so an unlimited run keeps going until it reaches the maximum cost per run set for the run. Set a number here unless you truly want everything. | Общий лимит на весь запуск, а не на каждый запрос. <strong>0 = без лимита</strong>, расход не ограничен.

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

<strong>Translates:</strong> addresses, categories, working hours, features, photo tags.<br/><strong>Not translated:</strong> business names (original), reviews (user-written), posts (user-written).<br/><strong>Note:</strong> Reviews are sorted by language — e.g. Turkish locale returns Turkish-language reviews first, English returns English reviews first.

## `includeReviews` (type: `boolean`):

Include up to 50 most-relevant reviews per place. Turn off for large runs (1000+ places) to keep the dataset small and compatible with tools like n8n, Google Sheets, or Airtable. | Отключите для больших выгрузок (1000+ мест), чтобы уменьшить размер датасета.

## `enrichBusinessData` (type: `boolean`):

Fetches <strong>email</strong>, AI-generated review summary (neurosummary), full delivery menu with prices, related businesses, foot traffic, and booking availability. Adds $1.50 / 1,000 places on top of the base scraping cost.

## `maxPhotos` (type: `integer`):

Maximum photos to fetch per place. Set to 0 to skip.

## `maxPosts` (type: `integer`):

Maximum posts/news items to fetch per place. Set to 0 to skip.

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

Paste Yandex Maps business page URLs. Supported formats:<br><code>https://yandex.com/maps/org/name/12345/</code><br><code>https://yandex.com/maps/-/CPqIUMo</code> (short share links)<br>Works with all Yandex domains (yandex.ru, yandex.com.tr, etc.) and with <code>/reviews/</code> suffix. For search queries, use the Search queries field above.

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

Direct Yandex business/organization IDs (numeric). Found in URLs like <code>/org/name/<strong>17323657526</strong>/</code>.

## `excludeBusinessIds` (type: `array`):

Business IDs to skip. Useful for recurring scrapes: pass the IDs you already collected in earlier runs, and you only get (and only pay for) places that are new to you.

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

Exact center point as <code>longitude,latitude</code> (e.g. <code>37.622,55.753</code>). Overrides the Location field. <br><em>Tip: Right-click any point on Yandex/Google Maps to copy coordinates.</em>

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

Search area size as <code>dLon,dLat</code>. <br>• <code>0.01,0.01</code> ≈ 1km (Neighborhood)<br>• <code>0.1,0.1</code> ≈ 10km (City center)<br>• <code>0.5,0.5</code> ≈ 50km (Full city)

## `filterRating` (type: `string`):

Filter by minimum rating threshold.

## `filterOpenNow` (type: `boolean`):

Only show places currently open.

## `filterOpen24h` (type: `boolean`):

Only show places open 24/7.

## `filterDelivery` (type: `boolean`):

Only show places with food delivery.

## `filterTakeaway` (type: `boolean`):

Only show places with takeaway option.

## `filterWifi` (type: `boolean`):

Only show places with Wi-Fi.

## `filterCardPayment` (type: `boolean`):

Only show places accepting card payments.

## `filterParking` (type: `boolean`):

Only show places with parking.

## `filterPetFriendly` (type: `boolean`):

Only show pet-friendly places.

## `filterWheelchairAccess` (type: `boolean`):

Only show wheelchair-accessible places.

## `filterGoodPlace` (type: `boolean`):

Only show places with Yandex's "Good Place" badge.

## `filterMichelin` (type: `boolean`):

Only show Michelin-rated restaurants.

## `filterBusinessLunch` (type: `boolean`):

Only show restaurants offering business lunch.

## `filterSummerTerrace` (type: `boolean`):

Only show places with a summer terrace.

## `filterCuisine` (type: `array`):

Filter by cuisine type (e.g. <code>italian</code>, <code>japanese</code>, <code>georgian</code>).

## `filterPriceCategory` (type: `array`):

Filter by price level. Select one or more tiers.

## `filterPriceMin` (type: `integer`):

Minimum average bill (in local currency).

## `filterPriceMax` (type: `integer`):

Maximum average bill (in local currency).

## `filterCategories` (type: `array`):

Return only places in these categories. Pick as many as you need, a place matches if it belongs to any of them. Start typing to search the list.

## `searchScope` (type: `string`):

How far to look for a company's branches. <b>One city</b> searches the place in <b>Location</b> and is what every run does today. <b>Whole country</b> visits towns across the country instead of one city, for collecting a chain nationwide; it needs <b>Chains</b> to be set and a single search query, takes much longer, and returns many more places, so set <b>Max results</b> and a maximum cost per run before using it. Nationwide runs do not report whether every branch was found — see the run summary.

## `filterChainId` (type: `array`):

Return only branches of specific chains. <b>Fill in Search queries and Location as well:</b> Chains narrows a search, it does not replace one, so a broad word such as <code>магазин</code> or <code>shop</code> is all the query needs to be. | <b>Заполните также «Запросы» и «Город»:</b> поле «Сети» сужает поиск, а не заменяет его. Enter the chain name (<code>Пятёрочка</code>, <code>Dodo Pizza</code>), the <code>chainId</code> from a previous run, or a <b>Yandex Maps page of any one branch</b> (<code>https://yandex.com/maps/org/name/12345/</code>) to collect the rest of that company's branches. List as many companies as you need in one run, mixing all three forms. <b>Max results</b> is one budget shared by every chain listed, so allow enough for all of them or the last ones come back empty.

## `customFilters` (type: `array`):

Raw <code>key:value</code> filter strings for advanced filtering. Use when built-in filter fields don't cover your needs.

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

Sort order for search results.

## `sortOrigin` (type: `string`):

Origin point for distance sorting as <code>longitude,latitude</code>. Only used when Sort by = Distance.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "query": [
    "restaurant"
  ],
  "location": "Moscow",
  "category": "",
  "maxResults": 100,
  "language": "ru",
  "includeReviews": true,
  "enrichBusinessData": false,
  "maxPhotos": 0,
  "maxPosts": 0,
  "startUrls": [],
  "businessIds": [],
  "excludeBusinessIds": [],
  "coordinates": "",
  "viewportSpan": "",
  "filterRating": "",
  "filterOpenNow": false,
  "filterOpen24h": false,
  "filterDelivery": false,
  "filterTakeaway": false,
  "filterWifi": false,
  "filterCardPayment": false,
  "filterParking": false,
  "filterPetFriendly": false,
  "filterWheelchairAccess": false,
  "filterGoodPlace": false,
  "filterMichelin": false,
  "filterBusinessLunch": false,
  "filterSummerTerrace": false,
  "filterCuisine": [],
  "filterPriceCategory": [],
  "filterCategories": [],
  "searchScope": "city",
  "filterChainId": [],
  "customFilters": [],
  "sortBy": "",
  "sortOrigin": ""
}
```

# Actor output Schema

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

No description

# 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 = {
    "query": [
        "restaurant"
    ],
    "location": "Moscow",
    "includeReviews": true,
    "searchScope": "city"
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/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 = {
    "query": ["restaurant"],
    "location": "Moscow",
    "includeReviews": True,
    "searchScope": "city",
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/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 '{
  "query": [
    "restaurant"
  ],
  "location": "Moscow",
  "includeReviews": true,
  "searchScope": "city"
}' |
apify call zen-studio/yandex-maps-scraper --silent --output-dataset

```

## MCP server setup

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