Skip to content

Repository files navigation

Логотип Seller SDK

Seller SDK

Типобезопасные TypeScript-клиенты для Seller API российских маркетплейсов.

Статус CI Ozon Seller API: 461 операция Wildberries API: 286 операций Yandex Market API: 165 операций Node.js 20.10 или новее TypeScript strict Лицензия MIT

SDK поддерживает Ozon Seller API, Wildberries API и Yandex Market Partner API. Можно установить только нужную площадку или использовать общий пакет.

Документация пакетов

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

Для проекта, который работает только с Ozon:

npm i @seller-sdk/ozon
import { OzonClient, OzonValues } from "@seller-sdk/ozon";

const ozon = new OzonClient({
  clientId: process.env.OZON_CLIENT_ID!,
  apiKey: process.env.OZON_API_KEY!,
});

const products = await ozon.products.list({
  filter: {
    visibility: OzonValues.ProductListVisibility.All,
  },
  limit: 100,
});

Для проекта, который работает только с Wildberries:

npm i @seller-sdk/wb
import { WbClient, WbValues } from "@seller-sdk/wb";

const wb = new WbClient({ token: process.env.WB_API_TOKEN! });
const connection = await wb.general.getPing();
const tariffs = await wb.general.getTariffConstructorOptions({
  query: { locale: WbValues.GetV1TariffConstructorOptionsLocale.Ru },
});

Для проекта, который работает только с Яндекс Маркетом:

npm i @seller-sdk/ym
import { YmClient, YmValues } from "@seller-sdk/ym";

const ym = new YmClient({ apiKey: process.env.YM_API_KEY! });
const orders = await ym.orders.getBusinessOrders({
  path: { businessId: 123456 },
  body: {
    statuses: [YmValues.OrdersOrderStatusType.Processing],
  },
});

Для приложения, которому нужна единая точка входа:

npm i seller-sdk
import { Marketplace, SellerClient } from "seller-sdk";

const seller = new SellerClient({
  marketplace: Marketplace.Ozon,
  credentials: {
    clientId: process.env.OZON_CLIENT_ID!,
    apiKey: process.env.OZON_API_KEY!,
  },
});

const roles = await seller.ozon.access.getRoles();

Использовать одновременно seller-sdk и focused package не требуется.

Почему SDK удобно использовать

  • Все 461 операция Ozon распределены по предметным областям.
  • Все 286 операций WB распределены по 13 официальным разделам.
  • Все 165 операций Yandex Market распределены по официальным предметным tags.
  • TypeScript подсказывает обязательные поля, ограничения и закрытые наборы значений.
  • Ответы проверяются во время выполнения через SafeShape.
  • Версионные семейства имеют рекомендуемые методы без суффикса версии.
  • Тайм-ауты, отмена, безопасные повторы и метаданные ответа настраиваются единообразно.
  • Для распространённых списков есть ленивые async-итераторы.
  • Новые методы Ozon можно временно вызвать через fixed-origin rawRequest.

Методы без версии

В прикладном коде используйте имя без версии. SDK направит вызов на актуальный поддерживаемый контракт:

await ozon.warehouses.listWarehouses({ limit: 100 }); // сейчас v2
await ozon.finance.listFinanceTransactions(input); // сейчас v3
await wb.general.getNews({ query: { from: "2026-08-01" } }); // сейчас v2

Явную версию используйте только для намеренной фиксации контракта:

await ozon.warehouses.listWarehousesV2({ limit: 100 });
await wb.general.getV2News({ query: { from: "2026-08-01" } });

В Yandex Market официальные operationId текущего snapshot уже не содержат суффиксов версии. Например, /v1/businesses/{businessId}/orders вызывается как ym.orders.getBusinessOrders(...); отдельный versionless alias не требуется.

Если Ozon пометил контракт устаревшим, IDE зачеркнёт и версионный метод, и его алиас. Например, listFinanceTransactions устаревает 8 сентября 2026 года; для нового кода используйте finance.accruals.

Конфигурация запросов

