Skip to content

Analytics Module ​

The Analytics module provides access to sales funnel analytics, search query reports, stock history, WB warehouse inventory, and CSV report generation for the Wildberries marketplace.


Overview ​

PropertyValue
Module Nameanalytics
SDK Namespacesdk.analytics.*
Base URLhttps://seller-analytics-api.wildberries.ru
Source Swaggerwildberries_api_doc/11-analytics/
Methods21
AuthenticationAPI Key (Header)

What's New (Unreleased) ​

  • NEW getOrderFeed() (WB news 2026-09): real-time Order Feed report — orders and buyouts unified in one method, with statuses (created/buyout/cancel/return/returnDefective), cancel reasons (cancelType), a B2B flag, and snapshotTime-cursor offset pagination. Replaces sdk.reports.getSupplierOrders() and sdk.reports.getSupplierSales() (both still work; WB announced a future shutdown without a date).
  • 6 new types: OrderFeedSelectedPeriod, OrderFeedPagination, OrderFeedRequest, OrderFeedOrder, OrderFeedResponse, OrderFeedResponseWrapper
  • NEW getSellerWarehousesStock() (WB news 2026-09): current inventory across ALL seller warehouses — no warehouse/size IDs required in the request. Replaces per-warehouse POST /api/v3/stocks/{warehouseId} usage. Data refreshes once every 30 minutes.
  • 3 new types: SellerWarehousesStockRequest, SellerWarehouseStockItem, SellerWarehousesStockResponse

What's New (v3.4.0 - March 2026) ​

  • NEW getWbWarehousesStock(): Get current inventory on WB warehouses. Replaces deprecated GET /api/v1/supplier/stocks (disabled June 23, 2026). Returns per-size, per-warehouse quantities with region names and in-transit counts.
  • currency field: Added to SalesFunnelProductsResponse, SalesFunnelProductsHistoryResponse, and SalesFunnelGroupedHistoryResponse. Returns the currency code (e.g., "RUB") for monetary values in the response.
  • 3 new types: WbWarehousesStockRequest, WbWarehouseStockItem, WbWarehousesStockResponse

Data freshness from 2026-09-24 ​

Wildberries refreshes data once every two hours for getSalesFunnelProducts(), getSalesFunnelProductsHistory() and getSalesFunnelGroupedHistory(), and for the DETAIL_HISTORY_REPORT and GROUPED_HISTORY_REPORT CSV exports created with createNmReportDownload().

This is the data refresh cadence, not a request-rate limit. Polling or generating another CSV sooner does not guarantee newer metrics. Order Feed (getOrderFeed()) can replace only order and buyout data; it does not replace views, cart additions or conversion metrics.

Sources: Sales Funnel, CSV reports.

Search Queries data freshness from 2026-10-12 ​

Wildberries refreshes data once every two hours for these five API operations and three CSV exports:

API methodEndpoint
createSearchReportReport()POST /api/v2/search-report/report
createTableGroup()POST /api/v2/search-report/table/groups
createTableDetail()POST /api/v2/search-report/table/details
createProductSearchText()POST /api/v2/search-report/product/search-texts
createProductOrder()POST /api/v2/search-report/product/orders

The CSV types are SEARCH_QUERIES_PREMIUM_REPORT_GROUP, SEARCH_QUERIES_PREMIUM_REPORT_PRODUCT and SEARCH_QUERIES_PREMIUM_REPORT_TEXT, created with createNmReportDownload().

This is data freshness, not a request-rate limit or a guarantee that every request returns new data. It is separate from the removal of five percentile columns in the TEXT CSV; other report schemas and request limits are unchanged by this cadence announcement.

Sources: Search Queries, CSV reports.

For the separate five-column TEXT CSV change, see TEXT CSV columns.

Quick Start ​

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({ apiKey: process.env.WB_API_KEY! });

// Get product card statistics (v3)
const stats = await sdk.analytics.getSalesFunnelProducts({
  selectedPeriod: { start: '2026-01-01', end: '2026-01-31' },
  orderBy: { field: 'orderCount', mode: 'desc' },
  limit: 10,
  offset: 0
});
console.log('Currency:', stats.currency); // e.g. "RUB"

