# VseInstrumenti.ru Scraper (`crawlerbros/vseinstrumenti-scraper`) Actor

Scrape VseInstrumenti.ru - Russia's largest tools & equipment e-tailer. Discover product/category/brand URLs for free via the sitemap, search products, browse a category, or fetch full product details: price, discount, rating, reviews, images, specifications.

- **URL**: https://apify.com/crawlerbros/vseinstrumenti-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## VseInstrumenti.ru Scraper

Scrape **VseInstrumenti.ru** — Russia's largest online tools and equipment retailer.
Discover product, category, and brand URLs for free, search by keyword, browse any
category or brand page, or pull full product details from a list of URLs. Get clean,
structured data on price, discounts, ratings, reviews, images, and technical
specifications, ready for spreadsheets, price-monitoring dashboards, or market research.

### What this actor does

- **Four modes:** `discoverUrls` (free URL discovery), `search`, `byCategory`, `productDetails`
- **Discover URLs for free** — lists thousands of product, category, or brand URLs,
  optionally filtered by keyword, without a proxy
- **Full product details** — brand, gallery images, breadcrumbs, stock status, technical
  specifications, GTIN/manufacturer part number, downloadable manuals/spec sheets,
  similar/related products, original (pre-discount) price, sale/promo badge text, and
  pickup/delivery info
- **Optional customer reviews** — attach each product's review text, rating, author,
  and date with `includeReviews`
- **Filters and sorting** — filter by price range, minimum rating, and discount status;
  sort by popularity, price, rating, discount, or newest
- **Empty fields are omitted** — a field that VseInstrumenti.ru doesn't expose for a
  given record is left out entirely, never sent as `null` or an empty placeholder

### Output per product (`search` / `byCategory` / `productDetails`)

- `title` — product name
- `brand` — brand/manufacturer name
- `price` — current price in Russian rubles (RUB)
- `originalPrice` — pre-discount price, if the product is on sale
- `discountPercent` — discount percentage, derived from price vs. original price
- `currency` — price currency (normally `RUB`)
- `rating` — average customer rating (1–5)
- `reviewCount` — number of customer reviews
- `sellerName` — name of the merchant fulfilling the listing
- `availability` — stock status (`in stock` / `out of stock`)
- `images` — array of product image URLs
- `category` — product category
- `breadcrumbs` — full category breadcrumb trail (product detail pages)
- `description` — product description
- `sku` — manufacturer/seller SKU
- `mpn` — manufacturer part number, when published
- `gtin` — GTIN/EAN barcode, when published
- `specifications` — key/value map of technical characteristics (product detail pages)
- `promoLabel` — sale/promo badge text (e.g. "Распродажа остатков!"), when the product carries one
- `deliveryInfo` — pickup/delivery text as shown on the page (e.g. "Самовывоз: сегодня, бесплатно")
- `videoUrls` — array of product video URLs, when the page has a video
- `documents` — array of `{url, title}` for downloadable manuals/spec sheets/certificates (product detail pages)
- `relatedProducts` — array of `{productId, title, productUrl, price}` for similar/related products shown on the page (product detail pages)
- `reviews` — array of `{author, rating, date, text}`, only present when `includeReviews` is enabled (mode=`productDetails`)
- `productId` — VseInstrumenti's numeric product ID
- `productUrl` — canonical product page URL
- `recordType` — always `"product"`
- `scrapedAt` — UTC timestamp of when the record was scraped

### Output per discovered URL (`discoverUrls`)

- `url` — the discovered URL
- `urlType` — `product`, `category`, or `brand`
- `productId` — numeric product ID (product URLs only)
- `lastmod` — sitemap's last-modified date for the URL, if present
- `recordType` — always `"discoveredUrl"`
- `scrapedAt` — UTC timestamp of when the record was scraped

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `discoverUrls` | `discoverUrls` (free), `search`, `byCategory`, or `productDetails` |
| `discoverUrlType` | string | `product` | `product`, `category`, or `brand` (mode=`discoverUrls`) |
| `discoverKeyword` | string | – | Only keep discovered URLs containing this text (mode=`discoverUrls`) |
| `searchQuery` | string | `дрель` | Keyword to search for (mode=`search`) |
| `categoryUrls` | array | `[]` | Full category or brand URLs to browse (mode=`byCategory`) |
| `productUrls` | array | `[]` | Full product page URLs (mode=`productDetails`) |
| `sortBy` | string | – (site relevance) | `popular`, `priceAsc`, `priceDesc`, `rating`, `discount`, `new` (search/category only) |
| `minPrice` | integer | – | Minimum price filter in RUB |
| `maxPrice` | integer | – | Maximum price filter in RUB |
| `minRating` | integer | – | Minimum rating filter (1–5) |
| `onSaleOnly` | boolean | `false` | Only return discounted products |
| `includeReviews` | boolean | `false` | Also fetch and attach each product's `reviews` array (mode=`productDetails` only; one extra page load per product) |
| `maxReviews` | integer | `10` | Cap reviews per product when `includeReviews` is enabled (1–50) |
| `maxItems` | integer | `20` | Maximum number of records to return (1–1000) |
| `proxyConfiguration` | object | Residential (RU) | Apify proxy configuration — required for `search`/`byCategory`/`productDetails`; only used as a fallback for `discoverUrls` |

