# 2GIS Scraper | Парсер 2ГИС: Phones, Emails, Websites (`piotrv1001/2gis-scraper`) Actor

2ГИС парсер: телефоны, email, сайты, соцсети, рейтинг, адрес, метро. Scrape 2GIS businesses by keyword and city (Москва, Алматы, Dubai): phones, emails, websites, socials, rating, hours, metro. Filters by rating, website, category.

- **URL**: https://apify.com/piotrv1001/2gis-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Lead generation, Travel, SEO tools
- **Features:** Limited permissions
- **Stats:** 106 total users, 5 monthly users, 87.3% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.80 / 1,000 results

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 Scraper (2ГИС парсер): Phones, Emails and Websites

> **2ГИС парсер организаций.** Ищите места по запросу и городу («Ресторан», «Москва») и получайте телефоны, email, сайты, соцсети, рейтинг, адрес, часы работы, ближайшее метро и фото. Фильтры по рейтингу, наличию сайта и рубрике. $1.80 за 1000 мест, контакты включены.

The **2GIS Scraper** is a 2GIS parser that turns 2GIS search results into clean JSON, CSV or Excel: each place's name, address, coordinates, rating, categories, opening hours, attributes, nearest metro stations and photo, plus its **phones, emails, websites and social links**. 2GIS is the map and business directory used across Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Armenia, the UAE and more. Use it as a simple alternative to the 2GIS API for lead lists, market research and location analysis: no key, no account.

### 🎯 Use Cases

- **Парсинг 2ГИС for lead lists**: collect phones, emails, websites and WhatsApp or Telegram links of restaurants, dental clinics or car services in one city, ready for a CRM or a sales sequence.
- **A 2GIS API alternative for your app**: feed places with coordinates, categories, ratings and hours into your own map, catalog or spreadsheet without applying for an API key.
- **Find new businesses**: `createdAt` says when a place was added to 2GIS, so a weekly run surfaces newly opened places to contact first.
- **Competitor and market research**: compare ratings, review counts, average bill and cuisine attributes across a category or district before you open or expand.
- **Location analysis**: coordinates, district, postcode and the nearest metro stations with walking distance for every place.
- **Business lists in Dubai, Almaty, Tashkent or Baku**: the same fields on the other 2GIS sites, with the site picked automatically from the city name.

### ✨ Features

- **Contacts for lead lists**: phone numbers, emails, websites, and WhatsApp, Telegram, VK, Instagram, Facebook and other social links, as listed on 2GIS. Included in the price.
- **Keyword + city search**: type what you're looking for (`Ресторан`, `стоматология`, `car repair`) and a city as you'd write it (`Москва`, `Алматы`, `Dubai`). No URL copying needed. Or paste 2GIS search URLs.
- **Any city, several at once**: every city 2GIS covers works by name (`Тверь`, `Минск`, `Samarkand`), and the 2GIS site is picked for you. Run the same keywords across many cities in one run with `cities`, or list them in one line (`Москва, Санкт-Петербург`); several keywords in one line (`кафе, бар`) run as separate searches.
- **Filters**: minimum rating, website, photos, card payment, Wi-Fi, delivery, takeaway and 2GIS category, plus sorting by rating, name or newest. 2GIS applies them in its search, so a strict filter still fills your pages. Places outside your filters are skipped and not charged.
- **Full place data**: address split into street, house and postcode, floor or entrance, building or shopping centre name, district, region, coordinates, rating and review count, categories, working hours, attributes (average bill, cuisine, payment methods, accessibility…), nearest metro stations, main photo and photo count, 2GIS's short description, and when the place was added to 2GIS.
- **Chains**: `orgName` and `branchCount` show the company behind a branch and how many branches it has.
- **No duplicates**: a place that appears on two result pages is saved and charged once.
- **Respects your budget**: the run stops at `maxItems` or at your maximum cost per run, whichever comes first, and the status message says which.
- **Quick**: 50 places with contacts take about a minute.

### 🛠️ How the 2GIS Parser Works

1. **Enter keywords and a city** (`Ресторан` in `Москва`), or paste 2GIS search URLs.
2. **Set filters and limits**: minimum rating, website, photos, Wi-Fi, delivery and the rest, `maxItems` (default 50) and, if you want a page limit, `maxPages`.
3. **Run the scraper** and download the places as JSON, CSV or Excel, or pull them through the Apify API.

