{
  "data": {
    "id": "D8zEadOFOCSTloS2r",
    "actId": "YYnETyuUyTTy4DeLE",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-27T12:00:00.676Z",
    "finishedAt": "2026-10-27T12:00:12.829Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 11694,
      "runTimeSecs": 11.694,
      "computeUnits": 0.012993333333333334,
      "imageSizeBytes": 319924736
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Yandex Maps Scraper Input\",\n  \"description\": \"Search Yandex Maps for businesses, fetch full business cards, or collect reviews. Cookieless: no login, API key, cookies or browser are needed.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to collect. searchPlaces finds businesses by keyword. getDetails returns full business cards for IDs or URLs. getReviews collects customer reviews for IDs, URLs or a search.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"searchPlaces\",\n        \"getDetails\",\n        \"getReviews\"\n      ],\n      \"enumTitles\": [\n        \"Search places by keyword\",\n        \"Get business details for IDs or URLs\",\n        \"Get reviews for businesses or a search\"\n      ],\n      \"default\": \"searchPlaces\",\n      \"prefill\": \"searchPlaces\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"One query per line, for example 'coffee' or 'dentist'. Used by searchPlaces, and by getReviews when no business IDs or URLs are supplied.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"coffee\"\n      ]\n    },\n    \"city\": {\n      \"title\": \"City\",\n      \"type\": \"string\",\n      \"description\": \"City name in any language, for example 'Moscow', 'Kazan' or 'Istanbul'. Yandex Maps resolves the city centre and passes it to the search.\",\n      \"prefill\": \"Moscow\",\n      \"editor\": \"textfield\"\n    },\n    \"coordinates\": {\n      \"title\": \"Centre point (latitude,longitude)\",\n      \"type\": \"string\",\n      \"description\": \"Optional point for a local search, for example '55.7558,37.6173'. When set, it overrides the city centre. Combine with Radius to search around the point.\",\n      \"editor\": \"textfield\"\n    },\n    \"radiusKm\": {\n      \"title\": \"Radius (km)\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only places within this distance of the centre point or city centre. Results are measured by straight-line distance and filtered strictly.\",\n      \"minimum\": 1,\n      \"maximum\": 50\n    },\n    \"bbox\": {\n      \"title\": \"Bounding box (west,south,east,north)\",\n      \"type\": \"string\",\n      \"description\": \"Optional rectangular area, for example '37.45,55.65,37.85,55.85'. Results outside the rectangle are dropped.\",\n      \"editor\": \"textfield\"\n    },\n    \"businessIds\": {\n      \"title\": \"Business IDs\",\n      \"type\": \"array\",\n      \"description\": \"Yandex Maps organization IDs, one per line. Use for getDetails or getReviews.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"startUrls\": {\n      \"title\": \"Business or search URLs\",\n      \"type\": \"array\",\n      \"description\": \"Yandex Maps organization URLs, short links or search URLs, one per line. Business and search URLs work in both getDetails and getReviews.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum records\",\n      \"type\": \"integer\",\n      \"description\": \"Run-wide cap. In searchPlaces and getDetails it counts places; in getReviews it counts reviews across all businesses.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 100,\n      \"prefill\": 3\n    },\n    \"maxReviewsPerPlace\": {\n      \"title\": \"Maximum reviews per place\",\n      \"type\": \"integer\",\n      \"description\": \"Review cap for each business. Yandex exposes up to 600 reviews per sort order; the actor combines four orders to reach up to 2,400 unique reviews per business.\",\n      \"minimum\": 1,\n      \"maximum\": 2400,\n      \"default\": 100\n    },\n    \"reviewSort\": {\n      \"title\": \"Review sort order\",\n      \"type\": \"string\",\n      \"description\": \"Primary review order. When you ask for more than 600 reviews per place, the actor also walks the other three orders and merges them, removing duplicates.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"time\",\n        \"rating_desc\",\n        \"rating_asc\"\n      ],\n      \"enumTitles\": [\n        \"Most relevant\",\n        \"Newest first\",\n        \"Highest rating first\",\n        \"Lowest rating first\"\n      ],\n      \"default\": \"relevance\"\n    },\n    \"reviewMinRating\": {\n      \"title\": \"Minimum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only reviews with at least this many stars (1-5).\",\n      \"minimum\": 1,\n      \"maximum\": 5\n    },\n    \"reviewMaxRating\": {\n      \"title\": \"Maximum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only reviews with at most this many stars (1-5).\",\n      \"minimum\": 1,\n      \"maximum\": 5\n    },\n    \"reviewDateFrom\": {\n      \"title\": \"Reviews from date\",\n      \"type\": \"string\",\n      \"description\": \"Keep reviews published on or after this date (YYYY-MM-DD).\",\n      \"editor\": \"textfield\"\n    },\n    \"reviewDateTo\": {\n      \"title\": \"Reviews to date\",\n      \"type\": \"string\",\n      \"description\": \"Keep reviews published on or before this date (YYYY-MM-DD).\",\n      \"editor\": \"textfield\"\n    },\n    \"reviewTextContains\": {\n      \"title\": \"Review text contains\",\n      \"type\": \"array\",\n      \"description\": \"One phrase per line. A review is kept when its text contains any of these phrases, ignoring case.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"reviewRequireOwnerReply\": {\n      \"title\": \"Only reviews with an owner reply\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only reviews where the business wrote a reply.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minRating\": {\n      \"title\": \"Minimum place rating\",\n      \"type\": \"string\",\n      \"description\": \"Drop businesses below this rating. Businesses without a rating are dropped when a threshold is set. Applies to place records.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"3\",\n        \"3.5\",\n        \"4\",\n        \"4.5\",\n        \"4.7\",\n        \"4.9\"\n      ],\n      \"enumTitles\": [\n        \"Any rating\",\n        \"3+ stars\",\n        \"3.5+ stars\",\n        \"4+ stars\",\n        \"4.5+ stars\",\n        \"4.7+ stars\",\n        \"4.9+ stars\"\n      ],\n      \"default\": \"any\"\n    },\n    \"minReviewCount\": {\n      \"title\": \"Minimum place review count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop businesses with fewer text reviews. 0 disables the filter. Applies to place records.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"default\": 0\n    },\n    \"requirePhone\": {\n      \"title\": \"Only businesses with a phone\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop businesses without a phone number. Applies to searchPlaces and getDetails.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"requireWebsite\": {\n      \"title\": \"Only businesses with a website\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop businesses without a website. Applies to searchPlaces and getDetails.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"openNow\": {\n      \"title\": \"Only open businesses\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only businesses that Yandex reports as open at collection time. Applies to place records.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"goodPlace\": {\n      \"title\": \"Only Good Place businesses\",\n      \"type\": \"boolean\",\n      \"description\": \"Yandex Good Place quality filter. Used as a server-side search filter and verified client-side on place records.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"priceCategories\": {\n      \"title\": \"Price categories\",\n      \"type\": \"array\",\n      \"description\": \"Keep businesses in any of these price bands. Leave empty for all prices. Server-side in searchPlaces, verified client-side elsewhere.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"price_cheap\",\n          \"price_reasonable\",\n          \"price_expensive\",\n          \"price_very_expensive\"\n        ],\n        \"enumTitles\": [\n          \"Inexpensive\",\n          \"Moderate\",\n          \"Expensive\",\n          \"Very expensive\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"categoryIds\": {\n      \"title\": \"Category IDs\",\n      \"type\": \"array\",\n      \"description\": \"Optional Yandex category IDs, one per line. The category ID appears in each place's categoryDetails. Used server-side in searchPlaces and verified client-side.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"maxPagesPerQuery\": {\n      \"title\": \"Maximum search pages per query\",\n      \"type\": \"integer\",\n      \"description\": \"Yandex returns 25 businesses per page. More pages find more places but take longer.\",\n      \"minimum\": 1,\n      \"maximum\": 50,\n      \"default\": 10\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Maximum concurrent requests\",\n      \"type\": \"integer\",\n      \"description\": \"How many business pages or review batches to process at once. Higher is faster but more likely to trigger rate limiting.\",\n      \"minimum\": 1,\n      \"maximum\": 20,\n      \"default\": 5\n    },\n    \"yandexDomain\": {\n      \"title\": \"Yandex domain\",\n      \"type\": \"string\",\n      \"description\": \"Regional Yandex domain. yandex.com works worldwide; regional domains return local metadata.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"yandex.com\",\n        \"yandex.ru\",\n        \"yandex.com.tr\",\n        \"yandex.kz\",\n        \"yandex.uz\",\n        \"yandex.by\"\n      ],\n      \"enumTitles\": [\n        \"International (yandex.com)\",\n        \"Russia (yandex.ru)\",\n        \"Turkey (yandex.com.tr)\",\n        \"Kazakhstan (yandex.kz)\",\n        \"Uzbekistan (yandex.uz)\",\n        \"Belarus (yandex.by)\"\n      ],\n      \"default\": \"yandex.com\",\n      \"prefill\": \"yandex.com\"\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Interface and metadata language. Review text stays in the reviewer's language and translations are returned separately.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"ru\",\n        \"tr\",\n        \"de\",\n        \"fr\",\n        \"uk\",\n        \"kk\",\n        \"uz\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Russian\",\n        \"Turkish\",\n        \"German\",\n        \"French\",\n        \"Ukrainian\",\n        \"Kazakh\",\n        \"Uzbek\"\n      ],\n      \"default\": \"en\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy and negotiates access automatically. Supply a proxy only if you want to pin a specific country or provider.\",\n      \"editor\": \"proxy\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Yandex Maps Business Search, Details & Reviews Scraper\r\n\r\nCollect business listings, full business cards and customer reviews from [Yandex Maps](https://yandex.com/maps/) — the map service used across Russia, Belarus, Kazakhstan, Uzbekistan and Turkey. The actor reads Yandex Maps' public server-rendered pages and its internal JSON endpoints directly, so it needs no login, no API key, no cookies and no browser.\r\n\r\n## What this actor does\r\n\r\n- **Three modes:** search by keyword and location (`searchPlaces`), fetch complete business cards (`getDetails`), or collect reviews (`getReviews`).\r\n- **Search precisely:** combine a query with a city, a centre point and radius, or a bounding box. Filter by rating, review count, phone, website, price band, category, current opening status and Yandex's Good Place flag.\r\n- **Full business cards:** contacts, categories, rating breakdown, price range, structured opening hours, features, chain membership, verified-owner flag, popular times, review-aspect sentiment, metro/stops, photos and coordinates.\r\n- **Deep reviews:** up to 2,400 unique reviews per business. Yandex exposes at most 600 reviews per sort order, so the actor walks all four orders (relevance, newest, highest rated, lowest rated) when you ask for more than 600, then removes duplicates.\r\n- **Review filters:** rating range, date range, text phrases and \"has an owner reply\".\r\n- **Run-wide caps and global deduplication:** `maxItems` counts records across the whole run, not per query. Duplicate businesses and reviews are removed across queries and pages.\r\n- **Omit-empty records:** a field is written only when Yandex has a real value for it. Every record carries `recordType`, `sourceUrl` and `scrapedAt`.\r\n- **International:** six regional domains and eight interface languages.\r\n\r\n## Output per record\r\n\r\nEach dataset item is either a place (`recordType: \"place\"`) or a review (`recordType: \"review\"`).\r\n\r\n### Place record\r\n\r\n- `placeId`, `name`, `shortName`, `description`, `url` — identity and canonical Yandex Maps page\r\n- `address`, `city`, `country`, `postalCode`, `addressDetails` — location\r\n- `coordinates` — `{ lat, lng }`; `distanceKm` when a centre point was used\r\n- `rating`, `ratingCount`, `reviewCount` — Yandex's rating value, star-rating count and text-review count\r\n- `categories`, `categoryDetails` — category names and Yandex category IDs\r\n- `phone`, `phones`, `website`, `websites`, `socialLinks` — contacts\r\n- `workingHours`, `workingHoursText`, `isOpenNow`, `openStatus` — structured week schedule and current status\r\n- `features`, `featureGroups` — amenities, payment methods and other business attributes\r\n- `priceRange`, `priceCategory`, `priceCategoryName` — price signals when Yandex publishes them\r\n- `chain`, `isChain`, `verifiedOwner`, `isGoodPlace`, `goodPlaceYear`, `businessStatus`\r\n- `popularTimes` — Yandex's 24-hour popularity histogram per weekday\r\n- `aspects` — review-aspect sentiment (staff, drinks, atmosphere, …)\r\n- `photos`, `photoCount`, `logoUrl`\r\n- `metro`, `stops` — nearest transit with distance\r\n- `advertiser` — legal name and TIN when the row is a promoted listing\r\n- `searchQuery`, `searchCity`, `position` — search provenance when applicable\r\n- `sourceUrl`, `scrapedAt`, `recordType`\r\n\r\n### Review record\r\n\r\n- `reviewId`, `rating`, `text`, `textLanguage`, `translations`\r\n- `date`, `updatedAt` — review date and full timestamp\r\n- `author`, `authorUrl`, `authorPublicId`, `authorAvatarUrl`, `authorLevel`\r\n- `likes`, `dislikes`, `isPinned`\r\n- `ownerReply` — `{ text, date, updatedAt }` when the business replied\r\n- `photos`, `photoCount`\r\n- `placeId`, `placeName`, `placeUrl`, `placeRating`, `placeReviewCount`, `placeAddress`, `placeCity`, `placePhone`, `placeWebsite`\r\n- `sortOrder`, `position`, `sourceUrl`, `scrapedAt`, `recordType`\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `searchPlaces` | `searchPlaces`, `getDetails` or `getReviews` |\r\n| `searchQueries` | array of strings | – | Keywords for `searchPlaces`, and for `getReviews` discovery when no IDs/URLs are supplied |\r\n| `city` | string | – | City name in any language; resolved to Yandex's region centre |\r\n| `coordinates` | string | – | Centre point as `lat,lng`, e.g. `55.7558,37.6173` |\r\n| `radiusKm` | integer | – | Keep places within 1–50 km of the centre (strict client-side distance filter) |\r\n| `bbox` | string | – | Rectangle as `west,south,east,north`; results outside it are dropped |\r\n| `businessIds` | array of strings | – | Yandex organization IDs for `getDetails` / `getReviews` |\r\n| `startUrls` | array of strings | – | Organization URLs, short links or Yandex search URLs |\r\n| `maxItems` | integer | `100` | Run-wide record cap (1–5,000) |\r\n| `maxReviewsPerPlace` | integer | `100` | Reviews per business (1–2,400) |\r\n| `reviewSort` | string | `relevance` | `relevance`, `time`, `rating_desc` or `rating_asc` |\r\n| `reviewMinRating` | integer | – | Minimum review stars (1–5) |\r\n| `reviewMaxRating` | integer | – | Maximum review stars (1–5) |\r\n| `reviewDateFrom` | string | – | Earliest review date (`YYYY-MM-DD`) |\r\n| `reviewDateTo` | string | – | Latest review date (`YYYY-MM-DD`) |\r\n| `reviewTextContains` | array of strings | – | Keep reviews containing any phrase (case-insensitive) |\r\n| `reviewRequireOwnerReply` | boolean | `false` | Only reviews with a business reply |\r\n| `minRating` | string | `any` | Minimum place rating: `any`, `3`, `3.5`, `4`, `4.5`, `4.7`, `4.9` |\r\n| `minReviewCount` | integer | `0` | Minimum text reviews for a place |\r\n| `requirePhone` | boolean | `false` | Only places with a phone |\r\n| `requireWebsite` | boolean | `false` | Only places with a website |\r\n| `openNow` | boolean | `false` | Only places Yandex reports as open now |\r\n| `goodPlace` | boolean | `false` | Yandex Good Place filter (server-side in search, verified on every place record) |\r\n| `priceCategories` | array of strings | `[]` | `price_cheap`, `price_reasonable`, `price_expensive`, `price_very_expensive` |\r\n| `categoryIds` | array of strings | – | Yandex category IDs (see `categoryDetails` in the output) |\r\n| `maxPagesPerQuery` | integer | `10` | Search pages per query, 25 businesses each |\r\n| `maxConcurrency` | integer | `5` | Concurrent business/review workers (1–20) |\r\n| `yandexDomain` | string | `yandex.com` | `yandex.com`, `.ru`, `.com.tr`, `.kz`, `.uz`, `.by` |\r\n| `language` | string | `en` | `en`, `ru`, `tr`, `de`, `fr`, `uk`, `kk`, `uz` |\r\n| `proxyConfiguration` | object | – | Optional. The actor works without a proxy; supply one only to pin a country/provider |\r\n\r\n### Example: coffee shops in Moscow\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"coffee\"],\r\n  \"city\": \"Moscow\",\r\n  \"maxItems\": 3\r\n}\r\n```\r\n\r\n### Example: cafés within 3 km of a point\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"coffee\"],\r\n  \"coordinates\": \"55.7558,37.6173\",\r\n  \"radiusKm\": 3,\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: full cards from a search URL\r\n\r\n```json\r\n{\r\n  \"mode\": \"getDetails\",\r\n  \"startUrls\": [\"https://yandex.com/maps/?text=coffee%20Moscow\"],\r\n  \"maxItems\": 20\r\n}\r\n```\r\n\r\n### Example: newest negative reviews with owner replies\r\n\r\n```json\r\n{\r\n  \"mode\": \"getReviews\",\r\n  \"businessIds\": [\"150968830833\"],\r\n  \"maxReviewsPerPlace\": 300,\r\n  \"reviewSort\": \"time\",\r\n  \"reviewMaxRating\": 3,\r\n  \"reviewRequireOwnerReply\": true\r\n}\r\n```\r\n\r\n### Example: Turkish restaurants in Istanbul\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"restaurant\"],\r\n  \"city\": \"Istanbul\",\r\n  \"yandexDomain\": \"yandex.com.tr\",\r\n  \"language\": \"tr\",\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Lead generation** — build lists of local businesses with phones, websites and social links by category and city.\r\n- **Market research** — compare ratings, price bands and feature adoption across a city or district.\r\n- **Reputation monitoring** — pull recent reviews with owner replies and translations on a schedule.\r\n- **Location analysis** — count nearby competitors within a radius or rectangle and read popular-times curves.\r\n- **Data enrichment** — resolve Yandex organization IDs and URLs into structured business cards.\r\n\r\n## How it works\r\n\r\n1. The actor fetches the normal Yandex Maps search or organization page.\r\n2. It reads the page's `state-view` JSON (`config`, `stack[0].results`) instead of parsing fragile HTML.\r\n3. For additional search pages and reviews it calls Yandex's internal `/maps/api/search` and `/maps/api/business/fetchReviews` endpoints, signing each request with the same `s` parameter the site's frontend computes.\r\n4. If the signature or an endpoint changes, the actor refreshes the page state and retries once, then falls back to the server-rendered page and reports a partial-result warning instead of silently returning wrong data.\r\n\r\n## FAQ\r\n\r\n**Does this need a Yandex account, API key or cookies?**\r\nNo. It uses public pages and the site's own session cookies, which are set automatically. Nothing is sent to Yandex except the normal request parameters.\r\n\r\n**Why is `maxItems` applied to the whole run?**\r\nSo two queries cannot return more rows than you asked for. The same business found by several queries is emitted once. Use `maxPagesPerQuery` to control search depth.\r\n\r\n**How many reviews can I get per business?**\r\nUp to 2,400 unique reviews. Yandex returns at most 600 reviews per sort order; the actor fetches the selected order and, when you request more than 600, the other three orders too, then de-duplicates by review ID.\r\n\r\n**Why does a broad search return fewer places than Yandex's result count?**\r\nYandex's `totalResultCount` is unstable and Yandex repeats businesses across pages. The actor stops after three pages without a new business, at `maxPagesPerQuery`, or at `maxItems`. Narrow the query with a city, radius or category to get more precise coverage.\r\n\r\n**Are review texts translated?**\r\nThe original text is always in `text`; `translations` holds Yandex's translations when available. Set `language` to change the interface and metadata language, not the review language.\r\n\r\n**Does the actor use a proxy?**\r\nIt works without one. If Yandex blocks the direct connection, the actor retries with a fresh session and can switch to Apify Proxy automatically. You can also supply your own proxy configuration; it is never required and never prefilled.\r\n\r\n**What is missing?**\r\nYandex does not publish email addresses, a full menu, an official legal-entity block or an AI review summary on these public pages. Promoted rows sometimes expose an advertiser name and TIN. Those gaps are documented in `docs/RESEARCH-yandex-maps.md`.\r\n\r\n**Is this affiliated with Yandex?**\r\nNo. This is an independent third-party actor that reads publicly available Yandex Maps pages. It is not affiliated with or endorsed by Yandex.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "yandex-maps-business-search-details-and-reviews",
      "title": "Yandex Maps Business Search, Details & Reviews Scraper",
      "description": "Search Yandex Maps by keyword or map area, fetch business cards, and collect up to 2,400 reviews per place. Returns contacts, ratings, hours, features, popular times, aspects, owner replies and translations without cookies, an API key or a browser.",
      "version": "2.0",
      "meta": {
        "templateId": "python-start"
      },
      "buildTag": "latest",
      "input": {
        "title": "Yandex Maps Scraper Input",
        "description": "Search Yandex Maps for businesses, fetch full business cards, or collect reviews. Cookieless: no login, API key, cookies or browser are needed.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to collect. searchPlaces finds businesses by keyword. getDetails returns full business cards for IDs or URLs. getReviews collects customer reviews for IDs, URLs or a search.",
            "editor": "select",
            "enum": [
              "searchPlaces",
              "getDetails",
              "getReviews"
            ],
            "enumTitles": [
              "Search places by keyword",
              "Get business details for IDs or URLs",
              "Get reviews for businesses or a search"
            ],
            "default": "searchPlaces",
            "prefill": "searchPlaces"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "One query per line, for example 'coffee' or 'dentist'. Used by searchPlaces, and by getReviews when no business IDs or URLs are supplied.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "coffee"
            ]
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "City name in any language, for example 'Moscow', 'Kazan' or 'Istanbul'. Yandex Maps resolves the city centre and passes it to the search.",
            "prefill": "Moscow",
            "editor": "textfield"
          },
          "coordinates": {
            "title": "Centre point (latitude,longitude)",
            "type": "string",
            "description": "Optional point for a local search, for example '55.7558,37.6173'. When set, it overrides the city centre. Combine with Radius to search around the point.",
            "editor": "textfield"
          },
          "radiusKm": {
            "title": "Radius (km)",
            "type": "integer",
            "description": "Keep only places within this distance of the centre point or city centre. Results are measured by straight-line distance and filtered strictly.",
            "minimum": 1,
            "maximum": 50
          },
          "bbox": {
            "title": "Bounding box (west,south,east,north)",
            "type": "string",
            "description": "Optional rectangular area, for example '37.45,55.65,37.85,55.85'. Results outside the rectangle are dropped.",
            "editor": "textfield"
          },
          "businessIds": {
            "title": "Business IDs",
            "type": "array",
            "description": "Yandex Maps organization IDs, one per line. Use for getDetails or getReviews.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Business or search URLs",
            "type": "array",
            "description": "Yandex Maps organization URLs, short links or search URLs, one per line. Business and search URLs work in both getDetails and getReviews.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum records",
            "type": "integer",
            "description": "Run-wide cap. In searchPlaces and getDetails it counts places; in getReviews it counts reviews across all businesses.",
            "minimum": 1,
            "maximum": 5000,
            "default": 100,
            "prefill": 3
          },
          "maxReviewsPerPlace": {
            "title": "Maximum reviews per place",
            "type": "integer",
            "description": "Review cap for each business. Yandex exposes up to 600 reviews per sort order; the actor combines four orders to reach up to 2,400 unique reviews per business.",
            "minimum": 1,
            "maximum": 2400,
            "default": 100
          },
          "reviewSort": {
            "title": "Review sort order",
            "type": "string",
            "description": "Primary review order. When you ask for more than 600 reviews per place, the actor also walks the other three orders and merges them, removing duplicates.",
            "editor": "select",
            "enum": [
              "relevance",
              "time",
              "rating_desc",
              "rating_asc"
            ],
            "enumTitles": [
              "Most relevant",
              "Newest first",
              "Highest rating first",
              "Lowest rating first"
            ],
            "default": "relevance"
          },
          "reviewMinRating": {
            "title": "Minimum review rating",
            "type": "integer",
            "description": "Keep only reviews with at least this many stars (1-5).",
            "minimum": 1,
            "maximum": 5
          },
          "reviewMaxRating": {
            "title": "Maximum review rating",
            "type": "integer",
            "description": "Keep only reviews with at most this many stars (1-5).",
            "minimum": 1,
            "maximum": 5
          },
          "reviewDateFrom": {
            "title": "Reviews from date",
            "type": "string",
            "description": "Keep reviews published on or after this date (YYYY-MM-DD).",
            "editor": "textfield"
          },
          "reviewDateTo": {
            "title": "Reviews to date",
            "type": "string",
            "description": "Keep reviews published on or before this date (YYYY-MM-DD).",
            "editor": "textfield"
          },
          "reviewTextContains": {
            "title": "Review text contains",
            "type": "array",
            "description": "One phrase per line. A review is kept when its text contains any of these phrases, ignoring case.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "reviewRequireOwnerReply": {
            "title": "Only reviews with an owner reply",
            "type": "boolean",
            "description": "Keep only reviews where the business wrote a reply.",
            "default": false,
            "prefill": false
          },
          "minRating": {
            "title": "Minimum place rating",
            "type": "string",
            "description": "Drop businesses below this rating. Businesses without a rating are dropped when a threshold is set. Applies to place records.",
            "editor": "select",
            "enum": [
              "any",
              "3",
              "3.5",
              "4",
              "4.5",
              "4.7",
              "4.9"
            ],
            "enumTitles": [
              "Any rating",
              "3+ stars",
              "3.5+ stars",
              "4+ stars",
              "4.5+ stars",
              "4.7+ stars",
              "4.9+ stars"
            ],
            "default": "any"
          },
          "minReviewCount": {
            "title": "Minimum place review count",
            "type": "integer",
            "description": "Drop businesses with fewer text reviews. 0 disables the filter. Applies to place records.",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0
          },
          "requirePhone": {
            "title": "Only businesses with a phone",
            "type": "boolean",
            "description": "Drop businesses without a phone number. Applies to searchPlaces and getDetails.",
            "default": false,
            "prefill": false
          },
          "requireWebsite": {
            "title": "Only businesses with a website",
            "type": "boolean",
            "description": "Drop businesses without a website. Applies to searchPlaces and getDetails.",
            "default": false,
            "prefill": false
          },
          "openNow": {
            "title": "Only open businesses",
            "type": "boolean",
            "description": "Keep only businesses that Yandex reports as open at collection time. Applies to place records.",
            "default": false,
            "prefill": false
          },
          "goodPlace": {
            "title": "Only Good Place businesses",
            "type": "boolean",
            "description": "Yandex Good Place quality filter. Used as a server-side search filter and verified client-side on place records.",
            "default": false,
            "prefill": false
          },
          "priceCategories": {
            "title": "Price categories",
            "type": "array",
            "description": "Keep businesses in any of these price bands. Leave empty for all prices. Server-side in searchPlaces, verified client-side elsewhere.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "price_cheap",
                "price_reasonable",
                "price_expensive",
                "price_very_expensive"
              ],
              "enumTitles": [
                "Inexpensive",
                "Moderate",
                "Expensive",
                "Very expensive"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "categoryIds": {
            "title": "Category IDs",
            "type": "array",
            "description": "Optional Yandex category IDs, one per line. The category ID appears in each place's categoryDetails. Used server-side in searchPlaces and verified client-side.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "maxPagesPerQuery": {
            "title": "Maximum search pages per query",
            "type": "integer",
            "description": "Yandex returns 25 businesses per page. More pages find more places but take longer.",
            "minimum": 1,
            "maximum": 50,
            "default": 10
          },
          "maxConcurrency": {
            "title": "Maximum concurrent requests",
            "type": "integer",
            "description": "How many business pages or review batches to process at once. Higher is faster but more likely to trigger rate limiting.",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          },
          "yandexDomain": {
            "title": "Yandex domain",
            "type": "string",
            "description": "Regional Yandex domain. yandex.com works worldwide; regional domains return local metadata.",
            "editor": "select",
            "enum": [
              "yandex.com",
              "yandex.ru",
              "yandex.com.tr",
              "yandex.kz",
              "yandex.uz",
              "yandex.by"
            ],
            "enumTitles": [
              "International (yandex.com)",
              "Russia (yandex.ru)",
              "Turkey (yandex.com.tr)",
              "Kazakhstan (yandex.kz)",
              "Uzbekistan (yandex.uz)",
              "Belarus (yandex.by)"
            ],
            "default": "yandex.com",
            "prefill": "yandex.com"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Interface and metadata language. Review text stays in the reviewer's language and translations are returned separately.",
            "editor": "select",
            "enum": [
              "en",
              "ru",
              "tr",
              "de",
              "fr",
              "uk",
              "kk",
              "uz"
            ],
            "enumTitles": [
              "English",
              "Russian",
              "Turkish",
              "German",
              "French",
              "Ukrainian",
              "Kazakh",
              "Uzbek"
            ],
            "default": "en"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy and negotiates access automatically. Supply a proxy only if you want to pin a specific country or provider.",
            "editor": "proxy"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Yandex Maps Business Search, Details & Reviews Scraper Output",
        "description": "One dataset containing Yandex Maps place records (recordType=place) and review records (recordType=review). Empty fields are omitted.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Yandex Maps results",
            "description": "Dataset with scraped Yandex Maps places and reviews. Use the Places, Reviews and Detailed views in the run's Storage tab.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Yandex Maps Results",
          "views": {
            "places": {
              "title": "Places",
              "transformation": {
                "fields": [
                  "recordType",
                  "placeId",
                  "name",
                  "address",
                  "city",
                  "rating",
                  "reviewCount",
                  "priceRange",
                  "phone",
                  "website",
                  "categories",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "placeId": {
                    "label": "Place ID",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "address": {
                    "label": "Address",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewCount": {
                    "label": "Reviews",
                    "format": "number"
                  },
                  "priceRange": {
                    "label": "Price",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "website": {
                    "label": "Website",
                    "format": "link"
                  },
                  "categories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "url": {
                    "label": "Yandex Maps URL",
                    "format": "link"
                  }
                }
              }
            },
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "placeName",
                  "reviewId",
                  "author",
                  "rating",
                  "date",
                  "text",
                  "hasOwnerReply",
                  "placeUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "placeName": {
                    "label": "Place",
                    "format": "text"
                  },
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "author": {
                    "label": "Author",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "date": {
                    "label": "Date",
                    "format": "text"
                  },
                  "text": {
                    "label": "Review",
                    "format": "text"
                  },
                  "hasOwnerReply": {
                    "label": "Owner replied",
                    "format": "text"
                  },
                  "placeUrl": {
                    "label": "Place URL",
                    "format": "link"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed view",
              "transformation": {
                "fields": [
                  "recordType",
                  "placeId",
                  "placeName",
                  "name",
                  "url",
                  "sourceUrl",
                  "address",
                  "city",
                  "country",
                  "coordinates",
                  "distanceKm",
                  "rating",
                  "ratingCount",
                  "reviewCount",
                  "priceRange",
                  "priceCategory",
                  "phone",
                  "phones",
                  "website",
                  "websites",
                  "socialLinks",
                  "workingHoursText",
                  "isOpenNow",
                  "openStatus",
                  "features",
                  "chain",
                  "verifiedOwner",
                  "goodPlaceYear",
                  "isGoodPlace",
                  "popularTimes",
                  "aspects",
                  "categories",
                  "categoryDetails",
                  "photos",
                  "author",
                  "authorUrl",
                  "authorLevel",
                  "reviewId",
                  "text",
                  "date",
                  "translations",
                  "ownerReply",
                  "likes",
                  "dislikes",
                  "isPinned",
                  "sortOrder",
                  "searchQuery",
                  "position",
                  "scrapedAt",
                  "hasOwnerReply",
                  "workingHours"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "placeId": {
                    "label": "Place ID",
                    "format": "text"
                  },
                  "placeName": {
                    "label": "Place",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  },
                  "sourceUrl": {
                    "label": "Source URL",
                    "format": "link"
                  },
                  "address": {
                    "label": "Address",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "country": {
                    "label": "Country",
                    "format": "text"
                  },
                  "coordinates": {
                    "label": "Coordinates",
                    "format": "object"
                  },
                  "distanceKm": {
                    "label": "Distance (km)",
                    "format": "number"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "ratingCount": {
                    "label": "Rating count",
                    "format": "number"
                  },
                  "reviewCount": {
                    "label": "Review count",
                    "format": "number"
                  },
                  "priceRange": {
                    "label": "Price",
                    "format": "text"
                  },
                  "priceCategory": {
                    "label": "Price category",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "phones": {
                    "label": "Phones",
                    "format": "array"
                  },
                  "website": {
                    "label": "Website",
                    "format": "link"
                  },
                  "websites": {
                    "label": "Websites",
                    "format": "array"
                  },
                  "socialLinks": {
                    "label": "Social links",
                    "format": "array"
                  },
                  "workingHoursText": {
                    "label": "Hours",
                    "format": "text"
                  },
                  "isOpenNow": {
                    "label": "Open now",
                    "format": "text"
                  },
                  "openStatus": {
                    "label": "Open status",
                    "format": "text"
                  },
                  "features": {
                    "label": "Features",
                    "format": "array"
                  },
                  "chain": {
                    "label": "Chain",
                    "format": "object"
                  },
                  "verifiedOwner": {
                    "label": "Verified owner",
                    "format": "text"
                  },
                  "popularTimes": {
                    "label": "Popular times",
                    "format": "object"
                  },
                  "aspects": {
                    "label": "Review aspects",
                    "format": "array"
                  },
                  "categories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "categoryDetails": {
                    "label": "Category details",
                    "format": "array"
                  },
                  "photos": {
                    "label": "Photos",
                    "format": "array"
                  },
                  "author": {
                    "label": "Review author",
                    "format": "text"
                  },
                  "authorUrl": {
                    "label": "Author URL",
                    "format": "link"
                  },
                  "authorLevel": {
                    "label": "Author level",
                    "format": "text"
                  },
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "text": {
                    "label": "Review text",
                    "format": "text"
                  },
                  "translations": {
                    "label": "Translations",
                    "format": "object"
                  },
                  "ownerReply": {
                    "label": "Owner reply",
                    "format": "object"
                  },
                  "likes": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "dislikes": {
                    "label": "Dislikes",
                    "format": "number"
                  },
                  "isPinned": {
                    "label": "Pinned",
                    "format": "text"
                  },
                  "sortOrder": {
                    "label": "Sort order",
                    "format": "text"
                  },
                  "searchQuery": {
                    "label": "Search query",
                    "format": "text"
                  },
                  "position": {
                    "label": "Position",
                    "format": "number"
                  },
                  "scrapedAt": {
                    "label": "Scraped at",
                    "format": "text"
                  },
                  "hasOwnerReply": {
                    "label": "Owner replied",
                    "format": "text"
                  },
                  "date": {
                    "label": "Review date",
                    "format": "text"
                  },
                  "workingHours": {
                    "label": "Working hours",
                    "format": "object"
                  },
                  "isGoodPlace": {
                    "label": "Good Place",
                    "format": "text"
                  },
                  "goodPlaceYear": {
                    "label": "Good Place year",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# Yandex Maps Business Search, Details & Reviews Scraper\r\n\r\nCollect business listings, full business cards and customer reviews from [Yandex Maps](https://yandex.com/maps/) — the map service used across Russia, Belarus, Kazakhstan, Uzbekistan and Turkey. The actor reads Yandex Maps' public server-rendered pages and its internal JSON endpoints directly, so it needs no login, no API key, no cookies and no browser.\r\n\r\n## What this actor does\r\n\r\n- **Three modes:** search by keyword and location (`searchPlaces`), fetch complete business cards (`getDetails`), or collect reviews (`getReviews`).\r\n- **Search precisely:** combine a query with a city, a centre point and radius, or a bounding box. Filter by rating, review count, phone, website, price band, category, current opening status and Yandex's Good Place flag.\r\n- **Full business cards:** contacts, categories, rating breakdown, price range, structured opening hours, features, chain membership, verified-owner flag, popular times, review-aspect sentiment, metro/stops, photos and coordinates.\r\n- **Deep reviews:** up to 2,400 unique reviews per business. Yandex exposes at most 600 reviews per sort order, so the actor walks all four orders (relevance, newest, highest rated, lowest rated) when you ask for more than 600, then removes duplicates.\r\n- **Review filters:** rating range, date range, text phrases and \"has an owner reply\".\r\n- **Run-wide caps and global deduplication:** `maxItems` counts records across the whole run, not per query. Duplicate businesses and reviews are removed across queries and pages.\r\n- **Omit-empty records:** a field is written only when Yandex has a real value for it. Every record carries `recordType`, `sourceUrl` and `scrapedAt`.\r\n- **International:** six regional domains and eight interface languages.\r\n\r\n## Output per record\r\n\r\nEach dataset item is either a place (`recordType: \"place\"`) or a review (`recordType: \"review\"`).\r\n\r\n### Place record\r\n\r\n- `placeId`, `name`, `shortName`, `description`, `url` — identity and canonical Yandex Maps page\r\n- `address`, `city`, `country`, `postalCode`, `addressDetails` — location\r\n- `coordinates` — `{ lat, lng }`; `distanceKm` when a centre point was used\r\n- `rating`, `ratingCount`, `reviewCount` — Yandex's rating value, star-rating count and text-review count\r\n- `categories`, `categoryDetails` — category names and Yandex category IDs\r\n- `phone`, `phones`, `website`, `websites`, `socialLinks` — contacts\r\n- `workingHours`, `workingHoursText`, `isOpenNow`, `openStatus` — structured week schedule and current status\r\n- `features`, `featureGroups` — amenities, payment methods and other business attributes\r\n- `priceRange`, `priceCategory`, `priceCategoryName` — price signals when Yandex publishes them\r\n- `chain`, `isChain`, `verifiedOwner`, `isGoodPlace`, `goodPlaceYear`, `businessStatus`\r\n- `popularTimes` — Yandex's 24-hour popularity histogram per weekday\r\n- `aspects` — review-aspect sentiment (staff, drinks, atmosphere, …)\r\n- `photos`, `photoCount`, `logoUrl`\r\n- `metro`, `stops` — nearest transit with distance\r\n- `advertiser` — legal name and TIN when the row is a promoted listing\r\n- `searchQuery`, `searchCity`, `position` — search provenance when applicable\r\n- `sourceUrl`, `scrapedAt`, `recordType`\r\n\r\n### Review record\r\n\r\n- `reviewId`, `rating`, `text`, `textLanguage`, `translations`\r\n- `date`, `updatedAt` — review date and full timestamp\r\n- `author`, `authorUrl`, `authorPublicId`, `authorAvatarUrl`, `authorLevel`\r\n- `likes`, `dislikes`, `isPinned`\r\n- `ownerReply` — `{ text, date, updatedAt }` when the business replied\r\n- `photos`, `photoCount`\r\n- `placeId`, `placeName`, `placeUrl`, `placeRating`, `placeReviewCount`, `placeAddress`, `placeCity`, `placePhone`, `placeWebsite`\r\n- `sortOrder`, `position`, `sourceUrl`, `scrapedAt`, `recordType`\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `searchPlaces` | `searchPlaces`, `getDetails` or `getReviews` |\r\n| `searchQueries` | array of strings | – | Keywords for `searchPlaces`, and for `getReviews` discovery when no IDs/URLs are supplied |\r\n| `city` | string | – | City name in any language; resolved to Yandex's region centre |\r\n| `coordinates` | string | – | Centre point as `lat,lng`, e.g. `55.7558,37.6173` |\r\n| `radiusKm` | integer | – | Keep places within 1–50 km of the centre (strict client-side distance filter) |\r\n| `bbox` | string | – | Rectangle as `west,south,east,north`; results outside it are dropped |\r\n| `businessIds` | array of strings | – | Yandex organization IDs for `getDetails` / `getReviews` |\r\n| `startUrls` | array of strings | – | Organization URLs, short links or Yandex search URLs |\r\n| `maxItems` | integer | `100` | Run-wide record cap (1–5,000) |\r\n| `maxReviewsPerPlace` | integer | `100` | Reviews per business (1–2,400) |\r\n| `reviewSort` | string | `relevance` | `relevance`, `time`, `rating_desc` or `rating_asc` |\r\n| `reviewMinRating` | integer | – | Minimum review stars (1–5) |\r\n| `reviewMaxRating` | integer | – | Maximum review stars (1–5) |\r\n| `reviewDateFrom` | string | – | Earliest review date (`YYYY-MM-DD`) |\r\n| `reviewDateTo` | string | – | Latest review date (`YYYY-MM-DD`) |\r\n| `reviewTextContains` | array of strings | – | Keep reviews containing any phrase (case-insensitive) |\r\n| `reviewRequireOwnerReply` | boolean | `false` | Only reviews with a business reply |\r\n| `minRating` | string | `any` | Minimum place rating: `any`, `3`, `3.5`, `4`, `4.5`, `4.7`, `4.9` |\r\n| `minReviewCount` | integer | `0` | Minimum text reviews for a place |\r\n| `requirePhone` | boolean | `false` | Only places with a phone |\r\n| `requireWebsite` | boolean | `false` | Only places with a website |\r\n| `openNow` | boolean | `false` | Only places Yandex reports as open now |\r\n| `goodPlace` | boolean | `false` | Yandex Good Place filter (server-side in search, verified on every place record) |\r\n| `priceCategories` | array of strings | `[]` | `price_cheap`, `price_reasonable`, `price_expensive`, `price_very_expensive` |\r\n| `categoryIds` | array of strings | – | Yandex category IDs (see `categoryDetails` in the output) |\r\n| `maxPagesPerQuery` | integer | `10` | Search pages per query, 25 businesses each |\r\n| `maxConcurrency` | integer | `5` | Concurrent business/review workers (1–20) |\r\n| `yandexDomain` | string | `yandex.com` | `yandex.com`, `.ru`, `.com.tr`, `.kz`, `.uz`, `.by` |\r\n| `language` | string | `en` | `en`, `ru`, `tr`, `de`, `fr`, `uk`, `kk`, `uz` |\r\n| `proxyConfiguration` | object | – | Optional. The actor works without a proxy; supply one only to pin a country/provider |\r\n\r\n### Example: coffee shops in Moscow\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"coffee\"],\r\n  \"city\": \"Moscow\",\r\n  \"maxItems\": 3\r\n}\r\n```\r\n\r\n### Example: cafés within 3 km of a point\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"coffee\"],\r\n  \"coordinates\": \"55.7558,37.6173\",\r\n  \"radiusKm\": 3,\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: full cards from a search URL\r\n\r\n```json\r\n{\r\n  \"mode\": \"getDetails\",\r\n  \"startUrls\": [\"https://yandex.com/maps/?text=coffee%20Moscow\"],\r\n  \"maxItems\": 20\r\n}\r\n```\r\n\r\n### Example: newest negative reviews with owner replies\r\n\r\n```json\r\n{\r\n  \"mode\": \"getReviews\",\r\n  \"businessIds\": [\"150968830833\"],\r\n  \"maxReviewsPerPlace\": 300,\r\n  \"reviewSort\": \"time\",\r\n  \"reviewMaxRating\": 3,\r\n  \"reviewRequireOwnerReply\": true\r\n}\r\n```\r\n\r\n### Example: Turkish restaurants in Istanbul\r\n\r\n```json\r\n{\r\n  \"mode\": \"searchPlaces\",\r\n  \"searchQueries\": [\"restaurant\"],\r\n  \"city\": \"Istanbul\",\r\n  \"yandexDomain\": \"yandex.com.tr\",\r\n  \"language\": \"tr\",\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Lead generation** — build lists of local businesses with phones, websites and social links by category and city.\r\n- **Market research** — compare ratings, price bands and feature adoption across a city or district.\r\n- **Reputation monitoring** — pull recent reviews with owner replies and translations on a schedule.\r\n- **Location analysis** — count nearby competitors within a radius or rectangle and read popular-times curves.\r\n- **Data enrichment** — resolve Yandex organization IDs and URLs into structured business cards.\r\n\r\n## How it works\r\n\r\n1. The actor fetches the normal Yandex Maps search or organization page.\r\n2. It reads the page's `state-view` JSON (`config`, `stack[0].results`) instead of parsing fragile HTML.\r\n3. For additional search pages and reviews it calls Yandex's internal `/maps/api/search` and `/maps/api/business/fetchReviews` endpoints, signing each request with the same `s` parameter the site's frontend computes.\r\n4. If the signature or an endpoint changes, the actor refreshes the page state and retries once, then falls back to the server-rendered page and reports a partial-result warning instead of silently returning wrong data.\r\n\r\n## FAQ\r\n\r\n**Does this need a Yandex account, API key or cookies?**\r\nNo. It uses public pages and the site's own session cookies, which are set automatically. Nothing is sent to Yandex except the normal request parameters.\r\n\r\n**Why is `maxItems` applied to the whole run?**\r\nSo two queries cannot return more rows than you asked for. The same business found by several queries is emitted once. Use `maxPagesPerQuery` to control search depth.\r\n\r\n**How many reviews can I get per business?**\r\nUp to 2,400 unique reviews. Yandex returns at most 600 reviews per sort order; the actor fetches the selected order and, when you request more than 600, the other three orders too, then de-duplicates by review ID.\r\n\r\n**Why does a broad search return fewer places than Yandex's result count?**\r\nYandex's `totalResultCount` is unstable and Yandex repeats businesses across pages. The actor stops after three pages without a new business, at `maxPagesPerQuery`, or at `maxItems`. Narrow the query with a city, radius or category to get more precise coverage.\r\n\r\n**Are review texts translated?**\r\nThe original text is always in `text`; `translations` holds Yandex's translations when available. Set `language` to change the interface and metadata language, not the review language.\r\n\r\n**Does the actor use a proxy?**\r\nIt works without one. If Yandex blocks the direct connection, the actor retries with a fresh session and can switch to Apify Proxy automatically. You can also supply your own proxy configuration; it is never required and never prefilled.\r\n\r\n**What is missing?**\r\nYandex does not publish email addresses, a full menu, an official legal-entity block or an AI review summary on these public pages. Promoted rows sometimes expose an advertiser name and TIN. Those gaps are documented in `docs/RESEARCH-yandex-maps.md`.\r\n\r\n**Is this affiliated with Yandex?**\r\nNo. This is an independent third-party actor that reads publicly available Yandex Maps pages. It is not affiliated with or endorsed by Yandex.\r\n"
    },
    "buildNumber": "2.0.2",
    "imageDigest": "fe032ced275c384fbf81d0fcf366d79dd0143a2cec99db8bed0143e7c5d1047a",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.012993333333333334
    }
  }
}