# Wildberries Scraper: Products, Prices, Reviews, No Login (`cliqtomedia/wildberries-scraper`) Actor

Search Wildberries by keyword or paste article numbers and get products with price, sale price, rating, review count, seller, stock and images, or the product's written reviews. Choose the delivery region. No login, no cookies.

- **URL**: https://apify.com/cliqtomedia/wildberries-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 products

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Search Wildberries (wildberries.ru) by keyword, or paste article numbers or product links, and get products as one row each: name, brand, price, sale price, discount, rating, number of reviews, seller, stock, sizes, images and the product link. A third mode saves the written reviews of products. Prices and stock are for the delivery region you choose. No Wildberries login, no cookies, no API key. The prefilled search (`наушники`, 10 products) usually finishes in 30–80 seconds and costs $0.049 on the Free plan.

Use it for marketplace research: compare prices and discounts in a category, watch competitors' sellers and stock, check ratings and read what buyers write about a product.

![Wildberries Products Scraper: search queries or article numbers in, Wildberries products with sale price, rating, stock and seller out, one row each](https://api.apify.com/v2/key-value-stores/Yx4lShW7FxjrtVCGn/records/README-HERO-20261015.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor reads the public Wildberries data a visitor sees on wildberries.ru, in one of three modes:

- **Search** — for each query, it reads the search results page by page, in Wildberries' order (or by price, rating, newest). One row per product: price and sale price in RUB, discount, rating, review count, brand, seller, stock, sizes, colours, images, category and the position in the results.
- **Products** — for each article number (nmId) or product link, it reads the product card: the same fields plus stock **per size**. Products that do not exist are marked `not_found` and are free.
- **Reviews** — for each article number, it saves the newest written reviews: stars, text, pros, cons, colour and size bought, tags, helpful votes, the seller's answer and the number of photos. Each review has the article number of the variant (colour or size) it was written for. Buyer names are not saved.

Every row has `status`, `errorCode`, `source`, `url` and `fetchedAt`. A value Wildberries does not show is `null`, never 0. Entries that give nothing (`not_found`, `error`) are free; the Dataset lists the first 25 of them per run and `RUN_SUMMARY.withoutResults` lists all.

#### Good fit

- Price and discount research in a Wildberries category, by query and region (`dest`).
- Tracking the same products over time: run on a schedule and compare `salePrice` and `stocks` by `nmId`.
- Checking a list of article numbers: still on sale, current price, stock per size, seller.
- Reading buyer reviews of your products or your competitors' products.

#### Not a fit / limits

- Wildberries shows at most 60 pages (about 6,000 products) per search query. For more, split the query (`наушники беспроводные`, `наушники игровые`) or use other sort orders.
- Large stocks are shown to visitors as a capped number (usually 37–54), not the warehouse total. Small stocks and 0 (sold out) are exact.
- Reviews: Wildberries serves about the 1,000 newest written reviews per product. No buyer names, no review photos.
- No seller legal details, no sales numbers, no price history, no login-only data (personal discounts, WB Club prices).

### Quick start

1. Open the **Input** tab.
2. Keep **What to scrape** = `Search by keyword` and the prefilled query `наушники`, or type your own.
3. Keep **Max products per query** = 10 (prefill) or raise it.
4. Click **Start**.
5. Open the **Output** tab, view **Products**, and check `salePrice`, `rating`, `feedbacks` and `supplier`.

Expected result: 10 rows with status `complete`, in Wildberries search order.

For a list of products, set **What to scrape** = `Products by article number or URL` and paste article numbers or links into **Article numbers or product URLs**. For reviews, choose `Reviews of products`.

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Category price research | `queries`, `sort`, `dest` | product | `price`, `salePrice`, `discountPercent`, `position` | Google Sheets, CSV |
| Competitor monitoring | `productIds` + schedule | product | `salePrice`, `stocks`, `sizes`, `fetchedAt` | Dataset API, webhooks |
| Seller and brand research | `queries` | product | `supplier`, `supplierId`, `brand`, `feedbacks`, `rating` | spreadsheet, BI |
| Review analysis | `productIds` (mode `reviews`) | review | `rating`, `text`, `pros`, `cons`, `size`, `createdDate` | LLM, sentiment tools |

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `mode` | What to scrape | string | no | default `search` | `search`, `product`, `reviews`, `products` | What to collect | `"reviews"` | `products` is auto: product cards when article numbers are given, else search |
| `queries` | Search queries | array of strings | yes in search | prefill `["наушники"]` | 1–20 queries | One search per query | `["iphone 16", "наушники"]` | Repeated queries are read once |
| `productIds` | Article numbers or product URLs | array of strings | yes in product and reviews | — | up to 1,000 article numbers or wildberries.ru product links | Products to read | `["219614590"]` | Wrong entries become free `error` rows |
| `maxItems` | Max products per query | integer | no | default 100, prefill 10 | 1–10,000 | Most products per query (search only) | `500` | Wildberries gives at most about 6,000 |
| `sort` | Search order | string | no | `popular` | `popular`, `rate`, `priceup`, `pricedown`, `newly`, `benefit` | Order of search results | `"priceup"` | Same as the sort menu on the site |
| `dest` | Delivery region | integer | no | `-1257786` (Moscow) | Wildberries region code | Prices, stock and search results for this region | `-1257786` | Copy `dest` from the site's requests after choosing your address |
| `maxReviewsPerProduct` | Max reviews per product | integer | no | 100 | 1–1,000 | Newest written reviews per product (reviews only) | `1000` | |
| `onlyRequestedVariant` | Only reviews of this exact variant | boolean | no | `false` | | Keep only reviews written for the article number you entered | `true` | Wildberries shows one review list for all colours and sizes |
| `proxyConfiguration` | Proxy | object | no | `{"useApifyProxy": true}` | Apify Proxy settings | Proxy for Wildberries requests | `{"useApifyProxy": true}` | Keep the default: datacenter, with an automatic switch to residential proxy in Russia when Wildberries refuses it |

Empty input in the selected mode gives one free row with `errorCode: INVALID_INPUT` and a message that names the field; the run ends normally. Extra spaces are removed and duplicates are read once.

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| Search mode | `mode` = `search` | `productIds` | Article numbers are ignored, with a warning | — | None |
| Product or reviews mode | `mode` = `product` / `reviews` | `queries`, `maxItems` | Queries and `maxItems` are ignored | — | One row per product / per review |
| Same product twice | `productIds` | — | Read once | `["219614590", "https://www.wildberries.ru/catalog/219614590/detail.aspx"]` | Charged once |
| Variants of one product in reviews mode | `productIds` | — | Their shared review list is saved once, with a warning | two colours of one product | Each review charged once |
| Region | `dest` | any mode | Prices, stock and search results follow the region | `-1257786` | None |

#### Input examples

##### Search products by keyword

```json
{
  "mode": "search",
  "queries": ["наушники"],
  "maxItems": 10
}
```

Expected behavior: reads the first Wildberries search results page for `наушники` in Moscow.
Expected output: 10 product rows with `salePrice`, `rating`, `feedbacks`, `supplier`, `stocks`.
Limit or cost note: usually 30–80 seconds, $0.049 on the Free plan.

##### Product cards by article number or link

```json
{
  "mode": "product",
  "productIds": [
    "839226871",
    "https://www.wildberries.ru/catalog/461140947/detail.aspx"
  ]
}
```

Expected behavior: reads each product card.
Expected output: one row per product, with `sizes` that include the stock of each size.
Limit or cost note: 1,000 article numbers took 46 seconds; `not_found` and `error` rows are free.

##### Newest reviews of a product

```json
{
  "mode": "reviews",
  "productIds": ["152540730"],
  "maxReviewsPerProduct": 100
}
```

Expected behavior: reads the newest written reviews of the product and its variants.
Expected output: up to 100 review rows; `isRequestedVariant` tells whether a review was written for this exact article number.
Limit or cost note: 10 products × 1,000 reviews (7,000 saved) took 66 seconds.

### Output

The Dataset has two views, **Products** and **Reviews**. The run summary is in the Key-value store record `RUN_SUMMARY`.

#### Output fields

Product rows (`rowType: product`, Search and Products modes):

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `nmId` | Article number | integer | on `error` rows | `839226871` | |
| `imtId` | Product group ID (all colours and sizes) | integer | yes | `2362405143` | |
| `name` | Product name | string | on `not_found` / `error` | `"Наушники беспроводные TWS Pro 2"` | As on Wildberries, in Russian |
| `brand`, `brandId` | Brand | string, integer | yes | `"TehnoVolna"` | `null` when Wildberries shows no brand (common for no-name goods) |
| `price` | Price before discount, RUB | number | yes | `2525` | `null` = not on sale in this region |
| `salePrice` | Price the buyer pays now, RUB | number | yes | `1617` | Lowest among sizes |
| `discountPercent` | Discount from `price` to `salePrice`, % | integer | yes | `36` | |
| `currency` | Currency | string | no | `"RUB"` | |
| `rating` | Average rating, 1–5 | number | yes | `5` | `null` = no ratings yet (common on new products) |
| `feedbacks` | Number of ratings and reviews | integer | yes | `133538` | |
| `supplier`, `supplierId`, `supplierRating` | Seller name, ID, rating | string, integer, number | yes | `"Me TradeMark"` | Shop name as shown on the site |
| `stocks` | Units in stock in the region, all sizes | integer | yes | `54` | Large stocks are capped by Wildberries; 0 = sold out |
| `inStock` | `stocks` > 0 | boolean | yes | `true` | |
| `sizes` | Sizes with price, sale price and stock | array | empty | `[{"name": "98-104", "price": 2590, "salePrice": 888, "stocks": 18}]` | Stock per size in Products mode only |
| `colors` | Colour names | array | empty | `["белый"]` | |
| `subjectId`, `subjectParentId` | Category IDs | integer | yes | `593` | |
| `imageUrl`, `imageUrls` | Main image, all images | string, array | yes / empty | image URLs | Up to 30; empty on a `partial` row with `MISSING_FIELDS` if the image link map could not be read |
| `url` | Product page | string | on `error` rows | `"https://www.wildberries.ru/catalog/839226871/detail.aspx"` | |
| `query`, `page`, `position` | Query, results page, position | string, integer, integer | `null` in Products mode | `"наушники"`, `1`, `1` | Search mode only |
| `input` | Your input entry | string | `null` in Search mode | `"461140947"` | Products mode only |
| `dest` | Region of prices and stock | integer | no | `-1257786` | |

Review rows (`rowType: review`, Reviews mode):

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `reviewId` | Review ID | string | no | `"uwpmaulgiPkCc09UOVEc"` | |
| `nmId` | Variant the review was written for | integer | no | `152540730` | Can differ from your article number |
| `requestedNmId`, `isRequestedVariant` | Your article number; same variant or not | integer, boolean | no | `152540730`, `true` | |
| `productName`, `productUrl` | Product name and link of the reviewed variant | string | yes | | |
| `rating` | Stars the buyer gave, 1–5 | integer | no | `5` | |
| `text`, `pros`, `cons` | Review text, pros, cons | string | yes | | `null` = left empty |
| `color`, `size` | Colour and size bought | string | yes | `"Белый"`, `"37"` | |
| `tags` | Quick tags the buyer picked | array | empty | | |
| `createdDate`, `updatedDate` | Written, last changed | string | yes | `"2026-10-15T10:46:43.664Z"` | ISO 8601 |
| `votesPlus`, `votesMinus` | Helpful / not helpful votes | integer | yes | `0` | |
| `sellerAnswer`, `sellerAnswerDate` | Seller's answer | string | yes | | |
| `photoCount`, `hasVideo` | Photos and video attached | integer, boolean | no | `0`, `false` | Counts only, no media |
| `parentReviewId` | Earlier review this one adds to | string | yes | `null` | |

All rows:

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `rowType` | Row type | string | no | `product`, `review` | |
| `status` | Row status | string | no | `complete`, `partial`, `not_found`, `error` | Only `complete` and `partial` are charged |
| `errorCode`, `errorMessage` | Why a row is not complete | string | yes | `NOT_ON_SALE`, `NOT_FOUND`, `NO_RESULTS`, `NO_REVIEWS`, `INVALID_INPUT`, `QUERY_REJECTED`, `SOURCE_ERROR` | Empty on `complete` rows |
| `source` | Wildberries data the row came from | string | no | `wb-search`, `wb-card`, `wb-feedbacks` | |
| `fetchedAt` | When the row was read | string | no | `"2026-10-15T11:40:18.126Z"` | ISO 8601, UTC |

#### Output entities and surfaces

| Situation | Dataset/API/KVS/live view | Result shape | User action |
| --- | --- | --- | --- |
| Normal product or review | Dataset, view Products / Reviews | one row each, `status: complete` | Open, export or use the fields |
| Not on sale in the region | Dataset | `status: partial`, `errorCode: NOT_ON_SALE`, prices `null`, `stocks: 0` | Try another `dest` or check later |
| Image links not available | Dataset, `RUN_SUMMARY.warnings` | `status: partial`, `errorCode: MISSING_FIELDS`, `imageUrl: null`, `imageUrls: []` | Run again; other fields are complete |
| Article number does not exist | Dataset | `status: not_found`, free | Check the number |
| Query without results | Dataset | one `not_found` row with `errorCode: NO_RESULTS`, free | Try other words |
| Query Wildberries refuses (e.g. random letters) | Dataset | one `error` row with `errorCode: QUERY_REJECTED`, free; other queries go on | Try other words |
| Product without written reviews | Dataset | one `not_found` row with `errorCode: NO_REVIEWS`, free | |
| Wrong entry | Dataset | `status: error`, `errorCode: INVALID_INPUT`, free | Fix the entry |
| More than 25 entries without results in one run | Dataset lists the first 25; `RUN_SUMMARY.withoutResults` lists all | `input`, `nmId`, `status`, `errorCode` per entry, plus a warning | Read the full list in `RUN_SUMMARY` |
| Run timeout or maximum charge reached | `RUN_SUMMARY` | `status: partial`, `stopReason: TIMEOUT` / `CHARGE_LIMIT`, saved rows stay | Raise the timeout or maximum charge |
| Wildberries refuses the datacenter proxy | `RUN_SUMMARY.residentialFallback: true`, a warning and a note in the run message | the run goes on through residential proxy in Russia; same rows, same price | Nothing to do |
| Wildberries blocks or fails | `RUN_SUMMARY.stopReason: SOURCE_ERROR`, run `FAILED` | rows saved before the failure stay | Run again later |

#### Output example

Search mode, from the prefilled input (one row, `imageUrls` trimmed):

```json
{
  "rowType": "product",
  "status": "complete",
  "nmId": 839226871,
  "imtId": 2362405143,
  "name": "Наушники беспроводные TWS Pro 2",
  "brand": "TehnoVolna",
  "brandId": 311123295,
  "price": 2525,
  "salePrice": 1617,
  "discountPercent": 36,
  "currency": "RUB",
  "rating": 5,
  "feedbacks": 133538,
  "supplier": "Me TradeMark",
  "supplierId": 1174666,
  "supplierRating": 5,
  "stocks": 54,
  "inStock": true,
  "sizes": [{ "name": null, "price": 2525, "salePrice": 1617, "stocks": null }],
  "colors": ["белый"],
  "subjectId": 593,
  "subjectParentId": 6258,
  "imageUrl": "https://basket-38.wbbasket.ru/vol8392/part839226/839226871/images/big/1.webp",
  "imageUrls": ["https://basket-38.wbbasket.ru/vol8392/part839226/839226871/images/big/1.webp"],
  "url": "https://www.wildberries.ru/catalog/839226871/detail.aspx",
  "query": "наушники",
  "page": 1,
  "position": 1,
  "input": null,
  "dest": -1257786,
  "source": "wb-search",
  "errorCode": null,
  "errorMessage": null,
  "fetchedAt": "2026-10-15T11:40:18.126Z"
}
```

Reviews mode (one row):

```json
{
  "rowType": "review",
  "status": "complete",
  "reviewId": "uwpmaulgiPkCc09UOVEc",
  "nmId": 152540730,
  "requestedNmId": 152540730,
  "isRequestedVariant": true,
  "imtId": 4156371482,
  "productName": "Кроссовки спортивные на платформе демисезонные",
  "productUrl": "https://www.wildberries.ru/catalog/152540730/detail.aspx",
  "rating": 5,
  "text": "Хорошие, красивые кроссовки. Возврат, не подошёл размер",
  "pros": null,
  "cons": null,
  "color": "Белый",
  "size": "37",
  "tags": [],
  "createdDate": "2026-10-15T10:46:43.664Z",
  "updatedDate": "2026-10-15T10:52:39.816Z",
  "votesPlus": 0,
  "votesMinus": 0,
  "sellerAnswer": "Спасибо за отзыв! …",
  "sellerAnswerDate": "2026-10-15T10:50:59.825Z",
  "photoCount": 0,
  "hasVideo": false,
  "parentReviewId": null,
  "input": "152540730",
  "source": "wb-feedbacks",
  "errorCode": null,
  "errorMessage": null,
  "fetchedAt": "2026-10-15T11:14:25.076Z"
}
```

`null` means Wildberries did not show this value; it is not 0. `rating: null` means "no ratings yet", not "0 stars".

### Pricing and limits

#### Pricing unit

Pay per event. You pay for:

- **Actor start** — $0.03 per run (Apify counts one start per GB of memory, at least one; the default 512 MB is one);
- **product** — each saved `complete` or `partial` product row;
- **review** — each saved review row.

| Event | Free | Bronze | Silver | Gold |
| --- | ---: | ---: | ---: | ---: |
| Actor start | $0.03 | $0.03 | $0.03 | $0.03 |
| product | $0.0019 | $0.0018 | $0.0017 | $0.0016 |
| review | $0.0018 | $0.0017 | $0.0016 | $0.0015 |

Platform usage (compute, proxy, including the residential fallback) is included. `not_found` and `error` rows are free; a run that saves nothing costs only the start fee. If a run fails, you pay only for the rows it saved. The run stops when it reaches your maximum charge and says so in `RUN_SUMMARY` (`stopReason: CHARGE_LIMIT`).

#### Cost examples (Free plan)

| Scenario | Input scope | Rows | Charge | Stop/cap behavior |
| --- | --- | ---: | ---: | --- |
| Prefill | 1 query, 10 products | 10 | $0.049 | usually 30–80 s |
| Category research | 3 queries × 100 products | 300 | $0.60 | |
| Price check of a product list | 1,000 article numbers | 1,000 | $1.93 | 46 s in our test |
| Reviews | 1 product × 100 reviews | 100 | $0.21 | |
| Nothing found | 1 query without results | 0 | $0.03 | start fee only |

#### Limits

- Up to 20 queries, up to 10,000 products per query (Wildberries gives at most about 6,000); up to 1,000 article numbers; up to 1,000 reviews per product.
- Measured in our tests: 5 queries × 1,000 → 5,000 products in 124 seconds (512 MB); 1 query × 6,000 → 5,984–5,987 products in 153–437 seconds (437 s at 512 MB when Wildberries was slow); 1,000 article numbers → 46 seconds (512 MB); 10 products × 1,000 reviews → 7,000 reviews in 66 seconds (512 MB).
- The default run timeout is 600 seconds. When it is reached, the run ends normally with the rows saved so far (`stopReason: TIMEOUT`). Big searches can take longer when Wildberries is slow; raise the timeout for them.

### API, export and integrations

- **API:** start the Actor with the [Apify API](https://docs.apify.com/api/v2) and read the Dataset items as JSON, CSV or Excel.
- **Export:** the Output tab exports JSON, CSV, Excel, XML and RSS.
- **Scheduling:** run the same article numbers daily with [Apify Schedules](https://docs.apify.com/platform/schedules) and compare `salePrice` and `stocks` by `nmId` and `fetchedAt`.
- **Webhooks / no-code:** send results to Google Sheets, Make or Zapier through [Apify integrations](https://docs.apify.com/platform/integrations).

#### Use with AI agents (MCP)

- MCP server with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/wildberries-scraper`
- Smallest input:

```json
{ "queries": ["наушники"], "maxItems": 10 }
```

- Key output fields: `name`, `salePrice` (RUB), `rating`, `feedbacks`, `supplier`, `stocks`, `url`.
- 10 products usually take 30–80 seconds and cost $0.049. Keep `maxItems` small for quick answers.

### Troubleshooting

#### Fewer products than `maxItems`

Symptom: a query stops at about 6,000 rows, with a warning in `RUN_SUMMARY.warnings`.
Likely reason: Wildberries shows at most 60 pages of results per query.
Check: the warning names the query.
Action: split the query into narrower ones or run it with other `sort` orders.

#### `salePrice` is `null`

Symptom: a product row with `status: partial` and `errorCode: NOT_ON_SALE`.
Likely reason: the product is sold out or not delivered to this region.
Check: `stocks` is 0; try the product on the site with the same delivery address.
Action: try another `dest` or check later.

#### The run ended with `stopReason: TIMEOUT`

Symptom: `RUN_SUMMARY.status: partial` and the warning "The run timeout was reached".
Likely reason: a big search, or Wildberries answered slowly.
Check: the saved rows are in the Dataset.
Action: raise the run timeout in the run options or lower `maxItems`.

#### The run failed with `SOURCE_ERROR`

Symptom: `RUN_SUMMARY.stopReason: SOURCE_ERROR`; the run ends `FAILED`, even if rows were saved.
Likely reason: Wildberries refused several new sessions in a row, on datacenter and then on residential proxy. A run without saved rows stops after about 3.5 minutes of such attempts (proxy traffic counted as run time), so a failed run stays cheap.
Check: saved rows are in the Dataset and charged; `RUN_SUMMARY.sourceError` says what failed.
Action: run again a bit later. This is a failure, not an empty result.

### FAQ

#### Do I need a Wildberries account, cookies or API key?

No. The Actor reads public Wildberries data without a login. It does not solve captchas or log in.

#### Why are prices different from what I see on the site?

Prices depend on the delivery region (`dest`) and on the account: WB Club and personal discounts are not included. The Actor sees the price for a visitor without an account in the chosen region.

#### Why does a review have another article number?

Wildberries shows one review list for all colours and sizes of a product. `nmId` is the variant the buyer reviewed, `requestedNmId` is the article number you entered. Turn on **Only reviews of this exact variant** to keep only yours.

#### Are the results complete and fresh?

The rows show what Wildberries shows at `fetchedAt`. Search order and prices change often. The Actor does not promise every product for a query.

### Related Actors

- [Historical FX Rates Converter](https://apify.com/cliqtomedia/historical-fx-rates-converter) — convert RUB prices to your currency for a given date.
- [Google Autocomplete Scraper](https://apify.com/cliqtomedia/google-autocomplete-scraper) — find product keywords to use in `queries`.
- [Website JSON-LD Structured Data Scraper](https://apify.com/cliqtomedia/website-jsonld-structured-data-scraper) — read product prices from other online stores.

### Support

For bugs, questions or feature requests, open the **Issues** tab of this Actor. Add the run ID, your input and the `errorMessage` or `RUN_SUMMARY` message. Never send tokens, cookies or passwords.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/wildberries-scraper/changelog.md

# Actor input Schema

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

Search: products found by your search queries. Products: product cards for the article numbers below. Reviews: written reviews of the products below. Auto picks Products when article numbers are given and Search otherwise; it accepts inputs written for other Wildberries scrapers.

## `queries` (type: `array`):

Keywords as you would type them on wildberries.ru, e.g. "наушники" or "iphone 16". Up to 20 queries. Used when "What to scrape" is Search.

## `productIds` (type: `array`):

Wildberries article numbers (nmId), e.g. 219614590, or product links such as https://www.wildberries.ru/catalog/219614590/detail.aspx. Up to 1000. Used when "What to scrape" is Products or Reviews.

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

Search only: how many products to save for each query, in Wildberries' order. Wildberries shows at most 60 pages (about 6000 products) per query; for more, split the query or use other sort orders.

## `sort` (type: `string`):

Search only: the order of results, as on the site.

## `dest` (type: `integer`):

Wildberries region code: prices, stock and search results depend on it. Default -1257786 is Moscow. Other codes appear as the dest parameter in the site's own requests after you pick a delivery address.

## `maxReviewsPerProduct` (type: `integer`):

Reviews only: how many written reviews to save per product, newest first. Wildberries serves at most about the 1000 newest written reviews.

## `onlyRequestedVariant` (type: `boolean`):

Reviews only: Wildberries shows one review list for all colours and sizes of a product. Turn on to keep only reviews written for the article number you entered.

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

Apify datacenter proxy is the default; when Wildberries refuses it, the run switches to residential proxy in Russia by itself, at no extra charge. Custom proxy URLs are used as given.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "наушники"
  ],
  "maxItems": 10,
  "sort": "popular",
  "dest": -1257786,
  "maxReviewsPerProduct": 100,
  "onlyRequestedVariant": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

One row per product: price, sale price, rating, reviews, seller, stock, link.

## `reviews` (type: `string`):

One row per written review: rating, text, pros, cons, variant, seller answer.

## `runSummary` (type: `string`):

Status, stop reason, counts and warnings.

# 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": "search",
    "queries": [
        "наушники"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/wildberries-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": "search",
    "queries": ["наушники"],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": "search",
  "queries": [
    "наушники"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cliqtomedia/wildberries-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/wildberries-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NzFa9Qe8MbHcNtA6b/builds/h3YfIhgoj0rzOtQVO/openapi.json