// Get search query report
const report = await sdk.analytics.createSearchReportReport({ ... });

// Get stock data by warehouses
const stocks = await sdk.analytics.createStocksReportOffice({ ... });

// NEW: Get current inventory on WB warehouses
const inventory = await sdk.analytics.getWbWarehousesStock({
  nmIds: [395996251],
  limit: 100,
  offset: 0,
});
for (const item of inventory.data.items) {
  console.log(`${item.warehouseName} (${item.regionName}): ${item.quantity} pcs`);
}

// Create analytics CSV report
const download = await sdk.analytics.createNmReportDownload({ ... });

Methods Reference ​

Sales Funnel v3 (3 methods) ​

MethodHTTPEndpointDescription
getSalesFunnelProducts()POST/api/analytics/v3/sales-funnel/productsProduct card statistics for period
getSalesFunnelProductsHistory()POST/api/analytics/v3/sales-funnel/products/historyProduct statistics by day/week
getSalesFunnelGroupedHistory()POST/api/analytics/v3/sales-funnel/grouped/historyGrouped product statistics by day

Currency Field (v3.4.0)

All three Sales Funnel v3 responses now include an optional currency field (e.g., "RUB") indicating the currency of monetary values in the response.

CSV Reports (4 methods) ​

MethodHTTPEndpointDescription
getNmReportDownloads()GET/api/v2/nm-report/downloadsGet list of analytics reports
createNmReportDownload()POST/api/v2/nm-report/downloadsCreate analytics report task
createDownloadsRetry()POST/api/v2/nm-report/downloads/retryRetry failed report generation
getDownloadsFile()GET/api/v2/nm-report/downloads/file/{downloadId}Download generated report file

Search Query Reports (4 methods) ​

MethodHTTPEndpointDescription
createSearchReportReport()POST/api/v2/search-report/reportGet search query report main page
createTableGroup()POST/api/v2/search-report/table/groupsPaginate by groups in search report
createTableDetail()POST/api/v2/search-report/table/detailsPaginate by products in search report
createProductSearchText()POST/api/v2/search-report/product/search-textsGet product search texts

Search Query - Product Orders (1 method) ​

MethodHTTPEndpointDescription
createProductOrder()POST/api/v2/search-report/product/ordersGet product order data by search texts

Stock History (4 methods) ​

MethodHTTPEndpointDescription
createProductsGroup()POST/api/v2/stocks-report/products/groupsGet stock data by product groups. ⚠️ Since 2026-09-17 data refreshes once per 2 hours
createProductsProduct()POST/api/v2/stocks-report/products/productsGet stock data by products. ⚠️ Since 2026-09-17 data refreshes once per 2 hours
createProductsSize()POST/api/v2/stocks-report/products/sizesGet stock data by product sizes. ⚠️ Since 2026-09-17 data refreshes once per 2 hours
createStocksReportOffice()POST/api/v2/stocks-report/officesGet stock data by warehouses. ⚠️ Since 2026-09-17 data refreshes once per 2 hours

⚠️ Data freshness (WB news 2026-09-17): all four stocks-history report groups above refresh once per 2 hours; the STOCK_HISTORY_REPORT_CSV / STOCK_HISTORY_DAILY_CSV report types via createNmReportDownload() share the same cadence. For current stocks without the update delay use getWbWarehousesStock() or getSellerWarehousesStock() (refreshes every 30 minutes).

WB Warehouse Inventory (1 method) - NEW in v3.4.0 ​

MethodHTTPEndpointDescription
getWbWarehousesStock()POST/api/analytics/v1/stocks-report/wb-warehousesGet current inventory on WB warehouses

Seller Warehouse Inventory (1 method) - NEW (WB news 2026-09) ​

MethodHTTPEndpointDescription
getSellerWarehousesStock()POST/api/analytics/v1/stocks-report/seller-warehousesGet current inventory across ALL seller warehouses — no warehouse/size IDs needed