### ⚙️ Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords to search for, e.g. `["Ресторан", "стоматология"]`. Needs `city`. |
| `city` | The city as you'd type it: `Москва`, `Тверь`, `Алматы`, `Ташкент`, `Минск`, `Dubai`… Any city 2GIS covers works, and the 2GIS site is picked automatically. |
| `cities` | More cities for the same keywords, e.g. `["Тверь", "Самара"]`. Every keyword runs in every city. |
| `startUrls` | 2GIS search URLs, e.g. `https://2gis.ru/moscow/search/Ресторан`. Use instead of, or together with, keywords. |
| `includeContacts` | Add `phones`, `emails`, `websites` and `socials` to each place. On by default. |
| `sortBy` | `relevance` (2GIS default), `rating` (highest first), `name` or `newest`. |
| `minRating` | Only places rated at least this on 2GIS (0–5), e.g. `4.5`. |
| `websiteOnly` | Only places that list a website (turns contacts on). |
| `hasPhotos`, `cardPayment`, `wifi`, `delivery`, `takeaway` | Only places with photos, that take cards, have Wi-Fi, deliver or offer takeaway. |
| `categories` | Only places whose 2GIS category contains one of these words, e.g. `["стомат"]`. Case-insensitive. |
| `maxItems` | Maximum places in the whole run (default 50, 0 = no limit). |
| `maxItemsPerSearch` | Maximum places for each keyword and city, so the first search doesn't use up `maxItems` (default 0 = no per-search limit). |
| `maxPages` | Maximum result pages per search, 12 places per page (default 0 = as many pages as `maxItems` needs, up to every place 2GIS lists). |
| `country` | Rarely needed: the 2GIS domain ending (`ru`, `kz`, `uz`, `kg`, `az`, `am`, `ae`…). Overrides the automatic choice for every city. |

Top-rated restaurants in Moscow that have a website:

```json
{
    "searchQueries": ["Ресторан"],
    "city": "Москва",
    "sortBy": "rating",
    "minRating": 4.8,
    "websiteOnly": true,
    "maxItems": 100
}
```

Dentists in Almaty:

```json
{
    "searchQueries": ["стоматология"],
    "city": "Алматы",
    "categories": ["стомат"],
    "maxItems": 100
}
```

### 💰 2GIS Data Pricing

Pay only for the places you get. Contacts are included, and places skipped by your filters are not charged.

| Event | Price | What you get |
|---|---|---|
| **Place** | $0.0018 per place ($1.80 per 1,000) | One place with all fields below, contacts included |
| **Actor start** | $0.00005 per run | Charged once when the run starts |

Examples: 50 places (the default) = $0.09 · 100 places = $0.18 · 1,000 places = $1.80.

### 📊 Sample Output Data

A real row from a search for `Ресторан` in `Москва`. `schedule`, `attributes`, `nearestStations` and `socials` are shortened:

```json
{
    "id": "70000001026027886",
    "name": "Bar bq cafe",
    "nameExtension": "Bar bq cafe",
    "address": "Ленинградское шоссе, 16а ст4",
    "buildingName": "Метрополис",
    "city": "Москва",
    "district": "Войковский",
    "latitude": 55.824325,
    "longitude": 37.494866,
    "categories": ["Рестораны", "Бары", "Доставка еды"],
    "rating": 4.9,
    "reviewCount": 270,
    "ratingCount": 1243,
    "schedule": {
        "Mon": [{ "from": "11:00", "to": "23:00" }],
        "Tue": [{ "from": "11:00", "to": "23:00" }]
    },
    "attributes": {
        "Премия 2ГИС": ["Номинант 2026"],
        "Ресторан / Кафе": ["Чек 2200 ₽", "Ланч от 450 ₽", "Европейская кухня", "Заказ столиков", "…"],
        "Способы оплаты": ["Оплата картой", "Наличный расчёт", "Оплата по QR-коду"]
    },
    "photoCount": 71,
    "photoUrl": "https://i4.photo.2gis.com/main/branch/32/70000001026027886/common",
    "postcode": "125171",
    "street": "Ленинградское шоссе",
    "houseNumber": "16а ст4",
    "addressComment": "4 этаж",
    "region": "Москва",
    "country": "Россия",
    "nearestStations": [
        { "name": "Балтийская", "distance": 10, "line": "Московское центральное кольцо" },
        { "name": "Войковская", "distance": 220, "line": "Замоскворецкая линия" }
    ],
    "summary": "Панорамный вид на город, где особенно хвалят бургеры, стейки и авторские коктейли. …",
    "badges": [],
    "createdAt": "2016-12-17T00:00:00Z",
    "updatedAt": "2026-09-28T11:59:48Z",
    "orgName": "Bar bq cafe",
    "branchCount": 2,
    "url": "https://2gis.ru/moscow/firm/70000001026027886",
    "searchUrl": "https://2gis.ru/moscow/search/%D0%A0%D0%B5%D1%81%D1%82%D0%BE%D1%80%D0%B0%D0%BD",
    "scrapedAt": "2026-10-19T06:09:22.699Z",
    "phones": ["+79663714472", "+74952580995"],
    "emails": ["bq@tigrusrest.ru", "pr@barbqcafe.ru", "rkmetropolis@tigrusrest.com"],
    "websites": ["http://barbqcafe.ru/"],
    "socials": {
        "telegram": ["http://t.me/tigrusholding"],
        "whatsapp": ["https://wa.me/79663714472"],
        "vkontakte": ["https://vk.com/barbqcafe"]
    }
}
```

