Yandex has no API that returns review text. Its Organization Search API returns business details, and none of its overview, request or response pages mentions a rating or a review. ToolzerHub returns a place's public reviews in two calls: find the place, then page its reviews.
What Yandex's own API returns
Yandex's Organization Search API (Places API in its docs) is an HTTP API at search-maps.yandex.ru/v1/ that finds businesses by name, address, phone and service. The documented fields are id, name, address, url, Categories, Phones, Hours and Features; there is no rating and no reviews. Access is a yearly license: $2,750 for up to 250,000 requests, or $3,575 with data storage.
Yandex's only reviews product is a Reviews Widget that shows a place's rating and reviews on your own page. To read and answer reviews of your own organization, use the Reviews and ratings page in Yandex Webmaster. Both are better than ours for those jobs.
Yandex Maps reviews with ToolzerHub
We make ToolzerHub. Our Yandex Maps API has two routes for this, both 1 credit per call, sent with an x-api-key header. First find the place. This searches for coffee near central Moscow:
curl "https://api.toolzerhub.com/v1/yandex/maps/search?query=coffee&latitude=55.7558&longitude=37.6173&results=25" \
-H "x-api-key: $TOOLZERHUB_API_KEY"
It returned 24 places. Each row has an id, a url and a rating. Three of the 24, trimmed:
{ "id": "129477618792", "title": "Lak", "url": "https://yandex.com/maps/org/lak/129477618792/",
"rating": { "value": 5, "ratings": 899, "reviews": 814 } }
{ "id": "122754033471", "title": "Sip Coffee", "url": "https://yandex.com/maps/org/sip_coffee/122754033471/",
"rating": { "value": 5, "ratings": 478, "reviews": 284 } }
{ "id": "60041962835", "title": "Bash Coffee", "url": "https://yandex.com/maps/org/bash_coffee/60041962835/",
"rating": { "value": 5, "ratings": 76, "reviews": 74 } }
If you already have the place's Yandex Maps address, skip the search: place takes the organization URL or the number at its end. Then page through the reviews:
curl "https://api.toolzerhub.com/v1/yandex/maps/reviews?place=60041962835&page_size=50" \
-H "x-api-key: $TOOLZERHUB_API_KEY"
The response for Bash Coffee, trimmed to two reviews with author fields replaced:
{
"data": {
"place_id": "60041962835",
"sort": "newest",
"language": "en_US",
"count": 50,
"total_reviews": 74,
"total_pages": 2,
"page": 1,
"page_size": 50,
"reviews_remaining": 24,
"reviews": [
{
"review_id": "mc4twnU7L4qHBe6y65-dyZYAWFUYfbg",
"business_id": "60041962835",
"rating": 5,
"text": "Хорошая кофейня, вкусный кофе и бариста вежливый ",
"text_language": "ru",
"updated_at": "2026-10-04T16:16:32.997Z",
"pinned": false,
"likes": 1,
"dislikes": 2,
"photos": [],
"author_name": "Author A",
"author_public_id": "<id>",
"author_level": "Level 2 Local Expert",
"author_avatar_url_template": "<avatar url>"
},
{
"review_id": "_KsrPktnN4vv73Z6U5vvBVJvA2NFvUY",
"rating": 2,
"text": "Раньше было вкусно, сейчас вообще не вкусно, бариста всем видом показывает что вам тут не рады..",
"text_language": "ru",
"updated_at": "2026-08-29T14:57:52.536Z",
"likes": 3,
"dislikes": 1,
"author_name": "Author B"
}
]
}
}
total_reviews and total_pages come from Yandex and tell you when to stop. In a search row, rating.reviews equals total_reviews, while rating.ratings is larger: 76 against 74 for Bash Coffee. Use reviews to count review records.
Parameters
| Parameter | Values | Default |
|---|---|---|
place |
Organization URL or numeric id | required |
page |
1 and up | 1 |
page_size |
1 to 50 | 50 |
sort |
newest, highest_rated, lowest_rated |
newest |
language |
en_US, ru_RU, tr_TR, uk_UA |
en_US |
language changes labels, not review text, which stays in the author's language. Each route's full parameter list is in the reviews reference.
Export every review of a place to CSV
The script pages a place to its last page using total_pages and writes one row per review. It leaves out the author fields.
import csv
import os
import sys
import time
import requests
URL = "https://api.toolzerhub.com/v1/yandex/maps/reviews"
HEADERS = {"x-api-key": os.environ["TOOLZERHUB_API_KEY"]}
FIELDS = ["review_id", "place_id", "rating", "updated_at", "text_language",
"likes", "dislikes", "photos", "text"]
def cell(value):
# Spreadsheets run text that starts with = + - or @ as a formula.
if isinstance(value, str) and value[:1] in ("=", "+", "-", "@", "\t", "\r"):
return "'" + value
return value
def get(params, tries=5):
# Retry rate limits (429) and upstream hiccups (503).
for attempt in range(tries):
r = requests.get(URL, headers=HEADERS, params=params, timeout=120)
if r.status_code not in (429, 503) or attempt == tries - 1:
r.raise_for_status()
return r.json()["data"]
time.sleep(5 * (attempt + 1))
def main(place, out="yandex_reviews.csv"):
seen, total = set(), None
page = 1
with open(out, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
writer.writeheader()
while True:
data = get({"place": place, "page": page, "page_size": 50})
total = data["total_reviews"]
for r in data["reviews"]:
if r["review_id"] in seen:
continue
seen.add(r["review_id"])
writer.writerow({
"review_id": r["review_id"],
"place_id": data["place_id"],
"rating": r["rating"],
"updated_at": r["updated_at"],
"text_language": r["text_language"],
"likes": r["likes"],
"dislikes": r["dislikes"],
"photos": len(r["photos"]),
"text": cell((r["text"] or "").replace("\n", " ")),
})
if page >= data["total_pages"]:
break
page += 1
print(f"wrote {len(seen)} of {total} reviews to {out} ({page} calls)")
if __name__ == "__main__":
main(*sys.argv[1:])
Run it with a place id from the search:
export TOOLZERHUB_API_KEY=your_key
python yandex_reviews.py 60041962835 bash_coffee.csv
It printed wrote 74 of 74 reviews to bash_coffee.csv (2 calls), and the two calls took 3.6 and 2.7 seconds. The CSV held 64 five-star, 1 four-star, 2 three-star, 1 two-star and 6 one-star reviews, and 8 reviews with photos.
What it costs
Each call costs 1 credit and returns up to 50 reviews, so 1,000 reviews is 20 credits and a place with 935 reviews takes 19.
You get 100 free credits a month, enough for up to 5,000 reviews; $19 buys 10,000 credits that never expire, and plans for higher volume cover more places. Get a free API key and your first place is a CSV in seconds.
For the same job on Google, see the Google Maps reviews API, or how to scrape Google Maps with Python. For 2GIS, see the 2GIS reviews API. For Ozon product prices, see the Ozon price parser in Python. Our Developer APIs list the other platforms on the same key.
We are not affiliated with Yandex LLC.