Piotr VassevPiotr Vassev•

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.

2GIS business listings with contacts

Pick the search

A search is a keyword plus a city on one 2GIS domain:

FieldExampleNotes
searchQueries["стоматология"]Search in the language locals use; 2GIS matches it best.
cityalmatyThe slug from the city's 2GIS URL.
countrykzae (default), ru, kz, uz, kg, az, com.cy
maxItems60Places for the whole run (default 50).
maxPages5Result 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:

SearchPhoneWhatsAppInstagramTelegramEmailWebsite
Almaty dentists (60)60595552922
Tashkent dentists (36)351330241718

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

  1. 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.
  2. Treat each row as one branch. branchCount tells you the organization has other locations. For company-level outreach, group rows by orgName and contact the organization once.
  3. Rank the list. Sort by reviewCount, then rating. A 4.9 from 932 reviews says more than a 5.0 from 3.
  4. Keep the source. Keep url and scrapedAt so 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.

Earlier 2GIS scraper output in the Apify dataset view, before contact fields were added

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 after maxPages pages (about 12 places per page). Raise maxPages or 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 null on 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.

Piotr Vassev

Piotr Vassev

Founder of FalconScrape. Building production-grade web scraping systems and data automation pipelines for businesses worldwide.

Connect on LinkedIn