Use 2GIS Business Directory Extractor for CIS & Middle East with Python
Search 2GIS for businesses by category and city across Russia, the UAE, Kazakhstan and the wider CIS, and get name, address, rating, hours, contacts and social links for each place.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"includeContacts": true,
"locationQuery": "Moscow",
"maxItems": 3,
"mode": "search",
"searchQueries": [
"coffee"
]
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to read: search the directory, expand 2GIS links, or look up place IDs. |
searchQueries | array | optional | What to look for, one term per line (mode=search). Example: coffee, restaurant, стоматология. Use the local language for better coverage. |
locationQuery | string | optional | City or area to search in (mode=search), for example Moscow, Алматы or Dubai. Can be a local or English name. |
cities | array | optional | Optional additional cities. Every search term runs in every city (mode=search). |
cityIds | array | optional | Optional exact 2GIS city IDs. Use instead of city names when you already know the ID. |
startUrls | array | optional | Search, place (/firm/), organization (/branches/) or building (/inside/) links, go.2gis.com short links, or bare place IDs (mode=urls). |
placeIds | array | optional | 2GIS branch IDs to read directly (mode=ids). |
latitude | number | optional | Center latitude for an area search (mode=search). Set together with longitude; overrides the city center. |
longitude | number | optional | Center longitude for an area search (mode=search). Set together with latitude. |
radiusMeters | integer | optional | Search radius around latitude/longitude, in meters (1–50000). |
bbox | string | optional | Optional rectangle as lon1,lat1,lon2,lat2. Overrides city and point search. |
country | string | optional | 2GIS country site. Leave on Auto-detect to derive it from the city or link. |
language | string | optional | Language of names and content returned by 2GIS. Auto uses the country site's default. |
maxItems | integer | optional | Maximum number of places per search term + city/area combination. |
sortBy | string | optional | Order of search results. Distance needs a latitude/longitude or map area. |
rubricIds | array | optional | Only places in these 2GIS categories (rubric IDs), for example 162 for coffee shops. |
districtIds | array | optional | Optional district IDs. Useful for splitting a large city into smaller searches. |
minRating | number | optional | Keep only places rated at least this value (0–5). |
minReviews | integer | optional | Keep only places with at least this many reviews. |
websiteFilter | string | optional | Return all places, only places with a website, or only places without one. |
filterHasPhotos | boolean | optional | Only return places that have photos on 2GIS. |
filterOpenNow | boolean | optional | Only return places open at the time of the run. |
filter24x7 | boolean | optional | Only return places open around the clock. |
filterHasGoods | boolean | optional | Only return places that published goods or a menu. |
filterHasRating | boolean | optional | Only return places with a rating. |
filterHasReviews | boolean | optional | Only return places with reviews. |
filterDelivery | boolean | optional | Only return places whose published attributes mention delivery. |
filterTakeaway | boolean | optional | Only return places whose attributes mention takeaway or pickup. |
filterCardPayment | boolean | optional | Only return places whose attributes mention card payment. |
filterWifi | boolean | optional | Only return places whose attributes mention Wi-Fi. |
minAverageCheck | integer | optional | Keep only places whose published average check is at least this value, in local currency. |
maxAverageCheck | integer | optional | Keep only places whose published average check is at most this value, in local currency. |
skipAds | boolean | optional | Drop paid/promoted search results. |
includeContacts | boolean | optional | Add phones, websites, emails, social links and messengers. |
includeReviews | boolean | optional | Add review texts to each place when 2GIS exposes them. Rating and review counts are always included. |
maxReviewsPerPlace | integer | optional | Maximum review texts per place when reviews are enabled (1–1000). |
reviewsSort | string | optional | Order of review texts. |
reviewsMinRating | integer | optional | Keep only reviews with at least this star rating (1–5). |
reviewsWithAnswer | boolean | optional | Keep only reviews that have an official business reply. |
reviewsSince | string | optional | Keep only reviews created on or after this date (YYYY-MM-DD). |
reviewsKeyword | string | optional | Keep only reviews whose text contains this word or phrase. |
includePhotos | boolean | optional | Add photo URLs when 2GIS exposes them. A main photo URL and photo count are included whenever available. |
maxPhotosPerPlace | integer | optional | Maximum photo URLs per place when photos are enabled (1–100). |
scrapeOrgBranches | boolean | optional | When a place link is given, also return the other branches of the same organization. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/egAceUslWJ9ezEaPL/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Places from 2GIS country sites, including contacts, hours, ratings, review statistics, attributes, photos and location data.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build VmwSyA6i1GQqfVvgJ and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.