Search Yandex Maps businesses and read their reviews
The Yandex Maps API returns Russian and CIS local-business data as clean JSON.
5 active endpoints. Every call is 1 credit.
- POST/yandex-maps/v1/search
- POST/yandex-maps/v1/detail
- POST/yandex-maps/v1/reviews
- POST/yandex-maps/v1/nearby
- POST/yandex-maps/v1/geocode
What Yandex Maps endpoints does ReefAPI ship?
5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Yandex Maps API
3 of 5 endpoints, ready to run
Businesses around a point: name, address, coordinates, rating, rating count, review count, categories, phone, website and social links.
{ "ok": true, "meta": { "api": "yandex-maps", "endpoint": "search", "mode": "live", "latency_ms": 1136.8, "record_count": 24, "cache_hit": false }, "data": { "orgs": [ { "org_id": "69353267050", "name": "Surf Coffee x Flow", "address": "Moscow, Strastnoy Boulevard, 8А", "latitude": 55.766219, "longitude": 37.610433, "url": "https://yandex.com.tr/maps/org/surf_coffee_x_flow/69353267050/", "seoname": "surf_coffee_x_flow", "status": "open", "hours_text": "Pzt-Cum 08:00–23:00; Cmt,Paz 10:00–23:00", "categories": [ { "id": "35193114937", "name": "Kahve dükkanları", "seoname": "coffee_shop" } ], "website": null, "social_links": [ { "type": "telegram", "href": "https://t.me/surfcoffeeru" } ], "rating": 4.9, "rating_count": 1205, "review_count": 614 }, { "org_id": "18453427291", "name": "Alenka", "address": "Moscow, Fadeyeva Street, 4Ас1", "latitude": 55.775781, "longitude": 37.602271, "url": "https://yandex.com.tr/maps/org/alenka/18453427291/", "seoname": "alenka", "status": "open", "hours_text": "Pzt-Cum 08:00–21:00; Cmt,Paz 09:00–21:00", "categories": [ { "id": "35193114937", "name": "Kahve dükkanları", "seoname": "coffee_shop" }, { "id": "184108017", "name": "pasta, şekerleme ve tatlı", "seoname": "confectionary" } ], "website": null, "social_links": [ { "type": "telegram", "href": "https://t.me/alenka_cafe" }, { "type": "vkontakte", "href": "https://vk.ru/alenka.cafe" } ], "rating": 4.7, "rating_count": 262, "review_count": 149 }, { "org_id": "211701948332", "name": "Noconcept", "address": "Moscow, Merzlyakovsky Lane, 3", "latitude": 55.754351, "longitude": 37.598908, "url": "https://yandex.com.tr/maps/org/noconcept/211701948332/", "seoname": "noconcept", "status": "open", "hours_text": "günlük, 10:00–22:00", "categories": [ { "id": "184107943", "name": "Giyim mağazası", "seoname": "clothing_store" }, { "id": "178781223490", "name": "al götür kahve", "seoname": "coffee_to_go" }, { "id": "35193114937", "name": "kahve dükkanları", "seoname": "coffee_shop" } ], "website": null, "social_links": [ { "type": "telegram", "href": "https://t.me/nonameconceptmoscow" }, { "type": "whatsapp", "href": "https://wa.me/79251725734" }, { "type": "youtube", "href": "https://www.youtube.com/channel/UC8T6CwiT3axy1lrOAVESQ0A" } ], "rating": 5, "rating_count": 725, "review_count": 455 } ] } }
How the Yandex Maps API works
Yandex Maps is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 192 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Anchor the search, then page the reviews on has_more
Two things decide whether this works: where you anchored the search, and when you stop paging. The anchor is now a named city or a map centre, and paging stops earlier than the total says it will.
{"text": "coffee", "city": "moscow"}A named city is enough for the nineteen on the list. For anywhere else, pass ll as longitude,latitude — longitude first — and it wins over everything.
{"org_id": "92098396399", "page": 1}Fifty rows, each with rating, full text, ISO date and the owner's reply. meta carries has_more and next_page.
{"org_id": "92098396399", "page": 2}Keep going while has_more is true. It goes false — with an empty, honest page — before the advertised total_pages.
One credit per search and one per review page of fifty. A 925-review business is a few hundred rows and a handful of credits, not a crawl.
curl -X POST https://api.reefapi.com/yandex-maps/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"text":"kahve","city":"istanbul"}'{
"ok": true,
"data": { … },
"meta": {
"api": "yandex-maps",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}How a Yandex Maps org is identified, and which text is localized
This engine reads the Turkish surface of Yandex Maps, so almost every human-readable label comes back in Turkish while the ids and slugs stay stable. Two things trip callers up: there are two separate review counters that mean different things, and a rating of 0.0 is not a rating. Everything below came from live calls on 2026-08-27.
| Field | Format | Measured example |
|---|---|---|
| org_id | Numeric string, 9-12 digits, no prefix, the number in /maps/org/<seoname>/<org_id>/ | "1242233919" (Kofemaniya, Moscow), "138235130252", "173477046228". It is always a string in the response; do not parse it as an integer. |
| rating | Float 0-5 with one decimal. 0.0 means nobody has voted, not zero stars | 4.7 for Kofemaniya. In a Berlin cafe search 22 of 25 orgs came back 0.0 with rating_count 0; in a New York search, 24 of 25. |
| rating_count vs review_count | Star votes against written reviews, and rating_count is the larger of the two | Kofemaniya: rating_count 7809, review_count 2264. A small Kilis coffee shop: rating_count 3, review_count 0. |
| categories[] | {id, name, seoname} where name is localized Turkish and seoname is a stable English slug | {"id":"184106390","name":"Kafe","seoname":"cafe"}. Other measured slugs: coffee_shop, coffee_store, tea_shop, restaurant, pharmacy, fast_food, advertising_agency. |
| status | String; measured values "open" and "permanent-closed" | A 25-org Moscow search returned 24 "open" and 1 "permanent-closed". |
| hours_text | A single free-text Turkish string, or null when the card has none | "günlük, 09:00-23:00" and "günlük, 24 saat açık". It is not a structured schedule, so parse it or display it as-is. |
| reviews[].rating | Integer 1-5, unlike the org-level rating which is a float | One 50-review page for Kofemaniya broke down as 37 fives, 5 threes, 4 twos and 4 ones. |
| reviews[].date | ISO 8601 UTC with milliseconds and a Z | "2026-05-16T10:43:03.043Z". review_id sits alongside it as a 30-33 character mixed-case token, not a number. |
| geocode result | {name, address, latitude, longitude, type, uri} where uri is Yandex's own object reference | "Taksim Meydanı" resolved to 41.037437, 28.985607 with type "toponym" and uri "ymapsbm1://geo?data=<base64>". |
ll is "lon,lat", longitude first, the reverse order of the latitude and longitude fields the response gives back, and it overrides everything else. city is a real anchor too now: one of nineteen named slugs across Turkey, Russia and the CIS, re-measured on istanbul, ankara and moscow, with anything outside the list refused as INVALID_PARAM rather than answered from somewhere else. region_id stays the raw escape hatch and nothing validates it — 103705 is Kilis, roughly 900 km from Istanbul, and Istanbul is 11508.
Where the results come from, and where paging really ends
Measured with differently anchored searches for the same query and eight pages of reviews on one Moscow business, and re-measured after the geography was rewired. The first row is the one that will cost you if you skip it.
Nineteen city slugs across Turkey, Russia and the CIS steer the search for real. The same query answered with Istanbul addresses on city istanbul and with no city at all, Ankara addresses on city ankara and Moscow addresses on city moscow. A slug that is not on the list — paris — comes back INVALID_PARAM with all nineteen supported values in the message, instead of quietly answering from somewhere else. For anywhere the list does not cover, pass ll as longitude,latitude; it overrides everything.
region_id bypasses the city list on purpose, and nothing checks the number you send. 213 really is Moscow and 11508 really is Istanbul, but 103705 — a value that has been passed around as Istanbul’s — is Kilis, a small town near the Syrian border, and asking for coffee with it returns 25 Kilis cafes with ok:true and no warning. If you are not certain of a region number, use city or ll instead; region_id is the escape hatch, not the default.
One Moscow cafe returned rating_count 1,848 and review_count 925 on the same record. The first counts everyone who left a star, the second counts the ones who wrote something. Size a review pull with review_count; quote the rating with rating_count behind it.
The same 925-review business advertised total_pages 19. Page 10 returned a full 50 rows; pages 15, 17, 18, 19, 20 and 25 all returned zero rows with has_more false and total_pages null. It stops honestly — it just stops earlier than it said. Loop on has_more.
On 50 rows: review id, star rating, full text, ISO date and photo count were 50 of 50, and the business's own reply was there on 48 of 50. The newest review on page one was three days old at the time of measurement, and page 10 reached back to 2018.
The Russian and the English word for the same category, both anchored on Moscow, each returned 24 rows with 24 Moscow addresses — but only 12 of the 24 businesses were the same. Language is not the geography lever; it is a relevance lever. If you are building a category sweep, run both spellings and merge on org_id rather than assuming one covers the other.
Category names, opening-hours text and the amenity labels arrive in one fixed language regardless of where the business is: a Moscow cafe came back with Turkish category and hours strings, and its street address came back transliterated into the Latin alphabet. Business names and review text stay in the original. Map the category by its numeric id rather than by its label, and treat the address as a display string rather than as something to match on.
What people build with Yandex Maps
The jobs this data is most often used for.
endpoints
credit per call
Local apps call search to list businesses across CIS regions.
Reputation tools use reviews to monitor ratings.
Lead-gen uses search and nearby to build local business lists.
What Yandex Maps data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 192 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/yandex-maps/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"text":"kahve","city":"istanbul"}'import requests
r = requests.post(
"https://api.reefapi.com/yandex-maps/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"text": "kahve",
"city": "istanbul"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Yandex Maps.
Get a free key →How does this differ from the google-maps engine?▾
Different id space and different strengths. There is no cross-walk between a Yandex org_id and a Google place id, so you cannot join the two without matching on name and coordinates. On coverage: Moscow and Istanbul searches returned phones on nearly every row and real ratings on most, while Berlin and New York, reached with ll because they are outside the nineteen named cities, also returned 25 genuine orgs each with street addresses and coordinates but a real rating on 0 of 25 and 2 of 25 respectively. Outside Russia and Turkey you get the place, not the reputation data.
Is a rating of 0.0 a bad business?▾
No, it is the empty state. Every org we saw with rating 0.0 also had rating_count 0, meaning nobody has voted. The engine returns 0.0 rather than null, so a naive average or a "rating below 2" filter will silently pick up unrated places. Gate on rating_count greater than 0 before you use rating at all.
Why do rating_count and review_count disagree?▾
They count different things. rating_count is how many people tapped a star rating; review_count is how many wrote text. Kofemaniya returned 7809 and 2264, roughly one written review for every three ratings. The reviews action pages against review_count, not rating_count, so use review_count when working out how many pages exist.
Does nearby really return the closest businesses first?▾
It returns nearby businesses, but not in distance order. A live nearby call for "eczane" around 28.985,41.036 returned six pharmacies at roughly 1.52, 0.37, 2.12, 2.06, 2.43 and 3.21 km from the center, in that order. Sort client-side from the latitude and longitude on each row. nearby also returns far fewer rows than search, six against search's usual 25, so it narrows the area and not just the ordering.
How many review pages can I pull?▾
50 reviews per page, and meta tells you the ceiling: for Kofemaniya, review_count 2264 with total_pages 46, plus has_more and next_page. Reviews are not sorted by date, the first three on page 1 being dated 2026-05-16, 2026-08-25 and 2026-07-16, so if you need the newest, pull the pages and sort yourself. business_reply is the owner's response text or null; on that page 49 of 50 reviews had one.
What does detail give me that search does not?▾
Seven extra fields plus an undocumented one: description, country, locality, street, house, photo_count, features and geo_id. A detail call on org_id 1242233919 returned country "Russian Federation", locality "Moscow", street "Kutuzovsky Avenue", house "17", photo_count 283 and geo_id 116997. One caveat worth knowing before you build on it: description was just the address restated ("Kutuzovsky Avenue No:17, Moscow"), not an about-the-business blurb.
What is inside features on a detail response?▾
An array of {name, value} pairs pulled from the amenities panel, where name is Turkish and value is either a string or a real boolean. The Kofemaniya card returned 20 of them, including {"name":"ortalama hesap","value":"1500-2500 ₽"} and {"name":"yemek teslimatı","value":true}. Because the names are free text in Turkish, match on them defensively rather than assuming a fixed key set.
Which fields are safe to key on if I do not read Turkish?▾
org_id, latitude, longitude, categories[].seoname and status all stay in a stable machine form. name, address, hours_text, author_level and every features[].name come back localized, for example author_level "9. seviye şehir uzmanı", which is Yandex's city-expert level with the level number at the front of the string.
What is the Yandex Maps API?▾
Yandex Maps API is a ReefAPI endpoint group for yandex maps It returns live JSON through POST requests under /yandex-maps/v1.
Is the Yandex Maps API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Yandex Maps calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Yandex Maps login or account?▾
No login to Yandex Maps is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Yandex Maps data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Yandex Maps API use?▾
Yandex Maps actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Yandex Maps from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call yandex-maps actions with the same key, credit pool and JSON envelope used by normal REST requests.
14 Reputation & Reviews APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Yandex Maps, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 191 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.