2GIS Search Scraper
Under maintenancePricing
from $1.99 / 1,000 search results
2GIS Search Scraper
Under maintenanceScrape public 2GIS search pages for business names, addresses, categories, ratings, working hours, and geographic coordinates.
Pricing
from $1.99 / 1,000 search results
Rating
0.0
(0)
Developer
Search API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Search public 2GIS results by the values a user would enter on the website and save a deduplicated, richly normalized business dataset.
What does this Actor do?
The Actor searches public 2GIS pages for business names, categories, services, and locations. It follows result pagination, merges duplicate businesses found by different searches or pages, and can enrich each result from the public Contacts, Info, Reviews, Photos, and Menu views.
It prefers structured JSON or server-rendered HTML when available and uses stable DOM text and links as a fallback. It never requires a result-page URL for normal searches, although public 2GIS search URLs are supported for advanced workflows.
Why use this Actor?
Use it when a plain list of names is not enough. Each record keeps source-backed contact, location, category, rating, hours, public web links, review, gallery, menu, and provenance fields in one stable contract. Multiple queries and start URLs can be combined into one dataset without duplicate businesses.
What data does it return?
Optional fields are omitted when 2GIS does not publicly expose them. The stable identity and provenance fields are always present on a valid record.
| Field | Type | Description |
|---|---|---|
id | string | Stable normalized 2GIS business identifier. |
businessId | string | Business identifier when exposed separately by 2GIS. |
name | string | Public business name. |
address | string | Public listing address, assembled from the listing's own address block. |
buildingName | string | Public building name shown with the business address. |
streetAddress | string | Street and building label linked from the 2GIS address card. |
floor | string | Public floor, level, suite, or unit label when shown. |
addressArea | string | Neighborhood and administrative area line from the address card. |
poBox | string | Public post office box number when shown. |
city | string | Parsed city or region, when available. |
categories | string[] | Public 2GIS categories. |
matchedQueries | string[] | Searches that discovered the business. |
matchedQueryIndexes | integer[] | Zero-based source indexes that discovered it. |
matchedPages | object[] | Source page and query index pairs where it appeared. |
rating | number | Public rating from 0 to 5. |
ratingCount | integer | Public rating count. |
reviewCount | integer | Public review count. |
latitude | number | Public latitude. |
longitude | number | Public longitude. |
phoneNumbers | string[] | Public phone numbers. |
workingHours | object | Day-to-hours mapping. |
workingHoursText | string | Original public hours or opening-state text, including lunch-break notices. |
openingStatus | string | Public open, closed, working, or time-to-change status. |
websiteUrl | string | Sanitized public external website URL. |
socialLinks | object[] | Public social platform and URL pairs. |
branchesUrl | string | Public 2GIS branches URL. |
branchCount | integer | Number of public branches when exposed. |
routeUrl | string | Public 2GIS route URL. |
description | string | Public page description from Open Graph or standard page metadata; it may be a 2GIS-generated summary. |
averageBill | number | Public average bill value when exposed. |
currency | string | Currency associated with the average bill. |
seatingCapacity | integer | Public seating capacity when exposed. |
cuisineTypes | string[] | Public cuisine types. |
features | string[] | Public venue features. |
attributes | string[] | Other public attributes. |
assortment | string[] | Public assortment or product group labels. |
services | string[] | Public services. |
paymentMethods | string[] | Public payment methods. |
serviceLanguages | string[] | Public service languages. |
accessibility | string[] | Public accessibility information. |
categoryLinks | object[] | Public related category names and URLs. |
parkingOptions | object[] | Public parking type and space information. |
landmarks | object[] | Public nearby landmark names, distances, and URLs. |
relatedSearches | object[] | Public related search labels and URLs. |
similarBusinesses | object[] | Public related business names, categories, listing URLs, and visible summary fields. |
reviewSummary | object | Public review total and review-page URL. |
reviewSnippets | object[] | Bounded public review text, rating, displayed reviewer name and review count, date, confirmation, visits, and useful count when visible. Profile identifiers and URLs are omitted. |
photoCount | integer | Public gallery photo count. |
photoCategories | object | Public gallery category counts. |
photoUrls | string[] | Bounded stable public 2GIS photo URLs. |
menuAvailable | boolean | Whether public menu photos are available; false when the Menu view shows its empty-menu prompt. |
menuPhotoCount | integer | Public menu-photo count. |
listingUrl | string | Canonical public 2GIS listing URL. |
query | string | Source query associated with the output position. |
queryIndex | integer | Zero-based source query or start-URL index. |
page | integer | Result page associated with the output position. |
sourceRank | integer | Stable first-discovery rank before final sorting. |
position | integer | One-based final dataset position. |
detailsFetched | boolean | Whether the public Contacts detail page completed. |
source | string | Source label, currently 2GIS. |
scrapedAt | string | ISO-8601 scrape timestamp. |
How to scrape 2GIS
- Enter a
query, or enter several values inqueries. - Optionally set
city, filters, sorting, pagination, and enrichment limits. - Run the Actor and inspect the default dataset and the
OUTPUTrun summary. - Download or integrate the normalized records through the Apify API.
Minimal input
{"query": "restaurant","city": "Dubai","maxItems": 25,"maxPages": 2}
Filtered and sorted input
{"query": "restaurant","city": "Dubai","sortBy": "ratingDesc","minRating": 4,"minReviewCount": 10,"requireWebsite": true,"maxItems": 50,"maxPages": 3,"includeDetails": true,"includeReviews": true,"maxReviews": 3}
Multiple searches and a starting page
{"queries": ["restaurant", "coffee"],"startUrls": [{ "url": "https://2gis.ae/dubai/search/bakery/page/2" }],"maxItems": 100,"maxPages": 2,"sortBy": "nameAsc"}
The startUrls format is an array of objects with a required url, matching the Apify requestListSources editor. Only public HTTPS 2GIS search URLs on supported 2GIS domains are accepted.
Input
Search fields are query, queries, city, and startUrls. Limits are maxItems and maxPages. Ordering supports relevance, ratingDesc, ratingAsc, reviewCountDesc, reviewCountAsc, photoCountDesc, averageBillAsc, averageBillDesc, nameAsc, and nameDesc.
Available filters are includeKeywords, excludeKeywords, includeCategories, excludeCategories, minRating, maxRating, minReviewCount, minPhotoCount, minAverageBill, maxAverageBill, onlyOpenNow, requireWebsite, requirePhone, requirePhotos, requireMenu, and requireCoordinates.
Enrichment controls are includeDetails, includeInfo, includeReviews, includePhotos, includeMenu, maxReviews, and maxPhotos. Detail-dependent filters and sorts automatically enable the minimum required public detail pages.
Developer options are grouped in the input UI: maxConcurrency (1–8), maxRequestRetries (0–10), requestTimeoutSecs (5–120), requestDelayMs (0–10000), and datasetBatchSize (1–100). requestDelayMillis remains available as a compatibility alias for existing saved JSON inputs.
proxyConfiguration supports the Apify proxy editor, including authorized Apify Proxy or custom HTTP(S) proxy URLs. Direct requests are the default. Proxy credentials are never written to logs or records.
Chrome observation sample (not Actor output)
On 2026-09-23, the visible Chrome page 2GIS Dubai restaurant search was opened from the Actor's public URL https://2gis.com/search/restaurant and loaded without a challenge. It showed about 15,600 places and pagination through page 7. The following is a partial transcription of visible card fields. It documents the browser observation only; it is not an Actor run, dataset record, or extraction result.
[{"name": "HuQQabaz Garden","businessId": "70000001055853809","rating": 4.6,"ratingCount": 23,"address": "Mall of the Emirates / Sheikh Zayed Road / Al Barsha 1 / Dubai","branchCount": 4,"averageBill": 200,"currency": "AED","cuisineTypes": ["Turkish and Mediterranean cuisine"],"services": ["Delivery"]},{"name": "Reef Zam Zam","categories": ["Kebab"],"branchCount": 12,"averageBill": 50,"currency": "AED","cuisineTypes": ["Arabic cuisine"],"services": ["Delivery"],"workingHoursText": "Closes for lunch break in 13 minutes","openingStatus": "Closes for lunch break in 13 minutes"}]
Output
The Actor pushes only normalized records that match the dataset schema. Records are deduplicated by stable business ID, and matchedQueries, matchedQueryIndexes, and matchedPages preserve all known discovery provenance. Filters are evaluated after enrichment; non-relevance sorts are applied across the bounded combined candidate set before maxItems is enforced.
Example record:
For a complete record captured from a public 2GIS listing, see examples/sample-record.json.
{"id": "70000001092852304","businessId": "70000001092852304","name": "Example Cafe","address": "1 Example Street","city": "Dubai","categories": ["Cafe", "Restaurant"],"matchedQueries": ["restaurant"],"matchedQueryIndexes": [0],"matchedPages": [{ "queryIndex": 0, "page": 1 }],"rating": 4.6,"ratingCount": 120,"reviewCount": 35,"latitude": 25.2048,"longitude": 55.2708,"phoneNumbers": ["+971 4 000 0000"],"workingHours": { "Monday": "09:00–23:00" },"openingStatus": "Open","websiteUrl": "https://example.com","cuisineTypes": ["International"],"features": ["Outdoor seating"],"services": ["Takeaway"],"paymentMethods": ["Cards"],"photoCount": 12,"photoUrls": ["https://i8.photo.2gis.com/images/branch/0/30258560077210013_7def.jpg"],"menuAvailable": true,"menuPhotoCount": 2,"listingUrl": "https://2gis.ae/dubai/firm/70000001092852304","query": "restaurant","queryIndex": 0,"page": 1,"sourceRank": 1,"position": 1,"detailsFetched": true,"source": "2GIS","scrapedAt": "2026-09-05T12:00:00.000Z"}
The Actor also writes a bounded OUTPUT key-value-store record containing status, item counts, pages, detail requests, filters, sorting, proxy use, dataset batches, and per-source stop reasons. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Pagination, filtering, and sorting
Each query and each start URL receives its own maxPages budget. A supplied /page/N URL continues at page N. Pagination stops on an empty result page, a reliable missing next-page link, the per-source page limit, or—when using default relevance without filters—the global maxItems limit. With filters or a non-relevance sort, the Actor continues through the bounded page set so the global filtered/sorted result is meaningful.
Search sources run concurrently up to maxConcurrency; pages within one source remain sequential. Detail views run in bounded concurrent workers. Dataset writes use datasetBatchSize and never exceed the global maxItems limit after deduplication and filtering.
How much does it cost?
Apify compute and proxy usage depend on the number of search pages, detail views, retries, and concurrency. Set includeDetails, maxPages, maxItems, maxReviews, and maxPhotos to control work. Direct requests are used unless an authorized proxy is selected.
Limitations and responsible use
Only publicly accessible 2GIS information is collected. The Actor does not log in, access private reviews, or bypass CAPTCHA or access controls. It retains only reviewer display names and review counts already shown publicly on the review card, and omits profile identifiers and URLs. Client-rendered gallery and menu content can be unavailable to the public HTTP response; those fields are omitted instead of guessed. A temporary block or changed website response is reported in OUTPUT and does not produce fabricated records.
Respect 2GIS terms, applicable law, robots and rate limits, and the rights of businesses and individuals. Use collected data for lawful purposes and avoid treating scraped information as verified business advice.
FAQ
Why is a rich field missing?
The field was not exposed in the public response for that business or view, or the value failed normalization. Optional fields are omitted so the dataset stays type-safe.
Why is my dataset empty?
Check OUTPUT for no-results, blocked, or failed. Filters intentionally reject records with missing values when a minimum or required field was requested. Start with a simple query and no filters, then add constraints gradually.
Can I reuse a saved input JSON file?
Yes. The repository includes working examples in qa-inputs/, and requestDelayMillis remains supported for older saved inputs. The Actor validates input bounds before network work begins.
Where do I see failures?
Open the OUTPUT key-value-store record. It contains bounded counts and per-source stop reasons without storing authorization headers, cookies, proxy credentials, signed URLs, or raw response bodies.
Support
For a reproducible issue, include the sanitized input shape, Actor run ID, OUTPUT summary, and the affected public 2GIS region/query. Do not include API tokens, cookies, proxy credentials, or private account data. This Actor is an independent tool and is not affiliated with 2GIS.