# 2GIS Scraper — Local Business Data (Russia, CIS, Central Asia) (`haketa/2gis-scraper`) Actor

Scrape 2GIS local business listings across Russia, CIS and Central Asia. Get name, address, phone, website, rating, reviews, opening hours, category and coordinates. Great for lead generation. Export JSON, CSV, Excel.

- **URL**: https://apify.com/haketa/2gis-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation, Business
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.
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

## 2GIS Scraper — Business Directory, Contacts, Ratings & Geo Data

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-orange?logo=apify)](https://apify.com/haketa/2gis-scraper)
[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://apify.com/haketa/2gis-scraper)
[![Data Format](https://img.shields.io/badge/Data-JSON%20%7C%20CSV%20%7C%20Excel-blue)](https://apify.com/haketa/2gis-scraper)

**The fastest, most reliable way to scrape 2GIS and extract local business data at scale.** This **2GIS scraper** pulls structured business listings from [2GIS](https://2gis.ru) — the dominant local search, maps, and enterprise business directory across **Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, and Central Asia**, where Google Maps coverage is sparse. Extract **business names, verified street addresses, postcodes, direct phone numbers, decoded websites, contact emails, customer ratings, review counts, operating hours, categories, social media profiles, and GPS coordinates** — with **no login, no API key, and no coding**.

Export everything to **JSON, CSV, Excel, XML, or API**.

> Built for **B2B lead generation specialists, sales development reps (SDRs), local SEO agencies, geomarketing analysts, and directory builders** targeting Russian, CIS, and Central Asian markets.

***

### ⚡ At a glance

| Feature | Description |
|---|---|
| **Coverage Area** | 200+ cities and regions across Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, UAE (Dubai), and Central Asia |
| **Input Options** | Local-language keywords (`searchTerms`), city names (`cities`), or direct 2GIS Region IDs (`regionIds`) |
| **Output Formats** | JSON, CSV, Excel (XLSX), XML, HTML table |
| **Key Data Fields** | Name, primary phone & full phone list, decoded website, email, address, postal code, ratings, reviews, opening schedule, latitude & longitude, social links |
| **Speed & Scale** | HTTP-native API extraction with rotating datacenter proxy sessions; 50 businesses per request, scaling to 1,000+ items |
| **Automatic Region Resolver** | Translates city names (e.g. `Москва`, `Алматы`, `Ташкент`, `Бишкек`) into numeric 2GIS Region IDs automatically |

***

### 🔎 Why scrape 2GIS?

**2GIS** is the uncontested #1 business map and directory across Eastern Europe and Central Asia. In markets where Western mapping engines lack accurate local phone numbers or updated operating hours, 2GIS maintains deep, verified company databases. Local businesses routinely list mobile and landline phones, official web domains, social messenger channels (Telegram, WhatsApp, VKontakte), entrance instructions, and precise building coordinates.

Manually collecting these listings is prohibitive: results are paginated 50 at a time, websites use redirect links, and phone numbers are nested inside widget blocks. This **2GIS scraper** automates end-to-end data harvesting: specify your target verticals and cities, and receive a normalized, de-duplicated dataset ready for your CRM or analysis pipeline.

**Common reasons people scrape 2GIS:**

- 📞 **B2B Lead Generation:** Build targeted cold-calling and outreach lists with verified telephone numbers and WhatsApp/Telegram links.
- 📊 **Geomarketing & Expansion:** Benchmark business density per square kilometer, analyze category saturation, and identify underserved neighborhoods.
- 🕵️ **Competitor Intelligence:** Monitor competitor branch footprints, customer satisfaction ratings, and working hour schedules.
- 🗺️ **GIS & Map Enrichment:** Feed routing engines and GIS software with exact geocoded latitudes, longitudes, and verified postal codes.
- 🏢 **Local Business Directories:** Populate regional industry portals and classifieds with fresh, enriched company listings.
- 📬 **Direct Mail Marketing:** Leverage 100% postal code coverage for hyper-local mail distribution and territory assignments.

***

### ✨ What this 2GIS scraper does

- 🔎 **Multi-City & Multi-Keyword Targeting:** Search multiple niches (`кафе`, `ресторан`, `стоматология`, `гостиница`) across multiple metropolitan hubs (`Москва`, `Санкт-Петербург`, `Алматы`, `Ташкент`, `Астана`) in a single run.
- 🔁 **Unlocked Deep Pagination (1,000+ items):** Automatically walks every 50-item page per search. Setting `maxPagesPerSearch: 0` enables boundless pagination governed strictly by your `maxItems` target.
- 📞 **Rich Multi-Channel Contact Details:** Captures primary phone, alternate phones, direct decoded website URLs (UTM parameters stripped), company emails, and direct social links (Telegram, VK, WhatsApp, Instagram).
- 📍 **Verified Geocoding & Postal Data:** Extracts latitude, longitude, formatted street addresses, and postal ZIP codes.
- ⭐ **Reputation Metrics:** Average star rating and total review counts to prioritize high-volume establishments.
- 🕐 **Full Weekly Schedule:** Structured weekly operating hours for every day of the week, including 24/7 flags.
- ⚡ **Pure HTTP Performance:** Extremely lightweight and fast, running smoothly on cost-effective Datacenter proxies without headless browser overhead.

***

### 📥 Input parameters

Configure the scraper using the Apify Console or pass JSON directly via the API. All fields are optional:

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | Array | `["кафе"]` | Business categories or keywords in Russian or local language (e.g. `["кафе", "ресторан", "отель"]`). |
| `cities` | Array | `["Москва"]` | City names to search. Automatically resolved to 2GIS Region IDs (e.g. `["Москва", "Алматы", "Ташкент"]`). |
| `regionIds` | Array | `[]` | Optional direct 2GIS Region IDs (e.g. `["32"]` for Moscow). Overrides `cities` if provided. |
| `maxItems` | Integer | `0` | Total maximum listings to collect across all searches. `0` = unlimited (governed by available listings). |
| `maxPagesPerSearch` | Integer | `0` | Result pages per city/keyword (50 businesses/page). `0` = auto/unlimited (governed by `maxItems`). |
| `proxyConfiguration` | Object | Datacenter | Apify Proxy Datacenter is enabled by default. Residential is unnecessary. |

#### Example input — multi-vertical lead generation

```json
{
  "searchTerms": ["стоматология", "косметология"],
  "cities": ["Москва", "Санкт-Петербург"],
  "maxItems": 500,
  "maxPagesPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

#### Example input — single city deep harvest

```json
{
  "searchTerms": ["ресторан"],
  "cities": ["Алматы"],
  "maxItems": 1000,
  "maxPagesPerSearch": 0
}
```

***

### 📊 Extracted fields

Every scraped business returns structured fields across 5 distinct categories:

#### 🏷️ Business identity & taxonomy

| Field | Type | Coverage | Description |
|---|---|---|---|
| `id` | String | 🟢 High | Unique 2GIS firm identifier (de-duplication key) |
| `name` | String | 🟢 High | Official company or trade name |
| `url` | String | 🟢 High | Canonical 2GIS business profile link |
| `category` | String | 🟢 High | Primary industry rubric / category |
| `categories` | Array | 🟢 High | All associated categories and sub-rubrics |
| `org` | String | 🟡 Conditional | Parent corporate or legal entity name |

#### 📞 Contact information & web presence

| Field | Type | Coverage | Description |
|---|---|---|---|
| `phone` | String | 🟢 High | Primary telephone number formatted for dialing |
| `phones` | Array | 🟢 High | Full list of published landline and mobile telephone numbers |
| `website` | String | 🟢 High | Direct decoded official website URL (redirect wrappers removed) |
| `websites` | Array | 🟢 High | Full list of published company websites |
| `email` | String | 🟡 Conditional | Direct business email address when publicly listed |
| `socials` | Array | 🟢 High | Social media profiles including Telegram, VK, WhatsApp, Instagram |

#### 📍 Location & geocoding

| Field | Type | Coverage | Description |
|---|---|---|---|
| `address` | String | 🟢 High | Full formatted street address |
| `addressComment` | String | 🟡 Conditional | Entrance notes, floor numbers, or landmark directions |
| `postcode` | String | 🟢 High | Postal / ZIP code for the building address |
| `lat` | Number | 🟢 High | Precise geographic latitude coordinate |
| `lon` | Number | 🟢 High | Precise geographic longitude coordinate |
| `city` | String | 🟢 High | Resolved city name |
| `regionId` | String | 🟢 High | Internal 2GIS numeric region identifier |

#### ⭐ Ratings & customer feedback

| Field | Type | Coverage | Description |
|---|---|---|---|
| `rating` | Number | 🟢 High | Average customer star rating (1.0 to 5.0) |
| `reviewCount` | Number | 🟢 High | Total number of published customer reviews |
| `photos` | Array | 🟢 High | URLs of user-submitted and verified interior/exterior photos |

#### 🕒 Operating hours & metadata

| Field | Type | Coverage | Description |
|---|---|---|---|
| `schedule` | Object | 🟢 High | Structured opening and closing hours per day of the week |
| `searchTerm` | String | 🟢 High | Search keyword that produced this result |
| `scrapedAt` | String | 🟢 High | ISO 8601 scrape execution timestamp |

***

### 💻 Sample output record

```json
{
  "id": "70000001018349821",
  "name": "Кофемания",
  "url": "https://2gis.ru/firm/70000001018349821",
  "category": "Кофейни",
  "categories": ["Кофейни", "Рестораны", "Кондитерские изделия"],
  "address": "Кудринская площадь, 1",
  "addressComment": "1 этаж, высотка на Кудринской",
  "postcode": "123242",
  "phone": "+7 (495) 721-38-68",
  "phones": [
    "+7 (495) 721-38-68",
    "+7 (926) 111-22-33"
  ],
  "website": "https://coffeemania.ru",
  "websites": ["https://coffeemania.ru"],
  "email": "info@coffeemania.ru",
  "socials": [
    { "type": "telegram", "value": "https://t.me/coffeemania_ru" },
    { "type": "vkontakte", "value": "https://vk.com/coffeemania" }
  ],
  "rating": 4.7,
  "reviewCount": 482,
  "lat": 55.758814,
  "lon": 37.581521,
  "schedule": {
    "Mon": { "working_hours": [{ "from": "08:00", "to": "23:00" }] },
    "Tue": { "working_hours": [{ "from": "08:00", "to": "23:00" }] },
    "Wed": { "working_hours": [{ "from": "08:00", "to": "23:00" }] },
    "Thu": { "working_hours": [{ "from": "08:00", "to": "23:00" }] },
    "Fri": { "working_hours": [{ "from": "08:00", "to": "00:00" }] },
    "Sat": { "working_hours": [{ "from": "09:00", "to": "00:00" }] },
    "Sun": { "working_hours": [{ "from": "09:00", "to": "23:00" }] }
  },
  "org": "ООО Кофемания-Кудринка",
  "photos": [
    "https://photogis.ru/preview/abc123_1024x768.jpg"
  ],
  "city": "Москва",
  "regionId": "32",
  "searchTerm": "кафе",
  "scrapedAt": "2026-11-10T13:00:00.000Z"
}
```

***

### 🔁 Deep pagination & scale

2GIS organizes search results into pages of **50 businesses**.

- **Unlocked 1,000+ Pagination:** Set `maxPagesPerSearch: 0` (or leave default `0`) and specify your desired `maxItems` (e.g. `2000`). The scraper continuously pages until the entire city directory is exhausted or your limit is satisfied.
- **Automatic De-Duplication:** Multiple keywords within the same city may surface overlapping listings. The actor indexes unique 2GIS firm IDs in-memory, ensuring you never pay for or export duplicated records.
- **Region Scaling:** Inputting multiple cities (e.g. `Москва`, `Алматы`, `Ташкент`) processes each city in turn, distributing requests cleanly across proxy sessions.

***

### ⚙️ How to integrate via API

Trigger runs programmatically and stream leads into your CRM or database using Python or Node.js:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run_input = {
    "searchTerms": ["стоматология"],
    "cities": ["Москва"],
    "maxItems": 250,
    "maxPagesPerSearch": 0
}
run = client.actor("haketa/2gis-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} | Phone: {item['phone']} | Address: {item['address']}")
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/2gis-scraper').call({
    searchTerms: ['гостиница'],
    cities: ['Алматы', 'Астана'],
    maxItems: 300,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Successfully scraped ${items.length} hotel records.`);
```

***

### 💡 Practical tips for optimal results

- **Local-Language Search:** Russian or local language queries return exponentially more results than English equivalents (`кафе` yields thousands of listings, while `cafe` yields a small fraction).
- **Postal Code Segmentation:** Filter or group outputs by `postcode` to assign field sales representatives specific geographic postal zones.
- **Messenger Lead Outreach:** Take advantage of the `socials` array — in CIS markets, businesses frequently reply faster via Telegram or WhatsApp than via traditional email.
- **Cost Efficiency:** Keep Apify Datacenter proxies enabled. Residential proxies add unnecessary per-GB bandwidth fees without improving success rates.

***

### ❓ Frequently Asked Questions

**Do I need a 2GIS API key or paid subscription?**
No. The scraper communicates with public directory endpoints and does not require an API token or 2GIS developer account.

**How many cities are supported?**
More than 200 cities across Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Belarus, Azerbaijan, and several international territories (including Dubai).

**Why are some email addresses missing?**
Small local shops and service providers often communicate exclusively via phone or messaging apps. Phone coverage is ~97%, while direct email is published on approximately 45–50% of listings.

**Are the website URLs clean or wrapped in redirects?**
All website links are automatically un-redirected and stripped of tracking parameters, giving you direct, clean canonical domains (e.g. `https://example.com` instead of `https://link.2gis.ru/...?http...`).

**Can I export the data to Google Sheets or Excel?**
Yes. You can export in XLSX, CSV, or JSON format directly from the Apify platform, or automate real-time synchronization to Google Sheets via Apify Integrations.

***

### 🔗 Related directory scrapers

- [Google Maps Scraper](https://apify.com/haketa/google-maps-scraper) — Global local business listings and reviews.
- [Kakao Map Scraper](https://apify.com/haketa/kakao-map-scraper) — South Korean local business and restaurant directory.
- [Justdial Scraper](https://apify.com/haketa/justdial-scraper) — Indian B2B and local service listings.
- [Hitta.se Business Scraper](https://apify.com/haketa/hitta-se-business-scraper) — Sweden company directory and phone numbers.

***

***

### 🏙️ Supported cities & major metropolitan regions

The scraper includes built-in automated region resolution for over 200 cities across 8 countries. Popular target markets include:

| Country | Key Cities Supported |
|---|---|
| **Russia** | Москва (Moscow), Санкт-Петербург (Saint Petersburg), Новосибирск (Novosibirsk), Екатеринбург (Yekaterinburg), Казань (Kazan), Нижний Новгород (Nizhny Novgorod), Челябинск (Chelyabinsk), Красноярск (Krasnoyarsk), Самара (Samara), Уфа (Ufa), Ростов-на-Дону (Rostov-on-Don), Краснодар (Krasnodar), Воронеж (Voronezh), Пермь (Perm), Волгоград (Volgograd), Сочи (Sochi) |
| **Kazakhstan** | Алматы (Almaty), Астана (Astana), Шымкент (Shymkent), Караганда (Karaganda), Актобе (Aktobe), Атырау (Atyrau), Павлодар (Pavlodar), Усть-Каменогорск (Oskemen) |
| **Uzbekistan** | Ташкент (Tashkent), Самарканд (Samarkand), Бухара (Bukhara), Наманган (Namangan), Андижан (Andijan) |
| **Kyrgyzstan** | Бишкек (Bishkek), Ош (Osh), Джалал-Абад (Jalal-Abad) |
| **Azerbaijan** | Баку (Baku), Гянджа (Ganja), Сумгаит (Sumqayit) |
| **United Arab Emirates** | Дубай (Dubai), Абу-Даби (Abu Dhabi) |

***

### 🔍 Recommended vertical search terms

For maximum recall, search using Russian terms. Here is a quick reference table of high-volume industry rubrics:

| Vertical | Russian Search Term | English Equivalent | Common Data Yield |
|---|---|---|---|
| **Food & Dining** | `ресторан` | Restaurant | High reviews, working hours, photos |
| **Cafes & Bakeries** | `кафе`, `кофейня` | Cafe / Coffee shop | High phone & social links |
| **Healthcare** | `стоматология`, `клиника` | Dentistry / Medical Clinic | Phone, doctor specialties, exact address |
| **Beauty & Wellness** | `салон красоты`, `барбершоп` | Beauty Salon / Barbershop | WhatsApp, Instagram, online booking |
| **Automotive** | `автосервис`, `шиномонтаж` | Auto Repair / Tire Fitting | Direct phone, schedule, emergency hours |
| **Hotels & Travel** | `гостиница`, `отель`, `хостел` | Hotel / Hostel | Website, star rating, full coordinates |
| **Fitness** | `фитнес-клуб`, `тренажерный зал` | Fitness Club / Gym | Opening schedule, website, phone |
| **Retail & Shopping** | `супермаркет`, `аптека` | Supermarket / Pharmacy | 24/7 hours flags, postal code |

***

### 🗺️ Geospatial analysis with GeoJSON conversion

Because every listing includes validated `lat` and `lon` coordinates, you can readily convert your scraped dataset into GeoJSON for mapping in QGIS, Mapbox, Kepler.gl, or Leaflet:

```python
import json

with open('dataset_2gis.json', 'r', encoding='utf-8') as f:
    items = json.load(f)

geojson = {
    'type': 'FeatureCollection',
    'features': [
        {
            'type': 'Feature',
            'geometry': {
                'type': 'Point',
                'coordinates': [it['lon'], it['lat']]
            },
            'properties': {
                'name': it.get('name'),
                'phone': it.get('phone'),
                'category': it.get('category'),
                'address': it.get('address'),
                'rating': it.get('rating')
            }
        }
        for it in items if it.get('lat') and it.get('lon')
    ]
}

with open('businesses.geojson', 'w', encoding='utf-8') as f:
    json.dump(geojson, f, ensure_ascii=False, indent=2)
print(f'Converted {len(geojson["features"])} locations to GeoJSON.')
```

***

### 📋 Changelog

#### v1.2 — 2026-11

- **Unlocked 1,000+ Deep Pagination:** Updated `maxPagesPerSearch` default to `0` (auto/unlimited), allowing deep pagination runs up to 1,000+ listings governed by `maxItems`.
- **Enhanced Redirect Decoder:** Improved regex decoding for 2GIS outgoing website redirects, stripping tracking query parameters cleanly.
- **Optimized Datacenter Proxy Retries:** Refined retry pacing with fast-timeout connection recycling for rapid prefill execution (<90s).
- **Field Normalization:** Standardized postal code and multi-channel messenger schemas across all CIS regions.

#### v1.1 — 2026-09

- Initial public release supporting 200+ cities across Russia, CIS, and Central Asia.
- Automatic city-to-region ID resolution without requiring manual region lookup.
- Extracted comprehensive contact information, weekly schedules, and reputation metrics.

# Changelog

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

# Actor input Schema

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

What to search for — a category or business name in the local language works best, e.g. 'кафе', 'ресторан', 'hotel', 'стоматология', 'фитнес'. Each term is searched separately.

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

Cities to search, by name as 2GIS knows them, e.g. 'Москва', 'Алматы', 'Ташкент', 'Астана', 'Бишкек', 'Baku'. Each city is resolved to its 2GIS region automatically.

## `regionIds` (type: `array`):

Optional. Provide 2GIS region IDs directly (e.g. '32' for Moscow) instead of city names. When set, Cities is ignored.

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

Maximum number of businesses to collect across all searches. 0 = unlimited.

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

How many result pages to scrape per city/term. Each page returns up to 50 businesses. 0 = auto/unlimited (governed by Max Items).

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

Apify Proxy (Datacenter) is enabled by default and works out of the box. Residential is not recommended (unnecessary per-GB cost).

## Actor input object example

```json
{
  "searchTerms": [
    "кафе"
  ],
  "cities": [
    "Москва"
  ],
  "regionIds": [],
  "maxItems": 100,
  "maxPagesPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view and export all scraped businesses (JSON, CSV, Excel).

# 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": [
        "кафе"
    ],
    "cities": [
        "Москва"
    ],
    "regionIds": [],
    "maxItems": 100,
    "maxPagesPerSearch": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "searchTerms": ["кафе"],
    "cities": ["Москва"],
    "regionIds": [],
    "maxItems": 100,
    "maxPagesPerSearch": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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 '{
  "searchTerms": [
    "кафе"
  ],
  "cities": [
    "Москва"
  ],
  "regionIds": [],
  "maxItems": 100,
  "maxPagesPerSearch": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/2gis-scraper --silent --output-dataset

```

## MCP server setup

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