# 2GIS Places Scraper (`lergassy/2gis-places-scraper`) Actor

Scrape 2GIS business listings and reviews for any city in Russia, Kazakhstan, UAE, Uzbekistan, Czechia and 10+ more countries: name, category, address, coordinates, phones, emails, websites, socials, opening hours, rating, photos, plus reviews with text, stars, date and owner reply. JSON/CSV.

- **URL**: https://apify.com/lergassy/2gis-places-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Lead generation, Agents
- **Stats:** 10 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Scrape **2GIS** — the business directory and map that covers Russia, Kazakhstan, the UAE, Uzbekistan, Kyrgyzstan, Azerbaijan, Czechia, Italy, Chile, Cyprus, Saudi Arabia and more. Search any category in any city and get one flat row per business: name, category, full address with district and postcode, coordinates, phones, e-mails, websites, social links, opening hours, rating, review count, photos and the parent organization. Turn on **Include reviews** for review text, stars, date, author photos and the owner's reply. Plain HTTP through the same public API the 2GIS site uses — no login, no browser; a residential address is used only as a fallback when the API stalls.

### Tested head-to-head — 9 October 2026

![2GIS place scrapers compared](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/2gis-places-tested-2026-10-09.png)

We sent the same request — *кофейня* (coffee shops) in Novosibirsk, limit 20 places, contacts included — to this Actor and to the four 2GIS place scrapers with the most monthly users on Apify Store (A–D, most users first).

- **Price:** $1.50 per 1,000 places with contacts and no start fee; the others charge $2.90–$4.50 per 1,000 plus $0.00005–$0.03 per start.
- **Rows:** 20 of 20; two Actors returned 10.
- **Data:** 40 filled fields per row: phones, e-mails, websites, socials, opening hours, rating, average bill and the parent organization. Two Actors fill more (45 and 94 fields); one fills 41.
- **Speed:** 34.4 s, the slowest in this test — the 2GIS API answers datacenter addresses slowly, so the Actor switches to a residential address when it stalls. The others took 9.9–19.1 s.

### What data can it extract

| Field | Example |
|---|---|
| `name`, `nameShort`, `category`, `categories` | Blackwood coffee factory, магазин-кофейня · Blackwood coffee factory · Кофейни · \[Кофейни, Продажа кофе] |
| `address`, `addressComment`, `district`, `city`, `postcode`, `lat`, `lon` | Фабричная улица, 11 · 4 этаж · Центральный район · Новосибирск · 630091 · 55.0163, 82.9201 |
| `phones`, `emails`, `websites`, `socials` | \["+77072208000"] · \["dr.boribay@gmail.com"] · \["http://www.boribay-stom.kz"] · {"instagram": \[…], "whatsapp": \[…]} |
| `openingHours`, `is24x7`, `temporarilyClosed` | {"Mon": "07:30-19:00", …} · false · false |
| `rating`, `reviewCount`, `orgRating`, `orgBranchCount`, `photoCount`, `mainPhotoUrl` | 4.9 · 248 · 4.6 · 1 · 248 · https://i7.photo.2gis.com/… |
| reviews: `text`, `rating`, `createdAt`, `authorName`, `photos`, `ownerReply` | "Мне в принципе понравилось…" · 4 · 2026-09-24 · Таня · \[2 photos] · null |

Measured on 25 Sep 2026: "стоматология" in Almaty lists 1,339 clinics, "coffee" in Almaty 2,497 places, "coffee" in the UAE 8,298; a Novosibirsk zoo page has 11,561 reviews. Places come 50 per request, reviews 50 per request.

### How much does it cost

**$1.50 per 1,000 places** (Free plan; $1.20 on Gold and higher plans) and **$1.00 per 1,000 reviews** as an add-on. Nothing per run, per search or per page; rows that fail are free. The free Apify plan ($5 credit) covers about 3,300 places.

### How to scrape 2GIS

1. Type what to search (`кофейня`, `dentist`, `автосервис`) and the cities (`Москва`, `Алматы`, `Dubai`).
2. Set **Max places per query**; turn on **Include reviews** if you want reviews.
3. Run and download JSON, CSV or Excel, or read the dataset through the API.

#### Input

```json
{ "queries": ["стоматология", "coffee"], "cities": ["Алматы", "Dubai"], "maxPlacesPerQuery": 500, "includeReviews": true, "maxReviewsPerPlace": 50 }
```

#### Output

```json
{ "type": "place", "id": "70000001028699803", "name": "Центр Цифровой Стоматологии Dr. Edil Boribay", "url": "https://2gis.kz/almaty/firm/70000001028699803",
  "category": "Частные стоматологии", "address": "улица Розыбакиева, 247 блок 4", "district": "Бостандыкский район", "city": "Алматы", "country": "KZ", "lat": 43.203965, "lon": 76.893432,
  "phones": ["+77072208000"], "emails": ["dr.boribay@gmail.com"], "websites": ["http://www.boribay-stom.kz"], "socials": {"instagram": ["https://instagram.com/…"], "whatsapp": ["https://wa.me/…"]},
  "rating": 4.8, "reviewCount": 932, "openingHours": {"Mon": "09:00-20:00", "Tue": "09:00-20:00"}, "photoCount": 64 }
```

