# 2GIS Scraper — Places, Reviews, Jobs & Realty (`memo23/2gis-scraper`) Actor

Scrape 2GIS (2ГИС) places, reviews, jobs and realty in one run — phones, emails, websites, hours, ratings, review replies, vacancy apply links, and CIAN / Domclick housing ads. City + query or any 2gis.ru / .kz / .com search, firm, vacancies, or realty URL. JSON or CSV.

- **URL**: https://apify.com/memo23/2gis-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Travel, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 place scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 2GIS Scraper — Places, Reviews, Jobs & Realty

Turn 2GIS (2ГИС) search, firm, vacancies, and realty URLs into structured business, review, job, and property rows. Start from a city + query (Moscow / кафе) or paste any 2GIS link. JSON or CSV out.

![How 2GIS Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-2gis.png)

### Why Use This Scraper?

- Places, reviews, jobs, and realty in one actor — pick a mode or run all four
- Firm-page contacts: phones, websites, emails, social links (search cards do not include them)
- Catalog filters (website, delivery, Wi-Fi, rating, new places, rubric) plus district / metro / GeoJSON
- Review filters: sentiment, date window, keyword, official-reply-only, Flamp / Booking source
- Vacancies board with title, salary, company, address, and the hh.ru apply URL
- Housing board (sale / rent / daily) with price, area, floor, and the CIAN or Domclick listing URL
- City + query mode for Russia, CIS, Gulf, and extra 2GIS TLDs
- Monitoring mode so scheduled runs only return new firm IDs

### Overview

Built for lead gen, local-market research, reputation monitoring, and recruiting teams that need structured 2GIS data.

Each dataset row is tagged with `itemType`: `place`, `review`, `job`, or `property`. A search run emits place rows. Turning on reviews adds review rows for those places. A vacancies URL emits job rows. A `/realty/` URL emits property rows. Filter on `itemType`.

Search listing cards omit phones. The actor opens each firm page when `includeContacts` is on (default) so contact fields fill in.

### Supported Inputs

#### URL types

