# 2GIS Scraper \[$3/1K💰] | Business Directory | Reviews | Jobs (`ahmed_jasarevic/2gis-scraper`) Actor

Extract business listings, reviews, jobs and real-estate data from 2GIS — the leading directory and map platform across Russia, Kazakhstan and Central Asia. Get names, addresses, coordinates, phones, ratings and vacancies. Built for local market research and lead generation. $3 per 1,000 places.

- **URL**: https://apify.com/ahmed_jasarevic/2gis-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.39 / 1,000 reviews

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

Scrape 2GIS business directory data — places with contacts and ratings, customer reviews, job vacancies and realty listings across Russia, the CIS and the UAE — into structured datasets, using the same public endpoints the 2gis.ru website itself calls, with no API key.

**Built for:**

- B2B lead generation and sales prospecting by city and category
- Review monitoring and reputation tracking for local businesses
- Local market and competitor analysis across 2GIS directories
- Job-market and realty-market monitoring per city
- Building a regional company contact database (phones, emails, schedules)

### Build Business Lead Lists From the 2GIS Directory

2GIS is a major business directory and map platform covering millions of organizations across Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Tajikistan, Georgia, Armenia, Azerbaijan, Cyprus and the UAE. This actor turns search queries, city names, coordinates, polygons or plain 2gis.\* URLs into structured rows: company name and legal name, address with administrative hierarchy and coordinates, phone numbers, emails and website links, opening schedule, rubrics (categories), ratings and review counts, price level, plus optional vacancy boards and realty listings (aggregated from CIAN and Domclick) for each city. Server-side filters (has website, delivery, card payment, average bill, minimum rating and more) narrow the list before rows are stored.

### How It Works

![How the 2GIS Scraper works: city searches become place, review, job and realty rows from public 2GIS endpoints.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-2gis.webp)

The Actor resolves each query or city to a 2GIS region, then calls the public place, review, vacancy and realty endpoints that power the site. Results are paged 50 at a time, and monitoring mode remembers IDs so later runs emit only new items.

Every row is written to the dataset for its type: places, reviews, jobs or realty. Rows carry addresses, coordinates, contacts, schedules and ratings, ready for local-market maps and lead lists.

1. At startup the actor fetches `2gis.ru` once and reads the public web, reviews and vacancies API keys from the site's page config; built-in fallback keys are used if the site is unreachable.
2. City names are resolved to 2GIS region IDs; coordinates are searched within a configurable radius (default 50 km); WKT polygons are searched by their exact geometry; URLs and firm IDs resolve directly.
3. Every search requests all available place fields and pages results 50 at a time until `maxResultsPerQuery` is reached, with polite delays between requests.
4. Reviews, vacancies and realty boards are read from their own public endpoints per city, with filters applied server-side.
5. Every row is written to the dataset of its type (`places`, `reviews`, `jobs` or `realty`); filtering, caps and monitoring apply before a row is stored.
6. In monitoring mode every pushed row is remembered by type + id in a named key-value store, so the next scheduled run outputs only items that appeared since.

### Input Parameters

#### Search targets

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `searchQueries` | array | No | — | Search terms (e.g. `cafe`); each query runs in each location. |
| `locations` | array | No | — | City names, `lat,lon` coordinates, or WKT `POLYGON(...)`. Jobs and realty need city names. |
| `startUrls` | array | No | — | Full 2gis.\* URLs: `/{city}/search/{query}` or `/{city}/firm/{id}`; mixable with queries. |
| `organizationIds` | array | No | — | Numeric firm IDs or firm URLs to scrape directly. |
| `includeBranches` | boolean | No | `false` | Also fetch every other branch of a multi-branch organization. |
| `scrapeMode` | enum | No | `places` | `places`, `reviews` or `all`. Reviews need `maxReviewsPerPlace > 0` (defaults to 20 in `reviews` mode). |

#### Limits & ordering

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `maxResultsPerQuery` | integer | No | `50` | Max places per search target (1–10,000), paged 50 at a time. |
| `maxItems` | integer | No | `0` | Hard global cap across all rows; `0` = no cap. Free plan capped at 100 items per run. |
| `searchRadiusKm` | number | No | `50` | Radius for coordinate locations (0.1–50); ignored for cities and polygons. |
| `locale` | enum | No | `en_RU` | 20 region locales (e.g. `ru_RU`, `en_AE`, `ar_AE`, `en_KZ`); auto-retries with the region default if unavailable. |
| `sortBy` | enum | No | `relevance` | `relevance`, `distance` (needs coordinates), `rating`, `name`, `opened_time`. |
| `categoryIds` | array | No | — | Rubric IDs (e.g. `164` for restaurants); empty = all categories. |

