Yandex Maps Scraper at a glance
Yandex Maps Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, name, category, address and phone, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.60 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.60 per 1,000 results (Free plan), from $1.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 22 options
- Run success
- 96.9% of completed public runs in the last 30 days
Scrape Yandex Maps businesses and places by keyword or URL for lead generation, research and market analysis. Парсер Яндекс Карт: сбор данных о компаниях и местах по запросу или ссылке для поиска клиентов, исследований и анализа рынка.
What Yandex Maps Scraper can do
- 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.
- 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.
Choose what to collect
These inputs let you configure Yandex Maps Scraper - Businesses, Places & Leads. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
searchStringsArrayarray | Search queries to run on Yandex Maps. |
startUrlsarray | Direct Yandex Maps targets - one per row: business page (with or without slug.com.ru or m. mobile host, a ?ol=biz&oid= link, or its /reviews/ tab), a ?text= search URL, a city search /maps/{geoId}/{city}/search/{query}/ (percent-encoded queries and ?page=N supported) or a city category page /maps/{geoId}/{city}/category/{rubric}/. Unsupported shapes (short /maps/-/ share links, /maps/search/{query}/ without a city id) are skipped with a warning. The default scrapes one example of each shape. |
locationstring | Free-text region for keyword searches (resolved to map coordinates via the open OpenStreetMap geocoder). Ignored by startUrls. |
filtersarray | Native Yandex Maps filters applied to keyword searches and to search / category / ?text= URLs that do not already carry their own filter. One per row: "good_place" (yes/no filter), "wi_fi", "open_now", or "type_cuisine:italian_cuisine,japanese_cuisine" (list filter with one or more values). Several rows combine. Available ids depend on the category (restaurants offer good_place, wi_fi, business_lunch, takeaway, type_cuisine and more). A filter Yandex does not apply is reported in the run log. Leave empty for no filtering. |
maxResultsPerSearchinteger | Maximum businesses to save per search. |
maxPagesPerSearchinteger | SERP pages walked per search (25 businesses each). 0 = no page cap - Max results per search is the only cap that stops a walk early. |
includeRawboolean | Include the matched raw Yandex response object in each dataset row for debugging. |
Show 15 more inputs
| Input | What it controls |
|---|---|
fetchDetailsboolean | Open each business page and read its reviews, opening hours and photo totals. Turn OFF for fast, search-card-only rows |
maxPhotosinteger | Photos to list per business (id, url, size, tags, credit) when details mode is on. 0 = off. Adds one read per business, included in the existing detail-enrichment unit; no extra charge. |
maxPostsinteger | Owner posts and events to list per business (text, publication time, photos) when details mode is on. 0 = off. Adds one or more reads per business, included in the existing detail-enrichment unit; no extra charge. |
includeMenuboolean | Read the business menu tab and return the whole menu (all categories, prices, volumes, photos, source, last update) instead of the popular-items preview on the card. Restaurants and shops that publish a menu only. Adds about 0.8 MB of page transfer per business with a menu; included in the existing detail-enrichment unit, no extra charge. |
includeChainBranchesboolean | For businesses that belong to a chain, add how many branches the chain has in the same city (one chain page read of about 1.8 MB per distinct chain per run). Included in the existing detail-enrichment unit, no extra charge. |
languagestring | Browser locale. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Businesses already collected there (matched by business id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Distinct from Incremental mode below, this continues one specific interrupted run, not recurring monitoring. |
incrementalModeboolean | When ON, this actor remembers the previous run of the SAME search (see State key) and classifies each business as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. UNCHANGED and EXPIRED rows are not saved to the dataset unless enabled below, this is what keeps a scheduled recurring run cheap. Default OFF (every run returns every business, as today). Combining with Resume from a previous run above is only safe on the very first incremental run (no baseline yet), once a baseline exists, remove Resume from a previous run or set a different State key. |
stateKeystring | Manually name the incremental baseline for this search, e.g. "nyc-coffee". Leave empty to auto-derive one from the search settings, two runs with the exact same search settings then share a baseline automatically. Set this explicitly if you want to run several DIFFERENT search configs against the SAME named baseline, or keep configs that happen to match fully separate. |
emitUnchangedboolean | When ON, incremental mode also saves businesses with no detected change (changeType="UNCHANGED") to the dataset, instead of only NEW/UPDATED/REAPPEARED. This returns, and bills for, every business every run, defeating the point of incremental mode for most use cases. Default OFF. |
emitExpiredboolean | When ON, incremental mode also saves a row (changeType="EXPIRED") for each previously-tracked business that no longer appears, once this run reaches the natural end of the search results (skipped on a capped, resumed, or otherwise incomplete run, those cannot tell "gone" apart from "not reached yet"). This returns, and bills for, an extra row per disappeared business. Default OFF. |
ignoreFieldsForChangesarray | Field names that must NOT count as a change in incremental mode, e.g. photosCount or addressParts.street (dotted paths reach nested fields, including inside lists). Ignored fields stay in the output rows; they just never turn an unchanged business into UPDATED and never appear in changedFields. Already ignored by default: scrapedAt, rank, raw, searchString, reviews (use reviewsCount to detect new reviews), trafficHistogram, photoUrls, logoUrl. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per business (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on businesses written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleName (text)categoryNameCategory (text)addressAddress (text)phonePhone (text)websiteWebsite (link)totalScoreRating (number)reviewsCountReviews (number)urlYandex Maps URL (link)phonesAll phones (array)reviewsReviews (author, rating, text, date) (array)changeTypeChange (text)Show 3 more fields
changedFieldsChanged fields (array)firstSeenAtFirst seen (text)lastSeenAtLast seen (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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
}
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Yandex Maps Scraper return?
The documented output for Yandex Maps Scraper includes id, name, category, address, phone, website, rating and reviews. Availability of each field depends on the source page and the selected mode.
How much does Yandex Maps Scraper cost?
It costs $2.60 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
