Yandex Maps Scraper - Businesses, Places & Leads avatar

Yandex Maps Scraper - Businesses, Places & Leads

Pricing

from $1.80 / 1,000 business records

Go to Apify Store
Yandex Maps Scraper - Businesses, Places & Leads

Yandex Maps Scraper - Businesses, Places & Leads

Scrape Yandex Maps businesses and places by keyword or URL for lead generation, research and market analysis. Парсер Яндекс Карт: сбор данных о компаниях и местах по запросу или ссылке для поиска клиентов, исследований и анализа рынка.

Pricing

from $1.80 / 1,000 business records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

2

Bookmarked

5

Total users

0

Monthly active users

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

FieldExample
source / id"yandex_maps" / "123456789012"
title / seoname"Riverside Coffee House" / "riverside_coffee_house"
url"https://yandex.com/maps/org/123456789012/"
searchString / rank"coffee shop" / 1
address / addressParts"Springfield, Example Ave 42" / { "country": "Sampleland", "street": "Example Ave", "house": "42" }
postalCode / country"12345" / "Sampleland"
categoryName / categories"Coffee shop" / ["Coffee shop", "Bakery"]
phone / phones / website"+1 555 0101" / ["+1 555 0101"] / "https://example-coffeehouse.example"
totalScore / reviewsCount4.6 / 128
workingTime / schedule{ "text": "daily, 8:00 AM to 8:00 PM", "openNow": true } / opening hours per weekday
priceLevels / trafficHistogram{ "price_category": "above average", "average_bill": "1500-1800 RUB" } / hourly visit intensity per weekday (when available)
photosCount / photoUrls / logoUrl24 / up to 10 photo URLs / business logo image URL
awards / reviewAspects / placeSummaryYandex award, review topics with positive / neutral / negative counts, and the short place summary Yandex shows on the card (each only when Yandex publishes it)
chainName / chainId / chainSlugthe chain a branch belongs to (chain members only); chainBranchesInCity adds its branch count when Chain branch count is on
menumenu block: source, last update, total items and items with title, description, price, currency, volume and photo; the card shows the popular items, Full menu returns the whole menu
productCatalog / promoshowcase offers or services with prices, and the active promotion (only when published)
phonesDetailed / socialLinkseach phone with dialable form, type, label and extension; social links with their readable handle
additionalAddress / categoryIdsfloor or mall detail, and category ids matching the category names
panorama / entrancesstreet panorama (id, position, heading, tilt, preview) and mapped entrance points
bookingPartner / bookingAvailability / bookingLinkstable-booking partner, whether slots are offered, and booking links
legalInfo / referenceslegal entity name and tax id as shown for advertising labelling (companies only: sole-proprietor details of private individuals are never included), and partner-system ids
photos / postsphoto gallery (Max photos per business) and owner posts and events (Max posts per business)
reviewsrecent reviews (author, rating, text, date, plus photos with ids and credit, videos, translations and language name); details mode only
location / scrapedAt{ "lat": 40.71, "lng": -74.01 } / "2026-09-30T12:00:00.000Z"
rawthe matched source object, when Include raw payload is on

The Output tab offers four views of the same rows: Businesses, Contacts & leads (phones, website), Reviews (the nested reviews list per business) and Changes since last run (incremental mode: change type and changed fields).

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

  1. 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.
  2. Turn Business details & reviews on or off, and set Max reviews per business if you want reviews.
  3. Set Max results per search and Max pages per search to control run size and cost, then click Start.
  4. 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
}

Supported Start URL shapes (the Start URLs field is pre-filled with one example of each, and the default run scrapes them):

ShapeExample
Business page (slug + id)https://yandex.com/maps/org/no_plates_coffee/124606085044/
Business page (id only)https://yandex.com/maps/org/124606085044/
Business reviews tabhttps://yandex.com/maps/org/no_plates_coffee/124606085044/reviews/
Russian hosthttps://yandex.ru/maps/org/no_plates_coffee/124606085044/
Search with positionhttps://yandex.com/maps/?ll=-74.006%2C40.7128&z=12&text=coffee
Search, text onlyhttps://yandex.com/maps/?text=restaurants
City searchhttps://yandex.com/maps/202/new-york/search/restaurants/
City categoryhttps://yandex.com/maps/202/new-york/category/coffee_shop/

Behaviour change: leaving Start URLs untouched now scrapes one example of each shape above (previously nothing). Clear the field to run keyword search only. The .ru host and the /reviews/ tab are normalised to the business page. Short share links (/maps/-/CODE) and /maps/search/{query}/ without a city id are not supported: they are skipped with a warning in the log and the run is treated as an incomplete scan. If Location cannot be resolved to coordinates, a warning is logged and the keyword search runs without a map position.

Filtered search-card-only rows (Wi-Fi, Italian or Japanese cuisine; faster, cheaper):