#### Place filters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `minRating` | number | No | — | 1–5; unrated places are dropped. |
| `avgBillMin` | integer | No | — | Minimum average bill in local currency. |
| `avgBillMax` | integer | No | — | Maximum average bill. |
| `hasSite` | boolean | No | `false` | Only places with a website in contacts. |
| `hasPhotos` | boolean | No | `false` | Server-side photo filter. |
| `hasGoods` | boolean | No | `false` | Only places with a price list / goods. |
| `delivery` | boolean | No | `false` | Only places offering delivery. |
| `takeaway` | boolean | No | `false` | Only places offering takeaway. |
| `wifi` | boolean | No | `false` | Only places advertising Wi-Fi. |
| `cardPayment` | boolean | No | `false` | Only places accepting cards. |
| `open24h` | boolean | No | `false` | Only 24-hour places. |
| `skipClosedPlaces` | boolean | No | `false` | Drop places that look permanently closed. |

#### Reviews

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `maxReviewsPerPlace` | integer | No | `0` | Reviews per place; `0` disables unless mode is `reviews` (then 20). |
| `reviewSortBy` | enum | No | `date_edited` | `date_edited` or `date_created`. |
| `reviewRatings` | enum | No | `all` | `positive` = rating ≥ 4, `negative` = rating ≤ 2. |
| `repliesOnly` | boolean | No | `false` | Keep only reviews with an official business reply. |
| `reviewKeywords` | array | No | — | Keep reviews whose text or reply contains any of these strings (case-insensitive). |
| `reviewSource` | enum | No | `all` | `2gis`, `flamp`, `booking` or `all` (2GIS mirrors some reviews). |
| `reviewDateFrom` | string | No | — | Inclusive: `YYYY-MM-DD` or relative offset like `-7d`. |
| `reviewDateTo` | string | No | — | Inclusive end date. |
| `includeUnratedReviews` | boolean | No | `false` | Also fetch unrated reviews. |
| `includeReviewerData` | boolean | No | `true` | Off clears reviewer name/id before rows are saved. |

#### Jobs & realty boards

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `includeJobs` | boolean | No | `false` | Scrape each location's vacancy board (locations must be city names). |
| `maxJobsPerLocation` | integer | No | `100` | Vacancies per location (1–10,000). |
| `includeRealty` | boolean | No | `false` | Scrape each city's realty board (aggregated from CIAN and Domclick). |
| `realtyDeal` | enum | No | `sale` | `sale` or `rent`. |
| `realtyPropertyType` | enum | No | `residential` | `residential`, `commercial` or `all`. |
| `realtySort` | enum | No | `default` | `price_asc`, `price_desc`, `area_asc`, `area_desc`. |
| `realtyRooms` | array | No | — | `studio`, `1`–`5+`; empty = all. |
| `realtyMinPrice` | integer | No | `0` | Local currency; `0` disables the bound. |
| `realtyMaxPrice` | integer | No | `0` | `0` disables the bound. |
| `realtyMinArea` | number | No | `0` | m²; `0` disables the bound. |
| `realtyMaxArea` | number | No | `0` | `0` disables the bound. |
| `realtyProviders` | array | No | — | `cian`, `domclick`; empty = all. |
| `maxRealtyListingsPerLocation` | integer | No | `100` | Listings per location (1–10,000). |

#### Monitoring & proxy

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `monitoringMode` | boolean | No | `false` | Push only items never pushed before (state kept in a named store) — rows skipped this way are not charged. |
| `monitoringStoreName` | string | No | `2gis-monitoring` | State store name; change it to start a fresh monitoring series. |
| `proxy` | object | No | disabled | Standard Apify proxy picker; use it only if 2GIS blocks datacenter IPs. |

### Output Fields

Rows are written to per-type datasets, discriminated by `item_type`:

- **`place` rows (32 fields):** `item_type`, `place_id`, `place_type`, `name`, `name_ex`, `address_name`, `address_comment`, `address`, `adm_div`, `full_address_name`, `building_name`, `full_name`, `purpose_name`, `floors`, `point`, `region_id`, `rubrics`, `contact_groups`, `schedule`, `attribute_groups`, `reviews`, `links`, `org`, `stat`, `context`, `has_goods`, `ads`, `rating`, `reviews_count`, `search_query`, `search_location`, `fetched_at`
- **`review` rows (21 fields):** `item_type`, `review_id`, `place_id`, `place_name`, `place_address`, `rating`, `text`, `provider`, `source`, `url`, `date_created`, `date_edited`, `likes_count`, `comments_count`, `is_verified`, `photos`, `official_answer`, `user`, `search_query`, `search_location`, `fetched_at`
- **`job` rows (22 fields):** `item_type`, `job_id`, `name`, `salary_label`, `legal_text`, `category_id`, `category_name`, `provider_name`, `provider_code`, `apply_url`, `org_id`, `org_name`, `branch_id`, `building`, `address_name`, `lat`, `lon`, `city`, `district`, `logo_url`, `search_location`, `fetched_at`
- **`realty` rows (28 fields):** `item_type`, `realty_id`, `name`, `url`, `button_name`, `is_recent`, `price`, `currency`, `price_per_meter`, `property_type`, `rooms`, `area`, `floor`, `attributes`, `images`, `categories`, `source`, `branch_id`, `org_id`, `building_id`, `address_name`, `postcode`, `lat`, `lon`, `adm_div`, `metro`, `search_location`, `fetched_at`

### Example Input

```json
{
  "searchQueries": ["coffee shop"],
  "locations": ["Dubai"],
  "scrapeMode": "all",
  "maxResultsPerQuery": 20,
  "maxReviewsPerPlace": 10,
  "minRating": 4,
  "hasSite": true,
  "includeJobs": false,
  "monitoringMode": true
}
```

### Example Output

```json
{
  "item_type": "place",
  "place_id": "70000001017456789",
  "name": "Example Coffee Shop",
  "full_address_name": "Dubai, Al Wasl Road, Building 12",
  "point": { "lon": 55.2619, "lat": 25.1972 },
  "rubrics": [{ "name": "Coffee shops", "alias": "coffee_shop" }],
  "contact_groups": [
    { "type": "phone", "contacts": [{ "value": "+971 4 000 0000" }] },
    { "type": "website", "contacts": [{ "value": "https://example.com" }] }
  ],
  "schedule": { "working_hours": [{ "from": "08:00", "to": "23:00" }] },
  "rating": 4.7,
  "reviews_count": 312,
  "search_query": "coffee shop",
  "search_location": "Dubai",
  "fetched_at": "2026-10-19T12:00:00.000Z"
}
```

### Automate Business Directory & Review Monitoring With Schedules & Webhooks

- **Daily lead refresh:** schedule `searchQueries` + `locations` with `monitoringMode: true` — each run delivers only new or updated rows, and skipped rows are not charged.
- **Reputation tracking:** schedule `scrapeMode: "reviews"` with `reviewDateFrom: "-1d"` over your client portfolio's firm IDs to collect yesterday's reviews every morning.
- **New-job and new-listing alerts:** run `includeJobs` / `includeRealty` daily per city and wire a dataset webhook to Slack or email.
- Scheduling is the intended usage pattern and also improves this actor's Store recommendation signals.

### Related Actors