### Use cases

#### Lead generation

Every clinic, restaurant or car service in a city with phone, e-mail, website and socials — a call list in one run.

#### Local SEO and reputation

Ratings and review counts of you and your competitors, plus the reviews themselves with owner replies, on a weekly schedule.

#### Market research

Density of a category by district, opening hours, chains (`orgBranchCount`) versus independents.

#### AI agents

Call it through the Apify MCP server or x402: "top-rated dentists in Almaty with a website" comes back as rows.

### Integrations

Apify API and clients (Python, JavaScript), n8n, Make, Zapier, Google Sheets, webhooks, Apify MCP server.

```bash
curl -X POST "https://api.apify.com/v2/acts/lergassy~2gis-places-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"queries":["dentist"],"cities":["Dubai"],"maxPlacesPerQuery":100}'
```

### Limits and troubleshooting

- 2GIS covers cities, not whole countries: search "Москва", "Алматы" or "Dubai", not "Russia".
- A city 2GIS does not cover returns one free error row saying so.
- The Actor uses the public keys the 2GIS website itself sends; if 2GIS rotates them, paste the new ones into the advanced fields (or open an issue — we update the defaults).

### ❓ FAQ

#### Is it legal to scrape 2GIS?

The Actor reads business listings and reviews that 2GIS shows to any visitor; business contact details are published by the businesses themselves. Use the data in line with 2GIS terms and your local law, and treat reviewer names as personal data.

#### Which countries work?

Any region in the 2GIS catalog: Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, UAE, Saudi Arabia, Bahrain, Qatar, Oman, Kuwait, Egypt, Cyprus, Czechia, Italy, Chile.

#### Can I get reviews only?

Yes — paste place URLs or ids and turn on **Include reviews**.

### Your feedback

If a field is missing or a city fails, open an issue on the Actor page — fixes usually ship the same day. A ⭐ review helps other people find the Actor.

### You might also like

| Actor | What it does |
|---|---|
| [Google Hotels Scraper](https://apify.com/lergassy/google-hotels-scraper) | Hotel prices and ratings from Google |
| [Website Contacts API](https://apify.com/lergassy/website-contacts-api) | E-mails, phones and socials from any website |
| [Trustpilot Reviews API](https://apify.com/lergassy/trustpilot-reviews-api) | Company reviews from Trustpilot |
| [Agoda Reviews Scraper](https://apify.com/lergassy/agoda-reviews-scraper) | Hotel guest reviews from Agoda and Booking.com |

# Changelog

This Actor's version history is a separate document: https://apify.com/lergassy/2gis-places-scraper/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Categories, names or keywords in any language 2GIS supports: <b>кофейня</b>, <b>dentist</b>, <b>Starbucks</b>, <b>автосервис</b>. One search per query per city.

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

Cities or regions as 2GIS names them: <b>Москва</b>, <b>Novosibirsk</b>, <b>Алматы</b>, <b>Dubai</b>, <b>Tashkent</b>, <b>Praha</b>. Each query runs in each city.

## `maxPlacesPerQuery` (type: `integer`):

Stop each query in each city after this many places (50 per request).

## `includeReviews` (type: `boolean`):

Also fetch reviews of every place found — text, rating, date, author, photos, owner reply. Add-on $1 per 1,000 reviews.

## `maxReviewsPerPlace` (type: `integer`):

Newest first, 50 per request.

## `placeUrls` (type: `array`):

Individual places: https://2gis.ru/novosibirsk/firm/141265769338187 or just the id.

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

Language of names and categories. Auto = the city's own language.

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

Hard stop for the whole run.

## `catalogKey` (type: `string`):

The public key the 2GIS website uses. Change only if 2GIS rotates it. Leave empty to use the built-in key.

## `reviewsKey` (type: `string`):

The public key the 2GIS website uses for reviews. Leave empty to use the built-in key.

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

Apify datacenter proxy is on by default so a schedule does not hammer the site from one address. Residential is not needed.

## Actor input object example

```json
{
  "queries": [
    "кофейня"
  ],
  "cities": [
    "Новосибирск"
  ],
  "maxPlacesPerQuery": 40,
  "includeReviews": false,
  "maxReviewsPerPlace": 20,
  "language": "auto",
  "maxItems": 100000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per business (type=place) and, when enabled, one row per review (type=review).

# 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 = {
    "queries": [
        "кофейня"
    ],
    "cities": [
        "Новосибирск"
    ],
    "maxPlacesPerQuery": 40,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/2gis-places-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 = {
    "queries": ["кофейня"],
    "cities": ["Новосибирск"],
    "maxPlacesPerQuery": 40,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/2gis-places-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 '{
  "queries": [
    "кофейня"
  ],
  "cities": [
    "Новосибирск"
  ],
  "maxPlacesPerQuery": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call lergassy/2gis-places-scraper --silent --output-dataset

```

## MCP server setup

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