# Wildberries Product Detail Scraper (`khadinakbar/wildberries-product-detail-scraper`) Actor

Scrape Wildberries product details by URL or NM-ID: specs, RUB prices, stock, seller, images, and description. MCP-ready. $0.006/product plus usage.

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

## Pricing

from $6.00 / 1,000 product scrapeds

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?

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

## Wildberries Product Detail Scraper

Scrape public Wildberries product cards from product URLs or numeric NM-IDs and return one validated detail record per product. This Actor is for marketplace analysts, price-monitoring teams, sourcing researchers, and AI workflows that already have Wildberries links or article IDs and need the public card: name, brand, supplier, RUB prices, stock, sizes, images, description, and specifications.

It queries Wildberries' public product-card JSON. Keyword search belongs in [Wildberries Product Search Scraper](https://apify.com/khadinakbar/wildberries-product-search-scraper). Review threads, buyer Q\&A, and price-history series are out of contract.

### Best fit for this Actor

- Start with catalog URLs (`/catalog/{nmId}/detail.aspx`) or NM-IDs when you need the public product card rather than ranked search listings.
- Use `maxResults` as the spend cap: each saved card is one `product-scraped` event, plus Apify platform usage.
- Continue with a dedicated review Actor when you need review text after this detail pass.

### Practical scenario

A sourcing analyst pastes a Wildberries laptop URL, keeps `maxResults` at 1, and receives the public card with sale and original RUB prices, destination stock, brand, supplier, description, and specification rows. The team can compare sellers on the same NM-ID, then schedule the same input to watch price and availability. OUTPUT and RUN\_SUMMARY say whether collection finished, some IDs were missing, found no matches, or needed a later retry.

### Quick start input

```json
{
  "productUrls": ["https://www.wildberries.ru/catalog/1281126726/detail.aspx"],
  "maxResults": 1
}
```

Provide at least one `productUrls` value or one numeric `productIds` value. `maxResults` defaults to 50 and permits at most 200 records. The Console quality sample uses 1 product so a first run stays bounded.

### Input reference

| Field | Type | What it controls |
| --- | --- | --- |
| `productUrls` | string\[] | Wildberries product page URLs. Optional if `productIds` is set. Deduplicated. Not a search URL. |
| `productIds` | string\[] | Numeric NM-IDs such as `1281126726`. Merged with URLs. |
| `maxResults` | integer | Overall saved-product cap, 1–200. Default 50. Prefill 1. |
| `destination` | integer | Wildberries destination ID. Default `-1257786` (Moscow). Affects price and stock. |
| `proxyConfiguration` | object | Defaults to Apify Residential in Russia. Direct datacenter traffic is often rate-limited. |

### What data you receive

Each dataset item is one public product card.

```json
{
  "type": "wildberries_product_detail",
  "productId": "1281126726",
  "productName": "Ноутбук Example 13",
  "brand": "Apple",
  "supplier": "Example Supplier",
  "priceRub": 75148,
  "originalPriceRub": 105545,
  "discountPercent": 28.8,
  "currency": "RUB",
  "inStock": true,
  "rating": 5,
  "reviewCount": 1,
  "category": "Ноутбуки",
  "description": "Public product description when card.json is available.",
  "characteristics": [{ "name": "Диагональ экрана (дюйм)", "value": "13.3" }],
  "productUrl": "https://www.wildberries.ru/catalog/1281126726/detail.aspx",
  "cardSource": "v4+basket",
  "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, missing IDs, 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. Description, specifications, and image URLs are filled when Wildberries' public merchandising card is reachable; the commercial price/stock card can still save without them.

### Use through the API

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~wildberries-product-detail-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"productUrls":["https://www.wildberries.ru/catalog/1281126726/detail.aspx"],"maxResults":1}'
```

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/wildberries-product-detail-scraper').call({
  productUrls: ['https://www.wildberries.ru/catalog/1281126726/detail.aspx'],
  maxResults: 1,
});

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

### Use with AI agents through Apify MCP

> Scrape the public Wildberries product card for `https://www.wildberries.ru/catalog/1281126726/detail.aspx` and return name, product URL, current and original RUB price, discount, stock, brand, supplier, description, and specifications. 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

Start with [Wildberries Product Search Scraper](https://apify.com/khadinakbar/wildberries-product-search-scraper) when you have a keyword instead of a product URL. After a ranked search, pass `productUrl` values into this Actor for the public detail card. For a non-Wildberries marketplace card 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 product pages.

### 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 detail rows receive the product event.

### Best results

- Paste canonical `/catalog/{nmId}/detail.aspx` URLs or numeric NM-IDs. Search URLs are rejected.
- Keep the first run small (`maxResults` 1–10) and inspect `OUTPUT` before raising the cap.
- Leave the residential Russia proxy default unless you have a tested route. Public product-card JSON is the supported source; HTML product pages are often HTTP 498.

### Builder's note

I found that `card.wb.ru` v1 and v2 now 404, HTML product pages often return 498, and the live commercial card is `cards/v4/detail` with nested `sizes[].price.product` / `basic` in kopecks. Description and specifications live on a moving `basket-{NN}.wbbasket.ru` `card.json` host per volume, so this Actor probes and caches that host instead of hardcoding a shard table.

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

# Changelog

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

# Actor input Schema

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

Use this when you already have Wildberries product page URLs. Pass catalog detail links such as https://www.wildberries.ru/catalog/1281126726/detail.aspx. The Actor extracts the numeric NM-ID, deduplicates repeats, and ignores search or category URLs. At least one URL or product ID is required across productUrls and productIds.

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

Use this when you already have numeric Wildberries NM-IDs rather than full URLs. Pass values such as 1281126726. IDs are merged with productUrls, deduplicated, and capped by maxResults. This field is not a keyword search and does not accept category paths.

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

Use this when you need a strict cap on saved product-detail records. Each saved card is one billable product-scraped event at $0.006, so this also bounds event charges before platform usage. Defaults to 50 and accepts 1 through 200. The Console quality sample uses 1 product so a first run stays bounded.

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

Use this when you need prices and stock 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 destination identifier for your target market. This affects marketplace prices and availability; it does not change the Actor's proxy country automatically.

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

Use this when you need to control the proxy route used for Wildberries' public product-card JSON. Residential Apify Proxy in Russia is the default because datacenter IPs are frequently rate limited. 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
{
  "productUrls": [
    "https://www.wildberries.ru/catalog/1281126726/detail.aspx"
  ],
  "productIds": [
    "1281126726",
    "762015089"
  ],
  "maxResults": 10,
  "destination": -1257786,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "RU"
  }
}
```

# Actor output Schema

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

Dataset of normalized Wildberries product-detail records.

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

Compact machine-readable outcome and charge summary.

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

Detailed request, 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 = {
    "productUrls": [
        "https://www.wildberries.ru/catalog/1281126726/detail.aspx"
    ],
    "maxResults": 1,
    "destination": -1257786,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "countryCode": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/wildberries-product-detail-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 = {
    "productUrls": ["https://www.wildberries.ru/catalog/1281126726/detail.aspx"],
    "maxResults": 1,
    "destination": -1257786,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "countryCode": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/wildberries-product-detail-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 '{
  "productUrls": [
    "https://www.wildberries.ru/catalog/1281126726/detail.aspx"
  ],
  "maxResults": 1,
  "destination": -1257786,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "RU"
  }
}' |
apify call khadinakbar/wildberries-product-detail-scraper --silent --output-dataset

```

## MCP server setup

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