| URL type | Pattern | Example |
|---|---|---|
| Search | `https://2gis.{tld}/{city}/search/{query}` | `https://2gis.ru/moscow/search/кафе` |
| Search page | `.../search/{query}/page/N` | `https://2gis.ru/moscow/search/кафе/page/2` |
| Firm | `https://2gis.{tld}/{city}/firm/{id}` | `https://2gis.ru/moscow/firm/70000001007179642` |
| Vacancies | `https://2gis.{tld}/{city}/vacancies` | `https://2gis.ru/moscow/vacancies` |
| Realty | `https://2gis.{tld}/{city}/realty/{sale\|rent\|saleCommercial\|rentCommercial\|rentDaily}` | `https://2gis.ru/moscow/realty/sale` |

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    "https://2gis.ru/moscow/search/кафе",
    "https://2gis.ru/moscow/firm/70000001007179642",
    "https://2gis.ru/moscow/vacancies",
    "https://2gis.ru/moscow/realty/sale"
  ]
}
```

#### Keyword / search mode

```json
{
  "searchQueries": ["кафе", "барбершоп"],
  "location": "Moscow",
  "country": "auto",
  "maxItems": 50
}
```

**Unsupported:** 2GIS login-only account pages, the official Places API key portal, and `job.2gis.ru` (that is DoubleGIS's own careers site, not the city vacancies board).

### Use Cases

| Who | What they pull |
|---|---|
| Lead gen / CRM | Phones, emails, websites, addresses for a category in a city |
| Market research | Ratings, rubric mix, new vs promoted places |
| Reputation teams | Review text, ratings, official replies |
| Recruiters | Vacancy title, salary, company, apply URL |
| Realty / investors | Sale and rent listings with price, area, floor, metro |
| Agencies | Scheduled city+query runs with monitoring mode |

### How It Works

1. You pass city + queries, or paste 2GIS search / firm / vacancies / realty URLs.
2. Search pages are read from server-rendered `initialState` JSON (about 12 places per page) and walked via `/page/N`.
3. Each firm page is fetched for phones, websites, emails, hours, and photos.
4. Optional: reviews come from `public-api.reviews.2gis.com` with `next_link` pagination.
5. Optional: the city vacancies board is parsed into job rows (apply links are usually hh.ru).
6. Optional: realty listings come from the public `market-backend` `/5.0/realty/items` feed (same data the 2GIS housing UI shows).
7. Rows land in the dataset tagged `place` / `review` / `job` / `property`.

### Input Configuration

| Field | Type | Description |
|---|---|---|
| `scrapeMode` | string | `places` (default), `reviews`, `jobs`, `realty`, or `all` |
| `searchQueries` | array | Queries used when `startUrls` is empty. Example: `кафе` |
| `location` | string | City in English or Russian. Default `Moscow` |
| `country` | string | TLD hint: `auto`, `ru`, `kz`, `ae`, `uz`, `by`, `com`, … |
| `startUrls` | array | 2GIS URLs. When set, they override city + query |
| `organizationIds` | array | Firm IDs or firm URLs, scraped directly |
| `includeContacts` | boolean | Fetch firm pages for phones/emails/sites. Default true |
| `skipClosedPlaces` | boolean | Drop names that look permanently closed |
| `rubricIds` | array | Rubric IDs (`161`) or names (`Кафе`) |
| `filterHasSite` / `filterHasPhotos` / `filterDelivery` / `filterTakeaway` / `filterWifi` / `filterPaymentCard` / `filterHasGoods` / `filterOpen24h` / `filterCreatedRecently` | boolean | Catalog filters. One goes on the listing URL; the rest are checked on the firm page |
| `filterMinRating` | integer | Minimum stars (1–5) |
| `filterAvgPriceMin` / `filterAvgPriceMax` | integer | Average-check band when 2GIS exposes a bill |
| `districts` / `metros` / `buildings` | array | Name match on the firm card |
| `customGeolocation` | object | GeoJSON Point (`radiusKm`) or Polygon. Coordinates are `[lon, lat]` |
| `maxPhotosPerPlace` | integer | Photo URLs on the place row. Default 20. No extra charge |
| `photoCategories` | array | `food`, `menu`, `interior`, `outside`, `rooms`, `pool`, `spa`, `parking` |
| `followOrgBranches` / `followInsideBuildings` | boolean | Walk `/branches/{orgId}` and `/inside/{id}` |
| `skipRealty` | boolean | Drop **place** rows whose rubrics look like housing agencies (does not turn off the realty mode) |
| `realtyCategory` | string | `sale_residential`, `sale_commercial`, `rent_residential`, `rent_commercial`, `daily_rent` |
| `realtySort` | string | `price_asc`, `price_desc`, `area_asc`, `area_desc` |
| `rooms` / `propertyType` / `newBuilding` / `provider` | array | Realty filters (studio–5+, flat/house/…, resale/new, CIAN/Domclick) |
| `priceMin` / `priceMax` / `pricePerMeterMin` / `pricePerMeterMax` / `areaMin` / `areaMax` / `floorMin` / `floorMax` | integer | Realty numeric bands |
| `notFirstFloor` / `notLastFloor` / `floorsInBuildingMin` / `floorsInBuildingMax` / `metroTime` | mix | Floor + walk-to-metro filters |
| `maxReviewsPerPlace` | integer | Reviews per place. `0` = off. Reviews mode defaults to 20 if you leave 0 |
| `reviewSortBy` | string | `date_edited`, `date_created`, or `rating` |
| `reviewRatings` | string | `all`, `positive` (≥4), `negative` (≤2) |
| `repliesOnly` | boolean | Keep reviews that have an official reply |
| `reviewKeywords` | array | Substring match on review text |
| `reviewSource` | string | `all`, `2gis`, `flamp`, `booking` |
| `reviewDateFrom` / `reviewDateTo` | string | Inclusive date window |
| `includeUnratedReviews` | boolean | Ask the reviews API for unrated rows |
| `includeReviewerData` | boolean | Keep `userId` / `userName`. Default true |
| `maxItems` | integer | Cap across all row types. Default 100 |
| `monitoringMode` | boolean | Skip firm IDs already delivered to this user |
| `resetMonitoringState` | boolean | Clear the seen-ID store for this run |
| `maxConcurrency` | integer | Parallel firm / review requests. Default 8 |
| `proxy` | object | Optional override. Direct works from many networks |

### Output Overview

One dataset, four shapes. Filter by `itemType`. Places carry identity, address, GPS, contacts, hours, rating, and categories. Reviews carry text, rating, author, dates, and `officialAnswer` when the business replied. Jobs carry title, salary label, company, address, and `applyUrl`. Properties carry price, area, floor, address, metro, and `offerUrl` (usually CIAN or Domclick).

### Output Samples

**Place** (firm page, Moscow cafe)

```json
{
  "itemType": "place",
  "id": "70000001007179642",
  "name": "Му-Му, кафе",
  "address": "Манежная площадь, 1 ст2",
  "city": "Москва",
  "phones": ["+74957818781", "+79851298276"],
  "emails": ["dostavka@cafemumu.ru"],
  "websites": ["http://cafemumu.ru"],
  "rating": 4.8,
  "reviewCount": 1104,
  "lat": 55.755301,
  "lon": 37.614586,
  "rubrics": ["Кафе", "Доставка еды", "Быстрое питание"],
  "url": "https://2gis.ru/moscow/firm/70000001007179642"
}
```

**Review**

```json
{
  "itemType": "review",
  "id": "295548772",
  "placeId": "70000001034739765",
  "placeName": "Руки Вверх!, бар",
  "rating": 5,
  "text": "Классное место, 👍👍👍👍👍",
  "dateCreated": "2026-09-09T22:44:01.756664+07:00",
  "userName": "Я здесь Власть 😈😈😈",
  "officialAnswer": {
    "text": "Рады, что вы круто отдохнули!",
    "dateCreated": "2026-09-10T00:11:15.434721+07:00",
    "orgName": "Руки Вверх!, бар"
  }
}
```

**Job**

```json
{
  "itemType": "job",
  "id": "136986651",
  "title": "Официант в итальянский ресторан",
  "salary": "от 170 000 ₽ в месяц на руки",
  "companyName": "Avero mio на Петровке, итальянский ресторан-бистро",
  "address": "улица Петровка, 34 ст1, Тверской, Москва",
  "provider": "hh.ru",
  "applyUrl": "https://hh.ru/vacancy/136986651"
}
```

**Property**

```json
{
  "itemType": "property",
  "id": "70250202178338985",
  "name": "1-комнатная, 41,3 м²",
  "propertyType": "Квартира",
  "rooms": "1",
  "area": 41.3,
  "floor": 3,
  "price": 23788800,
  "pricePerMeter": 576000,
  "address": "Строительный проезд, 9 к1",
  "city": "Москва",
  "provider": "cian",
  "offerUrl": "https://www.cian.ru/sale/flat/333843134/"
}
```

### Key Output Fields

**Place:** `id`, `name`, `orgId`, `orgName`, `url`, `city`, `address`, `lat`, `lon`, `phones`, `emails`, `websites`, `socials`, `rating`, `reviewCount`, `rubrics`, `schedule`, `attributes`, `photos`

**Review:** `id`, `placeId`, `placeName`, `rating`, `text`, `dateCreated`, `userName`, `isVerified`, `officialAnswer`, `photos`

**Job:** `id`, `title`, `salary`, `companyName`, `address`, `provider`, `applyUrl`

**Property:** `id`, `name`, `propertyType`, `rooms`, `area`, `floor`, `price`, `pricePerMeter`, `address`, `city`, `district`, `metro`, `provider`, `offerUrl`

### FAQ

**Do I need a 2GIS API key?** No. Places come from the public website's server-rendered JSON. Reviews use 2GIS's public reviews API. You do not paste a catalog key.

**Why are phones missing if I turn off includeContacts?** Search cards do not include `contact_groups`. Leave contacts on unless you only need name/address/rating.

**How many places is a full Moscow cafe search?** The listing meta reported 6,750 matches / 563 pages at 12 per page. Always set `maxItems`.

**Are job apply links on 2GIS itself?** Usually not. The vacancies board points at hh.ru (and similar) apply URLs. That is what `applyUrl` stores.

**Does this scrape 2GIS property listings?** Yes. Set `scrapeMode` to `realty` (or `all`), or paste a `/{city}/realty/sale` URL. Each kept listing is one `property-scraped` event, not `place-scraped`. `skipRealty` only hides housing **places**.

**What about geo / polygon filters?** Pass `customGeolocation` as GeoJSON Point (`coordinates: [lon, lat]`, optional `radiusKm`) or Polygon. District / metro / building names also match the firm card.

### Support

- **Bug or missing field:** [Issues](https://console.apify.com/actors/5Ff33xQgxRiy1iRD0/issues)
- **Email:** <muhamed.didovic@gmail.com>
- **Website:** [muhamed-didovic.github.io](https://muhamed-didovic.github.io/)

### Additional Services

Custom fields, scheduled incremental feeds into a CRM, or a private high-volume build — describe what you need on the Issues tab or by email.

### Explore More Scrapers

Other directory, review, and job actors: [memo23 on Apify](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/2gis-scraper`).

