# Yandex Maps Scraper Яндекс Карты \[Only $3] Phones & Websites (`memo23/yandex-maps-scraper`) Actor

\[$3 per 1000 places, +$0.50 with a phone] Scrape Yandex Maps (Яндекс Карты) with no login: name, phones, website, social links, rating and reviews count, categories, address, coordinates, hours and metro. Any query in any city in Russia, Turkey or the CIS, or paste map links. JSON, CSV, Excel.

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

## Pricing

from $3.00 / 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.

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

Get every business Yandex Maps (Яндекс Карты) shows for a search: name, phones, website, social links, rating and review count, categories, full address, coordinates, opening hours, metro and photos.
Search any query in any city in Russia, Turkey, Kazakhstan or the rest of the CIS, or paste map links and business IDs.
No login, no API key, no browser. One row per place, ready for CRM, Excel or your own database.

#### How it works

![How Yandex Maps Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-yandex-maps.png)

#### ✨ Why use this scraper?

- **Phones on almost every row.** In our tests 95% of places came with a phone number, and about 75% with a website.
- **More than one map view.** A single Yandex Maps view stops at a few hundred places. When you ask for more, the scraper splits the area into smaller parts on its own and keeps going, without duplicates.
- **Emails, if you want them.** Turn on `enrichEmails` and the scraper reads the contact pages of each place's own website for email addresses. You pay only for places where one is found.
- **Clean websites.** Ad tracking (`yclid`, `utm_*`) is stripped, so the link is the business's own address.
- **Advertiser details.** For paid placements, each row carries the advertiser's legal name and tax ID (INN) from Yandex's ad label.
- **Any language Yandex speaks.** Names, addresses and hours in English, Russian, Turkish, Ukrainian or Kazakh.
- **Pay per place.** $3 per 1,000 places, plus $0.50 per 1,000 for places with a phone number. Filtered-out places (no phone, no website, low rating) are not charged.

#### 🎯 Use cases

| Who | What they get |
|---|---|
| Sales and lead generation | Phone and website lists of businesses by category and city |
| Marketing agencies | Local competitor maps with ratings, reviews and paid placements |
| Market research | Counts, density and ratings of a business type across cities |
| Delivery, retail and real estate | Coordinates and opening hours for site planning |
| Data teams | A refreshable directory of businesses for Russia, Turkey and the CIS |

#### 📥 Supported inputs

| Input | Example |
|---|---|
| Search query + location | `стоматология` in `Kazan`, `coffee` in `Istanbul` |
| Search link | `https://yandex.ru/maps/213/moscow/search/кафе/` (with or without `ll`/`z` map position) |
| Business link | `https://yandex.com/maps/org/floo/1736003187/` |
| Short share link | `https://yandex.ru/maps/-/CPqIUMo` |
| Business ID | `1736003187` |

Any Yandex host works: `.ru`, `.com`, `.com.tr`, `.kz`, `.by`, `.uz`.

