Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringrequiredWhat to read: search the directory, expand 2GIS links, or look up place IDs.
searchQueriesarrayoptionalWhat to look for, one term per line (mode=search). Example: coffee, restaurant, стоматология. Use the local language for better coverage.
locationQuerystringoptionalCity or area to search in (mode=search), for example Moscow, Алматы or Dubai. Can be a local or English name.
citiesarrayoptionalOptional additional cities. Every search term runs in every city (mode=search).
cityIdsarrayoptionalOptional exact 2GIS city IDs. Use instead of city names when you already know the ID.
startUrlsarrayoptionalSearch, place (/firm/), organization (/branches/) or building (/inside/) links, go.2gis.com short links, or bare place IDs (mode=urls).
placeIdsarrayoptional2GIS branch IDs to read directly (mode=ids).
latitudenumberoptionalCenter latitude for an area search (mode=search). Set together with longitude; overrides the city center.
longitudenumberoptionalCenter longitude for an area search (mode=search). Set together with latitude.
radiusMetersintegeroptionalSearch radius around latitude/longitude, in meters (1–50000).
bboxstringoptionalOptional rectangle as lon1,lat1,lon2,lat2. Overrides city and point search.
countrystringoptional2GIS country site. Leave on Auto-detect to derive it from the city or link.
languagestringoptionalLanguage of names and content returned by 2GIS. Auto uses the country site's default.
maxItemsintegeroptionalMaximum number of places per search term + city/area combination.
sortBystringoptionalOrder of search results. Distance needs a latitude/longitude or map area.
rubricIdsarrayoptionalOnly places in these 2GIS categories (rubric IDs), for example 162 for coffee shops.
districtIdsarrayoptionalOptional district IDs. Useful for splitting a large city into smaller searches.
minRatingnumberoptionalKeep only places rated at least this value (0–5).
minReviewsintegeroptionalKeep only places with at least this many reviews.
websiteFilterstringoptionalReturn all places, only places with a website, or only places without one.
filterHasPhotosbooleanoptionalOnly return places that have photos on 2GIS.
filterOpenNowbooleanoptionalOnly return places open at the time of the run.
filter24x7booleanoptionalOnly return places open around the clock.
filterHasGoodsbooleanoptionalOnly return places that published goods or a menu.
filterHasRatingbooleanoptionalOnly return places with a rating.
filterHasReviewsbooleanoptionalOnly return places with reviews.
filterDeliverybooleanoptionalOnly return places whose published attributes mention delivery.
filterTakeawaybooleanoptionalOnly return places whose attributes mention takeaway or pickup.
filterCardPaymentbooleanoptionalOnly return places whose attributes mention card payment.
filterWifibooleanoptionalOnly return places whose attributes mention Wi-Fi.
minAverageCheckintegeroptionalKeep only places whose published average check is at least this value, in local currency.
maxAverageCheckintegeroptionalKeep only places whose published average check is at most this value, in local currency.
skipAdsbooleanoptionalDrop paid/promoted search results.
includeContactsbooleanoptionalAdd phones, websites, emails, social links and messengers.
includeReviewsbooleanoptionalAdd review texts to each place when 2GIS exposes them. Rating and review counts are always included.
maxReviewsPerPlaceintegeroptionalMaximum review texts per place when reviews are enabled (1–1000).
reviewsSortstringoptionalOrder of review texts.
reviewsMinRatingintegeroptionalKeep only reviews with at least this star rating (1–5).
reviewsWithAnswerbooleanoptionalKeep only reviews that have an official business reply.
reviewsSincestringoptionalKeep only reviews created on or after this date (YYYY-MM-DD).
reviewsKeywordstringoptionalKeep only reviews whose text contains this word or phrase.
includePhotosbooleanoptionalAdd photo URLs when 2GIS exposes them. A main photo URL and photo count are included whenever available.
maxPhotosPerPlaceintegeroptionalMaximum photo URLs per place when photos are enabled (1–100).
scrapeOrgBranchesbooleanoptionalWhen 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.