**Purpose:** Scrape 2GIS places (contacts, GPS, hours, rating), reviews (text + official reply), city vacancies, and realty listings from search/firm/vacancies/realty URLs or city + query.

**Minimal input:**

```json
{ "searchQueries": ["кафе"], "location": "Moscow", "maxItems": 20 }
```

Firm-only: `{ "startUrls": ["https://2gis.ru/moscow/firm/70000001007179642"], "maxReviewsPerPlace": 10, "maxItems": 20 }`.

Jobs-only: `{ "scrapeMode": "jobs", "location": "Moscow", "maxItems": 20 }`.

Realty-only: `{ "scrapeMode": "realty", "location": "Moscow", "realtyCategory": "sale_residential", "rooms": ["1","2"], "maxItems": 20 }`.

**Output:** one row per item — `itemType` is `place`, `review`, `job`, or `property`. Place fields: `id, name, orgId, orgName, url, city, address, lat, lon, phones[], emails[], websites[], rating, reviewCount, rubrics[], schedule, photos[]`. Review fields: `id, placeId, placeName, rating, text, dateCreated, userName, officialAnswer {text, dateCreated, orgName}`. Job fields: `id, title, salary, companyName, address, provider, applyUrl`. Property fields: `id, name, propertyType, rooms, area, floor, price, pricePerMeter, address, city, provider, offerUrl`.

