Skip to content

Управление остатками

Руководство по управлению остатками товаров через Wildberries SDK.

Обзор

SDK предоставляет методы для:

  • Управления остатками на складах продавца (FBS)
  • Получения отчётов об остатках на складах WB (FBW)
  • Управления складами продавца
  • Синхронизации остатков с внешними системами

Быстрый старт

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

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

// Получить список складов продавца
const warehouses = await sdk.products.warehouses();

// Получить остатки на складе продавца
const stocks = await sdk.products.getStocks(warehouseId, {
  skus: ['sku1', 'sku2']
});

// Обновить остатки
await sdk.products.updateStock(warehouseId, {
  stocks: [{ sku: 'sku1', amount: 100 }]
});

Архитектура складов WB

Типы складов

ТипОписаниеУправление остатками
FBW (Склад WB)Товары хранятся на складах WBWB управляет автоматически
FBS (Маркетплейс)Товары хранятся у продавцаПродавец управляет через API
DBS (Витрина)Продавец хранит и доставляетПродавец управляет через API

Связь модулей SDK

┌─────────────────────────────────────────────────────────┐
│                    Остатки товаров                       │
├─────────────────────┬───────────────────────────────────┤
│   FBS (Продавец)    │         FBW (Склад WB)            │
├─────────────────────┼───────────────────────────────────┤
│ sdk.products.*      │ sdk.reports.*                     │
│ - warehouses()      │ - warehouseRemains() (async)      │
│ - getStocks()       │ - getSupplierStocks() (sync)      │
│ - updateStock()     │                                   │
│ - deleteStock()     │                                   │
└─────────────────────┴───────────────────────────────────┘

Управление складами продавца (FBS)

Список складов

typescript
async function getSellerWarehouses(sdk: WildberriesSDK) {
  const warehouses = await sdk.products.warehouses();

  for (const wh of warehouses) {
    console.log(`ID: ${wh.id}`);
    console.log(`  Название: ${wh.name}`);
    console.log(`  Офис: ${wh.officeId}`);
    console.log(`  Cargo Type: ${wh.cargoType}`);
    console.log(`  Delivery Type: ${wh.deliveryType}`);
  }

  return warehouses;
}

Массовое обновление остатков

typescript
interface StockUpdate {
  sku: string;
  amount: number;
}

async function updateStocks(
  sdk: WildberriesSDK,
  warehouseId: number,
  updates: StockUpdate[]
) {
  const BATCH_SIZE = 1000;

  for (let i = 0; i < updates.length; i += BATCH_SIZE) {
    const batch = updates.slice(i, i + BATCH_SIZE);

    await sdk.products.updateStock(warehouseId, { stocks: batch });
    console.log(`Обновлено ${Math.min(i + BATCH_SIZE, updates.length)} / ${updates.length}`);

    if (i + BATCH_SIZE < updates.length) {
      await new Promise(r => setTimeout(r, 1000));
    }
  }
}

Rate Limits

МетодЛимитИнтервал
warehouses()60 запросов1 минута
getStocks()600 запросов1 минута
updateStock()600 запросов1 минута
deleteStock()600 запросов1 минута
getSupplierStocks()1 запрос1 минута
warehouseRemains()1 запрос1 минута

Best Practices

1. Батчинг обновлений

typescript
// Плохо: много мелких запросов
for (const item of items) {
  await sdk.products.updateStock(warehouseId, { stocks: [item] });
}

// Хорошо: батч до 1000 элементов
await sdk.products.updateStock(warehouseId, { stocks: items.slice(0, 1000) });

2. Обработка ошибок

typescript
async function safeUpdateStock(
  sdk: WildberriesSDK,
  warehouseId: number,
  stocks: { sku: string; amount: number }[]
) {
  try {
    await sdk.products.updateStock(warehouseId, { stocks });
    return { success: true };
  } catch (error: any) {
    if (error.statusCode === 429) {
      await new Promise(r => setTimeout(r, 60000));
      return safeUpdateStock(sdk, warehouseId, stocks);
    }
    throw error;
  }
}

Связанные материалы


← Назад к руководствам

Made with ❤️ for the Wildberries developer community