# Yandex Maps Scraper 📍 (business leads with phones) (`tagadanar/yandex-maps-scraper`) Actor

Businesses from Yandex Maps by search term and city: phone, website, Telegram, WhatsApp, VK, address, coordinates, rating, review count and opening hours. More than 1,000 places per city search. Russia, Kazakhstan, Turkey and more. No login.

- **URL**: https://apify.com/tagadanar/yandex-maps-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (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 $0.70 / 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: business leads with phones, websites and messengers

Get the businesses listed on **Yandex Maps** as clean lead rows: name, category, phone, website, Telegram, WhatsApp, VK and other social links, full address with street, house and postal code, coordinates, rating, number of ratings and reviews, and opening hours by day. Type what you are looking for (cafe, dentist, car repair, кафе, стоматология) and the cities you want (Moscow, Kazan, Almaty, Istanbul), or paste any Yandex Maps search, category or place link.

Yandex Maps is the business directory people actually use in Russia, Kazakhstan, Belarus, Uzbekistan and much of Turkey, where Google Maps listings are thin or out of date.

$1 per 1,000 places (Free plan; $0.70 on Gold), platform usage included. No login, no API key, no proxy to set up.

### Why this one

| | This actor | Typical Yandex Maps scraper on the Store |
| --- | --- | --- |
| Price per 1,000 places | $1 ($0.70 on Gold) | $0.40 to $7 |
| Places per city search | more than 1,000 (the map is split into smaller areas when Yandex's own list stops) | what Yandex lists for one search, usually 600 to 1,000 |
| Phone of advertised places | the business's own number, read from its place card when the search result shows a call-tracking number | the number shown in search results |
| Website and messenger links | tracking parameters and prefilled ad messages removed | often left in (`?yclid=...&utm_source=yandex`) |
| Filters | with a phone, with a website, minimum rating (places left out are free) | varies |
| Languages | English, Russian, Turkish, Ukrainian, Kazakh | varies |

### What you get

One row per business:

| Field | Description |
| --- | --- |
| `placeId`, `url` | The place's Yandex ID and its Yandex Maps page |
| `name`, `category`, `categories` | Business name, main category and every category it is listed under |
| `phone`, `phones` | Phone numbers in international format (`+74959376919`); an extension follows a comma |
| `website`, `websites`, `websiteDomain` | Websites, without tracking parameters, and the main site's domain |
| `telegram`, `whatsapp`, `vk`, `instagram`, `socialLinks` | Messenger and social links, and the full list with the network named (YouTube, Odnoklassniki, Viber, Max, TikTok...) |
| `address`, `addressDetail`, `street`, `house`, `city`, `region`, `postalCode`, `country` | The address as one line and in parts; `addressDetail` is the floor or entrance when given |
| `latitude`, `longitude` | Coordinates |
| `rating`, `ratingCount`, `reviewCount` | Rating out of 5, how many people rated, how many wrote a review |
| `workingHours`, `openingHours` | Opening hours as Yandex shows them, and by day (`"monday": ["09:00-20:00"]`, an empty list when closed) |
| `status` | `open`, or the closure Yandex shows |
| `verifiedOwner`, `advertiser` | The owner has claimed the listing; the business advertises on Yandex Maps |
| `chainName`, `averageBill`, `nearestMetro`, `nearestMetroDistance`, `photoCount`, `logoUrl` | Chain, average bill (restaurants), nearest metro station, photo count, logo |
| `searchQuery`, `searchLocation`, `position`, `scrapedAt` | Which search found it, where, at which position, and when |

#### Example row (real, 2026-10-21)

```json
{
  "placeId": "105123949960",
  "name": "Istoriya ulybki",
  "category": "Dental clinic",
  "categories": ["Dental clinic", "children's dentistry"],
  "phone": "+79870041521",
  "phones": ["+79870041521"],
  "website": "https://smilehistory.ru",
  "websiteDomain": "smilehistory.ru",
  "telegram": "https://t.me/+79600808090",
  "whatsapp": "https://wa.me/79600808090",
  "address": "Republic of Tatarstan, City of Kazan, Marshala Chuykova Street, 66А",
  "street": "Marshala Chuykova Street",
  "house": "66А",
  "city": "City of Kazan",
  "postalCode": "420133",
  "country": "Russian Federation",
  "latitude": 55.835708,
  "longitude": 49.158829,
  "rating": 5,
  "ratingCount": 385,
  "reviewCount": 305,
  "workingHours": "Mon-Fri 9:00 AM–8:00 PM; Sat 9:00 AM–5:00 PM",
  "openingHours": { "monday": ["09:00-20:00"], "saturday": ["09:00-17:00"], "sunday": [] },
  "verifiedOwner": true,
  "url": "https://yandex.com/maps/org/istoriya_ulybki/105123949960/",
  "searchQuery": "dentist",
  "searchLocation": "City of Kazan, Republic of Tatarstan"
}
```

### Who uses it

- **Sales teams and agencies selling to local businesses** in Russia and the CIS: a call list of dentists, beauty salons or car services in one city, with phone, WhatsApp and Telegram in separate columns.
- **Marketing and SEO agencies**: find businesses with no website (`website` empty) or a low rating, and pitch them.
- **Franchise and retail expansion**: count competitors by category and district, with coordinates for a map.
- **Market research**: how many cafes, pharmacies or gyms a city has, their ratings and opening hours.
- **Data enrichment**: paste a list of Yandex Maps place links and get their current phone, site and hours.

### How to use it

1. Put what you are looking for in **Search terms** and the places in **Locations**. Every term is searched in every location.
2. Set **Places per search**. Up to about 1,000 places a search reads Yandex's own list; above that the run splits the map into smaller areas, which takes longer.
3. Optionally keep only places with a phone, with a website, or above a rating. Places left out are not charged.
4. Run, then export the dataset as CSV, Excel or JSON, or connect it to your CRM.

#### Input examples

Dentists in Kazan (the prefill):

```json
{
  "searchTerms": ["dentist"],
  "locations": ["Kazan"],
  "maxResults": 40
}
```

Car services in two cities, only with a phone and a website, Russian addresses:

```json
{
  "searchTerms": ["автосервис"],
  "locations": ["Moscow", "Saint Petersburg"],
  "maxResults": 2000,
  "onlyWithPhone": true,
  "onlyWithWebsite": true,
  "language": "ru"
}
```

Pasted links (a search with its map area kept, and one place):

```json
{
  "startUrls": [
    "https://yandex.ru/maps/213/moscow/search/pizza/",
    "https://yandex.ru/maps/org/shibainu_fusion_cafe/153620140001/"
  ],
  "maxResults": 100
}
```

### FAQ

**How many places can I get for one city?**
Yandex Maps lists at most 1,000 places for one search, and in a big city many of them repeat from page to page, so one search usually ends with 600 to 1,000 different places. When you ask for more, the run splits the city into four areas, then sixteen, and searches each one, keeping only places it has not delivered yet. In October 2026 a "кафе" search in Moscow with the website and 4.5-star filters on read 2,832 different cafes and delivered 1,500 in about 18 minutes. For a very large category (cafes in Moscow) you can also run several terms (кафе, кофейня, столовая) or districts.

**Does it include emails?**
No. Yandex Maps does not publish email addresses on business listings. You get phones, websites and messenger links; run the websites through an email finder if you need emails.

**Why are some phone numbers different from what I see in the search list on Yandex?**
Businesses that advertise on Yandex Maps can use call tracking, which shows a temporary number in search results. For those places the run opens the place card and takes the business's own number.

**Which countries work?**
Everything Yandex Maps covers: Russia, Kazakhstan, Belarus, Uzbekistan, Armenia, Georgia, Turkey and more. Coverage outside these countries is thin (a "cafe" search near Paris found 2 places in October 2026), because few businesses there are listed on Yandex.

**Should I search in English or in Russian?**
Both work. Local-language terms (кафе, стоматология, kuaför) often match more listings. The **Language of names and addresses** setting only changes how addresses, categories and hours are written.

**What does a search with no results cost?**
Only the run start ($0.001). The run says when Yandex Maps has no places for a search, when your filters left everything out, or when a location was not recognised, so a zero is always explained.

**Can I scrape reviews?**
Not in this version. You get the rating, the number of ratings and the number of written reviews for each place.

**Is it legal?**
The actor reads public business listings, the same pages anyone sees on Yandex Maps without logging in. It collects business data only, no personal profiles. You are responsible for how you use the data (for example, cold-calling and messaging rules in your country).

### Related actors

- [Google Maps Contact Extractor](https://apify.com/tagadanar/google-maps-contact-extractor): Google Maps businesses with the emails and social profiles from their websites.
- [Gelbe Seiten Scraper](https://apify.com/tagadanar/gelbeseiten-scraper): German business directory leads with phones and websites.
- [All our scrapers](https://apify.com/tagadanar).

Keywords: yandex maps scraper, yandex maps api, yandex business directory, yandex maps leads, scrape yandex maps, парсер яндекс карт, выгрузка организаций из яндекс карт, база компаний, Russia business leads, Kazakhstan business list.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/yandex-maps-scraper/changelog.md

# Actor input Schema

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

What you would type into Yandex Maps: a kind of business or a keyword (cafe, dentist, car repair, кафе, стоматология). Every term is searched in every location below. Terms in the local language often find more places.

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

Cities or regions to search in, as you would type them into Yandex Maps (Moscow, Kazan, Saint Petersburg, Almaty, Istanbul, Москва). A Yandex region number such as 213 for Moscow works too. Districts and small towns are searched inside their own outline.

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

Optional. Search, category or place links copied from Yandex Maps on any Yandex domain (yandex.ru, yandex.com, yandex.com.tr, yandex.kz), short links included. A search link keeps its map area and filters; a place link brings back that one place.

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

How many places to bring back for each search term in each location, at most 5000. Yandex Maps lists up to 1,000 places for one search; above that the run splits the map into smaller areas to find more.

## `onlyWithPhone` (type: `boolean`):

Leave out places that show no phone number. Places left out are not charged.

## `onlyWithWebsite` (type: `boolean`):

Leave out places that show no website. Places left out are not charged.

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

Leave out places rated below this (places with no rating yet are left out too when this is set).

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

The language Yandex Maps uses for addresses, categories and opening hours. Business names stay as the business wrote them.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist",
    "car repair"
  ],
  "locations": [
    "Moscow",
    "Kazan"
  ],
  "startUrls": [
    "https://yandex.ru/maps/213/moscow/search/pizza/",
    "https://yandex.ru/maps/org/shibainu_fusion_cafe/153620140001/"
  ],
  "maxResults": 40,
  "onlyWithPhone": false,
  "onlyWithWebsite": false,
  "minRating": "",
  "language": "en"
}
```

# Actor output Schema

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

One item per Yandex Maps place in the default dataset.

# 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": [
        "dentist"
    ],
    "locations": [
        "Kazan"
    ],
    "maxResults": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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": ["dentist"],
    "locations": ["Kazan"],
    "maxResults": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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": [
    "dentist"
  ],
  "locations": [
    "Kazan"
  ],
  "maxResults": 40
}' |
apify call tagadanar/yandex-maps-scraper --silent --output-dataset

```

## MCP server setup

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