# Wildberries Product Search Scraper (`khadinakbar/wildberries-product-search-scraper`) Actor

Search public Wildberries product listings by keyword. Returns ranked products with RUB prices, discounts, brand, supplier, rating, and reviews.

- **URL**: https://apify.com/khadinakbar/wildberries-product-search-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** E-commerce, Automation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 product founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Wildberries Product Search Scraper

Search public Wildberries product listings by keyword and return one ranked listing record per product. This Actor is for marketplace analysts, price-monitoring teams, sourcing researchers, and AI workflows that need a keyword in and clean Wildberries search cards out: NM-ID, public product URL, name, brand, supplier, current and original RUB price, discount, rating, review count, listed quantity, image count, source keyword, rank, destination, and collection time.

It queries Wildberries' public product-search JSON and saves only validated listing records. Product-detail descriptions, specifications, review threads, category URLs, and seller legal profiles belong in a follow-on Actor after this search pass.

### Best fit for this Actor

- Start with a Russian or English product keyword when you need ranked Wildberries search listings rather than a full catalog crawl.
- Use `maxResults` as the spend cap: each saved product is one `product-found` event, plus Apify platform usage.
- Continue with a dedicated detail or review Actor when you need specifications, Q\&A, or review text after this search pass.

### Practical scenario

A sourcing analyst pastes `ноутбук`, keeps `maxResults` at 25, and optionally sets a rating floor. The dataset returns ranked public cards with sale and original RUB prices, discount, brand, supplier, rating, and the canonical product URL. The team can compare suppliers on the same keyword, then schedule the same input to watch rank and price movement. OUTPUT and RUN\_SUMMARY say whether collection finished, stopped at the page cap, found no matches, or needed a later retry.

### Quick start input

```json
{
  "searchQueries": ["ноутбук"],
  "maxResults": 5,
  "sortBy": "popular"
}
```

`searchQueries` is required and accepts up to 10 distinct keywords. `maxResults` defaults to 50 and permits at most 1,000 records across the whole run. The Console quality sample uses 5 products so a first run stays bounded.

### Input reference

| Field | Type | What it controls |
| --- | --- | --- |
| `searchQueries` | string\[] | Product keywords or brand phrases, for example `ноутбук`. Required. Deduplicated. Not a category or product URL. |
| `maxResults` | integer | Overall saved-product cap, 1–1,000. Default 50. |
| `maxPagesPerQuery` | integer | Request-safety page cap per keyword, 1–50. Default 10. Reaching it before the natural end is `PARTIAL`. |
| `destination` | integer | Wildberries destination ID. Default `-1257786` (Moscow). |
| `sortBy` | enum | Native search order: `popular`, `rate`, `priceup`, `pricedown`, `newly`, `benefit`. |
| `minPriceRub` / `maxPriceRub` | number | Optional post-search current-price filters in RUB. |
| `minRating` | number | Optional 0–5 post-search rating floor. |
| `proxyConfiguration` | object | Defaults to Apify Residential in Russia. Direct traffic is often rate-limited. |

### What data you receive

Each dataset item is one public listing product.

```json
{
  "type": "wildberries_product",
  "productId": "12345678",
  "productName": "Ноутбук Example 14",
  "brand": "ExampleBrand",
  "supplier": "Example Supplier",
  "priceRub": 49209,
  "originalPriceRub": 67226,
  "discountPercent": 26.8,
  "currency": "RUB",
  "rating": 4.9,
  "reviewCount": 10,
  "imageCount": 14,
  "totalQuantity": 10,
  "productUrl": "https://www.wildberries.ru/catalog/12345678/detail.aspx",
  "sourceQuery": "ноутбук",
  "searchRank": 1,
  "destination": -1257786,
  "scrapedAt": "collection-time"
}
```

The default key-value store also contains:

- `OUTPUT` — `outcome`, message, saved count, warnings, and charged event counts.
- `RUN_SUMMARY` — input, request attempts, pages, filtering, duplicates, validation errors, and terminal diagnostics.

`COMPLETE`, `PARTIAL`, `VALID_EMPTY`, and `INVALID_INPUT` finish successfully. `UPSTREAM_FAILED` is the honest terminal state when valid work received no usable marketplace data after retries. Control rows stay out of the product dataset.