Order Feed (1 method) - NEW (WB news 2026-09) ​

MethodHTTPEndpointDescription
getOrderFeed()POST/api/analytics/v1/order-feedReal-time orders + buyouts in one report, with statuses, cancel reasons and B2B flag

Item Rating ​

MethodHTTPEndpointDescription
getItemRatingV2()POST/api/analytics/v2/item-ratingCurrent item-rating report; supports catalog-hidden filtering and returns items[].isShadowed
getItemRating()POST/api/analytics/v1/item-ratingDeprecated: WB removal on 2026-07-30

Use onlyShadowedNms: true with getItemRatingV2() to retrieve only products hidden from the catalog. See the v2 migration guide.

Previously Deprecated v2 (removed from source) ​

These methods were deprecated and have been removed. Use v3 Sales Funnel methods instead.

Removed MethodReplacement
createNmReportDetail()getSalesFunnelProducts()
createDetailHistory()getSalesFunnelProductsHistory()
createGroupedHistory()getSalesFunnelGroupedHistory()

Rate Limits ​

All methods share the same rate limit tier:

OperationLimitIntervalBurst
All analytics endpoints3 req/min20s3
getWbWarehousesStock()3 req/min20s1
getSellerWarehousesStock()3 req/min20s1
getOrderFeed()1 req/min1 min1 (Base token without secret: 1 req per 3 h)

Usage Examples ​

getWbWarehousesStock() - WB Warehouse Inventory (NEW in v3.4.0) ​

Returns current inventory quantities on Wildberries warehouses. Data is updated every 30 minutes. Each row represents one size on one warehouse.

Endpoint: POST /api/analytics/v1/stocks-report/wb-warehouses

Request parameters (WbWarehousesStockRequest):

ParameterTypeRequiredDescription
nmIdsnumber[]NoWB article IDs to filter (0-1000 items, empty = all products)
chrtIdsnumber[]NoSize IDs (only used for articles specified in nmIds)
limitnumberNoRows in response (max 250000, default 250000)
offsetnumberNoNumber of results to skip for pagination (default 0)

Response fields (WbWarehouseStockItem):

FieldTypeDescription
nmIdnumberWB article ID
chrtIdnumberSize ID
warehouseIdnumberWB warehouse ID
warehouseNamestringWB warehouse name
regionNamestringRegion name
quantitynumberCurrent quantity in warehouse
inWayToClientnumberQuantity in transit to client
inWayFromClientnumberQuantity in transit from client (returns)

Rate Limit: 3 requests/minute, 20-second interval, burst 1

Token types: Only available for Personal and Service tokens.

Replaces Deprecated Endpoint

This method replaces the deprecated GET /api/v1/supplier/stocks, which will be disabled on June 23, 2026. Migrate to getWbWarehousesStock() before that date.

typescript
// Get all inventory across WB warehouses
const stock = await sdk.analytics.getWbWarehousesStock();
for (const item of stock.data.items) {
  console.log(
    `nmId=${item.nmId} chrtId=${item.chrtId} ` +
    `${item.warehouseName} (${item.regionName}): ` +
    `${item.quantity} in stock, ${item.inWayToClient} in transit`
  );
}

// Filter by specific articles with pagination
const page = await sdk.analytics.getWbWarehousesStock({
  nmIds: [395996251, 268913787],
  limit: 100,
  offset: 0,
});
console.log(`Found ${page.data.items.length} inventory rows`);

// Filter by specific sizes
const sized = await sdk.analytics.getWbWarehousesStock({
  nmIds: [395996251],
  chrtIds: [123456789],
});

getSellerWarehousesStock() - Seller Warehouse Inventory (NEW, WB news 2026-09) ​

Returns current inventory quantities across all seller warehouses in a single request — no warehouse or size IDs are required (filters are optional). Data is updated once every 30 minutes. Each row represents one item size in one seller warehouse.

Endpoint: POST /api/analytics/v1/stocks-report/seller-warehouses

Request parameters (SellerWarehousesStockRequest):

