2GIS $1💰 Extract Phones, Emails, Reviews & Locations avatar

2GIS $1💰 Extract Phones, Emails, Reviews & Locations

Pricing

from $1.00 / 1,000 results

Go to Apify Store
2GIS $1💰 Extract Phones, Emails, Reviews & Locations

2GIS $1💰 Extract Phones, Emails, Reviews & Locations

From $1/1K. Extract business and place data from 2GIS.com at scale. Get names, addresses, phones, emails, websites, social links, opening hours, ratings, reviews, photos, coordinates, and 80+ fields per place. Supports all regions covered by 2GIS with fast, low-cost extraction.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

2

Bookmarked

38

Total users

10

Monthly active users

5 days ago

Last modified

Share

2GIS Places Scraper: Phones, Emails, Hours and Reviews

2GIS is a mapping and business directory service used across Russia, Kazakhstan, the United Arab Emirates, Saudi Arabia and more than a dozen other countries in the CIS, the Gulf and beyond, similar to Google Maps for places. This scraper turns 2GIS into a structured places API: names, addresses, phone numbers, emails, websites, social links, per day opening hours, ratings, reviews, photos, coordinates and 80+ fields per place. Search by keyword or category in a city, around coordinates, or inside a map area, or paste 2GIS links or IDs directly, then export to JSON, CSV or Excel, or read the results through the API.

Why This Scraper?

  • One flexible search. Combine a WHAT (a text query and/or a category) with a WHERE (a city, coordinates with a radius, or a map area bounding box) in a single mode, plus a separate mode for direct 2GIS links or IDs.
  • 80+ fields per place, with every contact channel split out individually: primary phone, all phones, email, website, WhatsApp, Telegram, Instagram, VK, Facebook and more.
  • Reviews on demand. Pull full review text, author, rating, date, source (2GIS or Flamp), photos and the official reply, filtered by rating, keyword, date or whether it has a reply.
  • Structured opening hours. All seven days, each with an explicit open or closed status, plus a ready to read summary string.
  • Wide coverage. Russia, Kazakhstan, Uzbekistan, Kyrgyzstan, Azerbaijan, Georgia, Armenia, the UAE, Saudi Arabia, Qatar, Kuwait, Czechia, Italy and every other region 2GIS covers.
  • Built for monitoring. Incremental mode classifies places and reviews as new, updated, unchanged or reappeared (and expired for places) on recurring runs, so a schedule returns only what changed.
  • Nothing dropped. The full upstream contact, attribute and administrative blocks are kept alongside the flat, ready to use fields.

Use Cases

  • Lead generation and sales prospecting: build contact lists of phones, emails and websites for a category across a city or region.
  • Local SEO and directory audits: check how a business appears on 2GIS, including hours, photos, rating and categories.
  • Competitive and market research: map every competitor in a category across a city, with ratings and review counts.
  • Reputation monitoring: pull all reviews for a set of places, including official replies, to track sentiment over time.
  • Data enrichment: attach verified addresses, coordinates and contact details to an existing list of businesses through URL mode.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
nameКофейня Сюрприз
rating4.6
reviewCount128
phone+74951234567
phones["+74951234567"]
emailinfo@example.com
websitehttp://example.com
whatsapphttps://wa.me/74951234567
telegramhttps://t.me/example
instagramhttps://instagram.com/example
vkhttps://vk.com/example
fullAddressМосква, Тверская улица, 5
cityМосква
latitude / longitude55.7558 / 37.6173
primaryRubricКофейни
rubrics["Кофейни", "Кафе"]
isPromotedfalse
is24x7false
hoursTextMon: 09:00-21:00; Tue: 09:00-21:00; ...; Sun: closed
photos["https://cdn.example.com/0000.jpg"]
orgNameSample Org

Review records (pushed to the same dataset when maxReviews is above zero, with recordType set to review) carry the review text, rating, author, dates, source, photos and the official reply, keyed to their place by placeId.

How to Use

  1. Pick a mode: search (combine a WHAT with a WHERE) or url (paste 2GIS links or IDs).
  2. In search mode, set a WHAT (query and/or categoryQuery) and a WHERE (city, or latitude/longitude with radiusMeters, or a bbox map area). Leave WHAT empty to pull every place in the area.
  3. Add filters (minimum rating, phone or website required, skip promoted entries), and set maxReviews above zero to also fetch reviews.
  4. Set Max places to control run size and cost, then click Start. Download the dataset as JSON, CSV or Excel, or read it through the API.