- [2GIS Places Scraper](https://apify.com/m_mamaev/2gis-places-scraper) — the most-used 2GIS actor on the Store, a solid reference implementation.
- [2GIS Scraper (Phones, Emails, Reviews)](https://apify.com/zen-studio/2gis-places-scraper-api) — places with contact extraction, closest direct alternative.
- [2GIS Reviews Scraper](https://apify.com/zen-studio/2gis-reviews-scraper) — reviews-only focus if you do not need full place records.
- [2GIS Scraper — Places & Business Data](https://apify.com/dami_studio/2gis-places-scraper) — another places-focused option.
- [2GIS Places Scraper — Russia & CIS Business Directory](https://apify.com/bovi/2gis-places-scraper) — CIS-focused directory extraction.

### Frequently Asked Questions

#### Why use this actor instead of the official API?

2GIS does publish an official API platform (docs.2gis.com): Directory, Places, Geocoder and other services behind a registered key — a demo key is free for one month, after which paid subscriptions apply, and Data.2GIS sells `.xlsx` company samples (500+ filters) for Russia and Kazakhstan. This actor needs no registration at all: it reads the same public endpoints the 2gis.ru website itself calls (keys fetched automatically), combines places, reviews, jobs and realty boards in one run — the vacancy and realty boards have no documented public API endpoint — and keeps cross-run monitoring state so scheduled runs return only items you have not seen before.

#### Is there a 2GIS API?

Yes — 2GIS offers an official API platform with Directory, Places, Geocoder, Suggest, Categories and Regions APIs, plus maps and navigation services. You register at platform.2gis.com for a demo key (free for one month). For ad-hoc or keyless extraction, this actor and several Store alternatives call the website's own endpoints instead.

#### How can I get 2GIS data without an API key?

Use this actor: it fetches the website's public keys automatically at startup (with built-in fallbacks), so no account, key or subscription is needed. Paste search queries, city names or 2gis.\* URLs and run.

#### What are the alternatives to this actor?

The official 2GIS API platform and the paid Data.2GIS sample service are the non-scraping routes; within Apify, the 2GIS places and reviews scrapers listed under Related Actors cover parts of the same data (places only, or reviews only), while this actor covers places, reviews, jobs and realty in one input.

#### Can I export 2GIS business data to CSV for lead generation?

Yes — every dataset exports to CSV, Excel, JSON or XML from the Apify Console, or on a schedule through the dataset API. Combine `searchQueries`, `locations` and the contact filters to build targeted lead lists.

#### Does it cover Dubai and the UAE as well as Russia?

Yes — 2GIS operates across the CIS plus Cyprus and the UAE; pass `Dubai` or `Abu Dhabi` as a location (locale `en_AE`/`ar_AE` are available). Jobs and realty boards apply to cities where 2GIS lists them.

### For AI Agents & LLM Apps

**Purpose:** returns 2GIS directory rows — places (contacts, schedule, rubrics, rating), reviews, job vacancies and realty listings — from the site's public endpoints, keyless.

**Minimal input:**

```json
{ "searchQueries": ["cafe"], "locations": ["Moscow"], "maxResultsPerQuery": 10 }
```

**Reviews mode:**

```json
{ "searchQueries": ["cafe"], "locations": ["Moscow"], "scrapeMode": "reviews", "maxReviewsPerPlace": 5 }
```

**Output fields (by `item_type`):** place → place_id, name, address fields, point, rubrics, contact_groups, schedule, rating, reviews_count, stat, fetched_at; review → review_id, place_id, rating, text, source, date_created, official_answer, user; job → job_id, name, salary_label, apply_url, org_name, city; realty → realty_id, price, currency, property_type, rooms, area, source, url.

**Behaviors an agent should know:**

- `scrapeMode` defaults to `places`; reviews only flow when `maxReviewsPerPlace > 0` (in `reviews` mode it defaults to 20).
- `maxItems: 0` means uncapped — always set an explicit cap for agentic runs; free-plan runs stop at 100 items per run.
- `locations` accepts city names, `lat,lon` and WKT polygons — but `includeJobs`/`includeRealty` require city names.
- `monitoringMode: true` makes runs idempotent-by-delta (only never-seen rows); rows skipped by monitoring are not charged.
- `locale` falls back to the region default automatically if the requested locale is unavailable for a location.
- If both `startUrls`/`organizationIds` and search targets are set, all sources are processed and merged.

**Billing:** pay-per-event per row — `Place` $0.003, `Review` $0.0004, `Job` $0.002, `Property` $0.0025, plus a run-start event; monitoring-skipped rows are free.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by 2GIS. It accesses only publicly available website endpoints using the site's own published keys — no account registration or login is involved. Output includes business contact details that companies publish themselves, plus reviews that may contain personal names; users are responsible for their own compliance with the source platform's Terms of Service and applicable data-protection law (including GDPR for personal data such as reviewer identities), and business contact data should not be used for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, GDPR).

### SEO Keywords

2gis scraper, 2gis api, 2gis data, 2gis export, 2gis business directory, business directory data, business directory scraper, russia company database, moscow business data, dubai business directory, almaty company data, uae business leads, 2gis reviews scraper, business phone number database, local business listings data, lead generation database, company contact data, 2gis alternative, job vacancies data, property listings russia

# Actor input Schema

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

Search terms to find businesses (e.g., 'cafe', 'restaurant', 'hotel'). Each query is searched in each location below.

## `locations` (type: `array`):

City names (e.g., 'Moscow', 'Dubai', 'Almaty'), coordinates as 'lat,lon' (e.g., '55.751597,37.622161'), or a polygon as WKT 'POLYGON((lon lat,lon lat,...))' (e.g., 'POLYGON((37.5 55.65,37.75 55.65,37.75 55.85,37.5 55.85))'). Each query is searched in each location. Jobs and realty boards need city names.

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

Full 2gis.\* URLs: /{city}/search/{query} or /{city}/firm/{id}. Mix freely with search queries. Example: https://2gis.ru/moscow/search/cafe

## `organizationIds` (type: `array`):

Numeric 2GIS firm IDs or firm URLs to scrape directly (e.g., 4504128908474189).

## `includeBranches` (type: `boolean`):

When a scraped firm belongs to a multi-branch organization, also fetch every other branch of that organization (each branch becomes its own row, including its reviews).

## `scrapeMode` (type: `string`):

What to scrape: places, reviews, or both. Reviews require maxReviewsPerPlace > 0 (defaults to 20 in 'reviews' mode).

## `maxResultsPerQuery` (type: `integer`):

Maximum number of places to fetch for each search target. Results are paged 50 at a time up to this limit. When client-side filters are on, more pages are scanned to still fill this limit.

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

Hard cap on all pushed rows (places + reviews + jobs + realty listings) per run. 0 means no cap.

## `searchRadiusKm` (type: `number`):

Radius around coordinate locations ('lat,lon'). Ignored for city names and polygons.

## `locale` (type: `string`):

Language for results (e.g., 'en_RU', 'ru_RU', 'en_AE', 'ar_AE'). 2GIS locales are region-specific: if the chosen locale is not available for a location, the Actor automatically retries with the region's default locale.

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

Order of search results. 'distance' requires coordinates in locations.

## `categoryIds` (type: `array`):

Filter results by 2GIS category (rubric) IDs, e.g., '164' for restaurants. Leave empty to search all categories.

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

Only places with this 2GIS rating or higher. Places without a rating are dropped.

## `avgBillMin` (type: `integer`):

Minimum average bill (in the city's local currency). Places without an average bill still pass.

## `avgBillMax` (type: `integer`):

Maximum average bill. Places without an average bill still pass.

## `hasSite` (type: `boolean`):

Only places with a website in their contacts.

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

Only places that have photos on 2GIS (server-side filter).

## `hasGoods` (type: `boolean`):

Only places with a 2GIS price list / goods (server-side filter).

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

Only places that offer delivery.

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

Only places that offer takeaway.

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

Only places that advertise Wi-Fi.

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

Only places that accept credit cards.

## `open24h` (type: `boolean`):

Only places open around the clock.

## `skipClosedPlaces` (type: `boolean`):

Drop places whose name looks permanently closed.

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

How many reviews to pull for each place. 0 disables reviews unless scrape mode is 'reviews' (then it defaults to 20).

## `reviewSortBy` (type: `string`):

Order used on the 2GIS reviews API.

## `reviewRatings` (type: `string`):

positive = rating >= 4, negative = rating <= 2.

## `repliesOnly` (type: `boolean`):

Keep reviews that have an official business reply.

## `reviewKeywords` (type: `array`):

Keep a review if its text or the official reply contains any of these strings (case-insensitive).

## `reviewSource` (type: `string`):

2GIS mirrors some reviews from Flamp or Booking on the same branch.

## `reviewDateFrom` (type: `string`):

Inclusive start date: YYYY-MM-DD or a relative offset like '-7d' or '-30 days'.

## `reviewDateTo` (type: `string`):

Inclusive end date: YYYY-MM-DD or a relative offset.

## `includeUnratedReviews` (type: `boolean`):

Also fetch unrated reviews (rated=false pass on the reviews API).

## `includeReviewerData` (type: `boolean`):

When off, the reviewer user object is cleared before rows are saved.

## `includeJobs` (type: `boolean`):

Also scrape the 2GIS vacancy board of every location below. Each location must be a city name.

## `maxJobsPerLocation` (type: `integer`):

Maximum number of vacancies to fetch per location.

## `includeRealty` (type: `boolean`):

Also scrape the 2GIS realty board (sale/rent apartments, houses and commercial property) of every location. Each location must be a city name.

## `realtyDeal` (type: `string`):

Buy or rent.

## `realtyPropertyType` (type: `string`):

Which property segment to scrape.

## `realtySort` (type: `string`):

Order of realty listings (server-side).

## `realtyRooms` (type: `array`):

Only these room counts. Allowed values: studio, 1, 2, 3, 4, 5+. Leave empty for all.

## `realtyMinPrice` (type: `integer`):

Minimum price in the local currency. 0 disables the bound.

## `realtyMaxPrice` (type: `integer`):

Maximum price in the local currency. 0 disables the bound.

## `realtyMinArea` (type: `number`):

Minimum total area in square meters. 0 disables the bound.

## `realtyMaxArea` (type: `number`):

Maximum total area in square meters. 0 disables the bound.

## `realtyProviders` (type: `array`):

Only listings from these services. Allowed values: cian, domclick. Leave empty for all.

## `maxRealtyListingsPerLocation` (type: `integer`):

Maximum number of realty listings to fetch per location.

## `monitoringMode` (type: `boolean`):

When on, the Actor remembers every item it has ever pushed (keyed by item type + id) in a named key-value store and pushes only items it has not seen before. Re-run the same input on a schedule to get just the new places, reviews, jobs and listings.

## `monitoringStoreName` (type: `string`):

Name of the named key-value store that keeps the seen-item state. Change it to start a fresh monitoring series (for example when you switch to a different search).

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "searchQueries": [
    "cafe",
    "restaurant"
  ],
  "locations": [
    "Moscow",
    "Dubai"
  ],
  "startUrls": [],
  "organizationIds": [],
  "includeBranches": false,
  "scrapeMode": "places",
  "maxResultsPerQuery": 50,
  "maxItems": 0,
  "searchRadiusKm": 50,
  "locale": "en_RU",
  "sortBy": "relevance",
  "categoryIds": [],
  "hasSite": false,
  "hasPhotos": false,
  "hasGoods": false,
  "delivery": false,
  "takeaway": false,
  "wifi": false,
  "cardPayment": false,
  "open24h": false,
  "skipClosedPlaces": false,
  "maxReviewsPerPlace": 0,
  "reviewSortBy": "date_edited",
  "reviewRatings": "all",
  "repliesOnly": false,
  "reviewKeywords": [],
  "reviewSource": "all",
  "includeUnratedReviews": false,
  "includeReviewerData": true,
  "includeJobs": false,
  "maxJobsPerLocation": 100,
  "includeRealty": false,
  "realtyDeal": "sale",
  "realtyPropertyType": "residential",
  "realtySort": "default",
  "realtyRooms": [],
  "realtyMinPrice": 0,
  "realtyMaxPrice": 0,
  "realtyMinArea": 0,
  "realtyMaxArea": 0,
  "realtyProviders": [],
  "maxRealtyListingsPerLocation": 100,
  "monitoringMode": false,
  "monitoringStoreName": "2gis-monitoring",
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `reviews` (type: `string`):

No description

## `jobs` (type: `string`):

No description

## `realty` (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": [
        "cafe",
        "restaurant"
    ],
    "locations": [
        "Moscow",
        "Dubai"
    ],
    "startUrls": [],
    "organizationIds": [],
    "categoryIds": [],
    "reviewKeywords": [],
    "realtyRooms": [],
    "realtyProviders": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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": [
        "cafe",
        "restaurant",
    ],
    "locations": [
        "Moscow",
        "Dubai",
    ],
    "startUrls": [],
    "organizationIds": [],
    "categoryIds": [],
    "reviewKeywords": [],
    "realtyRooms": [],
    "realtyProviders": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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": [
    "cafe",
    "restaurant"
  ],
  "locations": [
    "Moscow",
    "Dubai"
  ],
  "startUrls": [],
  "organizationIds": [],
  "categoryIds": [],
  "reviewKeywords": [],
  "realtyRooms": [],
  "realtyProviders": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/2gis-scraper --silent --output-dataset

```

## MCP server setup

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