YandexAnswer

Yandex Maps reviews API: Yandex's options and 2 calls

Yandex's Organization Search API documents no reviews. Ours returns a place's Yandex Maps reviews as JSON, 50 per call for 1 credit.

5 min read

Short answer

  • Yandex's Organization Search API documents business fields such as name, address, phones and hours, but no rating or review fields.
  • It is a yearly license from $2,750 for up to 250,000 requests, and the only reviews product is a widget that shows ratings and reviews on your own page.
  • ToolzerHub returns a place's public Yandex Maps reviews as JSON, 50 per call at 1 credit a call, with 100 free credits a month.
On this page

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:

bash
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:

json
{ "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:

bash
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:

json
{
  "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.

python
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:

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

Get this data from your own code

The Yandex API returns it as JSON with one x-api-key header. 100 free credits monthly.