**Not supported:** photos beyond the first, and routes. For review text, use the [Yandex Maps Reviews Scraper](https://apify.com/memo23/yandex-maps-reviews-scraper).

#### 🔄 How it works

1. The scraper opens a Yandex Maps session the way a browser does, with no login.
2. Your location is looked up on Yandex Maps and turned into a map area.
3. Each query is searched in that area, 25 places per page, until the page runs dry or your limit is reached.
4. If an area runs dry before your limit, it is split into four smaller areas, each searched at a closer zoom.
5. Every place is cleaned into one flat row and pushed to the dataset, with duplicates removed.

#### ⚙️ Input parameters

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | What to search for, e.g. `кофейня`, `dentist`, a brand name. |
| `location` | string | City, region or country, e.g. `Moscow`, `Казань`, `Istanbul`. Empty means Moscow. |
| `maxResultsPerQuery` | integer | Places per query. Default 100. |
| `startUrls` | array | Yandex Maps search links or business links. |
| `businessIds` | array | Yandex Maps business IDs. |
| `language` | string | `en`, `ru`, `tr`, `uk` or `kk`. Default `en`. |
| `minRating` | number | Return only places rated at least this. |
| `onlyWithPhone` | boolean | Skip places without a phone number. |
| `onlyWithWebsite` | boolean | Skip places without a website. |
| `enrichEmails` | boolean | Find email addresses on each place's website. Off by default. |
| `maxItems` | integer | Stop after this many places in total. Default 1000. |
| `proxy` | object | Optional. Leave empty to use the built-in residential proxy. |

Example input:

```json
{
  "searchQueries": ["кофейня", "стоматология"],
  "location": "Kazan",
  "maxResultsPerQuery": 200,
  "language": "ru",
  "onlyWithPhone": true
}
```

#### 📊 Output overview

Each row is one place. Contact fields (`phone`, `phones`, `website`, `socialLinks`) come first, then rating, address and location, opening hours (as text and per day), metro, features Yandex lists for the place (prices, delivery, Wi-Fi…), the first photo, and where the row came from (`searchQuery`, `location`, `position`).

#### 📦 Output sample

```json
{
  "placeId": "1736003187",
  "name": "Floo",
  "categories": ["Coffee shop", "restaurant", "cafe"],
  "phone": "+7 (917) 531-27-61",
  "phones": ["+7 (917) 531-27-61"],
  "website": "http://floo.coffee",
  "socialLinks": [
    { "type": "telegram", "url": "https://t.me/floo_coffee" },
    { "type": "whatsapp", "url": "https://wa.me/79175312761" }
  ],
  "rating": 4.9,
  "ratingCount": 3363,
  "reviewCount": 1798,
  "fullAddress": "Moscow, Novodmitrovskaya Street, 1с23",
  "country": "Russian Federation",
  "latitude": 55.806507,
  "longitude": 37.584299,
  "workingHours": "Mon-Fri 7:30 AM–10:00 PM; Sat,Sun 9:00 AM–10:00 PM",
  "isOpenNow": true,
  "chain": { "id": "217629573533", "name": "Floo" },
  "metro": [{ "name": "Dmitrovskaya", "distance": "360 m" }],
  "features": [{ "name": "price cup cappuccino", "value": "300–380 ₽" }],
  "hasVerifiedOwner": true,
  "isAdvertisement": false,
  "advertiserName": null,
  "url": "https://yandex.com/maps/org/floo/1736003187/",
  "searchQuery": "coffee",
  "location": "Moscow",
  "position": 151
}
```

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| Identity | `placeId`, `name`, `shortName`, `categories`, `chain`, `url` |
| Contact | `phone`, `phones`, `website`, `websites`, `socialLinks`, `email`, `emails` (with `enrichEmails`) |
| Reputation | `rating`, `ratingCount`, `reviewCount`, `hasVerifiedOwner` |
| Location | `address`, `fullAddress`, `postalCode`, `country`, `latitude`, `longitude`, `metro` |
| Hours | `workingHours`, `workingHoursByDay`, `isOpenNow`, `status` |
| Extras | `features`, `photoCount`, `imageUrl` |
| Ads | `isAdvertisement`, `advertiserName`, `advertiserTaxId` |
| Source | `searchQuery`, `location`, `position`, `scrapedAt` |

#### ❓ FAQ

**How many places can I get for one query?** As many as Yandex Maps has in the area. One map view gives up to about 500; beyond that the scraper splits the area automatically. A big city and a common category can give thousands.

**Do I need a Yandex account, an API key or a proxy?** No. The scraper uses no login, and a residential proxy is built in.

**Which countries work?** Anywhere Yandex Maps has businesses: Russia, Turkey, Kazakhstan, Belarus, Uzbekistan and the rest of the CIS. Type the city in any language Yandex understands.

**How much does it cost?** $3 per 1,000 places, plus $0.50 per 1,000 places that have a phone number (about 95% do), plus $0.005 per run start. With `enrichEmails` on, $2 per 1,000 places where an email is found. A place is charged the phone fee once, however many numbers it lists. Places skipped by your filters are not charged.

**What does the free Apify plan get?** Up to 100 places per run.

**Are emails included?** Yandex Maps does not show emails, so they are opt-in: with `enrichEmails` on, the scraper reads the contact pages of the website Yandex lists for each place and returns what it finds in `email` and `emails`. Places without a website get none. It makes the run slower. Only places where an email is found are charged, once per website: branches of a chain that share one site are charged once.

#### 💬 Support

Found a bug or need a field added? Open an issue on the Actor's Issues tab and it will be looked at quickly.

#### 🛠 Additional services

Need a custom scraper or an integration with your CRM? Get in touch through the Issues tab.

#### 🔎 Explore more scrapers

- [Yandex Maps Reviews Scraper](https://apify.com/memo23/yandex-maps-reviews-scraper): review text, stars, owner replies and photos for any business, from $1.50 per 1,000
- [2GIS Scraper](https://apify.com/memo23/2gis-scraper): places, reviews, jobs and realty from 2GIS, the other big map of Russia and the CIS

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (Actor: `memo23/yandex-maps-scraper`).

**Purpose:** Yandex Maps businesses for a query in a location, or for given map links and business IDs, as one JSON row per place.

**Minimal input:**

```json
{ "searchQueries": ["dentist"], "location": "Almaty", "maxResultsPerQuery": 50 }
```

**Behaviors an agent should know:**

- Always set `maxResultsPerQuery` and/or `maxItems`; a big city can return thousands of places.
- `location` is any place name Yandex Maps knows; an unknown one returns nothing and logs an error.
- Price: $0.003 per place, plus $0.0005 per place with a phone number, plus $0.005 per run start; with `enrichEmails`, $0.002 per place where an email is found.
- Filters (`minRating`, `onlyWithPhone`, `onlyWithWebsite`) drop rows before they are charged.
- Free Apify plan: up to 100 places per run. The run also stops at the caller's spending limit.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Yandex, Yandex Maps, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available business listings — no authenticated endpoints, owner dashboards, or content behind a Yandex login. Users are responsible for ensuring their use complies with Yandex's Terms of Service, applicable data-protection law (GDPR, 152-FZ, KVKK, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

yandex maps scraper, yandex maps api, scrape yandex maps, парсер яндекс карт, яндекс карты парсер, yandex business directory, yandex maps leads, yandex maps phone numbers, russia business leads, russian companies database, turkey business leads, kazakhstan business directory, cis business data, local business scraper, maps lead generation, b2b leads russia, yandex places data, 2gis alternative, google maps alternative russia, Apify yandex maps

# Actor input Schema

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

What to search for, as you would type it on Yandex Maps: a business type, a category or a name, in Russian, English or Turkish. Each query is searched on its own in the location below.

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

City, region or country to search in, e.g. "Moscow", "Казань", "Istanbul" or "Almaty". Empty means Moscow.

## `maxResultsPerQuery` (type: `integer`):

How many places to return for each query. One map view gives up to about 500; for more, the area is split into smaller parts automatically.

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

Search links (yandex.ru/maps/213/moscow/search/кафе/, with or without ll/z map position) business links (yandex.com/maps/org/name/1234567890/) or short share links (yandex.ru/maps/-/…). Any Yandex host works: .ru, .com, .com.tr, .kz, .by, .uz.

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

Yandex Maps business IDs, the number at the end of a business link.

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

Language of names, addresses, categories and hours.

## `minRating` (type: `number`):

Return only places rated at least this much (1 to 5). Empty means no filter.

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

Skip places that list no phone number. Skipped places are not charged.

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

Skip places that list no website. Skipped places are not charged.

## `enrichEmails` (type: `boolean`):

For places that list a website, visit the site's contact pages and return the email addresses found there. Charged only where an email is found ($2 per 1,000), once per website: branches of a chain that share a site are charged once. Makes the run slower.

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

Stop the run after this many places across all queries and links.

## `proxy` (type: `object`):

Leave empty to use the built-in residential proxy. Set your own only if you need a specific exit.

## Actor input object example

```json
{
  "searchQueries": [
    "кофейня"
  ],
  "location": "Moscow",
  "maxResultsPerQuery": 100,
  "language": "en",
  "onlyWithPhone": false,
  "onlyWithWebsite": false,
  "enrichEmails": false,
  "maxItems": 1000
}
```

# Actor output Schema

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

Places with phones, website, social links, rating, categories, address, coordinates and opening hours.

# 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 = {
    "searchQueries": [
        "кофейня"
    ],
    "location": "Moscow"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["кофейня"],
    "location": "Moscow",
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "searchQueries": [
    "кофейня"
  ],
  "location": "Moscow"
}' |
apify call memo23/yandex-maps-scraper --silent --output-dataset

```

## MCP server setup

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