#### Example: free URL discovery

```json
{
  "mode": "discoverUrls",
  "discoverUrlType": "category",
  "discoverKeyword": "drel",
  "maxItems": 100
}
````

#### Example: keyword search sorted by discount

```json
{
  "mode": "search",
  "searchQuery": "шуруповерт",
  "sortBy": "discount",
  "onSaleOnly": true,
  "maxItems": 50
}
```

#### Example: browse a category with price and rating filters

```json
{
  "mode": "byCategory",
  "categoryUrls": ["https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/"],
  "minPrice": 500,
  "maxPrice": 5000,
  "minRating": 4,
  "maxItems": 60
}
```

#### Example: full product details with reviews

```json
{
  "mode": "productDetails",
  "productUrls": [
    "https://www.vseinstrumenti.ru/product/drel-udarnaya-bosch-gsb-13-re-0601217100-2162387/"
  ],
  "includeReviews": true,
  "maxReviews": 20
}
```

### Use cases

- **Bulk URL discovery** — collect thousands of product or category URLs for free
  before running a targeted scrape, or to feed into other tooling
- **Price monitoring** — track prices and discounts for specific products or an entire
  category over time
- **Competitive research** — compare assortments, pricing, and ratings across a tools
  and hardware category
- **Catalog enrichment** — pull structured product data (brand, images, specifications)
  for a known list of product URLs
- **Market research** — analyze rating/review distributions or technical specifications
  across a product category

### Other Russian marketplace actors by CrawlerBros

| Actor | URL |
|---|---|
| Citilink Scraper - Russian Electronics Store Products | <https://apify.com/crawlerbros/citilink-scraper> |
| DNS-Shop Scraper | <https://apify.com/crawlerbros/dns-shop-scraper> |
| Eldorado Scraper | <https://apify.com/crawlerbros/eldorado-scraper> |
| ETM Electrical Equipment Scraper | <https://apify.com/crawlerbros/etm-scraper> |
| Holodilnik.ru Scraper | <https://apify.com/crawlerbros/holodilnik-scraper> |
| Lemanapro Scraper | <https://apify.com/crawlerbros/lemanapro-scraper> |
| Magnit Market (mm.ru) Scraper | <https://apify.com/crawlerbros/magnit-market-scraper> |
| Maxidom Scraper | <https://apify.com/crawlerbros/maxidom-scraper> |
| Megamarket.ru Scraper | <https://apify.com/crawlerbros/megamarket-scraper> |
| M.Video Scraper | <https://apify.com/crawlerbros/mvideo-scraper> |
| Onlinetrade.ru Scraper | <https://apify.com/crawlerbros/onlinetrade-scraper> |
| Ozon Scraper - Products, Categories & Search | <https://apify.com/crawlerbros/ozon-scraper> |
| Petrovich Building Materials Scraper | <https://apify.com/crawlerbros/petrovich-scraper> |
| Regard Scraper | <https://apify.com/crawlerbros/regard-scraper> |
| Russkiy Svet (rs24.ru) Electrical Equipment Scraper | <https://apify.com/crawlerbros/russkiysvet-scraper> |
| Technopark.ru Scraper - Products, Categories & Search | <https://apify.com/crawlerbros/technopark-scraper> |
| VseInstrumenti.ru Scraper (this actor) | <https://apify.com/crawlerbros/vseinstrumenti-scraper> |
| Wildberries Scraper | <https://apify.com/crawlerbros/wildberries-scraper> |
| X-Com Shop Scraper | <https://apify.com/crawlerbros/xcom-shop-scraper> |
| Yandex Market Pro Scraper | <https://apify.com/crawlerbros/yandex-pro-scraper> |

### FAQ

**Do I need to configure the proxy myself?**
No — the default proxy configuration (Russian residential) is already set up. For
`search`, `byCategory`, and `productDetails` it's required for real data. For
`mode=discoverUrls` it's normally unused (that mode is free); it only kicks in
automatically as a fallback if the free sitemap path gets blocked for your run.

**Why is residential proxy required?**
VseInstrumenti.ru's storefront pages (search, category, and product pages) are
protected by an anti-bot system that blocks non-Russian and datacenter IPs with a
CAPTCHA challenge. A Russian residential IP passes the challenge; the sitemap used by
`discoverUrls`, however, is generally open and needs no proxy in the common case.

**Why did my `search`/`byCategory`/`productDetails` run return 0 results?**
VseInstrumenti.ru's anti-bot protection is session-based and can occasionally block an
individual run. Simply run the actor again — each run opens a fresh residential proxy
session. If a specific search or URL consistently returns nothing, double-check that
it's correct on vseinstrumenti.ru itself.

**How do I find category or product URLs to use as input?**
Run `mode=discoverUrls` first (it's free and fast) with `discoverUrlType=category` or
`product`, optionally with a `discoverKeyword` filter — then feed the resulting URLs
into `categoryUrls` or `productUrls`.

**What currency are prices in?**
Russian rubles (RUB), as displayed on the site.

**How do I get customer reviews?**
Set `includeReviews` to `true` with `mode=productDetails`. Each product record gets a
`reviews` array with up to `maxReviews` reviews (author, rating, date, text). This adds
one extra page load per product, so runs take a bit longer. Not every product has
reviews — those simply omit the field.

**Can I use a bare numeric product ID instead of a full URL?**
No — unlike some other Russian marketplaces, VseInstrumenti.ru's product URLs require
the full SEO slug and cannot be resolved from the numeric ID alone. Use
`mode=discoverUrls` to collect full product URLs first.

**Is this actor affiliated with VseInstrumenti.ru?**
No, this is an independent third-party actor that reads publicly available data from
vseinstrumenti.ru. It is not affiliated with, endorsed by, or sponsored by
VseInstrumenti.ru.

# Actor input Schema

## `mode` (type: `string`):

What to fetch. `discoverUrls` scans the site's sitemap for product/category/brand URLs and needs no proxy in the common case (it automatically falls back to the residential proxy only if the free sitemap path gets blocked). The other three modes need the Russian residential proxy to bypass the site's anti-bot protection.

## `discoverUrlType` (type: `string`):

Which kind of URL to pull from the sitemap.

## `discoverKeyword` (type: `string`):

Only keep discovered URLs containing this text (case-insensitive), e.g. `makita` or `drel`. Leave empty for no filter.

## `searchQuery` (type: `string`):

Free-text keyword search, e.g. `дрель`, `bosch`.

## `categoryUrls` (type: `array`):

Full VseInstrumenti.ru category or brand URLs to browse, e.g. `https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/` or `https://www.vseinstrumenti.ru/brand/makita-1/`. Use mode=discoverUrls to find more.

