{
  "data": {
    "id": "ncXz9Uk7y7k1PqrRI",
    "actId": "XOsDPtQpdza8krB4z",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-06T18:17:49.365Z",
    "finishedAt": "2026-11-06T18:18:23.220Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 33751,
      "runTimeSecs": 33.751,
      "computeUnits": 0.03750111111111111,
      "imageSizeBytes": 3152844288
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Yandex Market Scraper Input\",\n  \"description\": \"Search products, browse categories, get product details with all seller offers, or scrape reviews from Yandex Market.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape. searchProducts: find products by keyword. browseCategory: scrape a product category. getProductDetails: full details + all seller offers for specific product URLs. getReviews: scrape product or seller reviews.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"searchProducts\",\n        \"browseCategory\",\n        \"getProductDetails\",\n        \"getReviews\"\n      ],\n      \"enumTitles\": [\n        \"Search products by keyword\",\n        \"Browse a product category\",\n        \"Get product details + all seller offers\",\n        \"Get product or seller reviews\"\n      ],\n      \"default\": \"searchProducts\",\n      \"prefill\": \"searchProducts\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search Queries\",\n      \"type\": \"array\",\n      \"description\": \"One or more search queries (mode=searchProducts). Examples: 'iPhone 15', 'Samsung Galaxy S24', or Russian keywords.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"iPhone 15\"\n      ]\n    },\n    \"categoryUrls\": {\n      \"title\": \"Category URLs\",\n      \"type\": \"array\",\n      \"description\": \"Yandex Market category page URLs (mode=browseCategory). Use the /list form, e.g. https://market.yandex.ru/catalog--smartfony/54726/list.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://market.yandex.ru/catalog--smartfony/54726/list\"\n      ]\n    },\n    \"productUrls\": {\n      \"title\": \"Product URLs\",\n      \"type\": \"array\",\n      \"description\": \"Yandex Market product page URLs (mode=getProductDetails or getReviews). Format: https://market.yandex.ru/product--{slug}/{id}\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609\"\n      ]\n    },\n    \"sellerUrls\": {\n      \"title\": \"Seller URLs (getReviews only)\",\n      \"type\": \"array\",\n      \"description\": \"Yandex Market seller page URLs (mode=getReviews only). Format: https://market.yandex.ru/shop--{slug}/{id}\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Max Items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of records to return per query/URL. Also caps offers per product and reviews per URL.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 50,\n      \"prefill\": 5\n    },\n    \"sortOrder\": {\n      \"title\": \"Sort Order (search & category only)\",\n      \"type\": \"string\",\n      \"description\": \"How to sort search results. Only applies in searchProducts and browseCategory modes.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"priceAsc\",\n        \"priceDesc\",\n        \"rating\",\n        \"popularity\"\n      ],\n      \"enumTitles\": [\n        \"Relevance (default)\",\n        \"Price: low to high\",\n        \"Price: high to low\",\n        \"Highest rated\",\n        \"Most popular\"\n      ],\n      \"default\": \"relevance\"\n    },\n    \"minPrice\": {\n      \"title\": \"Min Price (RUB)\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum price filter in Russian rubles. Only applies in searchProducts and browseCategory modes.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"maxPrice\": {\n      \"title\": \"Max Price (RUB)\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum price filter in Russian rubles. Only applies in searchProducts and browseCategory modes.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"minRating\": {\n      \"title\": \"Min Rating (search & category only)\",\n      \"type\": \"string\",\n      \"description\": \"Filter out products below this rating. Only applies in searchProducts and browseCategory modes.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"3\",\n        \"3.5\",\n        \"4\",\n        \"4.5\"\n      ],\n      \"enumTitles\": [\n        \"Any rating\",\n        \"3+ stars\",\n        \"3.5+ stars\",\n        \"4+ stars\",\n        \"4.5+ stars\"\n      ],\n      \"default\": \"any\"\n    },\n    \"reviewsSortOrder\": {\n      \"title\": \"Reviews Sort Order (getReviews only)\",\n      \"type\": \"string\",\n      \"description\": \"How to sort reviews. Only applies in getReviews mode.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"newest\",\n        \"highestRating\",\n        \"lowestRating\",\n        \"mostHelpful\"\n      ],\n      \"enumTitles\": [\n        \"Newest first\",\n        \"Highest rated first\",\n        \"Lowest rated first\",\n        \"Most helpful first\"\n      ],\n      \"default\": \"newest\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy Configuration (optional)\",\n      \"type\": \"object\",\n      \"description\": \"Optional. No proxy is required: listing modes use cookieless HTTP first. If Yandex Market proves a request is blocked, the actor automatically tries its residential proxy and then a browser fallback. Provide this only to override that automatic fallback.\",\n      \"editor\": \"proxy\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Yandex Market Price & Seller Offer Comparison Scraper\n\nPull product listings, pricing, and reviews from [Yandex Market](https://market.yandex.ru), the marketplace where most listings are fulfilled by multiple independent sellers competing on the same product page. Search by keyword, browse a category, compare every seller's price for one product, or collect reviews.\n\n## What this actor does\n\n- Searches Yandex Market by one or more keywords and returns matching product cards\n- Browses products listed under a category URL\n- Fetches a single product's full detail page together with competing seller offers\n- Collects reviews for a product or for a seller's storefront\n- Uses cookieless HTTP first and parses Yandex Market's SSR `data-zone-data` payloads\n- Retries with fresh sessions on robot/CAPTCHA pages and only then uses its automatic residential-proxy and browser fallbacks\n- Emits diagnostic records for blocked pages and partial products instead of silently returning false empty results\n- Omits empty fields from records\n\n## Output per product\n\n- `recordType` — always `product`\n- `productId` — Yandex Market model ID\n- `marketSku`, `wareId`, `oskuId` — Yandex Market SKU/offer identifiers when present\n- `name`\n- `url` — product page URL\n- `categoryPath` — array of category names from top-level down to the product's category (product-detail fetches only)\n- `rating`, `reviewCount` — when the page exposes them (search cards often do not)\n- `price`, `originalPrice`, `discount` — current price, pre-discount price, and discount percentage, in `currency` (`RUB`)\n- `sellerName`, `sellerRating`, `sellerUrl` — lead seller details when shown\n- `deliveryInfo`, `deliveryDateFrom`, `deliveryDateTo` — delivery estimate when shown\n- `availability` — `in_stock` or `out_of_stock` when shown\n- `stockCount` — last-stock count when Yandex exposes it\n- `sponsored` — whether the listing card is sponsored\n- `searchPosition` — 1-based position on the search/category page\n- `sourceQuery` — search query for `searchProducts`, or the category URL for `browseCategory`\n- `page` — listing page number\n- `badges` — badge titles shown on the card\n- `specs` — key/value map of technical specifications (product-detail fetches only, when the page lists them)\n- `images` — array of product image URLs\n- `offers` — populated only in product-detail fetches; array of competing seller offers for this product (see below)\n- `offersUrl`, `offersTotal` — Yandex's offers page URL and the total number of offers it reports when exposed\n- `partial`, `diagnostics` — present when a product page was only partially readable (for example not-on-sale or offers page blocked)\n- `scrapedAt`\n\n## Output per seller offer\n\nIn `getProductDetails` mode each offer is emitted as its own flat `recordType: \"offer\"` record and is also nested in the product's `offers` array.\n\n- `recordType` — always `offer`\n- `productId`, `name` — the product this offer belongs to\n- `sellerName`, `sellerRating`, `sellerUrl` — when shown on the offer\n- `price`, `originalPrice`, `discount`\n- `condition` — only when Yandex explicitly shows a condition such as resale/used\n- `availability`, `stockCount` — when shown\n- `deliveryInfo`, `deliveryDateFrom`, `deliveryDateTo` — when shown\n- `offerUrl` — direct offer/card URL\n- `offerPosition` — 1-based position on the offers page\n- `marketSku`, `wareId`, `oskuId`, `shopId`, `supplierId` — when present\n- `badges`, `images`\n- `scrapedAt`\n\n## Output per review\n\n- `recordType` — always `review`\n- `reviewType` — `product` or `seller`\n- `reviewId` — when Yandex exposes it\n- `productId`, `productName`, `productUrl` — present on product reviews\n- `sellerId`, `sellerName`, `sellerUrl` — present on seller reviews\n- `author`, `rating`, `title`, `text`, `pros`, `cons` — when the review shows them\n- `date`\n- `helpfulVotes` — agree votes when shown\n- `photos` — review photo URLs when shown\n- `scrapedAt`\n\nReviews are deduplicated by review ID (or author/date/text fingerprint when no ID is available) and capped by `maxItems`.\n\n## Output diagnostics\n\nWhen a page is blocked, times out, or returns unusable content, the actor emits a diagnostic record instead of pretending the result was an empty page:\n\n- `recordType` — `diagnostic`\n- `type` — `yandex_market_scraper_error`\n- `mode`, `stage` — for example `search`, `product`, `offers`, or `reviews`\n- `reason` — `captcha`, `vpn_block`, `network_error`, `not_found`, `offers_truncated`, `reviews_truncated`, etc.\n- `message`, `url`, `statusCode`, `captcha`, `attempts`, `scrapedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `searchProducts` | `searchProducts` / `browseCategory` / `getProductDetails` / `getReviews` |\n| `searchQueries` | array | – | Keywords to search, e.g. `[\"iPhone 15\", \"Samsung Galaxy\"]` (mode=searchProducts) |\n| `categoryUrls` | array | – | `market.yandex.ru/catalog` URLs to browse (mode=browseCategory) |\n| `productUrls` | array | – | Product URLs for detail fetch or product reviews (mode=getProductDetails, getReviews) |\n| `sellerUrls` | array | – | Seller storefront URLs for seller reviews (mode=getReviews) |\n| `maxItems` | integer | `50` | Records per query/URL (1–1000); also caps offers per product and reviews per URL |\n| `sortOrder` | string | `relevance` | `relevance` / `priceAsc` / `priceDesc` / `rating` / `popularity` |\n| `minPrice` | integer | – | Minimum price in RUB |\n| `maxPrice` | integer | – | Maximum price in RUB |\n| `minRating` | string | `any` | `any` / `3` / `3.5` / `4` / `4.5` |\n| `reviewsSortOrder` | string | `newest` | `newest` / `highestRating` / `lowestRating` / `mostHelpful` |\n| `proxyConfiguration` | object | – | Optional override. No proxy is required; the actor automatically tries its residential proxy only after a proven block |\n\n### Example: keyword search with price range\n\n```json\n{\n  \"mode\": \"searchProducts\",\n  \"searchQueries\": [\"iPhone 15\", \"Samsung Galaxy S24\"],\n  \"minPrice\": 50000,\n  \"maxPrice\": 100000,\n  \"sortOrder\": \"priceAsc\"\n}\n```\n\n### Example: browse a category\n\n```json\n{\n  \"mode\": \"browseCategory\",\n  \"categoryUrls\": [\"https://market.yandex.ru/catalog--smartfony/54726/list\"],\n  \"maxItems\": 100\n}\n```\n\n### Example: compare every seller's offer for one product\n\n```json\n{\n  \"mode\": \"getProductDetails\",\n  \"productUrls\": [\"https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609\"]\n}\n```\n\n### Example: newest reviews for a product\n\n```json\n{\n  \"mode\": \"getReviews\",\n  \"productUrls\": [\"https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609\"],\n  \"reviewsSortOrder\": \"newest\",\n  \"maxItems\": 100\n}\n```\n\n## Use cases\n\n- **Price monitoring** — track how a product's price moves across every seller offering it\n- **Seller benchmarking** — compare seller ratings, delivery times, and pricing side by side\n- **Catalog research** — pull a whole category's listings with current prices and availability\n- **Sentiment tracking** — gather product reviews with pros/cons to spot recurring complaints\n- **Market-entry analysis** — scope typical price ranges and seller competition before listing a product\n\n## FAQ\n\n**Does `searchQueries` accept Russian text?**  Yes — keywords can be in Russian or English; Yandex Market returns whatever matches on its own site.\n\n**How do I see every seller's price for one product, not just the lead offer?**  Use `mode: \"getProductDetails\"` with the product URL. The product record contains the nested `offers` array, and each offer is also emitted as a flat `recordType: \"offer\"` record. `maxItems` caps how many offers are collected.\n\n**Why does a `searchProducts` record have no `offers` field?**  Search and category listing cards only show the lead offer; the full offer comparison is fetched only in `getProductDetails` mode. Listing cards may also omit rating, seller, or stock when Yandex does not expose them in the SSR payload.\n\n**Can I get reviews for a seller instead of a product?**  Yes — pass a storefront URL in `sellerUrls` with `mode: \"getReviews\"`; those records carry `reviewType: \"seller\"` and seller identifying fields instead of product ones.\n\n**Do I need to configure the proxy myself?**  No. Listing modes are HTTP-first and cookieless. If a request is proven blocked, the actor automatically tries a residential proxy and then a browser fallback. You can still provide `proxyConfiguration` to override the automatic fallback.\n\n**What happens if a page is blocked or a run finds nothing?**  Blocked pages produce diagnostic records with the failing stage and reason. Partial products are marked `partial: true` and keep the fields that were readable. If the whole run produces no product, offer, or review records and no diagnostics, the dataset gets a single informational record (`type: \"yandex_market_scraper_error\"`).\n\n**What are the hard limits?**  Yandex Market SSR usually exposes roughly 8–20 listing cards per page; pagination stops when a page adds no new records. Product, offers, and reviews pages are more CAPTCHA-prone than listing pages, so the actor retries fresh sessions and then escalates to its proxy/browser fallbacks. The SSR offers page repeats its first 16 offers when paginated, so this version can collect at most the offers that page exposes; `maxItems` caps collection below that. Reviews beyond the first SSR reviews page are not available in this version. Prices are in RUB and use the current card price when Yandex shows one, with the regular price as `originalPrice`.\n\n**Is this affiliated with Yandex?**  No. This actor reads Yandex Market's publicly accessible pages and is not affiliated with or endorsed by Yandex.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "yandex-market-price-and-seller-offer-comparison",
      "title": "Yandex Market Price & Seller Offer Comparison Scraper",
      "description": "Scrape product listings, prices, seller offers, and reviews from Yandex Market. Search by keyword, browse a category, pull a product's full seller-offer comparison, or collect product and seller reviews.",
      "version": "1.0",
      "meta": {
        "templateId": "python-playwright"
      },
      "input": {
        "title": "Yandex Market Scraper Input",
        "description": "Search products, browse categories, get product details with all seller offers, or scrape reviews from Yandex Market.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to scrape. searchProducts: find products by keyword. browseCategory: scrape a product category. getProductDetails: full details + all seller offers for specific product URLs. getReviews: scrape product or seller reviews.",
            "editor": "select",
            "enum": [
              "searchProducts",
              "browseCategory",
              "getProductDetails",
              "getReviews"
            ],
            "enumTitles": [
              "Search products by keyword",
              "Browse a product category",
              "Get product details + all seller offers",
              "Get product or seller reviews"
            ],
            "default": "searchProducts",
            "prefill": "searchProducts"
          },
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "One or more search queries (mode=searchProducts). Examples: 'iPhone 15', 'Samsung Galaxy S24', or Russian keywords.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "iPhone 15"
            ]
          },
          "categoryUrls": {
            "title": "Category URLs",
            "type": "array",
            "description": "Yandex Market category page URLs (mode=browseCategory). Use the /list form, e.g. https://market.yandex.ru/catalog--smartfony/54726/list.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "https://market.yandex.ru/catalog--smartfony/54726/list"
            ]
          },
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "Yandex Market product page URLs (mode=getProductDetails or getReviews). Format: https://market.yandex.ru/product--{slug}/{id}",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609"
            ]
          },
          "sellerUrls": {
            "title": "Seller URLs (getReviews only)",
            "type": "array",
            "description": "Yandex Market seller page URLs (mode=getReviews only). Format: https://market.yandex.ru/shop--{slug}/{id}",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": []
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Maximum number of records to return per query/URL. Also caps offers per product and reviews per URL.",
            "minimum": 1,
            "maximum": 1000,
            "default": 50,
            "prefill": 5
          },
          "sortOrder": {
            "title": "Sort Order (search & category only)",
            "type": "string",
            "description": "How to sort search results. Only applies in searchProducts and browseCategory modes.",
            "editor": "select",
            "enum": [
              "relevance",
              "priceAsc",
              "priceDesc",
              "rating",
              "popularity"
            ],
            "enumTitles": [
              "Relevance (default)",
              "Price: low to high",
              "Price: high to low",
              "Highest rated",
              "Most popular"
            ],
            "default": "relevance"
          },
          "minPrice": {
            "title": "Min Price (RUB)",
            "type": "integer",
            "description": "Minimum price filter in Russian rubles. Only applies in searchProducts and browseCategory modes.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "maxPrice": {
            "title": "Max Price (RUB)",
            "type": "integer",
            "description": "Maximum price filter in Russian rubles. Only applies in searchProducts and browseCategory modes.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "minRating": {
            "title": "Min Rating (search & category only)",
            "type": "string",
            "description": "Filter out products below this rating. Only applies in searchProducts and browseCategory modes.",
            "editor": "select",
            "enum": [
              "any",
              "3",
              "3.5",
              "4",
              "4.5"
            ],
            "enumTitles": [
              "Any rating",
              "3+ stars",
              "3.5+ stars",
              "4+ stars",
              "4.5+ stars"
            ],
            "default": "any"
          },
          "reviewsSortOrder": {
            "title": "Reviews Sort Order (getReviews only)",
            "type": "string",
            "description": "How to sort reviews. Only applies in getReviews mode.",
            "editor": "select",
            "enum": [
              "newest",
              "highestRating",
              "lowestRating",
              "mostHelpful"
            ],
            "enumTitles": [
              "Newest first",
              "Highest rated first",
              "Lowest rated first",
              "Most helpful first"
            ],
            "default": "newest"
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration (optional)",
            "type": "object",
            "description": "Optional. No proxy is required: listing modes use cookieless HTTP first. If Yandex Market proves a request is blocked, the actor automatically tries its residential proxy and then a browser fallback. Provide this only to override that automatic fallback.",
            "editor": "proxy"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Yandex Market Price & Seller Offer Comparison Scraper Output",
        "description": "Yandex Market products with pricing and seller-offer data, plus product and seller reviews. Products have recordType=product, reviews have recordType=review.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Yandex Market records",
            "description": "Dataset with scraped Yandex Market products, seller offers, and reviews.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# Yandex Market Price & Seller Offer Comparison Scraper\n\nPull product listings, pricing, and reviews from [Yandex Market](https://market.yandex.ru), the marketplace where most listings are fulfilled by multiple independent sellers competing on the same product page. Search by keyword, browse a category, compare every seller's price for one product, or collect reviews.\n\n## What this actor does\n\n- Searches Yandex Market by one or more keywords and returns matching product cards\n- Browses products listed under a category URL\n- Fetches a single product's full detail page together with competing seller offers\n- Collects reviews for a product or for a seller's storefront\n- Uses cookieless HTTP first and parses Yandex Market's SSR `data-zone-data` payloads\n- Retries with fresh sessions on robot/CAPTCHA pages and only then uses its automatic residential-proxy and browser fallbacks\n- Emits diagnostic records for blocked pages and partial products instead of silently returning false empty results\n- Omits empty fields from records\n\n## Output per product\n\n- `recordType` — always `product`\n- `productId` — Yandex Market model ID\n- `marketSku`, `wareId`, `oskuId` — Yandex Market SKU/offer identifiers when present\n- `name`\n- `url` — product page URL\n- `categoryPath` — array of category names from top-level down to the product's category (product-detail fetches only)\n- `rating`, `reviewCount` — when the page exposes them (search cards often do not)\n- `price`, `originalPrice`, `discount` — current price, pre-discount price, and discount percentage, in `currency` (`RUB`)\n- `sellerName`, `sellerRating`, `sellerUrl` — lead seller details when shown\n- `deliveryInfo`, `deliveryDateFrom`, `deliveryDateTo` — delivery estimate when shown\n- `availability` — `in_stock` or `out_of_stock` when shown\n- `stockCount` — last-stock count when Yandex exposes it\n- `sponsored` — whether the listing card is sponsored\n- `searchPosition` — 1-based position on the search/category page\n- `sourceQuery` — search query for `searchProducts`, or the category URL for `browseCategory`\n- `page` — listing page number\n- `badges` — badge titles shown on the card\n- `specs` — key/value map of technical specifications (product-detail fetches only, when the page lists them)\n- `images` — array of product image URLs\n- `offers` — populated only in product-detail fetches; array of competing seller offers for this product (see below)\n- `offersUrl`, `offersTotal` — Yandex's offers page URL and the total number of offers it reports when exposed\n- `partial`, `diagnostics` — present when a product page was only partially readable (for example not-on-sale or offers page blocked)\n- `scrapedAt`\n\n## Output per seller offer\n\nIn `getProductDetails` mode each offer is emitted as its own flat `recordType: \"offer\"` record and is also nested in the product's `offers` array.\n\n- `recordType` — always `offer`\n- `productId`, `name` — the product this offer belongs to\n- `sellerName`, `sellerRating`, `sellerUrl` — when shown on the offer\n- `price`, `originalPrice`, `discount`\n- `condition` — only when Yandex explicitly shows a condition such as resale/used\n- `availability`, `stockCount` — when shown\n- `deliveryInfo`, `deliveryDateFrom`, `deliveryDateTo` — when shown\n- `offerUrl` — direct offer/card URL\n- `offerPosition` — 1-based position on the offers page\n- `marketSku`, `wareId`, `oskuId`, `shopId`, `supplierId` — when present\n- `badges`, `images`\n- `scrapedAt`\n\n## Output per review\n\n- `recordType` — always `review`\n- `reviewType` — `product` or `seller`\n- `reviewId` — when Yandex exposes it\n- `productId`, `productName`, `productUrl` — present on product reviews\n- `sellerId`, `sellerName`, `sellerUrl` — present on seller reviews\n- `author`, `rating`, `title`, `text`, `pros`, `cons` — when the review shows them\n- `date`\n- `helpfulVotes` — agree votes when shown\n- `photos` — review photo URLs when shown\n- `scrapedAt`\n\nReviews are deduplicated by review ID (or author/date/text fingerprint when no ID is available) and capped by `maxItems`.\n\n## Output diagnostics\n\nWhen a page is blocked, times out, or returns unusable content, the actor emits a diagnostic record instead of pretending the result was an empty page:\n\n- `recordType` — `diagnostic`\n- `type` — `yandex_market_scraper_error`\n- `mode`, `stage` — for example `search`, `product`, `offers`, or `reviews`\n- `reason` — `captcha`, `vpn_block`, `network_error`, `not_found`, `offers_truncated`, `reviews_truncated`, etc.\n- `message`, `url`, `statusCode`, `captcha`, `attempts`, `scrapedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `searchProducts` | `searchProducts` / `browseCategory` / `getProductDetails` / `getReviews` |\n| `searchQueries` | array | – | Keywords to search, e.g. `[\"iPhone 15\", \"Samsung Galaxy\"]` (mode=searchProducts) |\n| `categoryUrls` | array | – | `market.yandex.ru/catalog` URLs to browse (mode=browseCategory) |\n| `productUrls` | array | – | Product URLs for detail fetch or product reviews (mode=getProductDetails, getReviews) |\n| `sellerUrls` | array | – | Seller storefront URLs for seller reviews (mode=getReviews) |\n| `maxItems` | integer | `50` | Records per query/URL (1–1000); also caps offers per product and reviews per URL |\n| `sortOrder` | string | `relevance` | `relevance` / `priceAsc` / `priceDesc` / `rating` / `popularity` |\n| `minPrice` | integer | – | Minimum price in RUB |\n| `maxPrice` | integer | – | Maximum price in RUB |\n| `minRating` | string | `any` | `any` / `3` / `3.5` / `4` / `4.5` |\n| `reviewsSortOrder` | string | `newest` | `newest` / `highestRating` / `lowestRating` / `mostHelpful` |\n| `proxyConfiguration` | object | – | Optional override. No proxy is required; the actor automatically tries its residential proxy only after a proven block |\n\n### Example: keyword search with price range\n\n```json\n{\n  \"mode\": \"searchProducts\",\n  \"searchQueries\": [\"iPhone 15\", \"Samsung Galaxy S24\"],\n  \"minPrice\": 50000,\n  \"maxPrice\": 100000,\n  \"sortOrder\": \"priceAsc\"\n}\n```\n\n### Example: browse a category\n\n```json\n{\n  \"mode\": \"browseCategory\",\n  \"categoryUrls\": [\"https://market.yandex.ru/catalog--smartfony/54726/list\"],\n  \"maxItems\": 100\n}\n```\n\n### Example: compare every seller's offer for one product\n\n```json\n{\n  \"mode\": \"getProductDetails\",\n  \"productUrls\": [\"https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609\"]\n}\n```\n\n### Example: newest reviews for a product\n\n```json\n{\n  \"mode\": \"getReviews\",\n  \"productUrls\": [\"https://market.yandex.ru/product--smartfon-apple-iphone-15-6-gb128-gb-chernyy-nano-simesim/6307259609\"],\n  \"reviewsSortOrder\": \"newest\",\n  \"maxItems\": 100\n}\n```\n\n## Use cases\n\n- **Price monitoring** — track how a product's price moves across every seller offering it\n- **Seller benchmarking** — compare seller ratings, delivery times, and pricing side by side\n- **Catalog research** — pull a whole category's listings with current prices and availability\n- **Sentiment tracking** — gather product reviews with pros/cons to spot recurring complaints\n- **Market-entry analysis** — scope typical price ranges and seller competition before listing a product\n\n## FAQ\n\n**Does `searchQueries` accept Russian text?**  Yes — keywords can be in Russian or English; Yandex Market returns whatever matches on its own site.\n\n**How do I see every seller's price for one product, not just the lead offer?**  Use `mode: \"getProductDetails\"` with the product URL. The product record contains the nested `offers` array, and each offer is also emitted as a flat `recordType: \"offer\"` record. `maxItems` caps how many offers are collected.\n\n**Why does a `searchProducts` record have no `offers` field?**  Search and category listing cards only show the lead offer; the full offer comparison is fetched only in `getProductDetails` mode. Listing cards may also omit rating, seller, or stock when Yandex does not expose them in the SSR payload.\n\n**Can I get reviews for a seller instead of a product?**  Yes — pass a storefront URL in `sellerUrls` with `mode: \"getReviews\"`; those records carry `reviewType: \"seller\"` and seller identifying fields instead of product ones.\n\n**Do I need to configure the proxy myself?**  No. Listing modes are HTTP-first and cookieless. If a request is proven blocked, the actor automatically tries a residential proxy and then a browser fallback. You can still provide `proxyConfiguration` to override the automatic fallback.\n\n**What happens if a page is blocked or a run finds nothing?**  Blocked pages produce diagnostic records with the failing stage and reason. Partial products are marked `partial: true` and keep the fields that were readable. If the whole run produces no product, offer, or review records and no diagnostics, the dataset gets a single informational record (`type: \"yandex_market_scraper_error\"`).\n\n**What are the hard limits?**  Yandex Market SSR usually exposes roughly 8–20 listing cards per page; pagination stops when a page adds no new records. Product, offers, and reviews pages are more CAPTCHA-prone than listing pages, so the actor retries fresh sessions and then escalates to its proxy/browser fallbacks. The SSR offers page repeats its first 16 offers when paginated, so this version can collect at most the offers that page exposes; `maxItems` caps collection below that. Reviews beyond the first SSR reviews page are not available in this version. Prices are in RUB and use the current card price when Yandex shows one, with the regular price as `originalPrice`.\n\n**Is this affiliated with Yandex?**  No. This actor reads Yandex Market's publicly accessible pages and is not affiliated with or endorsed by Yandex.\n",
      "dockerfile": "../Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Yandex Market Results",
          "views": {
            "products": {
              "title": "Products Overview",
              "transformation": {
                "fields": [
                  "recordType",
                  "productId",
                  "marketSku",
                  "name",
                  "price",
                  "originalPrice",
                  "discount",
                  "rating",
                  "reviewCount",
                  "sellerName",
                  "availability",
                  "stockCount",
                  "deliveryInfo",
                  "sponsored",
                  "searchPosition",
                  "sourceQuery",
                  "page",
                  "partial",
                  "url",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "productId": {
                    "label": "Product ID",
                    "format": "text"
                  },
                  "marketSku": {
                    "label": "Market SKU",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price (RUB)",
                    "format": "number"
                  },
                  "originalPrice": {
                    "label": "Original Price",
                    "format": "number"
                  },
                  "discount": {
                    "label": "Discount %",
                    "format": "number"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewCount": {
                    "label": "Reviews",
                    "format": "number"
                  },
                  "sellerName": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "availability": {
                    "label": "Availability",
                    "format": "text"
                  },
                  "stockCount": {
                    "label": "Stock",
                    "format": "number"
                  },
                  "deliveryInfo": {
                    "label": "Delivery",
                    "format": "text"
                  },
                  "sponsored": {
                    "label": "Sponsored",
                    "format": "boolean"
                  },
                  "searchPosition": {
                    "label": "Search Position",
                    "format": "number"
                  },
                  "sourceQuery": {
                    "label": "Source Query",
                    "format": "text"
                  },
                  "page": {
                    "label": "Page",
                    "format": "number"
                  },
                  "partial": {
                    "label": "Partial",
                    "format": "boolean"
                  },
                  "url": {
                    "label": "Product URL",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            },
            "offers": {
              "title": "Seller Offers",
              "transformation": {
                "fields": [
                  "recordType",
                  "productId",
                  "name",
                  "sellerName",
                  "sellerRating",
                  "sellerUrl",
                  "price",
                  "originalPrice",
                  "discount",
                  "condition",
                  "availability",
                  "stockCount",
                  "deliveryInfo",
                  "offerPosition",
                  "marketSku",
                  "wareId",
                  "offerUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "productId": {
                    "label": "Product ID",
                    "format": "text"
                  },
                  "name": {
                    "label": "Product Name",
                    "format": "text"
                  },
                  "sellerName": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "sellerRating": {
                    "label": "Seller Rating",
                    "format": "number"
                  },
                  "sellerUrl": {
                    "label": "Seller URL",
                    "format": "link"
                  },
                  "price": {
                    "label": "Price (RUB)",
                    "format": "number"
                  },
                  "originalPrice": {
                    "label": "Original Price",
                    "format": "number"
                  },
                  "discount": {
                    "label": "Discount %",
                    "format": "number"
                  },
                  "condition": {
                    "label": "Condition",
                    "format": "text"
                  },
                  "availability": {
                    "label": "Availability",
                    "format": "text"
                  },
                  "stockCount": {
                    "label": "Stock",
                    "format": "number"
                  },
                  "deliveryInfo": {
                    "label": "Delivery",
                    "format": "text"
                  },
                  "offerPosition": {
                    "label": "Offer Position",
                    "format": "number"
                  },
                  "marketSku": {
                    "label": "Market SKU",
                    "format": "text"
                  },
                  "wareId": {
                    "label": "Ware ID",
                    "format": "text"
                  },
                  "offerUrl": {
                    "label": "Offer URL",
                    "format": "link"
                  }
                }
              }
            },
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "reviewType",
                  "reviewId",
                  "author",
                  "rating",
                  "title",
                  "text",
                  "pros",
                  "cons",
                  "date",
                  "helpfulVotes",
                  "photos",
                  "productName",
                  "productUrl",
                  "sellerName",
                  "sellerUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Record Type",
                    "format": "text"
                  },
                  "reviewType": {
                    "label": "Review Type",
                    "format": "text"
                  },
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "author": {
                    "label": "Author",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "text": {
                    "label": "Review Text",
                    "format": "text"
                  },
                  "pros": {
                    "label": "Pros",
                    "format": "text"
                  },
                  "cons": {
                    "label": "Cons",
                    "format": "text"
                  },
                  "date": {
                    "label": "Date",
                    "format": "text"
                  },
                  "helpfulVotes": {
                    "label": "Helpful Votes",
                    "format": "number"
                  },
                  "photos": {
                    "label": "Photos",
                    "format": "text"
                  },
                  "productName": {
                    "label": "Product",
                    "format": "text"
                  },
                  "productUrl": {
                    "label": "Product URL",
                    "format": "link"
                  },
                  "sellerName": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "sellerUrl": {
                    "label": "Seller URL",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            },
            "diagnostics": {
              "title": "Diagnostics",
              "transformation": {
                "fields": [
                  "recordType",
                  "mode",
                  "stage",
                  "reason",
                  "message",
                  "url",
                  "statusCode",
                  "captcha",
                  "attempts",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Record Type",
                    "format": "text"
                  },
                  "mode": {
                    "label": "Mode",
                    "format": "text"
                  },
                  "stage": {
                    "label": "Stage",
                    "format": "text"
                  },
                  "reason": {
                    "label": "Reason",
                    "format": "text"
                  },
                  "message": {
                    "label": "Message",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  },
                  "statusCode": {
                    "label": "HTTP Status",
                    "format": "number"
                  },
                  "captcha": {
                    "label": "CAPTCHA",
                    "format": "boolean"
                  },
                  "attempts": {
                    "label": "Attempts",
                    "format": "number"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "8ce3839d87c05b8abab5b0ad9d8da7f9422cc272bc97cc5578c5bbd68109ba85",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03750111111111111
    }
  }
}