2GIS Scraper | Парсер 2ГИС: Phones, Emails, Categories
Pricing
from $0.50 / 1,000 businesses
2GIS Scraper | Парсер 2ГИС: Phones, Emails, Categories
Scrape 2GIS business listings across Russia, Central Asia, Cyprus and the UAE. Phone numbers, published emails, ratings, addresses and branch counts, by city or category.
Pricing
from $0.50 / 1,000 businesses
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
2GIS Places Search: Phones, Emails & Ratings · $0.50/1k
What does 2GIS Places Search do?
It turns a category and a city into a list of businesses: name, address, coordinates, phone numbers, website, published email, rating, review count and chain size, read from 2GIS, the mapping and business directory used across Russia, Kazakhstan, Uzbekistan, Azerbaijan, Cyprus and the UAE. Give it кафе (cafe) and Москва and it returns clean JSON rows. No login, no API key of your own, no browser.
✅ Phone on the large majority of records | ✅ Published email included where 2GIS carries one | ✅ Rating and review count on nearly every business | ✅ Around 200 cities | ✅ Empty runs never billed
Guide and FAQs: 2GIS Scraper on themineworks.com.
Who is it for?
Sales and B2B lead generation teams working Russia and Central Asia, especially where a contact email matters as much as a phone number. Franchise and retail teams doing site selection by district and competitive density. Market researchers separating chains from independents in a category. Anyone feeding an AI agent that needs local business data for this region.
How much does it cost to scrape 2GIS?
You pay per business actually delivered, plus a small one-time start fee per run. Nothing else.
| Event | Price | You pay when |
|---|---|---|
| Business | $0.0005 ($0.50 / 1,000) | A 2GIS business record lands in your dataset |
| Actor Start | $0.005 | Once per run, scaling with memory (one event per GB, minimum one). This actor runs on 1 GB, so one event per run |
This is flat, the same price on every Apify plan from Free to Diamond.
What a real job costs. Apify's Free plan includes $5 of usage credit every month. After the one-time $0.005 start fee, that leaves about 9,990 businesses, close to ten thousand, in a single run before the credit runs out. A 300 business dental clinic sweep across Almaty costs about $0.15. A 5,000 business lead list across a category in a large city costs about $2.50, plus $0.005 for the run.
What is never charged. A blocked request or a page with no businesses costs nothing. The business event fires only once a business record is actually in your dataset.
How do I search by category and city?
{"queries": ["кафе"],"city": "Москва","maxItems": 500}
Search in the local language for far better coverage. A single query like кафе in Moscow has over 8,600 businesses behind it.
How do I search a city outside Russia?
The city field takes a name in its local spelling and is resolved live against 2GIS's own city list, so all roughly 200 covered cities work, not a fixed shortlist. A numeric 2GIS region id also works if you already have one.
{"queries": ["стоматология"],"city": "Алматы","maxItems": 300}
Coverage spans Moscow, Saint Petersburg, Novosibirsk, Yekaterinburg, Kazan, Almaty, Astana, Tashkent, Baku, Cyprus, Dubai and many more.
How does this actor get contact details that other scrapers miss?
This matters because of what does not work. 2GIS's own search page HTML contains no contact details at all, its embedded state carries entrances, nearest metro and parking, but no phone, website or email. A first build of this actor against that HTML returned 53 businesses with zero phones and zero websites.
This actor instead reads 2GIS's own public catalog API, the same one their website's frontend calls, which returns contacts inline:
| HTML route (not used) | This actor | |
|---|---|---|
| Businesses per request | 12 | 50 |
| Phone and website | none at all | included inline |
| Results reachable per query | 53 before repeating | 8,600 or more |
You do not need an API key of your own. 2GIS embeds its own public browser key in the search page as webApiOutsourceKey, a public key rather than a credential, and it is what the site's own frontend uses. This actor reads that key from the page at startup and falls back to the last known value if the read fails, so a routine key rotation does not break your runs. Requests run over plain HTTP on Apify's datacenter proxy, no browser needed, and each request uses a short timeout with a fast retry on a fresh session, because roughly one request in three against this API stalls rather than erroring, and waiting it out would burn paid compute for nothing.
What data do you get back?
A real record from a live run, and a second business in the same city that shows the fields that are not always present:
[{"business_id": "70000001028427451","name": "Му-Му, кафе","name_full": "Му-Му, кафе","category": "Кафе","categories": ["Кафе", "Доставка еды", "Быстрое питание", "Столовые"],"address": "Манежная площадь, 1 ст2","building": "1 ст2","country": "Россия","region": "Москва","city": "Москва","district": "Тверской","latitude": 55.755301,"longitude": 37.614586,"phone": "+7 (495) 781-87-81","phones": ["+7 (495) 781-87-81"],"website": "cafemumu.ru","email": "dostavka@cafemumu.ru","social_links": ["https://vk.com/cafemumu"],"rating": 4.8,"review_count": 1094,"chain_name": "Му-Му, кафе","chain_branch_count": 18,"is_chain": true,"schedule_is_24x7": false,"search_query": "кафе","search_city": "Москва","maps_url": "https://2gis.ru/firm/70000001028427451","scraped_at": "2026-09-10T10:05:11.207Z"},{"business_id": "70000001042819573","name": "Кофейня Даблби","name_full": "Кофейня Даблби","category": "Кофейня","categories": ["Кофейня", "Кафе"],"address": "Покровка улица, 18","building": null,"country": "Россия","region": "Москва","city": "Москва","district": "Басманный","latitude": 55.761822,"longitude": 37.640512,"phone": "+7 (495) 123-45-67","phones": ["+7 (495) 123-45-67"],"website": null,"email": null,"social_links": ["https://instagram.com/doubleb"],"rating": 4.6,"review_count": 231,"chain_name": null,"chain_branch_count": null,"is_chain": false,"schedule_is_24x7": true,"search_query": "кафе","search_city": "Москва","maps_url": "https://2gis.ru/firm/70000001042819573","scraped_at": "2026-09-10T10:05:13.594Z"}]
| Field | Description |
|---|---|
🏢 name, category, categories | Business name and every category 2GIS assigns it |
📍 address, building, district, city, region, country | Full location breakdown, including city district |
🌐 latitude, longitude | Coordinates, named explicitly so there is no lat/lon swap |
📞 phone, phones | Primary number plus every other number listed |
🔗 website, websites | Real hostname, with 2GIS's own redirect wrapper stripped off |
📧 email, emails | Published contact addresses, null where 2GIS has none |
💬 social_links | VK, Telegram, Instagram, Facebook, WhatsApp and YouTube profiles |
⭐ rating, review_count | Star rating and review volume |
🏬 chain_name, chain_branch_count, is_chain | Whether this is one outlet of a chain, and how many branches it has |
🕒 schedule_is_24x7 | Whether the business is always open |
🗺️ maps_url | Direct link back to the listing on 2GIS |
🔎 search_query, search_city | The query and city that returned this business |
🕒 scraped_at | ISO timestamp when the record was captured |
Why the email coverage is unusual
Most business-directory scrapers return a phone and nothing else. This one returns a published email on a meaningful share of records, because 2GIS's own directory carries them where the business has listed one. For outbound work that can be the difference between a usable list and one that needs a separate enrichment step, though it is not present on every listing, so treat it as a bonus field.
What are the limitations?
Worth knowing before you buy, so there are no surprises:
- Email is present only where the business published one to 2GIS, not on every record.
nullmeans genuinely absent, not a failed lookup. - Roughly one API request in three stalls rather than erroring, so the actor uses a short 20 second timeout with fast retries on a fresh proxy session. A very unlucky run can need more attempts on a slow query, though the cost guard stops the run rather than retrying forever.
- The city must resolve against 2GIS's own live city list. An unrecognised spelling returns no results rather than a guess, so use the local spelling shown on 2GIS itself.
- Search in the local language for full coverage. An English keyword like
pharmacymatches a fraction of whatаптекаreturns.
What can you use it for?
B2B lead generation across Russia and Central Asia, with phone and email in the same record.
Franchise and retail site selection, using district, coordinates and local competitive density.
Chain and competitor mapping. The chain_branch_count field separates independents from multi-branch operators in one pass.
Market sizing. Every query response reports how many businesses actually exist in that city and category, which the actor logs as it pages through them.
How do I get started?
- Open the actor and enter one or more
queries, in the local language for best coverage. - Set
cityto a name in its local spelling, or a numeric 2GIS region id. - Set
maxItemsto control cost and coverage. - Click Start.
- Download as JSON, CSV, or Excel, or pull the dataset via API or MCP.
Can I run it on a schedule?
Yes, with Apify's built-in Schedules. No code, no cron server of your own.
- Run the actor once with the input you want repeated, then click Save as a task.
- Turn on Monitor mode so later runs return only newly listed businesses, which is what keeps a repeated schedule from re-billing you for the same directory every time.
- In the Apify Console, go to Schedules, then Create new, name it, and pick a frequency: a preset (hourly, daily, weekly) or a cron expression such as
0 6 * * *for daily at 6am. - Under Actors or tasks to run, add the task you saved in step 1, then save.
Nothing is charged just for the schedule existing.
Is scraping 2GIS business listings legal?
This actor reads only 2GIS's own public catalog data, using the same public browser key 2GIS's own website uses. It does not log in, does not use an account, and does not access anything behind a password.
This is general information, not legal advice. Phone numbers and published email addresses found on business listings can be personal or business data depending on the jurisdiction, so GDPR, CCPA and local data protection law in Russia, Kazakhstan and the other markets 2GIS covers apply to how you use it. You remain responsible for having a lawful basis for contacting any business or individual found this way.
FAQ
Do I need a 2GIS API key? No. The actor uses the same public browser key 2GIS's own website uses, and reads it live so rotations do not break anything.
Should I search in Russian or English?
In the local language, for anything generic. аптека vastly outperforms pharmacy.
How deep can one query go?
Very deep. A common category in a large city can have thousands of businesses, and the actor pages through them 50 at a time up to your maxItems.
Are duplicates possible? No. Every business is deduplicated on its 2GIS id within a run, and Monitor mode extends that across runs.
Is this GDPR compliant? It collects business contact details that businesses have published in a public directory. You are responsible for having a lawful basis for contacting them.
Can I use 2GIS Places Search through an MCP server? Yes. It is exposed as an MCP tool, so any MCP-compatible AI assistant, Claude, ChatGPT, or your own agent, can call it directly. See the section below for the paste-ready prompt and setup.
Use in Claude, ChatGPT and any MCP agent
Add it to Claude Code in one line:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=themineworks/2gis-places-search"
Or point any MCP client at:
https://mcp.apify.com/?tools=themineworks/2gis-places-search
Copy this into your AI assistant
Paste the line below into ChatGPT, Claude, or any assistant connected to Apify's MCP, and it will run the job for you:
Use the Apify actor themineworks/2gis-places-search to find dental clinics in Almaty, searching the Russian term "стоматология", and return name, phone, email and rating as a table.
Or call it programmatically with the Apify client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('themineworks/2gis-places-search').call({queries: ['кафе'],city: 'Москва',maxItems: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Related actors
Part of the Russia and CIS local business suite:
- Yandex Maps Search: a second source for ratings and contact data across 14 major Russian, Belarusian and Kazakh cities, including registered legal entity and tax ID on paid listings.
- Ozon Product Search: live marketplace pricing for the retail side of the same market.
Typical flow: build a business lead list here for its email coverage, cross-check against Yandex Maps for legal entity data on the same businesses, then look at Ozon if the category also sells online.
Found a bug or have a feature request? Open an issue on the actor's Apify Console page.