2GIS Places Scraper
Scrape 2GIS places: name, category, address, phone, email, website, rating and hours. Russia, the CIS, the UAE and Cyprus only. $0.50 per 1,000 places.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchQueries,city,startUrls(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0005 per place = $0.5 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Place returned | Charged once per genuine place row. Sample rows, diagnostics, blocked requests and empty runs are never charged. | $0.0005 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-07, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchQueries | What to look for on 2GIS, for example "pizza", "кафе", "dentist". One search per line. 2GIS is a Russian/CIS directory, so local-language terms return more. | array |
city | City to search in. English or local spelling both work ("Moscow", "Москва", "Almaty", "Dubai"). You can also paste a numeric 2GIS city id. Leave it empty only if you set a point below: with no city and no point, 2GIS returns just a handful of places from anywhere. | string |
startUrls | Optional. Paste 2GIS search pages (https://2gis.ru/moscow/search/кафе) or single place pages (https://2gis.ru/moscow/firm/70000001044357973). Works alongside the fields above. | array |
maxItems | Hard cap on rows returned across all searches (1-5000). You are charged per place returned. | integer |
minRating | Only places 2GIS rates at least this high. Places with no rating are left out too. | string |
hasPhotos | Keep places that have photos on 2GIS. | boolean |
cardPayment | Keep places 2GIS lists as accepting card payment. | boolean |
wifi | Keep places 2GIS lists as having Wi-Fi for customers. | boolean |
delivery | Keep places 2GIS lists as offering delivery. | boolean |
takeaway | Keep places 2GIS lists as taking takeaway orders. | boolean |
sortBy | 2GIS's own order puts the best matches first. Name lists places A to Z. | string |
latitude | Search around a point instead of a whole city. Example: 55.7558 | string |
longitude | Used together with latitude. Example: 37.6173 | string |
radiusMeters | Radius around the latitude/longitude point. Ignored unless both coordinates are set. | integer |
locale | Optional 2GIS locale for names and categories. Leave as Automatic unless you specifically need another language; not every locale is available in every country. | string |
What you get
A structured dataset — each result includes fields like:
namecategoryPrimaryaddressFullphonewebsiteemailratingreviewCountopeningHoursTextlatitudelongitudeurlplaceIdExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Maps & Local Lead Generation
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
2GIS Reviews Scraper
Scrape 2GIS reviews by place URL or city: rating, text, author, date, photos, owner replies. No API key. $0.50 per 1,000.
Yelp Scraper
Scrape Yelp businesses and reviews through Yelp's official Fusion API. Get rating, review count, price, phone, address, GPS and text. Bring your own key.
Google Maps Reviews Scraper
Scrape Google Maps reviews: rating, full text, exact date, reviewer, owner reply and photos. Set a date cutoff. No API key. $0.27 per 1,000.
Yandex Maps Scraper
Scrape Yandex Maps business listings: name, address, coordinates, rating, reviews, phone, website and hours. No API key. $0.40 per 1,000 places.
Google Maps Scraper
Scrape Google Maps places and reviews. Business name, category, address, rating, GPS coordinates and place ID. $0.27 per 1,000 rows.
Google Reviews Monitor — Multi-Location Alerts & Reports
Watch Google reviews for every location on a schedule. Get only the new ones, rating-drop alerts in Slack and AI reply drafts. $1.00 per 1,000 reviews.
Where this tool sits
- Categories
- Maps & Local Lead Generation
- Platforms
- 2GIS
2GIS Places Scraper: business listings with phone, email and opening hours
Type a search and a city the way you would into 2GIS, and get one row per business: name, category, full address down to the district, coordinates, phone, email, website, 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.
| Input | Search terms plus a city, or 2GIS URLs |
| Output | One row per place |
| Ceiling | 5,000 places per run |
| Account needed | None, and no API key |
| Price | $0.50 per 1,000 places, flat on every plan |
🏙️ 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://mozhayka.rvbar.ru/ and not a 300-character redirect.
📥 What you give it
{
"searchQueries": ["кафе", "пиццерия"],
"city": "Moscow",
"maxItems": 200
}
| Field | Default | What it is |
|---|---|---|
searchQueries | box holds кафе | One search per line. Local-language terms return more in Russian-speaking cities. |
city | box holds Moscow | English 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). |
startUrls | empty | 2GIS search pages or single place pages. Works alongside the fields above. |
maxItems | 50 | Hard cap on rows across every search, 1 to 5,000. You are charged per place returned, so this is your spend cap too. |
minRating | any rating | 3.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, takeaway | off | Tick 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. |
sortBy | 2GIS's own order | name lists places A to Z. |
latitude, longitude | empty | Search around a point instead of a city. Both are needed. |
radiusMeters | 1000 | How wide that circle is, 50 to 40,000. Ignored without both coordinates. |
locale | Automatic | ru_RU, en_AE, en_RU, kk_KZ, uz_UZ, az_AZ or ky_KG. Not every language exists in every country. |
proxyConfiguration | leave it alone | Optional. Only fill this in if you want the run to go out through your own servers. |
Run it with everything empty and you get one labelled sample row.
📤 What you get back
A real place row from a recent run. The raw openingHours block is cut short here, since it repeats the same shape for all seven days.
{
"placeId": "70000001063551091",
"name": "Руки Вверх!, бар",
"nameShort": "Руки Вверх!",
"brandName": "Руки Вверх!, бар",
"chainBranchCount": 9,
"categoryPrimary": "Бары",
"categories": ["Кафе", "Бары", "Ночные клубы", "Караоке-залы"],
"address": "Можайское шоссе, 45Б",
"addressFull": "Москва, Можайское шоссе, 45Б",
"addressComment": "3 этаж",
"postcode": "121353",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"cityAlias": "moscow",
"district": "Можайский",
"latitude": 55.7165,
"longitude": 37.407401,
"phone": "+74951205368",
"phones": ["+74951205368"],
"website": "http://mozhayka.rvbar.ru/",
"websites": ["http://mozhayka.rvbar.ru/"],
"email": null,
"emails": [],
"socialProfiles": [{"type": "telegram", "url": "https://t.me/book_rvb_bot"}, {"type": "vkontakte", "url": "https://vk.com/rvbar.mozhayka"}],
"rating": 4.8,
"reviewCount": 332,
"openingHours": {"Mon": {"working_hours": [{"from": "18:00", "to": "06:00"}]}, "...": "..."},
"openingHoursText": "Mon: 18:00-06:00; Tue: 18:00-06:00; Wed: 18:00-06:00; ...",
"url": "https://2gis.ru/moscow/firm/70000001063551091",
"searchQuery": "кафе",
"position": 1,
"scrapedAt": "2026-09-20T07:01:26.351Z"
}
| Field | What it is |
|---|---|
placeId | 2GIS's branch id. It is the dedupe key here and the key to join on between runs. |
brandName, chainBranchCount | The chain this branch belongs to, and how many branches it has. |
phone, phones, email, emails | What 2GIS publishes on the listing. Plenty of small businesses have none. |
website, websites | Unwrapped from 2GIS's click tracker, tracking tags stripped. |
district, postcode, cityAlias | The address broken down, useful for splitting a city into smaller searches. |
rating, reviewCount | The branch score and how many reviews it came from. |
openingHoursText | Monday through Sunday on one line. openingHours keeps 2GIS's own arrays. |
position | Where the place sat in that search's results. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it |
|---|---|
| A place | It has a placeId and a name |
| The sample row | Written only when the input was empty |
| A diagnostic | It carries an errorCode |
Diagnostic rows are never charged.
| Code | What it means |
|---|---|
CITY_NOT_FOUND | 2GIS could not place that city. The run stops there, so nothing is spent searching the wrong place. |
BAD_INPUT | minRating or sortBy is not one of the values above. The run stops before searching. |
BAD_URL | That entry is not a 2GIS address. The other jobs carry on. |
NOT_FOUND | Those place pages are gone, or they sat past your maxItems cap and were never fetched. |
NO_RESULTS | The search came back with nothing. |
API_ERROR, BAD_RESPONSE | 2GIS answered, but not with the data it normally carries. |
NETWORK, BLOCKED, KEY_REJECTED | 2GIS was unreachable or turned the request down. Worth one re-run. |
▶️ How to run it
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.
💰 How much does it cost?
$0.50 per 1,000 places. Flat on every Apify plan, no volume tiers.
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.
💡 What people use it for
- Building a local lead list 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
districtand walking each one, when a single search runs out of depth. - Joining 2GIS data to your own records on
placeId, on a schedule.
🚧 What it does not do
- No review text and no photos. You get
ratingandreviewCount, not what people wrote. There
is a separate actor for that.
- 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.
ratingis 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_FOUNDrow, 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
maxItemsallows 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.
🧭 Which directory scraper do you need?
| If you want | Use |
|---|---|
| Businesses and their contact details on 2GIS | This one |
| The reviews written about a 2GIS place | 2GIS Reviews Scraper |
| The same job on Yandex Maps | Yandex Maps Scraper |
| The same job on Google Maps | Google 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 actually have data? Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Belarus, Georgia, Armenia, Tajikistan, Cyprus and the UAE. Outside that list, 2GIS is the wrong source.
Should I search 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? Where 2GIS holds one. In a 50-place Moscow sample, 38 listings had an email on them. It arrives inside the row, with nothing extra to pay for it.
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 run it on a schedule? Yes. placeId is stable, so diffing hours, ratings or closures between runs is a straight join.
Is scraping 2GIS legal? These are public business listings. Apify's write-up on scraping and the law is a good place to start, 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.