ParameterTypeRequiredDescription
nmIdsnumber[]NoWB article IDs to filter (0-1000 items, empty = all products)
chrtIdsnumber[]NoSize IDs (only used for articles specified in nmIds)
limitnumberNoRows in response (max 250000, default 250000)
offsetnumberNoNumber of results to skip for pagination (default 0)

Response fields (SellerWarehouseStockItem):

FieldTypeDescription
nmIdnumberWB article ID
chrtIdnumberSize ID
warehouseIdnumberSeller warehouse ID
warehouseNamestringSeller warehouse name
regionNamestringRegion name
quantitynumberCurrent quantity in warehouse

Unlike the WB-warehouses report, no inWayToClient/inWayFromClient in-transit counts are returned.

Rate Limit: 3 requests/minute, 20-second interval, burst 1 (strict)

Token types: Only available for Personal and Service tokens.

Replaces Per-Warehouse Stocks Calls

WB recommends this report instead of sdk.products.getStocks() (POST /api/v3/stocks/{warehouseId}), which requires a warehouse ID and size IDs per call. The products method is not deprecated — but for read-only stock visibility across all seller warehouses, prefer getSellerWarehousesStock().

typescript
// Get inventory across ALL seller warehouses — no warehouse/size IDs needed
const stock = await sdk.analytics.getSellerWarehousesStock();
for (const item of stock.data.items) {
  console.log(
    `nmId=${item.nmId} chrtId=${item.chrtId} ` +
    `${item.warehouseName} (${item.regionName}): ${item.quantity}`
  );
}

// Filter by specific articles with pagination
const page = await sdk.analytics.getSellerWarehousesStock({
  nmIds: [47254354, 268913787],
  limit: 100,
  offset: 0,
});
console.log(`Found ${page.data.items.length} inventory rows`);

getOrderFeed() - Order Feed (NEW, WB news 2026-09) ​

Real-time report that unifies orders and buyouts in one method. 1 order = 1 assembly order = 1 item. Unlike the legacy supplier/orders + supplier/sales reports, a buyout does not create a second row — the same order row transitions between statuses (created → buyout/cancel/return/returnDefective). Statuses are the only mutating fields: re-request the same period to track an order's status transitions. Cancelled orders additionally carry cancelType (app/receipt/expire/other), and isB2b splits B2B from B2C sales.

Endpoint: POST /api/analytics/v1/order-feed

Request parameters (OrderFeedRequest):

ParameterTypeRequiredDescription
selectedPeriod.startstring (date-time)YesPeriod start — by date of the current order status; max 31 days back
selectedPeriod.endstring (date-time)NoPeriod end
nmIdsnumber[]NoWB article IDs to filter (max 1000, empty = all orders)
subjectIdsnumber[]NoSubcategory IDs to filter (max 50)
brandNamesstring[]NoBrands to filter (max 50)
tagIdsnumber[]NoLabel IDs to filter (max 50)
pagination.snapshotTimestring (date-time)NoSnapshot cursor — reuse across pages of one selection
pagination.offsetnumberNoResults to skip (default 0)
pagination.limitnumberNoOrders per response (max 10000, default 50)

Multiple filters combine with AND; empty filter arrays return all seller orders.

Response fields (OrderFeedOrder highlights):

FieldTypeDescription
status'created' | 'buyout' | 'cancel' | 'return' | 'returnDefective'Current order status
cancelType'app' | 'receipt' | 'expire' | 'other'?Present only when status = "cancel"
isMpbooleantrue — seller warehouse, false — WB warehouse
sellerPricenumberSeller price with seller discount (excl. WB Club discount and B2B wholesale)
isB2bbooleantrue — B2B, false — B2C
data.snapshotTimestringCursor — date of the last data update; drives consistent pagination

Rate Limit: 1 request/minute, 1-minute interval, burst 1. Base token without a secret: 1 request per 3 hours. Available for any token type (Analytics category).

Replaces supplier/orders + supplier/sales