Все клиенты поддерживают одинаковые настройки тайм-аутов, общего дедлайна, повторов, отмены и наблюдения за ответами.

Ozon

const ozon = new OzonClient(credentials, {
  timeoutMs: 30_000,
  deadlineMs: 60_000,
  maxRetries: 2,
  onResponse({ operationId, status, requestId, attempt, willRetry }) {
    console.info({ operationId, status, requestId, attempt, willRetry });
  },
});

await ozon.products.list(input, {
  timeoutMs: 10_000,
  maxRetries: 1,
  signal: abortController.signal,
});

Wildberries

const wb = new WbClient(
  { token: process.env.WB_API_TOKEN! },
  {
    environment: "production",
    timeoutMs: 30_000,
    deadlineMs: 60_000,
    maxRetries: 2,
    onResponse({ operationId, status, requestId, attempt, willRetry }) {
      console.info({ operationId, status, requestId, attempt, willRetry });
    },
  },
);

await wb.general.getNews(
  { query: { from: "2026-08-01", fromID: 42 } },
  {
    timeoutMs: 10_000,
    deadlineMs: 30_000,
    maxRetries: 1,
    signal: abortController.signal,
  },
);

maxRetries задаёт количество повторов после первой попытки. SDK повторяет только безопасные операции чтения: GET и методы, отмеченные в Swagger как x-readonly-method. Мутации не повторяются автоматически независимо от maxRetries.

Yandex Market

const ym = new YmClient(
  { apiKey: process.env.YM_API_KEY! },
  {
    timeoutMs: 30_000,
    deadlineMs: 60_000,
    maxRetries: 2,
    onResponse({ operationId, status, requestId, attempt, willRetry }) {
      console.info({ operationId, status, requestId, attempt, willRetry });
    },
  },
);

await ym.orders.getBusinessOrders(
  {
    path: { businessId: 123456 },
    body: { fake: true },
  },
  {
    timeoutMs: 10_000,
    deadlineMs: 30_000,
    signal: abortController.signal,
  },
);

Yandex Market использует те же timeout/deadline/request options; автоматически повторяются только GET, а HTTP 420 возвращается как RateLimitError. Полное описание аутентификации, businessId/campaignId, всех 36 областей API, YmValues, пагинации, тестовых заказов, бинарных ответов и rawRequest находится в README focused-пакета.

Пагинация

for await (const product of ozon.products.listAll({
  filter: {},
  limit: 100,
})) {
  console.log(product.offer_id);
}

listPages() возвращает страницы, а listAll() — отдельные элементы без накопления всего ответа в памяти. Готовые итераторы есть для товаров, FBO и FBS.

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

import { toSellerSdkErrorDetails } from "@seller-sdk/ozon";

try {
  await ozon.products.list({ filter: {}, limit: 100 });
} catch (error) {
  console.error(toSellerSdkErrorDetails(error));
}

toSellerSdkErrorDetails() одинаково работает для Ozon, WB, YM и umbrella-пакета. Результат содержит стабильные code, message, operationId, HTTP status, request ID, API code/message и validation issues, когда они доступны. В него не включаются stack, cause, ключ API, Client-Id и заголовки авторизации.

Требования

  • Node.js 20.10 или новее;
  • ESM;
  • TypeScript рекомендуется, но собранный JavaScript также поддерживается;
  • секреты продавца должны использоваться только на сервере.

Поддержка браузера не заявляется: ключи Seller API нельзя передавать в клиентское приложение.

Документация

Разработка

pnpm install
pnpm release:check

release:check проверяет форматирование, сгенерированные файлы, lint, TypeScript, тесты, сборку, состав tarball и установку в чистый consumer-проект.

Лицензия и товарные знаки

MIT © Seller SDK contributors.

Seller SDK — независимый open-source проект. Он не связан с Ozon, Wildberries или Яндексом, не одобрен и не спонсируется ими либо другими маркетплейсами. Названия маркетплейсов используются только для обозначения совместимости с их API.

About

Типобезопасные TypeScript SDK для Ozon Seller API, Wildberries API и Yandex Market Partner API.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages