How to Scrape 2GIS Business Listings With Phones and Emails
2GIS is the business directory people actually use in Russia, Kazakhstan, Uzbekistan, the UAE and several neighboring markets. For a sales team working those cities, it's the closest thing to a complete list of local businesses with their contact details.
Our 2GIS Places Scraper turns a 2GIS search into a table: name, address, district, coordinates, rating, categories and opening hours, plus each business's phones, emails, websites and social links (WhatsApp, Telegram, Instagram, VK and others). You give it a keyword and a city, or paste 2GIS search URLs. It returns only what businesses list publicly on 2GIS.

Pick the search
A search is a keyword plus a city on one 2GIS domain:
| Field | Example | Notes |
|---|---|---|
searchQueries | ["стоматология"] | Search in the language locals use; 2GIS matches it best. |
city | almaty | The slug from the city's 2GIS URL. |
country | kz | ae (default), ru, kz, uz, kg, az, com.cy |
maxItems | 60 | Places for the whole run (default 50). |
maxPages | 5 | Result pages per search (default 5, about 12 places each). |
Not sure about the slug or domain? Open the city on 2GIS in a browser and copy it from the address bar. Saudi cities now redirect from 2GIS to a separate service, so they aren't supported. A city the domain doesn't have ends the run with a message instead of wrong results.
You can also paste search URLs into startUrls if you've already refined a search on the site, for example with a district in view.
Budget
Pricing as of September 28, 2026: $0.0018 per place, plus a start fee of $0.00005 per GB of run memory (one event on the default 1 GB). Contacts are included in the per-place price. The 60 places below cost $0.108 plus the start fee. Check current pricing before scaling up.
Export dentists in Almaty
Open the Actor on Apify, go to Input, switch to JSON, and paste:
{
"searchQueries": ["стоматология"],
"city": "almaty",
"country": "kz",
"maxItems": 60
}
Leave Include contacts and Proxy configuration at their defaults and click Start. Our example run took about half a minute and returned 60 clinics across five result pages. Open the run's Dataset and export JSON, or CSV for a spreadsheet.
One row, abbreviated:
{
"name": "Центр Цифровой Стоматологии Dr. Edil Boribay",
"branchCount": 2,
"address": "улица Розыбакиева, 247 блок 4",
"district": "Бостандыкский район",
"rating": 4.9,
"reviewCount": 932,
"phones": ["+77072208000"],
"emails": ["dr.boribay@gmail.com"],
"websites": ["http://www.boribay-stom.kz/", "http://ccs.stom.kz/"],
"socials": {
"whatsapp": ["https://wa.me/77072208000"],
"instagram": ["https://instagram.com/dr.edil.boribay"],
"facebook": ["https://facebook.com/Digital.Dentistry.Centre.Dr.Edil.Boribay"]
},
"url": "https://2gis.kz/almaty/firm/70000001028699803"
}
Phones come in international format. Website links have 2GIS's tracking parameters removed, and WhatsApp links drop the prefilled message 2GIS adds. The full row also has coordinates, categories, schedule, attributes and scrapedAt.
Choose the outreach channel per market
Contact coverage differs a lot by country, so look at it before planning outreach. In our example runs:
| Search | Phone | Telegram | Website | |||
|---|---|---|---|---|---|---|
| Almaty dentists (60) | 60 | 59 | 55 | 5 | 29 | 22 |
| Tashkent dentists (36) | 35 | 13 | 30 | 24 | 17 | 18 |
An email-only campaign would reach about half of the Almaty clinics, while WhatsApp reaches nearly all of them. In Tashkent, Telegram does much of what WhatsApp does in Almaty.
Turn it into an outreach sheet
- Flatten the contacts. Put the first phone, first email and first website in their own columns, and keep the full lists alongside. Add one column per social network you plan to use.
- Treat each row as one branch.
branchCounttells you the organization has other locations. For company-level outreach, group rows byorgNameand contact the organization once. - Rank the list. Sort by
reviewCount, thenrating. A 4.9 from 932 reviews says more than a 5.0 from 3. - Keep the source. Keep
urlandscrapedAtso anyone on the team can open the 2GIS page and see when the data was collected.
Before messaging anyone, check the rules on unsolicited messages in the country you're contacting, and how your channel of choice treats business outreach.
Map a market instead
The same export works for a location study. Filter by categories and district, drop rows without coordinates rather than guessing them, and plot latitude/longitude. Count locations per district next to how many of them are rated. Remember it's a map of the search results you collected, shaped by search ranking and your limits, not a census of every business in the city.

When a run returns less than expected
- Run failed with "no page for this city": the city slug or domain is wrong. Open the city on 2GIS and copy both from the URL.
- Fewer places than
maxItems: each search stops aftermaxPagespages (about 12 places per page). RaisemaxPagesor add more keywords. - Some places have no email or website: the business didn't list one on 2GIS. The fields are empty lists, not errors.
- Contacts are
nullon some rows: the contacts lookup failed for that page, and the run log says how many places are affected. Re-run those searches. - A business you know is missing: it may rank beyond your page limit, or sit under a different category name. Try the name as a keyword.
For running the Actor from code, see the 2GIS Node.js example. If you're researching the companies behind these listings, the LinkedIn decision-maker workflow and company career-page guide cover the next steps.
Frequently asked questions
Does this Actor return phone numbers and email addresses?
Yes, when Include contacts is on (the default). Each place gets phones, emails, websites and social links such as WhatsApp, Telegram and Instagram, as the business lists them on 2GIS. Not every business lists an email or website.
Which countries and cities work?
2GIS domains ae (UAE), ru, kz, uz, kg, az and com.cy (Cyprus). Use the city slug from the 2GIS URL, such as dubai, almaty or tashkent. A city that 2GIS doesn't have on that domain ends the run with a clear message, and no places are charged.
Is maxItems applied to each search?
No. maxItems caps places across the whole run; maxPages limits pagination separately for each search.
Does a missing business mean it has closed?
No. A business can fall outside the search, the page limit, or the item limit. Check its 2GIS page before treating absence as closure.