## `productUrls` (type: `array`):

Full product page URLs (`https://www.vseinstrumenti.ru/product/...`). Bare numeric IDs are not supported for this site — use mode=discoverUrls to collect full URLs first.

## `sortBy` (type: `string`):

How to sort results. Only applies to search and category browsing.

## `minPrice` (type: `integer`):

Drop products cheaper than this (in Russian rubles).

## `maxPrice` (type: `integer`):

Drop products more expensive than this (in Russian rubles).

## `minRating` (type: `integer`):

Drop products rated below this (1-5 scale).

## `onSaleOnly` (type: `boolean`):

Only emit products that currently have a discount applied.

## `includeReviews` (type: `boolean`):

When enabled, also visits each product's review page and attaches a `reviews` array (author, rating, date, text) to the record. Adds one extra page load per product.

## `maxReviews` (type: `integer`):

Only used when `includeReviews` is enabled. Caps how many reviews are attached per product.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## `proxyConfiguration` (type: `object`):

Used by search / byCategory / productDetails modes (VseInstrumenti.ru blocks non-Russian IPs at the WAF with a ServicePipe rotate-image CAPTCHA — a Russian residential proxy is required for those). For mode=discoverUrls this is only used as an automatic fallback if the free sitemap path gets blocked.

## Actor input object example

```json
{
  "mode": "discoverUrls",
  "discoverUrlType": "product",
  "searchQuery": "дрель",
  "categoryUrls": [
    "https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/"
  ],
  "productUrls": [],
  "sortBy": "",
  "onSaleOnly": false,
  "includeReviews": false,
  "maxReviews": 10,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}
```

# Actor output Schema

## `items` (type: `string`):

