# Yandex + 2GIS Business Leads: One Merged List (`firsthand/yandex-2gis-business-leads`) Actor

Yandex Maps and 2GIS business leads in one list: each company once, with phones, emails, websites, messengers and ratings from both maps. A business directory of Russia for any city and keyword, more companies than either map alone. База компаний из Яндекс Карт и 2ГИС.

- **URL**: https://apify.com/firsthand/yandex-2gis-business-leads.md
- **Developed by:** [Firsthand](https://apify.com/firsthand) (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

$0.50 / 1,000 company returneds

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 + 2GIS Business Leads: One Merged List

One list of Russian companies from both big Russian maps, Yandex Maps and 2GIS. Each company appears once, with
phones, emails, websites, messengers and ratings from both maps.

### Why use it

- **More companies than either map.** Each map misses businesses the other has. Searched over the same area, dentists
  in Kazan: Yandex Maps 474, 2GIS 580, together about 616 (36 only on Yandex, 138 only on 2GIS). Veterinary clinics in
  Kazan: 88, 95 and about 111.
- **Emails and both ratings.** Emails come from 2GIS (Yandex Maps does not publish them), ratings and review
  counts from both maps side by side.
- **Each company once.** Records are matched by phone number, or by location within 60 m plus a shared word in the
  name. Phones are merged without repeats, and a company found again by another query or city is not repeated or charged.
- **Lead filters that don't cost you.** Only with a phone, only with an email, only with or without a website,
  minimum rating. Removed companies are not charged.
- **Cheaper than running two scrapers.** $0.0005 per company, no start fee.

### What you get

| field | example |
|---|---|
| name | Улыбка, стоматология |
| categories | rubrics from 2GIS and categories from Yandex Maps |
| address, city, district, postcode | from 2GIS, or Yandex Maps if 2GIS has no such company |
| lat, lon | coordinates |
| phones | all numbers from both maps, no repeats |
| emails | from 2GIS |
| website, websites, whatsapp, telegram, social | from both maps |
| hours | opening hours |
| ratingYandex, reviewCountYandex | 4.8 · 120 |
| rating2gis, reviewCount2gis | 4.9 · 340 |
| yandexUrl, gisUrl | links to the company on each map |
| sources | \["yandex", "2gis"], \["yandex"] or \["2gis"] |

### How to get a business list from Yandex Maps and 2GIS

1. Type what you are looking for: `стоматология`, `автосервис`, `юридические услуги`.
2. Add cities: `Москва`, `Казань`, `Новосибирск`.
3. Optionally set filters, then run. Download as Excel, CSV or JSON, or get it by API.

```json
{
  "searchQueries": ["стоматология"],
  "cities": ["Казань"],
  "onlyWithEmail": true
}
```

### Price

$0.0005 per company, no start fee, nothing charged for companies removed by filters.

### Yandex Maps vs 2GIS: why use both

Neither map has every business. Searched over the same area, 36 Kazan dentists are only on Yandex Maps and
138 only on 2GIS. This actor gives you the union, with the best of each map in one row, as a business directory
of Russia for any city.

### Good to know

- Both maps are searched over the same area: the 2GIS region of the city (suburbs included) plus the Yandex city area.
- Both maps are searched live at the time of the run.
- Opening hours come as the source map writes them: 2GIS as "Mon 08:00-21:00; ...", Yandex in its own text.
- A company is matched across maps by phone, or by place and name. Chains with one shared phone may be matched to
  the nearest branch.

### База компаний из Яндекс Карт и 2ГИС

Парсер Яндекс Карт и 2ГИС в одном: база компаний по запросу и городу, каждая компания один раз, с телефонами,
email, сайтами, мессенджерами и рейтингами обеих карт. $0.0005 за компанию.

# Actor input Schema

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

What to search for, as you would type it on the map: a business type or a name. One per line. Russian works best (стоматология, кафе, автосервис).

## `cities` (type: `array`):

City, district or region as named on the map, e.g. Москва, Казань, Новосибирск. One per line.

## `maxItemsPerQuery` (type: `integer`):

0 means everything the map has for this query in this city.

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

Stop after this many rows across all queries and cities. 0 means no limit.

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

Skip places without a phone number. Skipped places are not charged.

## `onlyWithEmail` (type: `boolean`):

Skip places without an email address. Skipped places are not charged.

## `website` (type: `string`):

Businesses without a website are leads for web studios and marketers. Skipped places are not charged.

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

Skip places rated below this, e.g. 4.5. Empty means any. Skipped places are not charged.

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

Used for 2GIS, which does not answer some cloud addresses. Yandex goes direct.

## Actor input object example

```json
{
  "searchQueries": [
    "стоматология"
  ],
  "cities": [
    "Казань"
  ],
  "maxItemsPerQuery": 0,
  "maxItems": 0,
  "onlyWithPhone": false,
  "onlyWithEmail": false,
  "website": "any",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `places` (type: `string`):

Places found in this run.

# 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": [
        "стоматология"
    ],
    "cities": [
        "Казань"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("firsthand/yandex-2gis-business-leads").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": ["стоматология"],
    "cities": ["Казань"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("firsthand/yandex-2gis-business-leads").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": [
    "стоматология"
  ],
  "cities": [
    "Казань"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call firsthand/yandex-2gis-business-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,firsthand/yandex-2gis-business-leads"
        }
    }
}
```

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/FQf4xSQgKUM2NgDXi/builds/IQWD58b6QlhPHShfJ/openapi.json
