2GIS Search Scraper avatar

2GIS Search Scraper

Under maintenance

Pricing

from $1.99 / 1,000 search results

Go to Apify Store
2GIS Search Scraper

2GIS Search Scraper

Under maintenance

Scrape 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

Search API

Maintained by Community

Actor 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.

FieldTypeDescription
idstringStable normalized 2GIS business identifier.
businessIdstringBusiness identifier when exposed separately by 2GIS.
namestringPublic business name.
addressstringPublic listing address, assembled from the listing's own address block.
buildingNamestringPublic building name shown with the business address.
streetAddressstringStreet and building label linked from the 2GIS address card.
floorstringPublic floor, level, suite, or unit label when shown.
addressAreastringNeighborhood and administrative area line from the address card.
poBoxstringPublic post office box number when shown.
citystringParsed city or region, when available.
categoriesstring[]Public 2GIS categories.
matchedQueriesstring[]Searches that discovered the business.
matchedQueryIndexesinteger[]Zero-based source indexes that discovered it.
matchedPagesobject[]Source page and query index pairs where it appeared.
ratingnumberPublic rating from 0 to 5.
ratingCountintegerPublic rating count.
reviewCountintegerPublic review count.
latitudenumberPublic latitude.
longitudenumberPublic longitude.
phoneNumbersstring[]Public phone numbers.
workingHoursobjectDay-to-hours mapping.
workingHoursTextstringOriginal public hours or opening-state text, including lunch-break notices.
openingStatusstringPublic open, closed, working, or time-to-change status.
websiteUrlstringSanitized public external website URL.
socialLinksobject[]Public social platform and URL pairs.
branchesUrlstringPublic 2GIS branches URL.
branchCountintegerNumber of public branches when exposed.
routeUrlstringPublic 2GIS route URL.
descriptionstringPublic page description from Open Graph or standard page metadata; it may be a 2GIS-generated summary.
averageBillnumberPublic average bill value when exposed.
currencystringCurrency associated with the average bill.
seatingCapacityintegerPublic seating capacity when exposed.
cuisineTypesstring[]Public cuisine types.
featuresstring[]Public venue features.
attributesstring[]Other public attributes.
assortmentstring[]Public assortment or product group labels.
servicesstring[]Public services.
paymentMethodsstring[]Public payment methods.
serviceLanguagesstring[]Public service languages.
accessibilitystring[]Public accessibility information.
categoryLinksobject[]Public related category names and URLs.
parkingOptionsobject[]Public parking type and space information.
landmarksobject[]Public nearby landmark names, distances, and URLs.
relatedSearchesobject[]Public related search labels and URLs.
similarBusinessesobject[]Public related business names, categories, listing URLs, and visible summary fields.
reviewSummaryobjectPublic review total and review-page URL.
reviewSnippetsobject[]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.
photoCountintegerPublic gallery photo count.
photoCategoriesobjectPublic gallery category counts.
photoUrlsstring[]Bounded stable public 2GIS photo URLs.
menuAvailablebooleanWhether public menu photos are available; false when the Menu view shows its empty-menu prompt.
menuPhotoCountintegerPublic menu-photo count.
listingUrlstringCanonical public 2GIS listing URL.
querystringSource query associated with the output position.
queryIndexintegerZero-based source query or start-URL index.
pageintegerResult page associated with the output position.
sourceRankintegerStable first-discovery rank before final sorting.
positionintegerOne-based final dataset position.
detailsFetchedbooleanWhether the public Contacts detail page completed.
sourcestringSource label, currently 2GIS.
scrapedAtstringISO-8601 scrape timestamp.

How to scrape 2GIS

  1. Enter a query, or enter several values in queries.
  2. Optionally set city, filters, sorting, pagination, and enrichment limits.
  3. Run the Actor and inspect the default dataset and the OUTPUT run summary.
  4. 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.