**Behaviors an agent should know:**

- Always set `maxItems`. A Moscow cafe search is thousands of places.
- `startUrls` overrides `searchQueries` + `location`.
- `includeContacts: true` (default) fetches each firm page; without it phones/emails are empty.
- Reviews are off unless `maxReviewsPerPlace` > 0 or `scrapeMode` is `reviews`.
- Billing: `place-scraped` ($0.003), `review-scraped` ($0.0004), `job-scraped` ($0.002), `property-scraped` ($0.0025). No charge for skipped monitoring IDs.
- Unsupported: login pages, official catalog API keys, `job.2gis.ru` careers.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by DoubleGIS LLC (ООО «ДубльГИС») or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available 2GIS pages and the public reviews API — no authenticated endpoints, paid Places API keys, or content behind a 2GIS login wall. Users are responsible for ensuring their use complies with 2gis.com / 2gis.ru Terms of Service, applicable data-protection law (GDPR, CCPA, and local equivalents), and any contractual obligations of their own organization.

***

### SEO Keywords

2GIS scraper, 2gis scraper, scrape 2GIS, 2ГИС парсер, 2gis places scraper, 2gis reviews scraper, 2gis jobs scraper, 2gis property scraper, 2gis realty scraper, 2gis API alternative, Apify 2GIS, Russia business directory scraper, CIS local leads, Dubai 2gis.com scraper, phone email extraction 2GIS, 2GIS vacancy parser, CIAN Domclick 2GIS, local market research Russia, 2gis.ru cafe scraper

# Actor input Schema

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

Choose places, reviews, jobs, realty, or all four in one run.

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