Dataset containing all scraped products and/or discovered URLs.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "discoverUrls",
    "discoverUrlType": "product",
    "searchQuery": "дрель",
    "categoryUrls": [
        "https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/"
    ],
    "productUrls": [],
    "sortBy": "",
    "onSaleOnly": false,
    "includeReviews": false,
    "maxReviews": 10,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/vseinstrumenti-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "discoverUrls",
    "discoverUrlType": "product",
    "searchQuery": "дрель",
    "categoryUrls": ["https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/"],
    "productUrls": [],
    "sortBy": "",
    "onSaleOnly": False,
    "includeReviews": False,
    "maxReviews": 10,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/vseinstrumenti-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "discoverUrls",
  "discoverUrlType": "product",
  "searchQuery": "дрель",
  "categoryUrls": [
    "https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/"
  ],
  "productUrls": [],
  "sortBy": "",
  "onSaleOnly": false,
  "includeReviews": false,
  "maxReviews": 10,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}' |
apify call crawlerbros/vseinstrumenti-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/vseinstrumenti-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "VseInstrumenti.ru Scraper",
        "description": "Scrape VseInstrumenti.ru - Russia's largest tools & equipment e-tailer. Discover product/category/brand URLs for free via the sitemap, search products, browse a category, or fetch full product details: price, discount, rating, reviews, images, specifications.",
        "version": "1.0",
        "x-build-id": "kQkuEfyRNL01gYv0j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~vseinstrumenti-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-vseinstrumenti-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~vseinstrumenti-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-vseinstrumenti-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~vseinstrumenti-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-vseinstrumenti-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "discoverUrls",
                            "search",
                            "byCategory",
                            "productDetails"
                        ],
                        "type": "string",
                        "description": "What to fetch. `discoverUrls` scans the site's sitemap for product/category/brand URLs and needs no proxy in the common case (it automatically falls back to the residential proxy only if the free sitemap path gets blocked). The other three modes need the Russian residential proxy to bypass the site's anti-bot protection.",
                        "default": "discoverUrls"
                    },
                    "discoverUrlType": {
                        "title": "URL type to discover (mode=discoverUrls)",
                        "enum": [
                            "product",
                            "category",
                            "brand"
                        ],
                        "type": "string",
                        "description": "Which kind of URL to pull from the sitemap.",
                        "default": "product"
                    },
                    "discoverKeyword": {
                        "title": "URL keyword filter (mode=discoverUrls)",
                        "type": "string",
                        "description": "Only keep discovered URLs containing this text (case-insensitive), e.g. `makita` or `drel`. Leave empty for no filter."
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text keyword search, e.g. `дрель`, `bosch`."
                    },
                    "categoryUrls": {
                        "title": "Category or brand URLs (mode=byCategory)",
                        "type": "array",
                        "description": "Full VseInstrumenti.ru category or brand URLs to browse, e.g. `https://www.vseinstrumenti.ru/category/klejkaya-lenta-6535/` or `https://www.vseinstrumenti.ru/brand/makita-1/`. Use mode=discoverUrls to find more.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "productUrls": {
                        "title": "Product URLs (mode=productDetails)",
                        "type": "array",
                        "description": "Full product page URLs (`https://www.vseinstrumenti.ru/product/...`). Bare numeric IDs are not supported for this site — use mode=discoverUrls to collect full URLs first.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort order (mode=search / byCategory)",
                        "enum": [
                            "",
                            "popular",
                            "priceAsc",
                            "priceDesc",
                            "rating",
                            "discount",
                            "new"
                        ],
                        "type": "string",
                        "description": "How to sort results. Only applies to search and category browsing.",
                        "default": ""
                    },
                    "minPrice": {
                        "title": "Min price (RUB)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Drop products cheaper than this (in Russian rubles)."
                    },
                    "maxPrice": {
                        "title": "Max price (RUB)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Drop products more expensive than this (in Russian rubles)."
                    },
                    "minRating": {
                        "title": "Min rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Drop products rated below this (1-5 scale)."
                    },
                    "onSaleOnly": {
                        "title": "On sale only",
                        "type": "boolean",
                        "description": "Only emit products that currently have a discount applied.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Include customer reviews (mode=productDetails)",
                        "type": "boolean",
                        "description": "When enabled, also visits each product's review page and attaches a `reviews` array (author, rating, date, text) to the record. Adds one extra page load per product.",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "Max reviews per product (mode=productDetails)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Only used when `includeReviews` is enabled. Caps how many reviews are attached per product.",
                        "default": 10
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records.",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Used by search / byCategory / productDetails modes (VseInstrumenti.ru blocks non-Russian IPs at the WAF with a ServicePipe rotate-image CAPTCHA — a Russian residential proxy is required for those). For mode=discoverUrls this is only used as an automatic fallback if the free sitemap path gets blocked.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "RU"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
