# 2GIS API: Business Leads with Phones & Emails (`firsthand/2gis-leads`) Actor

2GIS scraper and API alternative, no key: every place in a city with phones, emails, websites, WhatsApp, Telegram, ratings and hours. 2GIS leads for Russia, Kazakhstan (Almaty, Astana), Uzbekistan, Kyrgyzstan, Belarus, Armenia and Dubai. Парсер 2ГИС, выгрузка организаций.

- **URL**: https://apify.com/firsthand/2gis-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.40 / 1,000 place 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

## 2GIS API: Business Leads with Phones & Emails

Export every business that 2GIS shows for your search in a city: name, rubrics (categories), address, phones, emails,
website, WhatsApp, Telegram and other social links, rating, number of reviews, opening hours and coordinates.
No 2GIS account and no 2GIS API key needed.

### Why use it

- **The whole city, not the first page.** The 2GIS website stops at 60 results per search. This actor pages to the
  end of the list: for cafes in Moscow that is 173 pages, the full 8,605 that 2GIS counts.
- **Emails, not just phones.** Veterinary clinics in Kazan (the 2GIS Kazan region, suburbs included): all 95 places,
  74 with an email. Dentists in Kazan: phone 99%, email 78%, website 68%, social links 83% of 580 places.
- **Fast.** 580 places in about 20 seconds on Apify.
- **Lead filters that don't cost you.** Only with a phone, only with an email, only with or without a website,
  minimum rating. Places removed by a filter are not charged.
- **Cheap.** $0.0004 per place, contacts and emails included, no start fee.

### What you get

| field | example |
|---|---|
| name | Мадин, центр стоматологии, косметологии и педиатрии |
| rubrics | Частные стоматологии, Частные детские стоматологии |
| address, addressComment, postcode | улица Коммунаров, 2 · 1 этаж · 420034 |
| city, district, region, country | Казань · Кировский район · Республика Татарстан · Россия |
| lat, lon | 55.819983, 49.078397 |
| phones | +78432392222, +78435620359 |
| emails | dec.megadentkazan@mail.ru |
| website, websites | http://madinstom.ru (2GIS click-tracking links removed) |
| whatsapp, telegram, social | links to WhatsApp, Telegram, VK, Odnoklassniki, YouTube and others |
| rating, reviewCount | 4.9 · 340 |
| hours | Mon 08:00-21:00; ... Sun 09:00-19:00 |
| orgName, branchCount | chain name and number of branches |
| attributes | awards, payment methods, services |
| url | https://2gis.ru/kazan/firm/70000001055509979 |
| searchQuery, location | what you searched and where |

### How to scrape 2GIS

1. Type search queries as you would on 2GIS: `стоматология`, `кафе`, `автосервис`. Russian works best.
2. Add cities: `Москва`, `Казань`, `Алматы`, `Ташкент`, `Минск`, `Дубай`.
3. Optionally set filters and limits, then run. Download the result as Excel, CSV or JSON, or get it by API.

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

### 2GIS Almaty, Astana and other countries

The same actor works for 2GIS in Kazakhstan (Almaty, Astana), Uzbekistan (Tashkent), Kyrgyzstan (Bishkek),
Belarus (Minsk), Armenia (Yerevan), Azerbaijan (Baku) and the UAE (Dubai). Just write the city name. Links in the
result point to the right 2GIS site (2gis.kz, 2gis.uz, 2gis.ae and so on).

### 2GIS API price: how much does it cost?

$0.0004 per place, contacts and emails included. There is no start fee and nothing is charged for places removed
by your filters. 1,000 places cost $0.40. Set "Max results in total" or a maximum cost per run to stay in budget.

### Businesses without a website

Set "Website" to "Only without a website" to get businesses that have a phone but no site: a ready list for web
studios, marketing agencies and site builders.

### Moving from another 2GIS actor

Input fields of popular 2GIS and Google Maps actors are read too: `query`, `locationQuery`, `location`, `city`,
`cities`, `maxResults`, `searchStringsArray`. You can paste your old input and run.

### Good to know

- A 2GIS city is a region: "Казань" includes nearby towns and villages. Use the `city` column to keep the city only.
- Data is taken live from 2GIS at the time of the run.
- 2GIS does not answer some cloud addresses, so the actor uses Apify datacenter proxy by default. Keep it on.
- Emails and websites appear only where the business published them on 2GIS.

### FAQ

**Do I need a 2GIS API key?** No.

**Is there a 2GIS limit of 60 results?** On the website, yes. This actor goes past it to the end of the list.

**Can I get reviews too?** Use the companion actor 2GIS Reviews API with the place links from this actor.

**Can I get Yandex Maps and 2GIS together?** Use Yandex + 2GIS Business Leads: One Merged List, which merges both maps
into one list.

### Парсер 2ГИС: выгрузка организаций

Выгрузка организаций из 2ГИС по запросу и городу: телефоны, email, сайты, мессенджеры, рейтинг, часы работы,
координаты. Без ключа API и без лимита в 60 результатов. Работает для России, Казахстана, Узбекистана,
Кыргызстана, Беларуси, Армении, Азербайджана и ОАЭ. Цена $0.0004 за организацию.

# 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`):

2GIS does not answer some cloud addresses; Apify datacenter proxy fixes it. Keep it on.

## 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/2gis-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/2gis-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/2gis-leads --silent --output-dataset

```

## MCP server setup

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