# Yandex Maps Scraper - Business Leads with Phones (`scrapesage/yandex-maps-scraper`) Actor

Scrape Yandex Maps business listings worldwide: name, category, full address, coordinates, phone numbers, rating and review counts, opening hours, website and social links, nearest metro and chain info. Filter before you are charged.

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

## Pricing

$2.00 / 1,000 business scrapeds

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Yandex Maps Scraper - Business Leads with Phones

Turn any search into a clean local-business dataset: **name, category, full address, exact coordinates, phone numbers, rating and review counts, opening hours, website and social links, nearest metro and chain membership** - anywhere in the world.

**No login. No API key. No browser.** Yandex ships its whole result set as structured data, so this reads it directly - about **a second per page of 25 businesses**.

### Why this Yandex Maps scraper?

| Data | Typical map scrapers | This actor |
|---|---|---|
| Name, category, address | ✅ | ✅ + full address, country, region, postal code |
| **Phone numbers** | often paid or missing | ✅ **100% in Russia/CIS, 71% internationally** - every number, not just the first |
| Exact coordinates | partial | ✅ latitude + longitude |
| Rating **and** review count **and** rating count | partial | ✅ all three |
| Opening hours + current open/closed | ❌ | ✅ ~98% |
| **Nearest metro + walking distance** | ❌ | ✅ (Russia/CIS) |
| Website + social links | ❌ | ✅ where the owner published them |
| Chain membership + chain name | ❌ | ✅ |
| Photo count, logo | ❌ | ✅ |
| Search by **coordinates + radius** | ❌ | ✅ `52.5200,13.4050` + zoom |

**39 fields per business.** Two ready-made views: **Businesses** and **Lead list**.

#### It is not just Russia

Yandex Maps has worldwide coverage and this actor is verified on **Moscow, Berlin, London and Istanbul**. Data is richest in Russia/CIS - see the honest coverage table below.

### Use cases

- **Local lead generation** - a phone-number list for any trade in any city, filtered by rating.
- **Market entry research** - how many competitors, where, how well rated.
- **Territory planning** - coordinates on every row, so it maps straight into a GIS or CRM.
- **Franchise & chain analysis** - `isChain` and `chainName` separate chains from independents.
- **Review benchmarking** - rating plus review *and* rating counts per location.

### How to use

1. Add **Search terms** (`dentist`, `coffee`, `plumber`) and **Locations** (a city name, or `lat,lng`).
2. Set **Max pages per search** and any filters.
3. Hit **Start**, then export JSON, CSV or Excel.

### Input

```json
{
    "searchTerms": ["dentist", "orthodontist"],
    "locations": ["Berlin", "52.5200,13.4050"],
    "maxPagesPerSearch": 3,
    "minRating": 4,
    "minReviews": 10,
    "maxItems": 1000
}
```

- **searchTerms / locations** - every term is searched in every location; results are deduplicated. A location can be a **city name** or **`lat,lng`** coordinates (use **zoom** to widen or tighten the area).
- **termsFromFile** - paste a term list, or give **one link** to a `.txt`/`.csv`, Google Sheet, Drive share or key-value-store record. A file that cannot be read stops the run with a clear message.
- **startUrls** - paste Yandex Maps URLs directly; also accepts the Console's *Link remote text file* option.
- **language** *(pick-list)* - en / ru / tr / de / fr / uk / kk.
- **minRating / minReviews / withPhoneOnly / withWebsiteOnly / categoryFilter** - applied **inside** the scrape loop, so filtered-out businesses cost nothing.
- **outputFields** *(pick-list)* - tick exactly the fields you want; all 39 listed with plain-English labels and their exact key.

### Output

```json
{
    "type": "business",
    "businessId": "238919133832",
    "name": "Surf Coffee",
    "categories": ["Coffee shop"],
    "primaryCategory": "Coffee shop",
    "address": "Okhotny Ryad Street, 2",
    "fullAddress": "Moscow, Okhotny Ryad Street, 2",
    "country": "Russian Federation",
    "postalCode": "103265",
    "latitude": 55.757274,
    "longitude": 37.61823,
    "rating": 4.8,
    "reviewCount": 550,
    "ratingCount": 930,
    "phone": "+7 (985) 111-91-64",
    "phones": ["+7 (985) 111-91-64"],
    "workingHours": "24 hours",
    "openStatus": "Open now",
    "nearestMetro": "Okhotny Ryad",
    "nearestMetroDistance": "35 m",
    "photoCount": 237,
    "isChain": true,
    "chainName": "Surf Coffee",
    "url": "https://yandex.com/maps/org/surf_coffee/238919133832/"
}
```

#### What to expect (field coverage) - measured, not estimated

Over **315 businesses** across Russia, Germany and unlocated results:

| Field | Russia / CIS | International |
|---|---|---|
| `name`, `categories`, `address`, `fullAddress`, `latitude`/`longitude`, `rating`, `reviewCount`, `ratingCount`, `url` | **100%** | **100%** |
| `workingHours`, `openStatus` | 96% | 98% |
| **`phone`** | **100%** | **71%** |
| `postalCode` | 79% | not published |
| `nearestMetro` + distance | **100%** | not published |
| `website` / `socialLinks` | only where the owner listed one (~12% and lower) | same |
| `logoUrl`, `chainName` | chains and larger brands only | same |

