2GIS Places Scraper
Pricing
Pay per event
2GIS Places Scraper
Scrape 2GIS (2gis.ru, .kz, .ae) local business search by city and query. Get name, category, address, coordinates, rating, review count, opening hours, plus optional phone, website and e-mail for every place.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
🎯 What this scrapes
2GIS search results by city and query: cafes, pharmacies, salons, clinics, shops and every other category 2GIS lists, in Moscow, Saint Petersburg, Almaty, Dubai and every other 2GIS city. Each place becomes one dataset row with its 2GIS id, name, primary and additional categories, street address, building, district, numeric latitude and longitude, 2GIS rating and review count, opening hours per weekday, last-updated date, and a direct 2GIS link. Switch on includeContacts to add business phones, website and e-mail from each place's own page.
🔥 Features
- 🛡️ We rotate browser fingerprints (curl-cffi impersonation — Chrome / Firefox / Safari) so the target sees real-browser TLS, not Python.
- 🔁 We retry with exponential backoff on
408 / 429 / 5xxand honourRetry-After. Up to 5 attempts per page. - 🌐 We route through Apify Proxy and rotate the exit on every failed attempt. Pin an exit country with
proxyCountryCodewhen you need one. - 🗺️ We fan out for you. Give a list of cities and a list of queries and we run every combination.
- 🧱 We dedupe by place id across every page, query and city in a run, so overlapping searches never double-count or double-bill.
- 📞 We enrich on request.
includeContactsopens each place page and adds phones, website and e-mail. - 🧊 Pydantic-validated rows — clean, typed, stable field names, ISO-8601 timestamps. One failing page or place never kills the run.
- 💰 You pay only for results that land. No data → no charge (only the small
actor-startwarm-up fee).
💡 Use cases
- Lead lists of local businesses by category and city
- Location analytics and competitor mapping for retail, food and healthcare chains
- Feeding directories, delivery and travel products with fresh place data
- Tracking rating and review growth on chains and individual venues
⚙️ How to use it
- Open the Actor input form on the Apify Console.
- Add one or more
cities(the slug in the 2GIS address, for examplemoscow,spb,almaty,dubai). - Add one or more
queriesin the local language, for exampleкафеorаптека. - Tune
maxItemsPerQuery,maxPagesand the run-widemaxResults, then click Start. Results stream into the default dataset as JSON, CSV, Excel, or XML.
{"cities": ["moscow", "spb"],"queries": ["кафе", "аптека"],"maxItemsPerQuery": 60,"maxPages": 5,"includeContacts": false,"proxyConfiguration": { "useApifyProxy": true }}
📥 Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
cities | string[] | no | ["moscow"] | 2GIS city slugs. Every query runs in every city. |
queries | string[] | no | ["кафе"] | Search queries in the local language. |
maxItemsPerQuery | integer | no | 60 | Cap on places per city and query (max 60). |
maxPages | integer | no | 5 | Result pages per city and query, 12 places each (max 5). |
maxResults | integer | no | 1000 | Hard cap on total deduplicated rows across the run. |
includeContacts | boolean | no | false | Add phone, website and e-mail from each place page. |
proxyConfiguration | object | no | Apify Proxy | Apify Proxy configuration. |
proxyCountryCode | string | no | any | Two-letter proxy exit country, e.g. RU, KZ, AE. |
📤 Output
One row per deduplicated place:
{"placeId": "70000001007179642","name": "Му-Му, кафе","organizationId": "4504136498368318","category": "Кафе","categories": ["Кафе", "Доставка еды", "Быстрое питание"],"address": "Манежная площадь, 1 ст2","buildingName": "Охотный ряд","city": "Москва","district": "Тверской","latitude": 55.755301,"longitude": 37.614586,"rating": 4.8,"reviewCount": 1107,"phone": "+74957818781","website": "http://cafemumu.ru","workingHours": { "Mon": "08:00-23:00", "Sun": "08:00-23:00" },"url": "https://2gis.ru/moscow/firm/70000001007179642","query": "кафе","searchCity": "moscow","scrapedAt": "2026-10-01T10:00:00+00:00"}
phone, phones, website and email are filled only when includeContacts is on and the business lists them.
💰 Pricing
Pay-Per-Event (PPE) — you pay only for what you use:
| Event | Price (USD) | When |
|---|---|---|
actor-start | $0.20 | Once per run, at boot |
result-emitted | $0.003 | Per deduplicated place row written |
At scale that's roughly $3.00 per 1,000 results.
🚧 Limitations
- 60 places per city and query. 2GIS serves five result pages of 12 places for any single search. We detect the limit and stop cleanly instead of repeating page one. Use several specific queries (
кафе,пиццерия,кофейня) and more cities to cover more ground. - Queries work best in the local language of the city.
includeContactsopens one extra page per place, so runs are slower and use more proxy traffic.rating,reviewCountand opening hours are only present when 2GIS lists them.- A query with no exact matches finishes successfully with zero rows.
- Search-result rows only — no review text, menus or photos.
❓ FAQ
Do I need a 2GIS account or API key?
No. Add your cities and queries and start the run.
Why did I get fewer rows than maxResults?
Either each search reached 2GIS's 60-place limit, or it ran out of matching places. Add queries or cities for broader coverage. Places seen under an earlier search are not repeated.
Which cities are supported?
Use the slug from the 2GIS address of any city, such as moscow, spb, novosibirsk, almaty or dubai. Kazakhstan and UAE cities are served through the matching 2GIS country site automatically.
Are phone numbers personal data?
No. includeContacts only reads the business contacts a company publishes on its own 2GIS page.
💬 Your feedback
Found a bug or need a new field? Open an issue on the Actor's Apify Store page or contact the Devil Scrapes team at apify.com/DevilScrapes.