What to search for on 2GIS, one query per line. Examples: кафе, барбершоп, pharmacy, hotel. Used when Start URLs are empty.

## `location` (type: `string`):

City name in English or Russian, e.g. Moscow, Москва, Dubai, Almaty. Combined with each search query to build a 2GIS listing URL.

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

2GIS TLD to use when the city name is ambiguous. Auto picks from the city map (Moscow → 2gis.ru, Dubai → 2gis.com, Almaty → 2gis.kz).

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

Full 2GIS URLs: /{city}/search/{query}, /{city}/firm/{id}, /{city}/vacancies, /{city}/realty/sale. Mix freely.

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

2GIS firm IDs or firm URLs. Scraped directly. Combined with Start URLs when both are set.

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

Fetch each firm page so phones, websites, emails and social links are filled. Search cards alone do not carry contacts.

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

Drop places whose name looks permanently closed.

## `rubricIds` (type: `array`):

Numeric 2GIS rubric IDs (e.g. 161) or names (Кафе). IDs go on the search URL.

## `filterHasSite` (type: `boolean`):

Only places with a website on the firm page.

## `filterHasPhotos` (type: `boolean`):

Only places that expose at least one photo.

## `filterDelivery` (type: `boolean`):

Home delivery (covid\_homedelivery on the listing URL).

## `filterTakeaway` (type: `boolean`):

Food takeaway / навынос.

## `filterWifi` (type: `boolean`):

Places that advertise Wi-Fi.

## `filterPaymentCard` (type: `boolean`):

Places that accept cards.

## `filterHasGoods` (type: `boolean`):

Places with a 2GIS price list (sorting\_has\_goods).

## `filterOpen24h` (type: `boolean`):

Around-the-clock places.

## `filterCreatedRecently` (type: `boolean`):

2GIS created\_recently listing filter (new in the city).

## `filterMinRating` (type: `integer`):

Drop places below this star rating (1–5). Also picks a matching 2GIS rating URL filter.

## `filterAvgPriceMin` (type: `integer`):

Minimum average bill when 2GIS exposes one. Places with no bill still pass.

## `filterAvgPriceMax` (type: `integer`):

Maximum average bill when 2GIS exposes one.

## `skipRealty` (type: `boolean`):

Drop places whose rubrics look like apartments or real-estate agencies.

## `districts` (type: `array`):

District names or IDs, e.g. Пресненский.

## `metros` (type: `array`):

Station names when 2GIS puts them on the firm card.

## `buildings` (type: `array`):

Building names from the firm address.

## `customGeolocation` (type: `object`):

GeoJSON Point (coordinates \[lon, lat], optional radiusKm, default 5) or Polygon / MultiPolygon. Draw at geojson.io. Places outside the shape are dropped and not charged.

## `maxPhotosPerPlace` (type: `integer`):

Photo URLs kept on the place row. Default 20. No extra charge.

## `photoCategories` (type: `array`):

Keep only these kinds when 2GIS labels them: food, menu, interior, outside, rooms, pool, spa, parking.

## `followOrgBranches` (type: `boolean`):

After a place with orgBranchCount > 1, open /branches/{orgId} and scrape the other firms. Each extra firm is one place-scraped.

## `followInsideBuildings` (type: `boolean`):

Follow /inside/{id} links found on firm pages and scrape firms in that building. Each extra firm is one place-scraped.

## `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 officialAnswer.text.

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

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

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

2GIS sometimes mirrors Flamp or Booking text on the same branch.

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

Inclusive start (YYYY-MM-DD or a relative date).

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

Inclusive end date.

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

Ask the reviews API for rated=false (unverified / unrated rows).

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

When off, userId and userName are cleared before the row is saved.

## `realtyCategory` (type: `string`):

Sale / rent, residential or commercial, or daily rent.

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

Passed to the 2GIS realty API when it honours sort.

## `rooms` (type: `array`):

Studio, 1–4, or 5+.

## `propertyType` (type: `array`):

Matched on the 2GIS «Тип помещения» attribute.

## `newBuilding` (type: `array`):

New-build vs resale, from the listing text when 2GIS does not expose a dedicated flag.

## `priceMin` (type: `integer`):

