2GIS at a glance
2GIS is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes record type, id, full id, name and full name, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Automation, Real Estate
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 39 options
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.
What 2GIS $1💰 Extract Phones, Emails, Reviews & Locations can do
- 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.
Choose what to collect
These inputs let you configure 2GIS $1💰 Extract Phones, Emails, Reviews & Locations. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | search = find places by query, category, city, coordinates, or map area (any combination). url = scrape specific 2GIS links or IDs. |
queryarray | WHAT to find, as free text, for example coffee shop, dentist, hotel. Each query runs separately. Optional: leave empty (and no categories) to return every place in the chosen area. |
categoryQueryarray | WHAT to find, as category names, for example Restaurants, Pharmacies, Car repair. Each is matched against the 2GIS category tree and runs separately. Optional, and combine freely with queries. |
latitudestring | Search around a center point. Latitude, for example 55.7558. Provide together with longitude. Overrides city. |
longitudestring | Center longitude, for example 37.6173. Provide together with latitude. |
radiusMetersinteger | Search radius around the center point, in meters. Max 40000. Only used when latitude and longitude are set. |
bboxstring | Rectangle: lon1,lat1,lon2,lat2 (south-west corner then north-east corner), for example 37.55,55.70,37.70,55.80. Overrides city and coordinates. |
Show 32 more inputs
| Input | What it controls |
|---|---|
urlsarray | Paste 2GIS links: place pages (/firm/ID), searches (/search/query), buildings (/inside/ID), short links (go.2gis.com), or raw numeric firm IDs. Multiple supported. Left untouched, it scrapes one example of each shape. Used only when mode = url. |
citystring | Where to look, by city name, for example Moscow, Москва, Almaty, Dubai. Ignored if you provide coordinates or a map area. |
languagestring | Response language for names and content. For a city or link on another 2GIS country site (for example 2gis.ae or 2gis.kz) the matching local locale is used automatically when this language is not offered there (Russian on 2gis.ae is served in English). |
sortBystring | Result ordering. Distance only applies when searching around coordinates; otherwise it falls back to relevance. Newest listings and Name use the 2GIS catalog sort in search mode. |
minRatingstring | Keep only places with rating at or above this value (0 to 5). Leave blank for no filter. |
minReviewsinteger | Keep only places with at least this many reviews. Leave blank for no filter. |
onlyWithPhoneboolean | Skip places that have no phone number. |
onlyWithWebsiteboolean | Skip places that have no website. |
skipAdsboolean | Skip advertising or promoted entries. |
rubricIdsarray | Exact 2GIS rubric (category) ids to search, one search per id. Use alongside or instead of Category names. |
onlyWithPhotosboolean | Search mode: ask 2GIS for places that have photos. |
onlyWithGoodsboolean | Search mode: ask 2GIS for places that list goods or a menu. |
openNowboolean | Search mode: ask 2GIS for places open at run time. |
maxReviewsinteger | How many reviews to fetch per place. 0 = do not fetch reviews. Reviews are pushed as separate records. Fetching reviews adds an extra request per place. |
reviewsSortstring | Order of fetched reviews. |
reviewsProviderstring | Which review source to keep: all, 2GIS only, or Flamp only. |
reviewsRatingstring | Keep all reviews, only positive (4 to 5 stars), or only negative (1 to 3 stars). |
reviewsMinRatingstring | Keep only reviews at or above this star rating (1 to 5). Leave blank for no limit. |
reviewsWithAnswerboolean | Keep only reviews that have an official reply from the place. |
reviewsStartDatestring | Keep only reviews created on or after this date (YYYY-MM-DD). Leave blank for no limit. |
reviewsKeywordstring | Keep only reviews whose text contains this word or phrase. Leave blank for no filter. |
includePhotosboolean | Include photo URLs available in the place record. |
maxResultsinteger | Maximum total places across all queries / URLs. 0 = unlimited (capped at the 2GIS per-query ceiling of about 3000). |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of places without returning or charging for places already collected there. Use this after an interrupted run, or when continuing a large pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching places (and their reviews) as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED places and reviews. COMPARED: every output field of a place (name, address, rating, review count, hours, phone, website, photos, attributes, categories and so on) and every field of a review (rating, text, dates, likes, owner answer, photos). EXCLUDED on places (they change on every fetch, or are derived or re-sent copies of compared fields): fullId, contactsRaw, adsRaw, scrapedAt, pageNumber, searchUrl, searchRubricId, searchRubricLabel, createdAt, updatedAt, mainPhotoUrl, brand, attributeGroups, scheduleSpecial, phoneText, phoneValue; they are still returned in the output. Use "Ignore fields when detecting changes" to exclude more. Places and reviews are tracked separately, so a place with a brand-new review is not itself reported as UPDATED. Turn on "Emit unchanged" or "Emit expired" only when you also want those rows returned (and billed). State is kept separately for each search/category/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/category/URL and filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return places and reviews that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return places that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max places capped it or when Resume was used. Reviews do not have an EXPIRED state: review fetching is limited by Max reviews per place and the review filters, so an absent review is not reliable evidence it was deleted. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must NOT count as a change when incremental mode compares a place or review with the previous run, for example photos or rating. A name matches that field at any depth (a plain name also matches inside nested lists and objects); use dotted paths such as address.city for one specific nested field. Ignored fields are still returned in the output, they just never make a row UPDATED or appear in changedFields. Changing this list does not mark everything as UPDATED. Always ignored already on places: fullId, contactsRaw, adsRaw, scrapedAt, pageNumber, searchUrl, searchRubricId, searchRubricLabel, createdAt, updatedAt, mainPhotoUrl, brand, attributeGroups, scheduleSpecial, phoneText, phoneValue. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordTypeRecord Type (text)idID (text)fullIdFull ID (text)nameName (text)fullNameFull Name (text)shortNameShort Name (text)nameExtensionName Extension (text)urlURL (link)typeType (text)subtypeSubtype (text)purposePurpose (text)descriptionDescription (text)Show 115 more fields
rubricsCategories (array)rubricIdsCategory IDs (array)primaryRubricPrimary Category (text)ratingRating (number)reviewCountReviews (number)ratingCountRating Count (number)isReviewableIs Reviewable (boolean)orgRatingOrganization Rating (number)orgReviewCountOrganization Review Count (number)flampRatingFlamp Rating (number)flampReviewCountFlamp Review Count (number)addressAddress (text)fullAddressFull Address (text)addressCommentAddress Comment (text)postcodePostcode (text)buildingIdBuilding ID (text)countryCountry (text)regionRegion (text)cityCity (text)districtDistrict (text)livingAreaLiving Area (text)streetStreet (text)houseNumberHouse Number (text)latitudeLat (number)longitudeLon (number)timezoneOffsetTimezone Offset (number)nearestStationsNearest Stations (array)buildingNameBuilding Name (text)floorCountFloor Count (number)undergroundFloorsUnderground Floors (number)orgIdOrganization ID (text)orgNameOrganization Name (text)orgBranchCountOrganization Branch Count (number)isPromotedIs Promoted (boolean)isAdvertisedIs Advertised (boolean)isClosedIs Closed (boolean)badgesBadges (array)hasPhotosHas Photos (boolean)adTextAd Text (text)adDisclaimerAd Disclaimer (text)photosPhotos (array)photoCountPhoto Count (number)attributesAttributes (array)attributesByTagAttributes by Tag (object)is24x7Open 24/7 (boolean)hoursHours (object)hoursTextHours Text (text)scheduleCommentSchedule Comment (text)searchQuerySearch Query (text)contactsRawRaw Contacts (array)admDivRawRaw Admin Divisions (array)adsRawRaw Ads (object)linksRawRaw Links (object)phonePhone (text)phonesAll Phones (array)emailEmail (text)emailsAll Emails (array)websiteWebsite (link)websitesAll Websites (array)faxFax (text)socialsSocial Networks (object)whatsappWhatsApp (text)telegramTelegram (text)instagramInstagram (text)vkVK (text)okOK.ru (text)facebookFacebook (text)viberViber (text)youtubeYouTube (text)twitterTwitter (text)skypeSkype (text)tiktokTikTok (text)maxMax (text)pinterestPinterest (text)icqICQ (text)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)createdAtCreated At (text)updatedAtUpdated At (text)mainPhotoUrlMain Photo (image)brandBrand (object)attributeGroupsAttribute Groups (array)scheduleSpecialSpecial Hours (array)phoneTextPhone Text (text)phoneValuePhone Value (text)searchRubricIdSearch Category ID (text)searchRubricLabelSearch Category (text)searchUrlSearch URL (link)pageNumberPage Number (number)scrapedAtScraped At (text)reviewIdReview ID (text)placeIdPlace ID (text)placeNamePlace (text)textReview (text)dateCreatedDate Created (text)dateEditedDate Edited (text)reviewUrlReview URL (link)authorNameAuthor (text)authorIdAuthor ID (text)authorPublicIdAuthor Public ID (text)authorUrlAuthor URL (link)authorPhotoUrlAuthor Photo (image)authorReviewsCountAuthor Reviews Count (number)likesCountLikes (number)commentsCountComments (number)isVerifiedIs Verified (boolean)isHiddenIs Hidden (boolean)hasOfficialAnswerHas Official Answer (boolean)providerSource (text)sourceData Source (text)officialAnswerTextOfficial answer (text)officialAnswerDateOfficial Answer Date (text)officialAnswerOrgOfficial Answer Org (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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": "Европейская кухня"
}
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does 2GIS return?
The documented output for 2GIS includes record type, id, full id, name, full name, short name, name extension and url. Availability of each field depends on the source page and the selected mode.
How much does 2GIS cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
