2GIS Scraper - Places & Business Data avatar

2GIS Scraper - Places & Business Data

Pricing

from $0.49 / 1,000 places

Go to Apify Store
2GIS Scraper - Places & Business Data

2GIS Scraper - Places & Business Data

Scrape 2GIS business listings in Russia, the CIS, the UAE and Cyprus. Each row has the name, category, full address, coordinates, phones, emails, website, social links, rating, review count and opening hours. Filter by rating, Wi-Fi, card or delivery. $0.50 per 1,000 places.

Pricing

from $0.49 / 1,000 places

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

38

Total users

21

Monthly active users

a day ago

Last modified

Share

Scrape 2GIS business listings with phone, email, website and opening hours: type a search and a city the way you would into 2GIS, and get one row per business with the name, category, full address down to the district, coordinates, phones, emails, website, social links, rating, review count and the week's opening hours. Paste 2GIS search or place URLs instead if you already have them.

2GIS is a regional directory, not a global one. It covers Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Belarus, Georgia, Armenia, Tajikistan, Cyprus and the UAE. Search anywhere else and there is nothing there to find.

InputSearch terms plus a city or a point, or 2GIS URLs
OutputOne row per place: name, chain, categories, full address, coordinates, phones, emails, website, social links, rating, review count, opening hours
Ceiling5,000 places per run, and around 5,000 per search term
Account neededNone, and no API key
Price$0.50 per 1,000 places on the free plan, down to $0.485 on Business. The free plan's $5 a month covers about 10,000

🔍 What 2GIS Places Scraper does

Two ways in, and they work together in one run.

Search. A term and a city, like кафе in Moscow, and it pages through the matches until it reaches your limit or 2GIS stops handing out new places. Give it a latitude, longitude and radius instead and it searches that circle rather than a whole city.

URLs. Paste a 2GIS search page or a single place page and it reads that.

Filters. Keep only places rated above a floor, or with photos, card payment, Wi-Fi, delivery or takeaway. 2GIS applies them to the search itself, and every row is checked against them again before it is written, so a place that does not match is never charged.

Website links come out clean. 2GIS wraps every outbound link in its own click tracker with tracking tags attached, and those are unwrapped and stripped before the row is written, so you get http://cafemumu.ru and not a 300-character redirect.

📋 What data you get from each 2GIS place

What you getField
The place and 2GIS's ID and page for itplaceId, name, nameShort, url
The chain it belongs to, and its sizebrandName, chainBranchCount
CategoriescategoryPrimary, categories
The address, down to the districtaddress, addressFull, addressComment, postcode, country, region, city, cityAlias, district
Map positionlatitude, longitude
Phones, emails and websitesphone, phones, email, emails, website, websites
Social linkssocialProfiles
Rating and review countrating, reviewCount
Opening hoursopeningHours, openingHoursText
The search that found itsearchQuery, position, scrapedAt

▶️ How to scrape 2GIS places

  1. Open 2GIS Places Scraper and click Try for free.
  2. Put your searches into Search terms, one per line.
  3. Type the City, spelled however you like.
  4. Set Maximum places low for the first run, then click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Run it with everything empty and you get one labelled sample row, which is not charged.

💰 How much does it cost to scrape 2GIS places?

$0.50 per 1,000 places. That is the free plan's price; paid plans pay a little less: $0.495 on Starter, $0.49 on Scale and $0.485 on Business. On the free plan, the $5 Apify gives you each month covers about 10,000 places.

One row is one place. The sample row and every diagnostic row are not charged, and a search that comes back empty produces no place rows to charge for. A place that does not meet your filters is never charged either. Emails and social links arrive inside the row, with nothing extra to pay.

📥 What you give it

{
"searchQueries": ["кафе", "пиццерия"],
"city": "Moscow",
"maxItems": 200
}
FieldDefaultWhat it is
searchQueriesnone, the form opens with кафеOne search per line. Local-language terms return more in Russian-speaking cities.
citynone, the form opens with MoscowEnglish or local spelling both work: Moscow, Москва, Almaty, Dubai. Leave it empty only when you set a point: with neither, 2GIS returns a handful of places from anywhere (3 for кафе when we tried).
startUrlsempty2GIS search pages or single place pages. Works alongside the fields above.
maxItems50Hard cap on rows across every search, 1 to 5,000. You are charged per place returned, so this is your spend cap too.
minRatingany rating3.0, 3.5, 4.0, 4.5 or 4.9. Only places 2GIS rates at least that high. Places with no rating are left out.
hasPhotos, cardPayment, wifi, delivery, takeawayoffTick any to keep only places 2GIS lists with photos, card payment, Wi-Fi, delivery or takeaway. Tick several and a place needs all of them.
sortBy2GIS's own ordername lists places A to Z.
latitude, longitudeemptySearch around a point instead of a city. Both are needed.
radiusMeters1000How wide that circle is, 50 to 40,000. Ignored without both coordinates.
localeAutomaticru_RU, en_AE, en_RU, kk_KZ, uz_UZ, az_AZ or ky_KG. Not every language exists in every country.
proxyConfigurationoffOptional. Only fill this in if you want the run to go out through your own servers.

📤 What you get back

A real place row from a run on 1 October 2026, a Moscow cafe search with the rating, Wi-Fi, card and photo filters on. The raw openingHours block and a long WhatsApp link are cut short.

{
"placeId": "4504127908546994",
"name": "Му-Му, кафе",
"nameShort": "Му-Му",
"brandName": "Му-Му, кафе",
"chainBranchCount": 18,
"categoryPrimary": "Кафе",
"categories": ["Кафе", "Доставка еды", "Быстрое питание", "Суши-бары", "Кулинарии", "Кейтеринг"],
"address": "площадь Семёновская, 1",
"addressFull": "Москва, площадь Семёновская, 1",
"addressComment": "-1 этаж",
"postcode": "105318",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"cityAlias": "moscow",
"district": "Соколиная Гора",
"latitude": 55.78318,
"longitude": 37.720392,
"phone": "+74957818781",
"phones": ["+74957818781", "+74996784023", "+79165029127"],
"website": "http://cafemumu.ru",
"websites": ["http://cafemumu.ru"],
"email": "dostavka@cafemumu.ru",
"emails": ["dostavka@cafemumu.ru", "fastland@cafemumu.ru"],
"socialProfiles": [
{"type": "vkontakte", "url": "https://vk.com/cafemumu"},
{"type": "odnoklassniki", "url": "https://ok.ru/group/51852991463629"},
{"type": "whatsapp", "url": "https://wa.me/74957818781?text=..."},
{"type": "telegram", "url": "https://t.me/mumuchatbot"}
],
"rating": 4.6,
"reviewCount": 162,
"openingHours": {"Mon": {"working_hours": [{"from": "08:00", "to": "21:00"}]}, "...": "..."},
"openingHoursText": "Mon: 08:00-21:00; Tue: 08:00-21:00; Wed: 08:00-21:00; Thu: 08:00-21:00; Fri: 08:00-21:00; Sat: 10:00-21:00; Sun: 10:00-21:00",
"url": "https://2gis.ru/moscow/firm/4504127908546994",
"searchQuery": "кафе",
"position": 2,
"scrapedAt": "2026-10-01T00:21:06.466Z"
}
FieldHow to read it
placeId2GIS's branch id. It is the dedupe key here and the key to join on between runs.
brandName, chainBranchCountThe chain this branch belongs to, and how many branches it has.
phone, emailThe first of phones and emails. Plenty of small businesses publish none, and then both are empty.
website, websitesUnwrapped from 2GIS's click tracker, tracking tags stripped.
district, postcode, cityAliasThe address broken down, useful for splitting a city into smaller searches.
rating, reviewCountThe branch score and how many reviews it came from.
openingHoursTextMonday through Sunday on one line. openingHours keeps 2GIS's own arrays.
positionWhere the place sat in that search's results.

🧾 Reading the output

RowHow to spot itCharged
A placeIt has a placeId and a nameyes
The sample rowWritten only when the input was emptyno
A diagnosticIt carries an errorCodeno
CodeWhat it means
CITY_NOT_FOUND2GIS could not place that city. The run stops there, so nothing is spent searching the wrong place.
BAD_INPUTminRating or sortBy is not one of the values above. The run stops before searching.
BAD_URLThat entry is not a 2GIS address. The other jobs carry on.
NOT_FOUNDThose place pages are gone, or they sat past your maxItems cap and were never fetched.
NO_RESULTSThe search came back with nothing.
API_ERROR, BAD_RESPONSE2GIS answered, but not with the data it normally carries.
NETWORK, BLOCKED, KEY_REJECTED2GIS could not be read this time. Worth one re-run.
TIME_LIMITThe run reached its time limit first. Everything found before that is in the dataset, and a run that found nothing ends as failed. Give it more time to get the rest.

💡 What people use it for

  • Building a local business directory for Russia, the CIS or the UAE with phone, email and website already on the row.
  • Counting how many branches a chain runs in a city, with coordinates ready to plot.
  • Comparing ratings and review counts across a category before signing a lease.
  • Splitting a city by district and walking each one, when a single search runs out of depth.

A business list that is filled in and checked:

  1. Run this on стоматология in Almaty with minRating at 4.5.
  2. Drop the rows with no phone and no website, so every place left can be reached.
  3. Paste the url of the places you keep into 2GIS Reviews Scraper and read what patients say before you call.

🚧 What it does not do

  • No review text and no photos. You get rating and reviewCount, not what people wrote. 2GIS Reviews Scraper, linked below, reads the reviews.
  • Around 5,000 places per search term. 2GIS stops serving new pages somewhere near that depth, whatever you set maxItems to. Split the job by district, by rubric, or walk a grid of coordinates.
  • rating is the branch score. For a chain branch 2GIS also publishes a company-wide rating; this returns the branch one.
  • No ordering by rating. 2GIS's rating order also weighs how many reviews a place has, so a 4.9 can sit above a 5.0. Use minRating to keep only well-rated places.
  • Filters apply to searches only. Place pages you paste are fetched as they are.
  • A point search can run a little past the radius. In one test, 2 of 30 places sat 6 m and 65 m outside an 800 m circle.
  • An unknown city ends the run. You get a CITY_NOT_FOUND row, and any place URLs you pasted in the same run are not fetched either. Check the spelling and start again.
  • Paste more place URLs than maxItems allows and the extras are skipped. They come back as NOT_FOUND, which reads as if the page was missing. Raise the cap to match your list.
  • You can land a little under maxItems. The same branch showing up on two pages is written once, and the cap is counted before that. The copy is not charged.
  • Rows are a snapshot. Hours change, places close, ratings move.
  • It is not an official 2GIS tool. Dami's Studio is independent and is not affiliated with or endorsed by 2GIS, or by any other company named on this page.

🧭 Which directory scraper do you need?

If you wantUse
Businesses and their contact details on 2GISThis one
The reviews written about a 2GIS place2GIS Reviews Scraper
The same job on Yandex MapsYandex Maps Scraper
The same job on Google MapsGoogle Maps Scraper

❓ Questions people ask

Do I need a 2GIS account or an API key?

No. Nothing to register and no quota to watch.

Which countries does 2GIS actually cover?

Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Belarus, Georgia, Armenia, Tajikistan, Cyprus and the UAE. Outside that list, 2GIS is the wrong source.

Should I search 2GIS in Russian or English?

Russian, in Russian-speaking cities: кафе finds more than cafe in Moscow. In Dubai it is the other way round.

Do I get email addresses from 2GIS?

Where 2GIS holds one. In a 50-place Moscow sample, 38 listings had an email on them.

How do I get every cafe in a city?

Set the city, put your term in Search terms and raise Maximum places. Expect to top out near 5,000, then keep going per district.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/2gis-places-scraper. Either way the run happens on your Apify account at the same price.

These are public business listings. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the search term, the city and the run ID. The errorCode on the diagnostic row usually names the problem on its own.