Yandex Maps Scraper API
Pricing
from $0.40 / 1,000 place returneds
Yandex Maps Scraper API
There is a business directory behind Yandex Maps covering Russia, Kazakhstan, Turkey and the CIS, and this reads it by term and city or from pasted URLs: name, address, GPS coordinates, rating, review count, phone, website and opening hours. $0.40 per 1,000 places.
Pricing
from $0.40 / 1,000 place returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Share
Give it a search term and a city, or paste Yandex Maps URLs. You get one row per business: name, full address, GPS coordinates, category, star rating, review count, phone number, website and opening hours.
Yandex keeps its own business index for Russia, Belarus, Kazakhstan, Uzbekistan, Armenia, Azerbaijan and Turkey, filled in by the owners themselves. This reads it without a login or a key.
$0.40 per 1,000 places. Flat on every Apify plan including the free one. No volume tiers, no minimum spend.
What a row looks like
Real row from a "кафе" search in Moscow:
{"placeId": "19464848293","name": "Рыба моя","categoryPrimary": "Ресторан","categories": ["Ресторан", "кафе", "бар"],"address": "Москва, Славянская площадь, 2","addressDetail": "Рыба моя, этаж -1","country": "Россия","city": "Москва","street": "Славянская площадь","postalCode": "109012","latitude": 55.753391,"longitude": 37.633956,"phone": "+74957846858","phones": ["+74957846858"],"website": "https://rybamoya.ru/","socialProfiles": [{ "type": "telegram", "url": "https://t.me/perelmanrestaurants" }],"rating": 4.9,"ratingCount": 6041,"reviewCount": 2694,"openingHoursText": "Mon: 12:00-00:00; Tue: 12:00-00:00; ...","openingHoursRaw": "ежедневно, 12:00 PM–12:00 AM","isOpenNow": false,"priceRange": { "text": "от 3000 ₽", "lower": 3000, "upper": 3500, "currency": "₽" },"nearestMetro": { "name": "Китай-город", "distanceMeters": 36 },"verifiedOwner": true,"status": "open","url": "https://yandex.com/maps/org/ryba_moya/19464848293/"}
Every field: placeId, name, nameShort, chainName, categoryPrimary, categories,
address, addressDetail, country, city, street, postalCode, latitude, longitude,
phone, phones, website, websites, socialProfiles, rating, ratingCount, reviewCount,
openingHoursText, openingHoursRaw, openingHours, isOpenNow, priceRange, nearestMetro,
verifiedOwner, status, url, searchQuery, position, scrapedAt.
openingHours is the machine-readable version, an array of seven days each holding {from, to}
objects. openingHoursText is the same thing flattened into one string if you'd rather not parse.
How complete is it
Measured on a 250-place run (Moscow, "кафе", 61 seconds):
| Field | Filled |
|---|---|
| name, address, coordinates, category | 250 / 250 |
| rating, review count | 250 / 250 |
| phone | 250 / 250 |
| opening hours | 249 / 250 |
| website | 237 / 250 |
| postal code | 196 / 250 |
Every row in that particular run had a phone number on it. Don't read that as a guarantee. It was one search term in one city, and a narrower term in a smaller town will fill fewer columns.
Input
{"searchQueries": ["кафе", "стоматология"],"city": "Moscow","maxItems": 250}
| Field | What it does |
|---|---|
searchQueries | One term per line. Russian terms return more than English ones, even in Turkey. |
city | Moscow, Москва, Almaty, Istanbul and a numeric Yandex geo id all work. |
startUrls | Search pages (https://yandex.ru/maps/213/moscow/search/кафе/) or single business pages (https://yandex.ru/maps/org/osteria_mario/1769547913/). |
latitude / longitude / zoom | Search around a point instead of a whole city. Zoom 15 is roughly a neighbourhood, 11 roughly a city. |
maxItems | Hard cap, 1 to 5000. Duplicates are removed before this cap, so asking for 250 gives you 250 distinct businesses. |
language | Russian, English, Turkish, Ukrainian, Kazakh, Uzbek or Azerbaijani. |
Run it with no search terms and you get a single labelled sample row, marked _sample: true and
charged: false, so you can look at the shape before spending anything.
What it doesn't do
No review text. You get the rating and the review count, not what anyone wrote. That's a separate scraper.
No photos. Yandex ships image URLs in its page data and this actor doesn't return them.
No email addresses. Yandex Maps cards don't carry them. Anything that claims otherwise is guessing from the website domain.
Roughly 25 places per request, so 1,000 places means about 50 requests and a few minutes.
Yandex re-ranks between pages. Consecutive pages overlap by around a quarter. The actor removes the
duplicates for you, which is why a deep run makes more requests than maxItems / 25 suggests.
Result totals are estimates. Yandex's own "about 94 matches" figure moves between requests. Treat it as a hint.
Some fields stay in Russian whatever language you pick. Yandex localises names and categories, but street names in Russia usually stay Cyrillic.
Billing
| Per place returned | $0.0004 ($0.40 per 1,000) |
| Actor start | $0.001 per run |
You're charged per unique place. Duplicates, sample rows, error rows, captchas and empty runs cost nothing beyond the start fee. A 250-place run costs $0.101.
That $0.0004 is flat on every Apify plan. What you read here is what you pay on your first run and on your thousandth.
FAQ
Do I need a Yandex API key? No. The official Places API needs a paid key and caps results. This reads the public map pages, so there's nothing to sign up for.
Is this the same data as a Google Maps scraper? No. It's a separate index with separate cards, so a business can be listed and rated on one map and missing from the other, in both directions. Which map has better coverage depends on the country and the search term, and the only honest way to find out for yours is to run both and match on name plus coordinates.
Can I scrape one business I already have the link for?
Yes. Paste the https://yandex.ru/maps/org/.../<id>/ URL into startUrls. One place, one row, one
charge.
How many places can I get from one search term? Yandex keeps serving deeper pages as you go. A Moscow "кафе" search comfortably passes 250. Narrow terms in small towns run out sooner, and the actor stops when a page stops producing anything new.
Why did my run return an error row instead of places?
Error rows are free. CAPTCHA means Yandex challenged that exit address, and re-running usually
lands elsewhere. NO_RESULTS means the search genuinely matched nothing, so try a broader or
Russian-language term. CITY_NOT_FOUND means Yandex didn't recognise the city name.
Is the output ready for a CRM?
Phone numbers come back normalised (+74957846858). Website links have Yandex's tracking
parameters stripped, so you get https://rybamoya.ru/ rather than a URL with yclid and
utm_source glued on.
What does an empty run cost? The $0.001 start fee and nothing else.