2GIS Places Scraper: Phones, Emails, Websites avatar

2GIS Places Scraper: Phones, Emails, Websites

Pricing

from $2.40 / 1,000 places

Go to Apify Store
2GIS Places Scraper: Phones, Emails, Websites

2GIS Places Scraper: Phones, Emails, Websites

Scrape 2GIS businesses by search term and city (Russia, Kazakhstan, UAE and other 2GIS countries) or 2GIS URLs: name, categories, address, coordinates, phones, emails, websites, social links, hours, rating, branch count. Gets past the 60-place limit map area by area. New-places-only mode.

Pricing

from $2.40 / 1,000 places

Rating

0.0

(0)

Developer

Amit Aviv

Amit Aviv

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Business listings from 2GIS (2gis.ru, 2gis.kz, 2gis.ae and the other 2GIS country sites) for a search term in a city, or for pasted 2GIS search, category and place URLs: name, categories, address, coordinates, phones, emails, websites, social links, opening hours, rating, review count and branch count. It reads 2GIS's public pages over plain HTTP (no browser, no login), gets past 2GIS's 60-places-per-search limit by searching the city map area by area, and you pay only for places delivered; a run that delivers nothing because of an error or a block ends as Failed, never as a green empty run.

What you get

  • Name, short name and descriptor ("Demokrat" + "стоматологический центр"), 2GIS categories (names and rubric ids, main one first)
  • Street address, full address, where in the building ("Д блок; 1 этаж"), street, house number, postcode, district, city, region, country, latitude and longitude
  • Contacts as the business publishes them on 2GIS: phones (international format), emails, websites (the business's own URL, not 2GIS's redirect link), social and messenger links (VK, Telegram, WhatsApp, Instagram, Facebook, YouTube and others), faxes
  • Opening hours per weekday, open 24/7 flag
  • Rating, number of reviews, number of ratings, number of photos
  • Organisation id and name, and how many branches the organisation has on 2GIS
  • Features 2GIS lists for the place (payment methods, Wi-Fi, services, average bill and so on), advertising flag, when the listing was added and last updated
  • One record per place, as JSON, CSV or Excel, or through the API. A place is delivered and charged once per run, however many searches or map areas list it.
  • A run summary (OUTPUT_SUMMARY in the run's key-value store): what was requested, delivered and charged, how many places 2GIS lists for each search, how many map areas were searched, what was left out and why, and why the run stopped.

What it does not return: review texts, reviewer names, photos, menus and price lists, anything behind a login.

How it gets past 2GIS's 60-place limit

2GIS shows at most 60 places (5 pages of 12) for one search, even when it says it has thousands. The actor first reads the search as 2GIS lists it (its own order, most relevant first). When 2GIS has more, it searches the map area by area with 2GIS's own "search here" filter, which gives each map view its own count: a view that lists more than 60 places is cut into four quarters and searched again, until every view lists 60 or fewer. It covers the map 2GIS shows for the search first, then the rest of the city's bounds. Places found twice are delivered once.

Only the city you named. 2GIS groups cities into areas, and its search lists places from the whole area: the Almaty area includes Talgar, Kaskelen and Konaev, and the Bishkek area is all of Kyrgyzstan. By default a search term in a city delivers only places 2GIS files under that city (Troitsk and Zelenograd count as their own cities, not as Moscow); the others are not charged, and the status message says how many were left out among the places read, also when the run stops at Max places per search (OUTPUT_SUMMARY has the count as otherTownsInArea). Turn on Include nearby towns of the 2GIS area (includeWholeArea) to get the whole area. A pasted search URL always gets what 2GIS lists for it, the whole area included.

Measured: dentistry in Karaganda, 2GIS's search listed 225. In the city only (the default) the actor delivered 183, left out 5 in other towns and 4 listings in a private person's name (run ey1GQyPaNFNeKWWEN); these 183 are every Karaganda place that an earlier run over the whole area delivered (that run's other 31 were in Temirtau, Saran and two villages). Dentistry in Almaty, where 2GIS's search listed 1,207: in a test run from our own server without the contacts step the map search found 1,343 different places in the whole 2GIS Almaty area (with nearby towns), 99% of the 1,358 that 2GIS counted for it. A pasted "search here" URL for central Almaty (cafés) gave exactly the 172 places 2GIS counted for that view (ZPjlPyphWsQsUw71Y).

Turn this off with Get past 2GIS's 60-place limit if you only want 2GIS's first 60.

What is left out by default

Listings in a private person's name (includeIndividuals, off) are not delivered and not charged; the status message says how many were left out among the places read, also when the run stops at Max places per search (OUTPUT_SUMMARY: individualsWithheld). These are listings where any part of the name 2GIS shows is a person's name: sole traders ("ИП …", also as a descriptor: "Стоматологическая клиника, ИП Хелаев М.Я."), names with initials ("Нотариус Ахметова Л.К.", "Доктор Алексеев В. А."), full names with a patronymic ("Иванова Мария Петровна"), and a common first name with a surname ("Репетитор Иванова Мария"). Their names and phones are personal data. It is a heuristic on the name: in our tests it caught all 36 notaries listed by name in Karaganda, held back 4 of 218 dentistry listings there (solo practices named after the doctor), and among 2,531 different places delivered by our test runs it flagged no business by mistake. A person's name written in another form (only a first name, a name in Latin letters such as "Dr. Abdullayev") is not recognised. Turn it on only if you have a lawful basis to process such data; the records then carry isIndividual: true.

A sole trader behind a business. 2GIS often adds the legal owner to a business's organisation name ("Россиянка, кафе, ИП Казак И.А."). The business is delivered, but organizationName comes without the person's name ("Россиянка, кафе") unless includeIndividuals is on.

How to use

  1. Type what you are looking for into Search terms or 2GIS URLs, as you would in 2GIS (стоматология, кофейня, автосервис, dentist on 2gis.ae). Several entries are fine.
  2. Type the City: Москва, Almaty, Dubai, Новосибирск, or the code from a 2GIS address (2gis.ru/novosibirsk/…). Several cities: separate them with ;. Or skip this and paste a 2GIS search or category URL; its filters are kept.
  3. Set Max places per search and press Start.
  4. Download the results from the Output tab, or read them from the API.

Input

FieldTypeDefaultWhat it does
querieslist of textnone (required)Search terms, 2GIS search or category URLs (https://2gis.ru/moscow/search/Кофейни/rubricId/162, filters such as sort and "has photos" are kept), or place URLs (https://2gis.kz/almaty/firm/70000001047564924 returns that one place). A search URL copied with a place card open (…/search/кафе/firm/…) reads the whole search. URLs from any 2GIS country site are accepted, with or without https://. Entries from other sites, building pages (/geo/…) and, when location is empty, search terms are ignored and listed in the summary; the rest of the input still runs.
locationtextemptyThe city for the search terms. Several, separated by ;: every term is searched in every city. Needed for search terms, not for URLs.
maxItemsnumber100Stop after this many places for each search (each term in each city, or each URL). Up to 100,000.
splitLargeSearchesyes/noyesSearch the city map area by area when 2GIS has more than 60 places. See above.
includeWholeAreayes/nonoAlso deliver places in the other towns of the city's 2GIS area. See above.
includeIndividualsyes/nonoAlso deliver listings in a private person's name. See above.
onlyNewyes/nonoDeliver and charge only places earlier runs have not delivered. See "Only new places".
monitorKeytextemptyName of the "only new" memory, to keep two schedules apart.
proxyConfigurationproxyoffNot needed. See the FAQ.

This input was run as uFJ3oeLe28hcpfEh7 (a 2gis.ae search, a 2gis.ru category URL and a 2gis.kz place URL; 31 places, all with their place page read):

{
"queries": [
"https://2gis.ae/dubai/search/dentist",
"https://2gis.ru/moscow/search/Кофейни/rubricId/162",
"https://2gis.kz/almaty/firm/70000001047564924"
],
"maxItems": 15
}

Example result

The place URL from run uFJ3oeLe28hcpfEh7 on 2026-10-20, unedited except that the list of 24 features is shortened:

{
"id": "70000001047564924",
"url": "https://2gis.kz/almaty/firm/70000001047564924",
"name": "Demokrat, стоматологический центр",
"shortName": "Demokrat",
"descriptor": "стоматологический центр",
"categories": ["Частные стоматологии"],
"categoryIds": ["222"],
"primaryCategory": "Частные стоматологии",
"address": "микрорайон Коктем-3, 24 к1",
"fullAddress": "Алматы, микрорайон Коктем-3, 24 к1",
"addressComment": "Д блок; 1 этаж",
"street": "микрорайон Коктем-3",
"houseNumber": "24 к1",
"postcode": "050000",
"district": "Бостандыкский район",
"city": "Алматы",
"region": "Алматы",
"country": "Казахстан",
"latitude": 43.234488,
"longitude": 76.919835,
"phone": "+77072837030",
"phones": ["+77072837030"],
"email": "demokrat.almaty@gmail.com",
"emails": ["demokrat.almaty@gmail.com"],
"website": "http://demokrat-almaty.kz/?utm_source=2_Gis&utm_medium=link&utm_campaign=site",
"websites": ["http://demokrat-almaty.kz/?utm_source=2_Gis&utm_medium=link&utm_campaign=site"],
"socialLinks": [
{ "type": "vkontakte", "url": "https://vk.com/public201210007" },
{ "type": "facebook", "url": "https://facebook.com/demokratalmaty" },
{ "type": "instagram", "url": "https://instagram.com/demokrat_almaty" },
{ "type": "youtube", "url": "https://youtube.com/channel/UC--tZvU0u92McnNWbZfF7Rw" },
{ "type": "whatsapp", "url": "https://wa.me/77768063377" }
],
"faxes": [],
"openingHours": {
"Mon": ["09:00-19:00"], "Tue": ["09:00-19:00"], "Wed": ["09:00-19:00"], "Thu": ["09:00-19:00"],
"Fri": ["09:00-19:00"], "Sat": ["09:00-19:00"], "Sun": ["09:00-19:00"]
},
"isOpen24x7": false,
"scheduleComment": null,
"rating": 4.9,
"reviewCount": 928,
"ratingCount": 1243,
"photoCount": 82,
"attributes": ["Скидки", "Взрослый стоматолог-хирург", "Взрослый ортодонт", "Взрослый стоматолог-ортопед", "Имплантация", "Взрослый пародонтолог", "…"],
"organizationId": "70000001047564923",
"organizationName": "Demokrat, стоматологический центр",
"branchCount": 1,
"isPromoted": false,
"isIndividual": false,
"createdAt": "2021-01-13T01:00:00Z",
"updatedAt": "2026-09-10T15:47:18Z",
"timezoneOffsetMinutes": 300,
"detailsFetched": true,
"searchQuery": null,
"searchCity": null,
"scrapedAt": "2026-10-20T14:14:01.059Z"
}

(fullAddress in that run was null: place pages carry no full address; since build 0.1.8 it is built from the city and the street address, as shown.)

FieldMeaning
id2GIS's id of the place (branch); stable between runs.
urlThe place's page on 2GIS.
phone, email, websiteThe first of phones, emails, websites.
socialLinks[{type, url}]. WhatsApp links are given without 2GIS's pre-filled greeting.
openingHoursPer weekday; an empty list is a closed day; null when 2GIS has no hours.
rating, reviewCount, ratingCount2GIS's figures for this branch.
organizationId, branchCountThe organisation all branches share, and how many branches it has on 2GIS.
isPromoted2GIS marks the listing as advertising.
detailsFetchedtrue: the contacts come from the place's own page. A place whose page 2GIS does not send is left out and not charged (the status message says how many), so delivered records have it true.
searchQuery, searchCityThe search that found the place (empty for a pasted place URL).

Fields 2GIS does not provide for a place are null (lists are empty), never missing.

Pricing

Pay per event. You pay for what is delivered, not for time or memory.

EventFree planBronzeSilverGold and above
Actor start (once per run)$0.003$0.003$0.003$0.003
Place delivered, contacts included$0.0036$0.003$0.0027$0.0024

Worked example on Bronze: 1 search, 500 places = 500 × $0.003 + $0.003 = $1.503. A scheduled "only new" run that finds 4 new places costs 4 × $0.003 + $0.003 = $0.015; a run that finds nothing new costs the start fee, $0.003.

  • Places that were not delivered are not charged: places of other cities and towns, places found twice, listings left out by includeIndividuals, places whose page 2GIS did not send.
  • The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so in the status message (run 3b6pO9XFJ7vGJ176K: limit $0.018 = start + 5 places, exactly 5 delivered).

Reliability and failure behaviour

What happenedRun statusStatus message (from real runs)
Places deliveredSucceededScraped 31 places from 3 queries
2GIS has no places for your searchSucceeded0 results: 2GIS has no places for this query
2GIS lists places, but every one is left out by your settingsSucceeded0 places delivered: all 60 places 2GIS listed were left out by this input's settings — 15 places in other towns of the 2GIS Казань area not delivered (turn on "includeWholeArea" to get them); 45 listings in a private person's name not delivered (…) (notaries in Kazan, run kpt24sPlVf0hyyFMG)
Some entries worked, some failedSucceededScraped … places from 2 queries — 1 of 2 queries failed ("…": …)
Nothing delivered because of errors or blockingFailedNo places delivered: 2GIS blocked every attempt; try again later. No places were charged (the start fee applies).
Input the actor cannot useFailed, within 2 secondsNothing to do: the input has no "queries". Add a search term such as "стоматология" with "location": "Almaty", or a 2GIS search or place URL. …
City not foundFailed… "Atlantis" was not recognised as a 2GIS city: …
Stopped at Max places, some places left out by your settingsSucceededScraped 40 places from 1 query — 1 place in other towns of the 2GIS Новосибирск area not delivered (turn on "includeWholeArea" to get them) (run v7Uov547FQ5VkkOuf, Max places 40; the count is of the places read before the stop)
Maximum charge reachedSucceededScraped 5 places from 1 query — stopped at the maximum charge set for this run
Run timeout closeSucceededScraped 22 places from 1 query — stopped just before the run timeout; raise the timeout to get the rest (run GdmTqSMXQDeUwqQPn, 18-second timeout: stopped while place pages were being read; the 22 finished places were delivered, the unfinished ones were not charged; the run ended 4.6 s before its timeout)
Run timeout so short that no place could be readFailedNo places delivered before the run timeout: raise the run timeout and try again. No places were charged (the start fee applies). (run 9uZGx1Z9k9PggKJlq, 50 seconds on 2gis.kg, whose search pages took up to 40 s each)
  • No proxy is needed: test runs went straight from Apify's servers to 2GIS. In the 1,000-place run 2GIS refused 2 of 1,154 requests; the actor switched to Apify Proxy by itself, said so in the log and summary, and finished (qaN2Hn9L6y2Z1XbgN). If 2GIS refused most requests, it would move on to residential proxy (tested offline only).
  • Requests are retried up to 3 times with increasing pauses on network errors, HTTP 429 and 5xx. A map view that still gets no answer is asked once more at the end, then skipped; the status message says how many map areas could not be read.
  • Places are saved and charged page by page. A run that is aborted, times out or is resurrected keeps what was delivered and never delivers or charges the same place twice.
  • In all test runs (2026-10-20 to 2026-10-24) the charged places equalled the delivered places, counted after the run's charges had settled.

Limits

  • Speed depends on the 2GIS country site. 2GIS sends Apify's servers its pages slowly, and each place needs its own place page for the contacts. Measured on 2gis.ru and 2gis.kz: 39-55 places a minute for runs of 100 to 1,000 places (300 Almaty dentists in 7.2 minutes, rWfKYs4PgUdVxmFLd; 1,000 in 26 minutes, qaN2Hn9L6y2Z1XbgN). 2gis.kg and 2gis.ae answered Apify's servers far more slowly: 5-8 places a minute on .kg (80 Bishkek coffee places in 15.6 minutes, fKOj3t9tta3Yb4OVK; 440 in 59 minutes, aQtQVOeJQwB7cUFcC) and about 4 a minute on .ae (19 Dubai dentists in 4.9 minutes, ikgML9vskAA3vHMec). The other country sites were not measured. Give large runs a long timeout: with the default hour, expect roughly 2,000 places on .ru/.kz and a few hundred on .kg or .ae.
  • City areas. By default only the city you named is delivered (see above). With includeWholeArea or a pasted URL you get the whole 2GIS area, which can be a whole country (Kyrgyzstan for Bishkek); every record has its own city.
  • Coverage. The map search finds what 2GIS lists for each map view. Where one building or block lists more than 60 matching places even at street level (a large shopping centre), only 60 of them can be read; the status message says how many such spots there were. In our tests coverage of 2GIS's own count for the area was 99%.
  • Languages. Names, addresses and categories come in the language 2GIS uses for the country site: Russian on 2gis.ru and 2gis.kz, English on 2gis.ae.
  • Contacts. Only what the business publishes on 2GIS. In a 10-place Moscow test every place had a phone and opening hours, 7 an email and 7 a website (yrWfUb4voJMSZXdMp).

Only new places (monitoring)

  1. Turn on Only new places and save the input as a task.
  2. Schedule the task (daily or weekly).
  3. The first run delivers what it finds (up to the maximum). Every later run delivers and charges only places it has not delivered before for the same search and city; a run with nothing new ends as Succeeded with 0 new places… and charges only the start fee.

Tested: Karaganda dentistry delivered 183 places (ey1GQyPaNFNeKWWEN), then the same input 0 new places in 1 monitored query with 0 places charged (KqvdpGJzbAPH0l7CO, 63 seconds). A later run still reads the whole city's map to find new places, but reads no place pages for places it already knows. When a later run hits the maximum, the rest of the new places come in the run after it.

The memory is a key-value store named 2gis-places-scraper-monitor in your own account (one record per search, city and monitor name). Delete the store or change Monitor name to start over.

FAQ

Do I need a proxy? No. Leave the proxy setting empty. If 2GIS refuses requests, the actor falls back to Apify Proxy on its own.

Why do I get more, or fewer, places than 2GIS's search count? 2GIS's search shows 60, and its count covers its whole area (nearby towns included) for the map view it picks. The actor searches the whole city map, so it finds more than 60; by default it keeps to the city you named, so it can deliver fewer than 2GIS's count. Turn on includeWholeArea for the whole area.

Can I get only one district? Open 2GIS, search, move the map to the district, press "Искать здесь" / "Search here", and paste that URL: the actor searches that view only (tested: ZPjlPyphWsQsUw71Y, 172 of 172).

Can I run it from code? Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. The Output tab shows the URLs.

What happens when 2GIS changes its pages? Runs fail loudly ("2GIS answered without the page data this actor reads") instead of returning empty data. Report the run id under Issues.

  • 2GIS Reviews Scraper: the reviews of 2GIS places (text, rating, date, business replies). Feed it the place URLs this actor returns.
  • Yandex Maps Scraper: the same kind of business data from Yandex Maps (Russia, Turkey, Kazakhstan and more). Many businesses list on both: run both for the same city to fill gaps in phones and websites.

This actor collects business listing data that 2GIS shows publicly without a login: business names, addresses, switchboard phones, websites and opening hours as the businesses publish them. By default it does not deliver listings in a private person's name (see "What is left out by default"), and it never returns reviews, reviewer names or anything behind a login.

You are responsible for how you use the data: respect 2GIS's terms, copyright and database rights, and data-protection and anti-spam law (GDPR, Russia's 152-FZ, Kazakhstan's law on personal data and others) in your country and the country of the data. Do not use the output for unsolicited marketing where the law requires consent. If you are unsure, ask a lawyer before you build on it.

Changelog

  • 2026-10-24: the status message names places left out in other towns and listings in a private person's name also when a search stops at Max places per search (before, only when it ran to its end).
  • 2026-10-24: first version: by default only the named city (includeWholeArea for the whole 2GIS area); sole traders recognised in any part of a listing's name and removed from organisation names; building URLs and search terms without a city are skipped instead of failing the run.

Support

Open an issue on the actor's Issues tab with the run id.