Minimum listing price (same currency as 2GIS, usually RUB).

## `priceMax` (type: `integer`):

Maximum listing price.

## `pricePerMeterMin` (type: `integer`):

Minimum price per square metre.

## `pricePerMeterMax` (type: `integer`):

Maximum price per square metre.

## `areaMin` (type: `integer`):

Minimum total area in square metres.

## `areaMax` (type: `integer`):

Maximum total area in square metres.

## `floorMin` (type: `integer`):

Minimum floor number.

## `floorMax` (type: `integer`):

Maximum floor number.

## `notFirstFloor` (type: `boolean`):

Drop listings on floor 1 when the floor is known.

## `notLastFloor` (type: `boolean`):

Needs «Этажей в доме» on the card. Listings without that attribute still pass.

## `floorsInBuildingMin` (type: `integer`):

Minimum number of floors in the building when 2GIS exposes it.

## `floorsInBuildingMax` (type: `integer`):

Maximum number of floors in the building when 2GIS exposes it.

## `metroTime` (type: `string`):

Uses the nearest-station distance on the card (about 80 m/min).

## `provider` (type: `array`):

CIAN or Domclick, from the 2GIS card.

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

Hard cap across places, reviews, jobs and properties combined. Each dataset row counts as one item.

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

Skip firm IDs already delivered to this user. First run after enabling still returns the full match set and seeds the store.

## `resetMonitoringState` (type: `boolean`):

Clear the per-user seen-ID store at the start of this run. Has no effect when monitoring is off.

## `maxConcurrency` (type: `integer`):

How many firm pages and review requests to run in parallel.

## `minConcurrency` (type: `integer`):

Minimum parallel requests on the Crawlee fallback path.

## `maxRequestRetries` (type: `integer`):

Retries before a failed request is dropped on the Crawlee fallback path.

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

Optional override. Paying runs already use a built-in residential proxy. 2GIS listing pages work without a proxy from many networks; set this if you hit blocks.

## Actor input object example

```json
{
  "scrapeMode": "places",
  "searchQueries": [
    "кафе"
  ],
  "location": "Moscow",
  "country": "auto",
  "startUrls": [
    "https://2gis.ru/moscow/search/кафе"
  ],
  "includeContacts": true,
  "skipClosedPlaces": false,
  "filterHasSite": false,
  "filterHasPhotos": false,
  "filterDelivery": false,
  "filterTakeaway": false,
  "filterWifi": false,
  "filterPaymentCard": false,
  "filterHasGoods": false,
  "filterOpen24h": false,
  "filterCreatedRecently": false,
  "skipRealty": false,
  "maxPhotosPerPlace": 20,
  "followOrgBranches": false,
  "followInsideBuildings": false,
  "maxReviewsPerPlace": 0,
  "reviewSortBy": "date_edited",
  "reviewRatings": "all",
  "repliesOnly": false,
  "reviewSource": "all",
  "includeUnratedReviews": false,
  "includeReviewerData": true,
  "realtyCategory": "sale_residential",
  "realtySort": "",
  "notFirstFloor": false,
  "notLastFloor": false,
  "metroTime": "",
  "maxItems": 100,
  "monitoringMode": false,
  "resetMonitoringState": false,
  "maxConcurrency": 8,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# Actor output Schema

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

Businesses with name, address, GPS, phones, websites, hours, rating and categories.

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

Review text, rating, author, date and official business reply.

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

Vacancy cards with title, salary, company, address and apply URL.

## `properties` (type: `string`):

2GIS realty cards with price, area, floor, address and the CIAN / Domclick listing URL.

# 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": [
        "кафе"
    ],
    "location": "Moscow",
    "startUrls": [
        "https://2gis.ru/moscow/search/кафе"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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": ["кафе"],
    "location": "Moscow",
    "startUrls": ["https://2gis.ru/moscow/search/кафе"],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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": [
    "кафе"
  ],
  "location": "Moscow",
  "startUrls": [
    "https://2gis.ru/moscow/search/кафе"
  ]
}' |
apify call memo23/2gis-scraper --silent --output-dataset

```

## MCP server setup

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