{
"searchStringsArray": ["restaurants"],
"location": "Moscow",
"filters": ["wi_fi", "type_cuisine:italian_cuisine,japanese_cuisine"],
"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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole tracked scope, and only with emitExpired). stateKey names 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.
  • EXPIRED safety: a business is only marked EXPIRED after a run that walked every search from its first results page to the natural end of the results. A search or start URL that was refused, a page that could not be read, a walk cut by Max pages, a start URL that begins at ?page=2 or later, and a Max results cap all make the run an incomplete scan, so no EXPIRED rows are produced and the saved baseline for those businesses is kept. A search whose businesses are all unchanged is a normal result, not a failure.
  • Ignore fields when detecting changes: ignoreFieldsForChanges lists fields that must not count as a change (for example photosCount, or a dotted path such as addressParts.street for nested fields). They stay in the output rows but never turn a business into UPDATED or show in changedFields. Already ignored by default: scrapedAt, rank, raw, searchString, reviews (use reviewsCount to see new reviews), trafficHistogram, photoUrls, logoUrl. Changing the list never causes a one-time wave of UPDATED rows.

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.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
searchStringsArrayarray["restaurants"]Search queries to run on Yandex Maps.
startUrlsarray(none)Direct Yandex Maps targets to scrape, one search, category, or business page per row.
locationstringNew York, NYFree-text region for keyword searches, resolved to map coordinates. Ignored by startUrls.
filtersarray[]Yandex Maps own filters, one per row: good_place, wi_fi, open_now, or type_cuisine:italian_cuisine,japanese_cuisine. Several rows combine. Applied to keyword searches and to search or category URLs without their own filter; a filter Yandex does not apply is reported in the run log.
maxResultsPerSearchinteger20Maximum businesses to save per search.
maxPagesPerSearchinteger0Results pages walked per search (25 businesses each). 0 = no page cap; Max results per search is the only cap that stops a walk early.
includeRawbooleanfalseInclude the matched raw source object in each dataset row, for debugging.
fetchDetailsbooleantrueOpen each business page and read its reviews, opening hours and photo totals. Off = faster, search-card-only rows.
maxReviewsinteger3Per-business review count when Business details & reviews is on. Billing scales with volume.
maxPhotosinteger0Photos to list per business (needs Business details & reviews). 0 = off.
maxPostsinteger0Owner posts and events to list per business (needs Business details & reviews). 0 = off.
includeMenubooleanfalseReturn the whole menu from the business menu tab instead of the popular-items preview. About 0.8 MB of page transfer per business with a menu.
includeChainBranchesbooleanfalseAdd the chain's branch count in the same city to chain members (one chain page of about 1.8 MB per distinct chain per run).
languagestringen-USBrowser locale. Currently informational: pages are always requested in English.
resumeFromRunIdstring(none)Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs.
incrementalModebooleanfalseRecurring monitoring: reruns the same search and classifies each business as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED.
stateKeystring(none)Optional. Name the incremental baseline explicitly. Auto-derived from the search settings when left empty.
emitUnchangedbooleanfalseIncremental mode only. Also save UNCHANGED businesses.
emitExpiredbooleanfalseIncremental mode only. Also save a row for businesses no longer found, once the walk reaches its natural end.
ignoreFieldsForChangesarray[]Incremental mode only. Fields (dotted paths allowed) that never count as a change.
proxyConfigurationobjectDatacenter (useApifyProxy: true)Connection settings used for all requests. Pick the residential group if the datacenter pool is refused.
mcpConnectorsarray(none)Optional: send a summary of each business to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger(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_category": "above average", "average_bill": "1500-1800 RUB" },
"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 the detail-enrichment charge when Business details & reviews is on: 1 unit per business whose page was read, plus 1 unit per started block of 10 reviews delivered (10 reviews = 1 extra unit, 25 = 3; the default of 3 reviews = 1 unit in total). Photos, posts, the full menu and the chain branch count are read from the same business page visit and are included in that detail-enrichment unit: turning them on adds no extra charge, only extra page transfer through your proxy. Rows that are unchanged and not saved are not charged. The Pricing tab shows the current rates. Use Max results per search to cap the cost of any run.

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.

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 Search Scraper
Scrape Yandex web, image and video search results with URLs, snippets and organic...
📇 Google Maps Scraper
Extract business data from Google Maps at scale. Get names, addresses, phone numbers...
📇 2GIS
Extract business and place data from 2GIS.com at scale. Get names, addresses, phones...
✈️ Naver Map Scraper
Scrape Naver Map places by keyword or URL: names, categories, ratings, phones, addresses...
📇 BBB Scraper
Scrape bbb.org (Better Business Bureau, USA & Canada) business profiles: BBB rating...
📇 HiPages Scraper
Scrape business listings from HiPages Australia by category, location, or URL. Extract...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 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 contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.