**Metro and postal code are Russia/CIS only** - Yandex ships transit data for its home markets. Everything a lead list actually needs (name, category, address, coordinates, rating, reviews) is **100% everywhere**.

### Automate & schedule

Pair with Apify **Schedules** to re-run a term × city matrix weekly and push new businesses into Sheets, Slack or your CRM.

### Use with AI assistants (MCP)

Expose this actor to Claude, ChatGPT or any MCP client via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) and ask for local business data in plain language.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Pricing

Pay per event: **$0.002 per business** - $2 per 1,000, with phone numbers and coordinates included. Businesses removed by your filters are **not** charged.

### FAQ

**Does it work outside Russia?** Yes - Berlin, London and Istanbul are all verified. Names, categories, addresses, coordinates and ratings are 100% worldwide; phone coverage is 71% internationally versus 100% in Russia/CIS.

**Can I search a radius instead of a city?** Yes - put coordinates in **Locations** as `lat,lng` and set **zoom** (11 ≈ city-wide, 15 ≈ a few streets).

**Why do some businesses have no website?** Because the owner never added one. Yandex has no website for roughly 7 in 8 listings; the phone number is the reliable contact field here.

**Do I get every result?** Yandex returns 25 per page; set **Max pages per search** for depth. The run message tells you the total Yandex reported.

### Need help?

Open an issue on the actor's **Issues** tab - feature requests genuinely do get built.

***

*Not affiliated with, endorsed by, or sponsored by Yandex. "Yandex" is a trademark of its respective owner and is used here only to describe what this tool reads. Scrapes public pages only.*

# Actor input Schema

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

What to look for - e.g. <code>coffee</code>, <code>dentist</code>, <code>plumber</code>, <code>hotel</code>. Every term is searched in every location below. <b>Leave empty and the run returns a small free sample.</b>

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

A <b>city name</b> (<code>Berlin</code>, <code>Istanbul</code>, <code>London</code>, <code>Moscow</code>) or <b>coordinates</b> as <code>lat,lng</code> (<code>52.5200,13.4050</code>) to search a precise area. Yandex Maps covers the whole world, not just Russia - Berlin, London and Istanbul all verified. Leave empty to search without a location.

## `termsFromFile` (type: `string`):

Bulk-load search terms. Either <b>paste the whole list</b> (one per line), or give <b>a single link</b> to a public <code>.txt</code>/<code>.csv</code>, a Google Sheet or Drive share link, or an Apify key-value-store record. Blank lines, <code>#</code> comments, CRLF and a UTF-8 BOM all parse. A file that cannot be read stops the run with a clear message.

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

Paste Yandex Maps search URLs directly, e.g. <code>https://yandex.com/maps/213/moscow/search/coffee/</code>. Useful when you have already filtered on the site. <b>Bulk import:</b> use this field's <i>Link remote text file</i> option.

## `maxPagesPerSearch` (type: `integer`):

How deep to paginate each term/location pair. Yandex returns up to 25 businesses per page.

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

Language for names, categories and addresses.

## `zoom` (type: `integer`):

Only used when a location is given as coordinates. Lower zoom covers a wider area: 11 is city-wide, 15 is a few streets.

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

Keep only businesses rated at least this. 0 disables it.

## `minReviews` (type: `integer`):

Keep only businesses with at least this many reviews. 0 disables it.

## `withPhoneOnly` (type: `boolean`):

Keep only businesses that publish a phone number. Around 100% do, so this rarely removes anything.

## `withWebsiteOnly` (type: `boolean`):

Keep only businesses that list a website. This is the strictest filter - only about 1 in 8 businesses lists one.

## `categoryFilter` (type: `array`):

Keep only businesses whose category contains one of these, e.g. <code>Coffee shop</code>, <code>Restaurant</code>. Case-insensitive, partial match. Leave empty for all.

## `outputFields` (type: `array`):

Pick the fields you want and every record is trimmed to exactly those - handy for lean CSV/Sheets exports. <b>Nothing to memorise:</b> open the dropdown and tick, or start typing (<code>phone</code>, <code>rating</code>) to filter.

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

Maximum businesses to output across all terms and locations. Duplicates are counted once.

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

Apify datacenter proxy is the default and is normally enough - Yandex serves this data cleanly to it. Switch to RESIDENTIAL only if you start seeing captcha challenges in the run message.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee"
  ],
  "locations": [
    "Moscow"
  ],
  "maxPagesPerSearch": 3,
  "language": "en",
  "zoom": 13,
  "minRating": 0,
  "minReviews": 0,
  "withPhoneOnly": false,
  "withWebsiteOnly": false,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped businesses as JSON items 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": [
        "coffee"
    ],
    "locations": [
        "Moscow"
    ],
    "termsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/yandex-maps-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["coffee"],
    "locations": ["Moscow"],
    "termsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/yandex-maps-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "coffee"
  ],
  "locations": [
    "Moscow"
  ],
  "termsFromFile": ""
}' |
apify call scrapesage/yandex-maps-scraper --silent --output-dataset

```

## MCP server setup

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