`nameExtension` is the name without 2GIS's description after the comma (`Мята Platinum Лубянка` for `Мята Platinum Лубянка, лаундж-бар`). `rating` is `null` when 2GIS shows no rating for the place yet. `ratingCount` is the "N оценок" 2GIS shows next to the stars (every star rating) and `reviewCount` the written reviews on the Отзывы tab, so `ratingCount` is usually the larger one, and `latitude`/`longitude` are numbers. `createdAt` is when the place was added to 2GIS (filled for roughly half of places), which makes it useful for finding new businesses. `addressComment` is the floor or entrance, `buildingName` the shopping or business centre, and `distance` in `nearestStations` is in metres. `summary` is 2GIS's short description of the place and `badges` holds 2GIS awards, when it has them. `socials` is keyed by network (`whatsapp`, `telegram`, `vkontakte`, `instagram`, `facebook`, `viber`…).

### 🔁 Schedule and Integrate

For lead generation, run the same searches **once a week**: new places (check `createdAt`) and changed phones or ratings show up in each fresh dataset. For a one-off city database, a single run per keyword is enough. Set up recurring runs in Apify **Schedules**, and send the results to **Google Sheets**, **Zapier**, **Make**, **n8n** or a webhook with Apify **integrations**, so new leads land in your CRM or sheet automatically.