WB recommends this report instead of sdk.reports.getSupplierOrders() (GET /api/v1/supplier/orders) and sdk.reports.getSupplierSales() (GET /api/v1/supplier/sales). Both legacy endpoints still work, but WB announced they will be disabled in the future — no date announced yet.

Cursor pagination: the report data updates asynchronously. To avoid skipping or duplicating orders, all requests of one selection must share the same snapshotTime: omit it on the first request (offset: 0), then pass the data.snapshotTime value from that first response on every subsequent page. When changing the period or filters, start over with offset: 0 and no snapshotTime.

typescript
// First page — offset 0, no snapshotTime
const first = await sdk.analytics.getOrderFeed({
  selectedPeriod: { start: '2026-08-24T00:00:00Z', end: '2026-09-23T00:00:00Z' },
  nmIds: [47254354],
  pagination: { offset: 0, limit: 1000 },
});
console.log(first.data.snapshotTime, first.data.currency);

// Subsequent pages — SAME snapshotTime cursor (mind the 1 req/min limit)
if (first.data.orders.length === 1000) {
  const page2 = await sdk.analytics.getOrderFeed({
    selectedPeriod: { start: '2026-08-24T00:00:00Z', end: '2026-09-23T00:00:00Z' },
    nmIds: [47254354],
    pagination: { snapshotTime: first.data.snapshotTime, offset: 1000, limit: 1000 },
  });
  console.log(`Page 2: ${page2.data.orders.length} orders`);
}

Sales Funnel v3 ​

typescript
// Get product card statistics (v3)
const stats = await sdk.analytics.getSalesFunnelProducts({
  selectedPeriod: { start: '2026-01-01', end: '2026-01-31' },
  orderBy: { field: 'orderCount', mode: 'desc' },
  limit: 10,
  offset: 0,
});
console.log('Currency:', stats.currency); // "RUB"
for (const { product, statistic } of stats.products) {
  console.log(`${product.nmId}: ${statistic.orderCount} orders`);
}

// Product statistics by day
const history = await sdk.analytics.getSalesFunnelProductsHistory({
  selectedPeriod: { start: '2026-01-01', end: '2026-01-07' },
  nmIds: [268913787],
  aggregationLevel: 'day',
});
// history[0].currency is now available

// Grouped statistics by day
const grouped = await sdk.analytics.getSalesFunnelGroupedHistory({
  selectedPeriod: { start: '2026-01-01', end: '2026-01-07' },
  aggregationLevel: 'day',
});
// grouped[0].currency is now available

CSV Report Generation ​

typescript
// Create analytics CSV report
const report = await sdk.analytics.createNmReportDownload({
  // SalesFunnelProductReq, SearchReportGroupReq, etc.
});

// Check report status
const reports = await sdk.analytics.getNmReportDownloads({
  'filter[downloadIds]': [report.downloadId],
});

// Download completed report (returns ArrayBuffer - ZIP with CSV)
const file = await sdk.analytics.getDownloadsFile(report.downloadId);

// Retry failed report
await sdk.analytics.createDownloadsRetry({ downloadId: report.downloadId });

Search Query Reports ​

typescript
// Get main search report
const report = await sdk.analytics.createSearchReportReport({
  selectedPeriod: { start: '2026-01-01', end: '2026-01-31' },
  // ... filters
});

// Paginate by groups
const groups = await sdk.analytics.createTableGroup({ ... });

// Paginate by products within a group
const details = await sdk.analytics.createTableDetail({ ... });

// Get search texts for a product
const texts = await sdk.analytics.createProductSearchText({ ... });

// Get product order data by search texts
const orders = await sdk.analytics.createProductOrder({ ... });

Stock History ​

typescript
// Stock data by product groups
const groups = await sdk.analytics.createProductsGroup({ ... });

// Stock data by individual products
const products = await sdk.analytics.createProductsProduct({ ... });

// Stock data by product sizes
const sizes = await sdk.analytics.createProductsSize({ ... });

// Stock data by warehouses
const offices = await sdk.analytics.createStocksReportOffice({ ... });

Made with ❤️ for the Wildberries developer community