### Use through the API

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~wildberries-product-search-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["ноутбук"],"maxResults":25}'
```

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/wildberries-product-search-scraper').call({
  searchQueries: ['ноутбук'],
  maxResults: 25,
  minRating: 4.5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use with AI agents through Apify MCP

> Search public Wildberries listings for `ноутбук`, save at most 25 ranked products, and return name, product URL, current and original RUB price, discount, brand, supplier, rating, review count, and search rank. Inspect OUTPUT.outcome before treating an empty dataset as a real no-match.

Tell the agent to keep `maxResults` small on the first call, preserve `productUrl` as provenance, and read `RUN_SUMMARY` when the outcome is `PARTIAL` or needs a later retry. Current MCP client setup: https://mcp.apify.com

### Connect the workflow

After a ranked search, continue with a Wildberries product-detail or review Actor when you need specifications or review text. For a non-Wildberries marketplace search in the same portfolio, start with [Alibaba Listings Scraper](https://apify.com/khadinakbar/alibaba-listings-scraper) when the job is B2B supplier cards instead of Wildberries consumer listings.

### Pricing

This Actor uses **Pay per event** plus Apify **platform usage**. Open the live Pricing tab for current event names and amounts. `maxResults` is the predictable cap on product events before platform compute and proxy usage. A product is validated before it is persisted and charged, so only accepted listing rows receive the product event.

### Best results

- Use Russian marketplace language when that matches shopper intent (`ноутбук`, `беспроводные наушники`).
- Keep the first run small (`maxResults` 5–25) and inspect `OUTPUT` before raising the cap.
- Leave the residential Russia proxy default unless you have a tested route. The public search JSON is the supported source; start there before HTML pages.

### Builder's note

I found that Wildberries listing prices now live under `sizes[].price.product` / `basic`, and the search JSON sits at the top level as `{ products, total }` rather than `data.products`. I built the parser to read both envelopes and to prefer `reviewRating` over the coarser integer `rating` bucket so a search row keeps a usable price and rating.

### Responsible use

Use this Actor for lawful collection and analysis of public marketplace information. Follow applicable laws and Wildberries policies, and keep the workflow on public listing data you are authorized to collect. Wildberries is a trademark of its owner. This independent Actor is not affiliated with, associated with, or endorsed by Wildberries.

# Actor input Schema

## `searchQueries` (type: `array`):

Use this when you want to search Wildberries by product keyword, brand, or phrase. Pass up to 10 distinct queries, for example 'ноутбук' or 'wireless headphones'; the Actor deduplicates repeated products across queries. At least one non-empty query is required. This field searches public listings only and is not a category URL or product-ID input.

## `maxResults` (type: `integer`):

Use this when you need a strict overall cap on saved product records across all search queries. Each product saved to the dataset is one billable product-found event at $0.005, so this also bounds event charges before platform usage. Defaults to 50 and accepts 1 through 1,000. A smaller value is best for a quick price check; a larger value suits catalog research.

## `maxPagesPerQuery` (type: `integer`):

Use this when you need to bound how far the Actor paginates each keyword search before moving to the next query. Wildberries does not guarantee a fixed page size, so this is a request-safety cap rather than a product cap. Defaults to 10 pages and accepts 1 through 50. If this cap is reached before the natural end of a search, the run succeeds with a PARTIAL outcome and warning.

## `destination` (type: `integer`):

Use this when you need product results for a specific Wildberries delivery destination. Defaults to -1257786, Wildberries' Moscow destination used by the built-in example. Change it only when you know the numeric Wildberries destination identifier for your target market. This affects the marketplace response and does not change the Actor's proxy country automatically.

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

Use this when Wildberries' public search ranking should be ordered differently. Choose popular for the marketplace default, rate for rating, priceup for low-to-high price, pricedown for high-to-low price, newly for newer items, or benefit for value-oriented ranking. Defaults to popular. Sorting changes the native search rank returned in searchRank; it does not filter products.

## `minPriceRub` (type: `number`):

Use this when you only want products whose current public sale price is at or above a RUB threshold. For example, set 1000 to exclude products below 1,000 RUB. Leave it empty to keep all prices. This filter is applied after Wildberries returns public search results, so records without a price are excluded when a minimum is set.

## `maxPriceRub` (type: `number`):

Use this when you only want products whose current public sale price is at or below a RUB threshold. For example, set 5000 to keep products priced at 5,000 RUB or less. Leave it empty to keep all prices. This post-search filter must be greater than or equal to minPriceRub when both fields are supplied.

## `minRating` (type: `number`):

Use this when you only want public product listings at or above a rating threshold from 0 to 5. For example, set 4.5 to keep strongly rated products in a sourcing or competitor-research workflow. Leave it empty to keep products regardless of rating. Products without a rating are excluded only when this filter is set.

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

Use this when you need to control the proxy route used for Wildberries' public search endpoint. Residential Apify Proxy in Russia is the default attempt because direct requests are frequently rate limited with HTTP 429. Leave the default unless you have a tested proxy configuration. This field configures network access only; it does not collect credentials or log proxy URLs.

## Actor input object example

```json
{
  "searchQueries": [
    "ноутбук",
    "беспроводные наушники"
  ],
  "maxResults": 100,
  "maxPagesPerQuery": 10,
  "destination": -1257786,
  "sortBy": "priceup",
  "minPriceRub": 1000,
  "maxPriceRub": 5000,
  "minRating": 4.5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "RU"
  }
}
```

# Actor output Schema

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

Dataset of normalized Wildberries product listing records.

## `output` (type: `string`):

Compact machine-readable outcome and charge summary.

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

Detailed request, filtering, validation, warning, and charge diagnostics.

# 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 = {
    "searchQueries": [
        "ноутбук"
    ],
    "maxResults": 5,
    "maxPagesPerQuery": 10,
    "destination": -1257786,
    "sortBy": "popular",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "countryCode": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/wildberries-product-search-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 = {
    "searchQueries": ["ноутбук"],
    "maxResults": 5,
    "maxPagesPerQuery": 10,
    "destination": -1257786,
    "sortBy": "popular",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "countryCode": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/wildberries-product-search-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 '{
  "searchQueries": [
    "ноутбук"
  ],
  "maxResults": 5,
  "maxPagesPerQuery": 10,
  "destination": -1257786,
  "sortBy": "popular",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "RU"
  }
}' |
apify call khadinakbar/wildberries-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/wildberries-product-search-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/Rmwc0fDBj0MZaG8Bd/builds/GIK88DrXasa7WtHPh/openapi.json