### 🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "searchQueries": ["стоматология"], "city": "Алматы", "maxItems": 20 }
```

### ❓ FAQ about the 2GIS API and Parser

**Does 2GIS have an official API?** Yes. 2GIS offers developer APIs for places, maps and routing, which need an API key from 2GIS and a commercial agreement for production use. This Actor is the practical alternative when you just need business listings: no key, no approval, the contacts included in every place, and pagination and retries handled for you.

**Do I need a 2GIS API key or a 2GIS account?** No. The scraper collects the public data anyone sees on the 2GIS website.

**Which cities and countries work?** Every city and region 2GIS covers (about 200, in Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Armenia, Belarus, the UAE and more), by name in Russian or English. A smaller town inside a region (`Балашиха`, part of the Moscow region on 2GIS) is searched by name within that region, so a few neighbouring towns can appear in its results. A name 2GIS doesn't know returns nothing: the run ends with a message saying so, and nothing is charged.

**How many places can I get per search?** All of them. The 2GIS website stops at 5 pages (60 places) per search, but the scraper keeps going past that: `Ресторан` in Moscow returns all 3,690 places 2GIS lists. Set `maxItems` to how many you want (`0` = all); the status message says how many places 2GIS lists for your searches. Places after the first 60 of a search have no `photoCount` and `photoUrl` and an empty `attributes`; every other field, contacts included, is the same. Several searches in one run are fine: a place found by two searches is saved once.

**Why is an email, website or `createdAt` empty?** Contacts are what the business lists on 2GIS, and many places have no email or website. Use `websiteOnly` to keep only places with one. `createdAt` is filled for about half of places. If the contacts lookup fails for a page, its places are still saved with contacts set to `null`, and the run's status message says how many.

**What format are phones and websites in?** Phones are in international format (`+7…`), including toll-free `8 800` numbers (`+7800…`). A number with an extension comes in dial format, the extension after `,,,` (`+74959881717,,,17` is extension 17). `websites` holds real websites only: when a business lists a Telegram channel, VK page or other social link as its website on 2GIS, it goes to `socials` instead, and redirect wrappers are replaced by the real link. Links have `utm_` tracking parameters removed.

**Why did I get fewer places than `maxItems`?** A search may simply have fewer results, or a `maxPages` you set stopped it. The status message says how many places were skipped by your filters, and whether the run stopped at your maximum cost per run.

### 🔗 Related Scrapers

- [2GIS Reviews Scraper](https://apify.com/piotrv1001/2gis-reviews-scraper): full review text, ratings, dates and owner replies for the places you find here.
- [Yandex Maps Scraper](https://apify.com/piotrv1001/yandex-maps-scraper): the other big map in Russia and the CIS (a парсер Яндекс Карт), to cross-check phones and ratings.
- [Google Maps Scraper](https://apify.com/piotrv1001/google-maps-scraper): the same kind of business list for any country outside 2GIS.
- [Local Google Maps Lead Scraper](https://apify.com/piotrv1001/local-google-maps-lead-scraper): Google Maps leads enriched with emails, social links and a lead score.
- [Bing Maps Scraper](https://apify.com/piotrv1001/bing-maps-scraper): business listings from Bing Maps for a second source.

# Actor input Schema

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

What to search for on 2GIS, e.g. "Ресторан", "стоматология" or "car repair". Needs a city below.

## `city` (type: `string`):

City name as you would type it: Москва, Тверь, Алматы, Ташкент, Минск, Dubai… Any city 2GIS covers works, and the 2GIS site is picked automatically.

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

More cities to run the same keywords in, e.g. "Тверь", "Минск", "Samarkand". Every keyword runs in every city.

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

Or paste 2GIS search page URLs, e.g. https://2gis.ru/moscow/search/Ресторан. Use these instead of, or together with, the keywords.

## `includeContacts` (type: `boolean`):

Add phones, emails, websites and social links (WhatsApp, Telegram, Instagram, VK…) to each place. Included in the price.

## `sortBy` (type: `string`):

Order of search results.

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

Only places rated at least this on 2GIS (0–5), e.g. 4.5.

## `websiteOnly` (type: `boolean`):

Only places that list a website (turns contacts on).

## `hasPhotos` (type: `boolean`):

Only places with photos.

## `cardPayment` (type: `boolean`):

Only places that take cards.

## `wifi` (type: `boolean`):

Only places with Wi-Fi.

## `delivery` (type: `boolean`):

Only places that deliver.

## `takeaway` (type: `boolean`):

Only places with takeaway.

## `categories` (type: `array`):

Only places in a 2GIS category containing one of these words, e.g. "Стоматологические клиники" or just "стомат". Case-insensitive.

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

Maximum number of places to save across all searches and cities. Set to 0 for unlimited.

## `maxItemsPerSearch` (type: `integer`):

Maximum places for each keyword and city, so the first search does not use up "Max places". 0 = no per-search limit.

## `maxPages` (type: `integer`):

Maximum number of result pages per search, 12 places per page. 0 (default) = as many pages as "Max places" needs, past the 5 pages (60 places) the 2GIS website shows, up to all the places 2GIS lists for the search.

## `country` (type: `string`):

Rarely needed: the 2GIS domain ending, e.g. ru, kz, uz, kg, az, am, ae. Overrides the automatic choice for every city.

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

Apify datacenter proxy by default, which is the fastest and cheapest option for 2GIS.

## Actor input object example

```json
{
  "searchQueries": [
    "Ресторан"
  ],
  "city": "Москва",
  "includeContacts": true,
  "sortBy": "relevance",
  "websiteOnly": false,
  "hasPhotos": false,
  "cardPayment": false,
  "wifi": false,
  "delivery": false,
  "takeaway": false,
  "maxItems": 50,
  "maxItemsPerSearch": 0,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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": [
        "Ресторан"
    ],
    "city": "Москва",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/2gis-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": ["Ресторан"],
    "city": "Москва",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/2gis-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": [
    "Ресторан"
  ],
  "city": "Москва",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/2gis-scraper --silent --output-dataset

```

## MCP server setup

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