2GIS Places Scraper avatar

2GIS Places Scraper

Pricing

Pay per event

Go to Apify Store
2GIS Places Scraper

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

DevilScrapes

Maintained by Community

Actor 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 / 5xx and honour Retry-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 proxyCountryCode when 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. includeContacts opens 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-start warm-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

  1. Open the Actor input form on the Apify Console.
  2. Add one or more cities (the slug in the 2GIS address, for example moscow, spb, almaty, dubai).
  3. Add one or more queries in the local language, for example кафе or аптека.
  4. Tune maxItemsPerQuery, maxPages and the run-wide maxResults, 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

FieldTypeRequiredDefaultDescription
citiesstring[]no["moscow"]2GIS city slugs. Every query runs in every city.
queriesstring[]no["кафе"]Search queries in the local language.
maxItemsPerQueryintegerno60Cap on places per city and query (max 60).
maxPagesintegerno5Result pages per city and query, 12 places each (max 5).
maxResultsintegerno1000Hard cap on total deduplicated rows across the run.
includeContactsbooleannofalseAdd phone, website and e-mail from each place page.
proxyConfigurationobjectnoApify ProxyApify Proxy configuration.
proxyCountryCodestringnoanyTwo-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:

EventPrice (USD)When
actor-start$0.20Once per run, at boot
result-emitted$0.003Per 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.
  • includeContacts opens one extra page per place, so runs are slower and use more proxy traffic.
  • rating, reviewCount and 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.