2GIS Scraper — Business Leads: Phones, Emails, Reviews & Hours
Pricing
from $1.50 / 1,000 results
2GIS Scraper — Business Leads: Phones, Emails, Reviews & Hours
Scrape 2GIS business listings by keyword or category across any city. Extract names, phones, emails, websites, social links, addresses, ratings, reviews and opening hours for B2B lead generation. No API key, no login.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
2GIS Scraper — Business Leads: Phones, Emails, Reviews & Opening Hours (No API Key)
An unofficial 2GIS scraper and structured 2GIS business-data API in a single Apify Actor. Pull local-business leads from 2GIS (2gis.ru) by keyword or by category, across one city or many cities at once — with phones, emails, websites, social links, addresses, GPS coordinates, ratings, review counts and opening hours on every row. Powered directly by 2GIS's own public Catalog API — no API key, no login, no cookies, no headless browser. Just fast HTTP and clean, flat JSON you can export to CSV, Excel or JSON. Three modes share one input form, and every result is tagged with _mode so you can mix modes in a single dataset and filter later.
🏆 Why this 2GIS scraper?
3 modes in 1 Actor (keyword search, whole-category sweep, batch details) · powered by 2GIS's own Catalog API · thousands of businesses per city · multi-city batch (loop many regions in one run) · full contact extraction (phones + emails + VK/Telegram/Instagram/WhatsApp) · clean split address fields (country / region / city / district) · keyless with automatic key refresh — no browser and no key to manage. The unofficial 2GIS API alternative for lead generation, local SEO, market mapping and AI agents.
✨ What this Actor does / Key features
- 🔎 Keyword search — find every business matching a term (
restaurant,dentist,coffee,аптека,hotel…), optionally scoped to one or more cities; paginates the full result set (thousands of matches). - 🗂️ Whole-category sweep — browse an entire 2GIS rubric (category) across one or many cities via
rubric_id+region_id— e.g. every restaurant in Moscow (3,900+), every pharmacy, every beauty salon. - 🌍 Multi-city batch — pass an array of region IDs (and, in category mode, an array of rubric IDs) and the Actor loops the cross-product so one run sweeps many cities and verticals at once.
- ☎️ Full contact extraction —
phone+ allphones[],email+ allemails[],website+ allwebsites[], plus VK, Telegram, Instagram, WhatsApp and Facebook links — the real value for B2B lead gen. - 📍 Clean split address —
country,region,city,district,address,postcode, plus preciselat/lon— geo fields most competitors flatten away. - ⭐ Ratings & reviews —
ratingValueandreviewCounton every listing, straight from 2GIS/Flamp. - 🕒 Opening hours — a human-readable
workingHoursstring, anis24x7flag and a structured per-dayscheduleStructuredobject. - 🧩 Batch details — feed many 2GIS firm/branch IDs at once with
byIdfor enrichment. - 🔑 Keyless & self-healing — the Actor mints 2GIS's public web key itself at startup (with a built-in fallback), so you never supply a key. No browser, no OAuth; every item carries
_modeandscrapedAt(ISO 8601). - 🗂️ 3 pre-built dataset views — Overview, Leads (contacts) and Location — slice the data with zero post-processing.
The 3 modes
| Mode | What it returns |
|---|---|
search | Free-text business search by keyword (q), optional multi-city scope — highest volume |
category | Whole category (rubric) across one or more cities via rubric_id + region_id |
byId | Full details for one or many 2GIS firm/branch IDs (batch) |
🚀 Quick start (3 steps)
- Pick a Mode — start with
searchand a keyword to build a lead list, orcategorywith arubric_id+region_idto sweep a whole vertical of a city. - Fill the fields that mode needs — the input form shows which apply (a
querykeyword, aregionIdcity, arubricIdcategory, or a batch ofids). - Run & export — download results as JSON, CSV, Excel, HTML, RSS or JSON Lines, or pull them via the Apify API.
Empty input works too — it returns Moscow restaurants so you can see real rows immediately.
📥 Input
Pick a mode, then fill only the fields that mode needs. Nothing is required.
Example — keyword search for restaurants in Moscow
{"mode": "search","query": "restaurant","regionId": "32","maxResults": 600}
Example — sweep an entire category (all restaurants in Moscow)
{"mode": "category","rubricId": "164","regionId": "32","maxResults": 2000}
Example — multi-city lead sweep (dentists in 3 cities)
{"mode": "search","query": "dentist","regionIds": ["32", "2", "1"],"maxResults": 1500}
Example — batch details by 2GIS ID
{"mode": "byId","ids": ["70000001031659781", "70000001006481143"]}
| Field | Type | Default | Used by | Description |
|---|---|---|---|---|
mode | string (select) | search | all | search, category or byId. |
query | string | кафе | search | Free-text business keyword (a type or brand). |
regionId | string | — | search, category | 2GIS region/city ID, e.g. 32 = Moscow. |
regionIds | array | [] | search, category | Many region IDs to sweep several cities in one run. |
rubricId | string | 164 | category | 2GIS category (rubric) ID, e.g. 164 = Restaurants. |
rubricIds | array | [] | category | Many rubric IDs to sweep several categories. |
id | string | — | byId | A single 2GIS firm/branch ID. |
ids | array | [] | byId | Batch of 2GIS firm/branch IDs. |
maxResults | integer | 200 | all | Row cap across the whole run; drives pagination. |
proxyConfiguration | object | Apify Proxy (auto) | all | Proxy settings; default works well. |
Finding region and rubric IDs
- Region (city) ID appears in a city's 2gis.ru URL and in the
regionIdyou pass. Common ones:32Moscow ·2Saint Petersburg ·1Novosibirsk ·4Yekaterinburg ·54Kazan. - Rubric (category) ID: the easiest way is to run a
searchfirst and read thecategoriesfield on the results, or copy the ID from a 2gis.ru category URL. Common ones:164Restaurants ·161Cafes ·165Bars ·271Pharmacies ·327Beauty salons.
📤 Output — what data you get
Results stream to the dataset; every item is a flattened business lead tagged with _mode and scrapedAt. Contacts are the headline value, so phones, emails and socials are all extracted.
Field reference
| Field | Type | Description |
|---|---|---|
id | string | 2GIS firm/branch ID. |
name | string | Business name. |
type | string | Object type (branch, building, admin, street…). |
categories | string | All 2GIS categories (rubrics), comma-joined. |
primaryCategory | string | The primary category only. |
address | string | Full street address (address_name). |
addressComment | string | Extra locator (floor, entrance…). |
postcode | string | Postal code. |
country | string | Country (from adm_div). |
region | string | Region / oblast (from adm_div). |
city | string | City (from adm_div). |
district | string | City district (from adm_div). |
lat | number | Latitude. |
lon | number | Longitude. |
phone | string | First / primary phone. |
phones | array | All phone numbers. |
website | string | Primary website. |
websites | array | All websites. |
email | string | First email. |
emails | array | All emails. |
vk | string | VKontakte URL. |
telegram | string | Telegram URL. |
instagram | string | Instagram URL. |
whatsapp | string | WhatsApp contact. |
facebook | string | Facebook URL. |
workingHours | string | Human-readable opening hours (e.g. Mon 09:00-22:00; Sat 10:00-23:00, or 24/7). |
is24x7 | boolean | Whether the business is open 24/7. |
scheduleStructured | object | Per-day working_hours[] ({from,to}) object. |
ratingValue | number | Average rating. |
reviewCount | number | Number of reviews. |
description | string | Short description, when present. |
orgId | string | Parent organization ID (chains). |
branchCount | number | Number of branches of the parent org. |
twogisUrl | string | Canonical https://2gis.ru/firm/<id> link. |
_mode | string | Which mode produced the row. |
scrapedAt | string | ISO-8601 timestamp. |
Output example
{"_mode": "category","rubricId": "164","regionId": "32","id": "70000001031659781","name": "Мясо&Рыба, ресторан","type": "branch","categories": "Рестораны, Доставка еды","primaryCategory": "Рестораны","address": "улица Архитектора Щусева, 4 к1","addressComment": "1 этаж","postcode": "115432","country": "Россия","region": "Москва","city": "Москва","district": "Даниловский","lat": 55.766672,"lon": 37.599969,"phone": "+74956409640","phones": ["+74956409640", "+79917271660"],"website": "delikateska.ru","websites": ["delikateska.ru", "dzen.ru"],"email": "mail@delikateska.ru","emails": ["mail@delikateska.ru"],"vk": "https://vk.com/delikateska","telegram": "https://t.me/delikateska_ru","instagram": null,"whatsapp": null,"facebook": null,"workingHours": "24/7","is24x7": true,"scheduleStructured": null,"ratingValue": 4.8,"reviewCount": 4130,"description": null,"orgId": "4504136499435533","branchCount": 11,"twogisUrl": "https://2gis.ru/firm/70000001031659781","scrapedAt": "2026-07-24T12:00:00.000Z"}
💡 Use cases
- B2B lead generation — build targeted lists of local businesses (restaurants, dentists, gyms, contractors…) with phones, emails and social channels ready for outreach or CRM import.
- Local SEO & citation building — audit a category across a city, check names/addresses/phones (NAP), find businesses with missing websites or hours.
- Market & competitor mapping — pull every competitor in a vertical per city, plot them by
lat/lon, compare ratings and review volume. - Sales territory planning — sweep multiple cities in one run and segment leads by district, category and rating.
- Data enrichment — feed your own business IDs into
byIdto attach fresh contacts, hours and ratings. - AI agents & RAG — wire the Actor as a tool so an LLM can answer "list top-rated pharmacies in Kazan with phone numbers" and return structured leads.
👥 Who uses it
Sales & lead-gen teams building outreach lists · local-SEO and marketing agencies · market researchers and analysts mapping verticals · data teams enriching a CRM · directory and aggregator builders · AI-agent developers wiring 2GIS as a data tool.
💰 Pricing
This Actor runs on a simple pay-per-result model — you pay for the leads you extract, with no separate Apify platform fees to calculate. It uses no browser (just HTTP against 2GIS's JSON API), so runs are quick and lightweight. Try it on the free tier first, then scale up. See the Pricing tab on this page for the current rate.
⚙️ How it works
The Actor calls 2GIS's own public Catalog API (catalog.api.2gis.com) — the same endpoint the 2gis.ru web map uses. That API needs a public "web API key", which the Actor mints itself at startup by reading the current webApiOutsourceKey from 2gis.ru (with a known-good built-in fallback), so you never supply a key. In search and category modes it paginates 50 results per page until it hits maxResults or the last page, looping every region (and rubric) you pass. Requests go through Apify Proxy (residential group) with a fresh IP per retry — the 2GIS API blocks datacenter IPs, so residential proxying is handled automatically for you. There is a ~4-minute time budget: on very large sweeps it pushes what it has collected and exits successfully rather than running forever.
🧭 Tips for best results
- Scope by city for cleaner leads. Pass a
regionId(e.g.32for Moscow) so results are one city; leave it empty only if you want the broadest possible match. - Use
categoryfor exhaustive coverage. Keyword search is great for a term;rubric_id+region_idreturns the entire vertical of a city (thousands of rows). - Sweep many cities in one run with
regionIds, and many verticals withrubricIds— the Actor loops the cross-product automatically. - Discover rubric IDs by running a quick
searchfirst and reading thecategoriesfield, then switch tocategorymode with that ID. - Raise
maxResultsto pull a whole city; keep it modest (100–500) for a fast, cheap sample. - Filter for leads with contacts after export by keeping rows where
phoneoremailis non-null. - Coordinates are real numbers (
lat/lon) — drop them straight into a map or geo join. - Chains share an
orgIdand exposebranchCount; de-dupe onorgIdif you only want one row per brand. - Localized text: 2GIS data is primarily Russian/CIS; names and categories come back in the local language.
- Re-run on a schedule to keep phones, hours and ratings fresh.
🔌 Integrations
Push 2GIS leads anywhere Apify connects:
- Google Sheets — export the dataset straight into a sheet for the sales team.
- Slack — notify a channel when a new sweep finishes.
- Zapier / Make / n8n — trigger workflows on new items (add to CRM, enrich, email).
- Webhooks — POST results to your own endpoint on run completion.
- Schedules — refresh a city/category dataset daily or weekly.
- Apify API & clients — pull items on demand from your stack (see below).
🧑💻 API usage
Run the Actor and fetch results from your own code. Get your token from Apify Console → Settings → Integrations.
cURL
curl -X POST "https://api.apify.com/v2/acts/logiover~2gis-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"category","rubricId":"164","regionId":"32","maxResults":500}'
Node.js (Apify client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('logiover/2gis-scraper').call({mode: 'search',query: 'restaurant',regionId: '32',maxResults: 600,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length, 'leads');
Python (Apify client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("logiover/2gis-scraper").call(run_input={"mode": "category","rubricId": "164","regionId": "32","maxResults": 500,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item.get("phone"))
🤖 Use with AI agents (MCP)
This Actor works as a tool for LLM agents via the Apify MCP server, so an assistant can fetch live 2GIS leads on demand. Point your MCP client at Apify, expose logiover/2gis-scraper, and prompt naturally — e.g. "Get me 100 top-rated coffee shops in Saint Petersburg (region 2) with phone numbers and websites, as a table." The agent runs the Actor and reads the structured dataset back.
❓ Frequently Asked Questions
Do I need a 2GIS API key or account?
No. This is an unofficial 2GIS scraper that reads publicly available data through 2GIS's own Catalog API. The Actor mints the required public web key itself (with a built-in fallback), so you only need an Apify account — no 2GIS key, no login, no cookies.
Is this a 2GIS API or a 2GIS API alternative?
Both, effectively. It works as an unofficial 2GIS API and a practical 2GIS data-export alternative: send structured input (keyword, category, IDs), get structured JSON back with contacts, geo, ratings and hours — without applying for 2GIS's official developer API.
How do I scrape 2GIS phone numbers and emails?
Every row includes phone (first) and phones[] (all), plus email and emails[] when the business publishes them. Use search with a keyword or category with a rubric ID, then filter exported rows to those with a non-empty phone or email.
Which cities and countries does it cover?
2GIS covers Russia and several CIS/other markets (e.g. Kazakhstan, Kyrgyzstan, the UAE, and more). Scope any city with its regionId (e.g. 32 Moscow, 2 Saint Petersburg), or sweep several at once with regionIds.
How do I find a region ID or a rubric (category) ID?
A region ID appears in a city's 2gis.ru URL. For a rubric ID, run a quick search first and read the categories field on the results, or copy the ID from a 2gis.ru category URL. Common rubrics: 164 restaurants, 161 cafes, 271 pharmacies.
How many businesses can one run return?
A single city category can hold thousands of businesses (e.g. 3,900+ restaurants in Moscow). The Actor paginates up to your maxResults, and with regionIds / rubricIds you can sweep many cities and verticals in one run.
Why are some fields empty (null)?
Not every business publishes every detail. A listing may have no email, no website, or no posted hours — those fields come back null while the rest of the row is fully populated. Contacts are extracted whenever 2GIS exposes them.
Can I get opening hours in a structured form?
Yes. workingHours is a readable string, is24x7 is a boolean, and scheduleStructured is a per-day object with {from,to} spans — use whichever fits your pipeline.
How do I export 2GIS data to CSV, JSON or Excel?
Run any mode and download the dataset as CSV, JSON, Excel (XLSX), HTML, RSS or JSON Lines from the run page, or pull it via the Apify API. This makes it a simple 2GIS data-export and business-directory tool.
How fast is it, and does it use a browser?
It uses no browser — just HTTP against 2GIS's JSON API (through residential proxies, which the 2GIS API requires) — so it's efficient. Large sweeps stop at a ~4-minute time budget and still return everything collected so far.
Is it legal to scrape 2GIS?
The Actor collects only publicly available business data served by 2GIS's own endpoints. You are responsible for using the data in compliance with 2GIS's terms of service, applicable privacy laws (e.g. for personal data) and any local regulations.
⚖️ Is it legal?
This Actor extracts only publicly available business information served by 2GIS's own public endpoints, and is intended for legitimate use such as lead generation, market research, local SEO and dataset-building. It does not bypass any login or access control. You are responsible for complying with 2GIS's terms of service, applicable data-protection/privacy laws when handling any personal data (for example, contacting individuals), and any other relevant local regulations.
🔗 Related scrapers by logiover
Building a local-business or lead-gen dataset? Pair 2GIS with the rest of the suite:
| Actor | What it does |
|---|---|
| B2B Lead Scraper | Sector + country B2B leads (company, person, email) from open map data |
| LinkedIn Company Scraper | Company profiles & firmographics, no login |
| Meta Ad Library Scraper | Advertiser ads, spend and impressions |
| Company Registry Scrapers | Official company registries across many countries |
👉 Browse all logiover scrapers on Apify Store — 180+ actors across real estate, jobs, crypto, social media & B2B data.
📝 Changelog
2026-07-24
- 🎉 Initial release: three 2GIS modes (keyword search, whole-category sweep, batch details) over 2GIS's public Catalog API — keyless with automatic web-key refresh, multi-city/multi-category batch, full contact extraction (phones + emails + VK/Telegram/Instagram/WhatsApp), clean split address (country/region/city/district), coordinates, ratings, review counts and opening hours. Three dataset views: Overview, Leads and Location.