By text query in a city:

{
"mode": "search",
"query": ["кофейня"],
"city": "Москва",
"maxResults": 200
}

By category around coordinates:

{
"mode": "search",
"query": [],
"categoryQuery": ["Рестораны"],
"latitude": "55.7558",
"longitude": "37.6173",
"radiusMeters": 1000,
"maxResults": 100
}

In a map area, with reviews:

{
"mode": "search",
"query": [],
"categoryQuery": ["Аптеки"],
"bbox": "37.55,55.70,37.70,55.80",
"maxReviews": 10
}

From 2GIS URLs or IDs:

{
"mode": "url",
"urls": [
"https://2gis.ru/moscow/firm/70000001063551091",
"https://2gis.ru/moscow/search/coffee",
"70000001063551091"
],
"maxReviews": 50
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/2gis-places-scraper").call(run_input={"mode": "search", "query": ["кофейня"], "city": "Москва"})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
print(place["name"], place["phone"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/2gis-places-scraper').call({ mode: 'search', query: ['кофейня'], city: 'Москва' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Result caps and the 2GIS ceiling

2GIS caps a single query near 3000 results. Max places is shared fairly across every query, category and URL job in the run. To collect more places for a city, split the search into several narrower queries, categories or map areas.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted crawl: paste its run or dataset id and this run skips places already collected there (their reviews are not re-fetched either), so you do not pay twice.
  • Incremental mode (incrementalMode) is for scheduling this actor on the same search again and again. The actor remembers the previous run itself, no run id to paste. The first run returns everything as NEW; later runs return only NEW, UPDATED and REAPPEARED places and reviews by default. Places and reviews are tracked separately, so a place getting a brand new review does not itself become UPDATED. Turn on emitUnchanged or emitExpired to also return (and be billed for) unchanged or vanished rows. stateKey names or shares a monitoring campaign; leave it blank and the actor derives one automatically from your search and filter setup.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (query / category / city / coordinates / map area) or url (2GIS links or IDs).
queryarray["кофейня"]WHAT to find, as free text. Each query runs separately. Optional.
categoryQueryarray[]WHAT to find, as category names matched against the 2GIS category tree. Optional, combines with query.
latitudestring(none)WHERE, center latitude. Set together with longitude. Overrides city.
longitudestring(none)WHERE, center longitude. Set together with latitude.
radiusMetersinteger1000Search radius in meters around the coordinates (max 40000).
bboxstring(none)WHERE, map area as lon1,lat1,lon2,lat2 (south west then north east). Overrides city and coordinates.
urlsarray(none)2GIS links (place, search, building, short link) or raw numeric IDs. Used only when mode is url.
citystringМоскваWHERE, by city name. Ignored if coordinates or bbox are set.
languagestringruResponse language for names and content.
sortBystringrelevancerelevance, rating, or distance (coordinates only, otherwise falls back to relevance).
minRatingstring(none)Keep only places with rating at or above this value (0 to 5).
minReviewsinteger(none)Keep only places with at least this many reviews.
onlyWithPhonebooleanfalseSkip places that have no phone number.
onlyWithWebsitebooleanfalseSkip places that have no website.
skipAdsbooleanfalseSkip advertising or promoted entries.
maxReviewsinteger0Reviews to fetch per place. 0 disables review fetching. Reviews are pushed as separate records.
reviewsSortstringdate_editedOrder of fetched reviews.
reviewsProviderstringallKeep all sources, 2GIS only, or Flamp only.
reviewsRatingstringallKeep all reviews, only positive (4 to 5 stars), or only negative (1 to 3 stars).
reviewsMinRatingstring(none)Keep only reviews at or above this star rating (1 to 5).
reviewsWithAnswerbooleanfalseKeep only reviews that have an official reply.
reviewsStartDatestring(none)Keep only reviews created on or after this date (YYYY-MM-DD).
reviewsKeywordstring(none)Keep only reviews whose text contains this word or phrase.
includePhotosbooleantrueInclude photo URLs available in the place record.
maxResultsinteger10Maximum total places across all queries and URLs, shared fairly across them. 0 means unlimited (capped at the 2GIS per query ceiling of about 3000).
proxyobjectApify Proxy (datacenter)Connection settings.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
resumeFromRunIdstring(none)Continue one interrupted crawl by run or dataset id.
incrementalModebooleanfalseRecurring monitoring: classify places and reviews as new, updated, unchanged, reappeared, or (places only) expired, against the actor's own remembered state.
stateKeystring(none)Name the incremental monitoring campaign. Auto derived from the search and filters when blank.
emitUnchangedbooleanfalseAlso return (and bill) unchanged places and reviews in incremental mode.
emitExpiredbooleanfalseAlso return (and bill) places no longer found, in incremental mode (expired rows appear only after a run scans the full search).

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"recordType": "place",
"id": "70000001063551091",
"name": "Кофейня Сюрприз",
"url": "https://2gis.ru/moscow/firm/70000001063551091",
"type": "branch",
"rating": 4.6,
"reviewCount": 128,
"primaryRubric": "Кофейни",
"rubrics": ["Кофейни", "Кафе"],
"phone": "+74951234567",
"phones": ["+74951234567"],
"email": "info@example.com",
"website": "http://example.com",
"whatsapp": "https://wa.me/74951234567",
"telegram": "https://t.me/example",
"instagram": "https://instagram.com/example",
"vk": "https://vk.com/example",
"fullAddress": "Москва, Тверская улица, 5",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"district": "Тверской",
"street": "Тверская улица",
"houseNumber": "5",
"postcode": "125009",
"latitude": 55.7558,
"longitude": 37.6173,
"is24x7": false,
"hoursText": "Mon: 09:00-21:00; Tue: 09:00-21:00; Wed: 09:00-21:00; Thu: 09:00-21:00; Fri: 09:00-21:00; Sat: 10:00-20:00; Sun: closed",
"photos": ["https://cdn.example.com/0000.jpg"],
"photoCount": 1,
"orgName": "Sample Org",
"isPromoted": false,
"attributesByTag": { "food_service_food_european": "Европейская кухня" }
}

Plan Requirement

The default proxy setting works out of the box, and the actor rotates the connection automatically when one is refused. For large or frequent runs, the residential proxy group gives more headroom and also rotates across nearby countries; pick it under Connection.

FAQ

How much does it cost?

You pay per record returned, plus an optional charge for a place whose review fetch actually returns at least one review row (a fetch that turns up nothing is not charged). The Pricing tab shows the current rates. Use Max places to cap the cost of any run.

This actor collects only publicly available places data. You are responsible for how you use it: follow 2GIS's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Reviews and photos are contributed by third parties and may carry their own rights.

Why is there no separate "category" or "coordinates" mode?

Search mode already covers all of it. WHERE precedence is a map area (bbox) beats coordinates (latitude/longitude) beats city, the more specific one wins and the others are ignored. WHAT is query and/or categoryQuery; leave both empty to pull every place found in the area.

Can I get only new or changed places on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared places and reviews by default, classified against the run before it, and unchanged rows are not billed unless you turn on Emit unchanged.

Why did my run fail instead of returning an empty dataset?

A run fails only in two situations: resumeFromRunId points to a run or dataset id that could not be read, or incrementalMode is combined with resumeFromRunId on a search that already has saved incremental state (remove one of the two, or use a different stateKey). Everything else, including a search or category that matches nothing, or review filters that keep zero reviews, finishes as a normal successful run with an empty or smaller dataset.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each place or review into Notion, Linear or Airtable.

🔗 Want more leads data?

Pair this actor with these related scrapers from the same team:

📇 Google Maps Scraper
Extract business data from Google Maps at scale. Get names, addresses, phone numbers...
📇 TrueLocal AU Directory Listings & Reviews Scraper
Scrape TrueLocal.com.au business listings by keyword, location, or URL. Extract names...
✈️ Naver Map Scraper
From $1/1K. Scrape Naver Map places by keyword or URL: names, categories, ratings...
📇 Yellow Pages NZ
From $0.8/1K. Scrapes business listings from Yellow.co.nz (New Zealand Yellow Pages)...
📇 Herold.at Scraper
From $0.80/1K. Scrape Herold.at business listings across Austria into clean JSON. Extract...
📇 BetaList Scraper
Scrape BetaList.com startup profiles with founder and contact enrichment. Extract startup...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.