Yandex Maps Scraper - Businesses, Places & Leads
Pricing
from $1.80 / 1,000 business records
Yandex Maps Scraper - Businesses, Places & Leads
Scrape businesses and places from Yandex Maps by search term or URL for research, leads and market analysis. Парсер Яндекс Карт: собирайте данные о компаниях и местах по запросу или ссылке для поиска клиентов, исследований и анализа рынка.
Pricing
from $1.80 / 1,000 business records
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
2
Bookmarked
1
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Yandex Maps Scraper: Business Listings, Contact Info & Reviews
Yandex Maps Scraper turns Yandex Maps into structured business data. Search by keyword or paste direct business, category or search links, or mix both in one run, to get names, addresses, categories, ratings, contact details, opening hours, price levels, photos and reviews for cafes, shops, offices and any other place listed on Yandex Maps. Export the results to JSON, CSV or Excel, or pull them straight into your app through the API.
Why This Scraper?
- Two ways to find businesses. Search by keyword (with the location resolved to map coordinates automatically) or paste direct Yandex Maps links. Both feeds merge into one dataset.
- Rich business records. Contact info, categories, ratings, price levels, opening hours, traffic patterns and up to 10 photo URLs per business, read straight from the source page.
- Reviews on demand. Turn on business details to pull recent reviews per business, with billing that scales with how many you request.
- Cost-aware pagination. Cap how many businesses each search saves and how many result pages it walks, so you only pay for what you collect.
- Built for schedules. Incremental mode returns only new and changed businesses on recurring runs, and resume continues one interrupted walk without repeating work.
- A refused run fails loudly instead of quietly returning an empty dataset.
Use Cases
- Local business directories and lead lists: build a database of cafes, shops or service providers in a city or district, complete with contact info.
- Competitive and market research: compare ratings, review counts and price levels for a category of business across a region.
- Reputation monitoring: pull recent reviews for specific businesses to track sentiment over time.
- Location intelligence: use coordinates, addresses and traffic patterns to study business density and foot traffic by area.
- Recurring data feeds: schedule the actor and use incremental mode to get only new, changed or closed businesses since the last run.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
source | "yandex_maps" |
id | "123456789012" |
title | "Riverside Coffee House" |
url | "https://yandex.com/maps/org/123456789012/" |
searchString / rank | "coffee shop" / 1 |
address | "Springfield, Example Ave 42" |
addressParts | { "country": "Sampleland", "street": "Example Ave", "house": "42" } |
postalCode / country | "12345" / "Sampleland" |
categoryName / categories | "Coffee shop" / ["Coffee shop", "Bakery"] |
phone / phones | "+1 555 0101" / ["+1 555 0101"] |
website | "https://example-coffeehouse.example" |
totalScore / reviewsCount | 4.6 / 128 |
workingTime | { "text": "daily, 8:00 AM to 8:00 PM", "openNow": true, "openNowText": "Open now" } |
priceLevels | { "price_cup_cappuccino": "3-4 USD" } |
trafficHistogram | hourly visit-intensity values per weekday (when available) |
photosCount / photoUrls | 24 / up to 10 photo URLs |
logoUrl | business logo image URL |
seoname | "riverside_coffee_house" |
reviews | recent reviews (author, rating, text, date); details mode only |
location | { "lat": 40.71, "lng": -74.01 } |
scrapedAt | "2026-09-30T12:00:00.000Z" |
raw | the matched source object, when Include raw payload is on |
Incremental mode adds changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt to every row; see Resume and recurring updates below.
How to Use
- Pick a way to find businesses: enter Search terms with a Location (keyword search), add Start URLs (direct business, category or search page links), or both in the same run.
- Turn Business details & reviews on or off, and set Max reviews per business if you want reviews.
- Set Max results per search and Max pages per search to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search for coffee shops in a city:
{"searchStringsArray": ["coffee shop"],"location": "Austin, TX","maxResultsPerSearch": 20}
Scrape one business page directly:
{"startUrls": [{ "url": "https://yandex.com/maps/org/example_bakery/123456789/" }],"fetchDetails": true,"maxReviews": 20}
Search-card-only rows, no detail pages (faster, cheaper):
{"searchStringsArray": ["hardware store"],"location": "Warsaw","maxResultsPerSearch": 50,"fetchDetails": false}
Recurring monitoring of a search:
{"searchStringsArray": ["car wash"],"location": "Manchester","incrementalMode": true,"emitExpired": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/yandex-maps-scraper").call(run_input={"searchStringsArray": ["coffee shop"], "location": "Austin, TX"})for business in client.dataset(run["defaultDatasetId"]).iterate_items():print(business["title"], business.get("address"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/yandex-maps-scraper').call({ searchStringsArray: ['coffee shop'], location: 'Austin, TX' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max results per search shapes a walk
Each search term or start URL is walked page by page (25 businesses per results page) until it reaches the site's own last page, or until the business cards scanned so far for that search reach Max results per search, whichever comes first. That cap counts every card scanned, not unique rows actually saved: a card repeated on the page, a business already saved earlier in the same run by another search term or start URL, and a business already collected by the run you are resuming all count toward it. So an overlapping search, or a resumed run, can stop paging with far fewer new rows than Max results per search calls for. Raise Max results per search (raising Max pages per search alone does not help here), or run overlapping searches in separate runs, to collect the rest.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every business id already collected there (before opening its page, saving or billing it), so you don't pay twice. An ID that matches no run or dataset you can read fails the run immediately instead of starting over. Skipped businesses still count toward Max results per search, so raise it on the resumed run. - Incremental mode (
incrementalMode) is for recurring runs over the same search. Each business is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole tracked scope, and only withemitExpired).stateKeynames or shares the stored baseline; leaving it empty auto-derives one from the search settings, so two runs with identical search settings share a baseline automatically. With incremental mode off, output is exactly as before. - EXPIRED rows are not capped by Max results per search. On a run that reaches the natural end of its tracked scope, every previously tracked business missing from this run gets one EXPIRED row, however many that is.
- Known limitation: EXPIRED detection is correctly skipped on a run that hit its Max results per search cap, but a results page that could not be read is not currently treated the same way. If a search term or start URL is refused outright (every attempt on its first page fails, for example after repeated blocked requests), or one of its later pages fails or comes back incomplete, the walk just moves on or stops there and the run still counts as a complete scan. With
incrementalModeandemitExpiredon, the previously tracked businesses on those unread pages can then be marked EXPIRED even though they were never re-checked. A repeatedly blocked page does not always log a warning, so before trusting a large EXPIRED batch, check thefailedSearcheslist in the end-of-run log summary and rerun the affected search once it succeeds (a later run that finds those businesses again reports them asREAPPEARED).
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each business, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchStringsArray | array | ["restaurants"] | Search queries to run on Yandex Maps. |
startUrls | array | (none) | Direct Yandex Maps targets to scrape, one search, category, or business page per row. |
location | string | New York, NY | Free-text region for keyword searches, resolved to map coordinates. Ignored by startUrls. |
maxResultsPerSearch | integer | 20 | Maximum businesses to save per search. |
maxPagesPerSearch | integer | 0 | Results pages walked per search (25 businesses each). 0 = no page cap; Max results per search is the only cap that stops a walk early. |
includeRaw | boolean | false | Include the matched raw source object in each dataset row, for debugging. |
fetchDetails | boolean | true | Open each business page and read its reviews, opening hours and photo totals. Off = faster, search-card-only rows. |
maxReviews | integer | 3 | Per-business review count when Business details & reviews is on. Billing scales with volume. |
language | string | en-US | Browser locale. Currently informational: pages are always requested in English. |
resumeFromRunId | string | (none) | Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. |
incrementalMode | boolean | false | Recurring monitoring: reruns the same search and classifies each business as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. |
stateKey | string | (none) | Optional. Name the incremental baseline explicitly. Auto-derived from the search settings when left empty. |
emitUnchanged | boolean | false | Incremental mode only. Also save UNCHANGED businesses. |
emitExpired | boolean | false | Incremental mode only. Also save a row for businesses no longer found, once the walk reaches its natural end. |
proxyConfiguration | object | Datacenter (useApifyProxy: true) | Connection settings used for all requests. Pick the residential group if the datacenter pool is refused. |
mcpConnectors | array | (none) | Optional: send a summary of each business to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | (none set; falls back to 200) | Cap on businesses written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"source": "yandex_maps","id": "123456789012","title": "Riverside Coffee House","scrapedAt": "2026-09-30T12:00:00.000Z","searchString": "coffee shop","rank": 1,"url": "https://yandex.com/maps/org/123456789012/","address": "Springfield, Example Ave 42","addressParts": { "country": "Sampleland", "street": "Example Ave", "house": "42" },"postalCode": "12345","country": "Sampleland","categoryName": "Coffee shop","categories": ["Coffee shop", "Bakery"],"phone": "+1 555 0101","phones": ["+1 555 0101"],"website": "https://example-coffeehouse.example","totalScore": 4.6,"reviewsCount": 128,"workingTime": { "text": "daily, 8:00 AM to 8:00 PM", "openNow": true, "openNowText": "Open now" },"priceLevels": { "price_cup_cappuccino": "3-4 USD" },"photosCount": 24,"photoUrls": ["https://avatars.mds.yandex.net/example/orig"],"logoUrl": "https://avatars.mds.yandex.net/example/80x80","seoname": "riverside_coffee_house","reviews": [{ "authorName": "Alex Sample", "authorLevel": "Level 3 Local Expert", "rating": 5, "text": "Cozy corner, good pastries.", "date": "2026-09-01T12:00:00Z" }],"location": { "lat": 40.71, "lng": -74.01 }}
Plan Requirement
The default connection works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, or if the default pool is refused often, the residential group under Connection gives more headroom.
FAQ
How much does it cost?
You pay per business saved, plus an optional detail-enrichment charge when Business details & reviews is on (it scales with how many reviews you request). The Pricing tab shows the current rates. Use Max results per search to cap the cost of any run.
Is it legal to scrape Yandex Maps?
This actor collects only publicly available business listing data. You are responsible for how you use it: follow Yandex's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Reviews and photos may be subject to third-party rights.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues ONE specific interrupted run from a pasted run or dataset ID; it does not remember anything between separate scheduled runs. Incremental mode reruns the SAME search on a schedule and reports only what changed since the last run. Combining both is only safe on the very first incremental run, before a baseline exists.
Can I get only new, changed or closed businesses on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Turn on Include expired businesses in output to also get a row for businesses that disappeared from the results, once a run completes a full scan of the tracked search. See the note above about searches that are refused outright.
Why did I get fewer businesses than Max results per search?
The cap is checked against business cards scanned for that search, not unique rows saved. If the page repeats a business, a business was already collected earlier in the same run by another search term or start URL, or it was already collected by the run you are resuming, it still counts, and the walk can stop before delivering the full count. Raise Max results per search to collect more. In incremental mode, UNCHANGED businesses are also left out of the dataset unless Include unchanged businesses in output is on.
Why did my run fail instead of returning an empty dataset?
If the maps search refuses every request across all the given inputs, the run stops with a clear message so "nothing found" is never confused with "nothing could be read". Run it again in a few minutes, or with a different connection setting. If only some searches or URLs could be read, you still get what was found.
One known quirk: the same "No results" failure currently also appears when a run saves zero rows for a benign reason, namely an incremental run where nothing changed (every business UNCHANGED and no EXPIRED rows) or a resumed run where every business found was already collected. The scan itself worked, and in incremental mode the log still shows "state saved for the next scheduled run". Turn on Include unchanged businesses in output if a scheduled incremental run must never end as failed.
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 results into Notion, Linear or Airtable.
🔗 Want more Yandex data?
Pair this actor with these related scrapers from the same team:
| 🧩 Yandex SERP Scraper Scrape Yandex web, image and video results with URLs, snippets and organic rankings for... | 📇 Google Maps Scraper Extract business data from Google Maps at scale. Get names, addresses, phone numbers... |
| 🛒 Dealroom Startup & Market Map Scraper Scrape Dealroom.net market maps, company lookup results, live signals, and newly founded... | 📇 PagesJaunes FR From $0.8/1K. Scrapes business listings from PagesJaunes.fr (French Yellow Pages)... |
| 🏠 Cian RU Collect property listings from Cian.ru by search filters or direct URLs. Returns... | 📇 BBB Scraper Scrape bbb.org (Better Business Bureau, USA & Canada) business profiles: BBB rating... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.