wb-api-client
Version:
Typescript API для Wildberries, сгенерированное из Swagger. Без внешних зависимостей.
1,632 lines (1,563 loc) • 92.9 kB
text/typescript
/* eslint-disable */
/* tslint:disable */
/*
* ---------------------------------------------------------------
* ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##
* ## ##
* ## AUTHOR: acacode ##
* ## SOURCE: https://github.com/acacode/swagger-typescript-api ##
* ---------------------------------------------------------------
*/
export interface KeysDeleteResponse {
/** Статусы удаления ключей */
statuses: {
/**
* Идентификатор ключа
* @format int64
*/
id: number;
/** HTTP статус-код для каждой операции над ключом */
code: string;
/** Описание к статусу удаления */
message: string;
/** Флаг статуса удаления (`true` - успешно удален, `false` - ошибка) */
status: boolean;
}[];
}
export interface OfferResponse {
/**
* Идентификатор предложения
* @format int64
* @example 42
*/
id?: number;
/**
* Название предложения
* @example "Книга `Спортивное питание`"
*/
title?: string;
/**
* Описание предложения
* @example "Очень хорошая книга о спортивном питании."
*/
description?: string;
/**
* Идентификатор категории товара:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `3` — Ключи активации
* - `4` — Электронные книги
* - `5` — Аудиокниги
* - `6` — Цифровые товары
* - `8` — Услуги
* - `12` — Купоны и развлечения
* - `13` — Подарочные сертификаты
* @format int32
* @example 4
*/
section?: 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 12 | 13;
/**
* Массив идентификаторов подкатегорий, в котором находится предложение
* @example [10]
*/
catalog_path?: number[];
/**
* Цена предложения в рублях
* @format int64
* @example 849
*/
price?: number;
/**
* Цена с учетом скидки в рублях
* @format int64
* @example 799
*/
discount_price?: number;
/**
* Список URL-адресов дополнительных изображений, а так же видео превью
* @example ["vol42/352/91b751bfb753ff365afbc8dca21b7f87/video.mp4","vol42/352/91b751bfb753ff365afbc8dca21b7f87/0_1280.jpg","vol42/352/91b751bfb753ff365afbc8dca21b7f87/1_1280.png"]
*/
gallery?: string[];
/** Метаданные предложения */
meta?: string;
/** Список тегов. Теги нужны для группирования, ранжирования и облегчения поиска вашего товара. */
tags?: Tag[] | null;
/**
* Обложка предложения
* @example ["vol6/842/900bec865s329db6c0efbf0f1a61ebee/480.jpg","vol6/842/900bec865s329db6c0efbf0f1a61ebee/1280.jpg","vol6/842/900bec865s329db6c0efbf0f1a61ebee/1920.jpg"]
*/
thumbnail?: string[];
/** Контент предложения */
content?: OfferContent[];
/**
* Дата создания, UTC +3 (Москва)
* @example "2024-06-10T07:29:30Z"
*/
created?: string;
/**
* Дата обновления, UTC +3 (Москва)
* @example "2024-06-17T22:12:13Z"
*/
updated?: string;
/**
* Дата удаления, UTC +3 (Москва). 1970-01-01T00:00:00Z — является нулевым значение.
* @example "2024-06-19T22:12:13Z"
*/
deleted?: string;
/**
* Статус вашего предложения:
* - `0` — Добавить в черновик
* - `1` — Опубликовать
* @format int32
* @example 1
*/
status: 0 | 1;
/**
* Количество просмотров
* @format int64
* @example 47
*/
view_count?: number;
/**
* Количество покупок
* @format int64
* @example 10
*/
purchase_count?: number;
/**
* Флаг, который отвечает за ограничение контента для взрослых (блюр контента)
* @example false
*/
adult: boolean;
/**
* Возрастное ограничение. Это система, которая используется для определения, подходит ли ваше предложение для определенной возрастной группы.
* @example "16+"
*/
age_rating?: "0+" | "6+" | "12+" | "14+" | "16+" | "18+";
/**
* Рейтинг предложения
* @format float64
* @example 50
*/
rating?: number;
}
export interface OfferCreateRequest {
/**
* Название предложения.</br>Максимальная длина — **500 символов.**
* @maxLength 500
* @example "Книга `Спортивное питание`"
*/
title: string;
/**
* Описание предложения. Это текст, который описывает ваше предложение и помогает людям понять, что именно представляет из себя продаваемый вами товар и чем он может быть полезен. Важно правильно назвать предложение и более подробно прописать его описание, чтобы пользователи узнали как можно больше информации еще до покупки.</br>Максимальная длина — **5000 символов.**
* @maxLength 5000
* @example "Очень хорошая книга о спортивном питании."
*/
description: string;
/**
* Массив тегов. Теги нужны для группирования, ранжирования и облегчения поиска вашего товара.
*
* **Ограничения**:
* - Максимальное количество тегов — **5**
* - Максимальная длина тега — **45 символов**
* @maxItems 5
* @minItems 1
* @example ["life","work","gym"]
*/
tags: string[];
/**
* Идентификатор категории предложения:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `3` — Ключи активации
* - `4` — Электронные книги
* - `5` — Аудиокниги
* - `6` — Цифровые товары
* - `8` — Услуги
* - `12` — Купоны и развлечения
* - `13` — Подарочные сертификаты
* @format int32
* @example 4
*/
section: 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 12 | 13;
/**
* Массив идентификаторов подкатегорий, в котором находится предложение.</br>
* Воспользуйтесь методом [Получить категории и их подкатегории](#operation/GetCatalog) для получения идентификатора и правильного сопоставления с категорией.
* @minItems 1
* @example [10]
*/
catalog_path: number[];
/**
* Возрастное ограничение. Это система, которая используется для определения, подходит ли ваше предложение для определенной возрастной группы.
* @example "16+"
*/
age_rating: "0+" | "6+" | "12+" | "14+" | "16+" | "18+";
/**
* Цена предложения в рублях
* @format int64
* @example 849
*/
price: number;
/**
* Цена с учетом скидки в рублях
* @format int64
* @example 799
*/
discount_price?: number;
/**
* Список URL-адресов дополнительных изображений, а так же видео превью.</br>
* **Можно передать до 8 медиа-файлов.**</br>
* **Важно, чтобы все изображения были в формате .jpg или .png, а видео в формате .mp4**
* @maxItems 8
* @example ["vol42/352/91b751bfb753ff365afbc8dca21b7f87/video.mp4","vol42/352/91b751bfb753ff365afbc8dca21b7f87/0_1280.jpg","vol42/352/91b751bfb753ff365afbc8dca21b7f87/1_1280.png"]
*/
gallery?: string[];
/**
* Список ключей.</br>
* Это **обязательное поле**, если вы хотите создать предложение из категории (`section`):
* - **Ключи активации** — `3`
* - **Купоны и развлечения** — `12`
* - **Подарочные сертификаты** — `13`
*
* **Ограничения:**
* - Максимальное количество ключей — **1000**
* - Максимальная длина ключа — **200 символов**
* @maxItems 1000
* @example ["0181-c2a38--6379-69d8ae","1983-454e4--5379-0edbbc","6860-f1f20--8421-c1e6a1"]
*/
keys?: string[];
/**
* Задается статус вашего предложения:
* - `0` — Добавить в черновик
* - `1` — Опубликовать
* @format int32
* @default 0
* @example 1
*/
status?: 0 | 1;
/**
* Список контента
* @example [{"category_id":4,"content":8942},{"category_id":4,"content":4211}]
*/
content?: OfferCreateContent[];
/** Метаданные предложения */
meta?: OfferMetaRequest;
}
export interface OfferUpdateRequest {
/**
* Название предложения.</br>Максимальная длина — **500 символов.**
* @maxLength 500
* @example "Книга `Спортивное питание`"
*/
title?: string;
/**
* Описание предложения. Это текст, который описывает ваше предложение и помогает людям понять, что именно представляет из себя продаваемый вами товар и чем он может быть полезен. Важно правильно назвать предложение и более подробно прописать его описание, чтобы пользователи узнали как можно больше информации еще до покупки.</br>Максимальная длина — **5000 символов.**
* @maxLength 5000
* @example "Очень хорошая книга о спортивном питании."
*/
description?: string;
/**
* Цена предложения в рублях
* @format int64
* @example 849
*/
price?: number;
/**
* Цена с учетом скидки в рублях
* @format int64
* @example 799
*/
discount_price?: number | null;
/**
* Список URL-адресов дополнительных изображений, а так же видео превью.</br>
* **Можно передать до 8 медиа-файлов.**</br>
* **Важно, чтобы все изображения были в формате .jpg или .png, а видео в формате .mp4**
* @maxItems 8
* @example ["vol42/352/91b751bfb753ff365afbc8dca21b7f87/video.mp4","vol42/352/91b751bfb753ff365afbc8dca21b7f87/0_1280.jpg","vol42/352/91b751bfb753ff365afbc8dca21b7f87/1_1280.png"]
*/
gallery?: string[] | null;
/**
* Возрастное ограничение. Это система, которая используется для определения, подходит ли ваше предложение для определенной возрастной группы.
* @example "16+"
*/
age_rating?: "0+" | "6+" | "12+" | "14+" | "16+" | "18+";
/**
* Массив тегов. Теги нужны для группирования, ранжирования и облегчения поиска вашего товара.
*
* **Ограничения**:
* - Максимальное количество тегов — **5**
* - Максимальная длина тега — **45 символов**
* @maxItems 5
* @minItems 1
* @example ["life","work","gym"]
*/
tags?: string[];
/**
* Статус вашего предложения:
* - `0` — Добавить в черновик
* - `1` — Опубликовать
* - `2` — Приостановить продажу
* - `3` — Удалить
* @format int32
* @example 1
*/
status?: 0 | 1 | 2 | 3;
/**
* Массив идентификаторов подкатегорий, в котором находится предложение.</br>
* Воспользуйтесь методом [Получить категории и их подкатегории](#operation/GetCatalog) для получения идентификатора и правильного сопоставления с категорией.
* @example [10]
*/
catalog_path?: number[];
/** Метаданные предложения */
meta?: OfferMetaRequest;
/**
* Идентификатор категории предложения:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `4` — Электронные книги
* - `5` — Аудиокниги
* - `6` — Цифровые товары
* @format int32
* @example 4
*/
section?: 1 | 2 | 4 | 5 | 6;
}
export interface OfferPriceUpdateRequest {
/**
* Цена в рублях
* @format int64
* @example 5432
*/
regular_price?: number;
/**
* Цена в рублях с учетом скидки
* @format int64
* @example 5000
*/
discount_price?: number;
}
export interface KeysCountResponse {
/**
* Общее количество ключей
* @format int64
* @example 10
*/
total: number;
/**
* Количество свободных ключей
* @format int64
* @example 5
*/
available: number;
/**
* Количество зарезервированных ключей
* @format int64
* @example 2
*/
reserved: number;
/**
* Количество удаленных ключей
* @format int64
* @example 2
*/
deleted: number;
}
export interface OfferStatusUpdateRequest {
/** @format int32 */
status: 0 | 1 | 2 | 3;
}
/** Метаданные предложения */
export interface OfferMetaRequest {
/**
* Адреса где можно воспользоваться купонами, подарочными сертификатами
* @maxLength 1000
* @example "Москва, Нагатинская д. 1"
*/
addresses?: string | null;
/**
* Инструкция по активации ключа
* @maxLength 5000
* @example "Инструкция по активации
* 1. Зайдите на сайт ...
* 2.Вставьте ключ в поле ..."
*/
key_instruction?: string | null;
}
export interface OfferResponseList {
/** Список предложений */
items: OfferResponse[];
/**
* Общее количество записей, соответствующих заданным критериям выборки.
*
* Параметры:
* - `take` (integer): Количество записей, которые необходимо вернуть в текущем ответе. Например, если `take` равно 10, то в ответе будет не более 10 записей.
* - `skip` (integer): Количество записей, которые необходимо пропустить перед началом выборки. Например, если `skip` равно 20, то выборка начнется с 21-й записи.
*
* Поле `total` показывает полное количество записей, соответствующих условиям фильтрации, без учета параметров `take` и `skip`.
*/
total: Total;
}
export interface KeyResponse {
/**
* Идентификатор ключа
* @format int64
* @example 42
*/
id: number;
/**
* Значение ключа
* @example "0181-c2a38--6379-69d8ae"
*/
value: string;
/**
* Дата и время создания ключа
* @example "2022-06-15T09:19:02Z"
*/
created_at: string;
/**
* Дата и время покупки ключа
* @example "2022-07-03T011:30:30Z"
*/
buyed_at: string | null;
/**
* Дата и время удаления ключа
* @example "2022-07-03T011:30:30Z"
*/
deleted_at: string | null;
}
export interface OfferContent {
/**
* Идентификатор контента
* @format int64
* @example 542342523
*/
content: number;
/**
* Название контента
* @example "Книга 'Иван Тургенев: Отцы и дети'"
*/
title?: string;
/**
* Описание контента
* @example "Очень хорошая книга."
*/
description?: string;
/** Список с информацией о дополнительных файлах */
files?: {
/**
* Тип контента
* @example "application/fb2"
*/
contentType?: string;
/**
* Размер файла
* @format int64
* @example 3665547
*/
size?: number;
/**
* URI адрес на файл
* @example "vol13/689/98235be67bdefcew2a33c5f0e55b17eb/output.fb2"
*/
uri?: string;
}[];
/**
* Хранит в себе метаданные контента:
* - `bisac` — ISBN (Международный стандартный книжный номер)
* - `voice` — Актер озвучивающий аудиоконтент
* - `author` — Автор контента
* - `rating` — Возрастное ограничение
* - `preview` — Короткий отрезок контента для предварительного просмотра
* - `duration` — Продолжительность контента
* - `thumbnail` — Список обложки для контента разного разрешения
* - `dimensions` — Список разрешений видео
* - `duration_ms` — Продолжительность контента в миллисекундах
* - `translator` — Автор перевода
* - `original_name` — Оригинальное название контента
* - `pages` — Количество страниц в контенте
* - `encoded_videos` — Список информации (размер, разрешение) для декодированного видео
* - `encoded_audios` — Список информации (размер, битрейт) для декодированного аудио
*/
meta?: string;
/**
* URI адрес на плейлист контента.
*
* Если контент является аудио или видео контентом, то файл декодируется в плейлист.
* @example "vol14/147/f2671cfb67bd8c200b9464vd6f0dd97d/output.m3u8"
*/
playlist?: string;
/**
* Идентификатор категории контента:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `4` — Документ
* @format int64
* @example 4
*/
category_id?: 1 | 2 | 4;
}
export interface GetFullCatalogResponse {
/** Дерево с категориям и их подкатегориями */
items: CatalogNode[];
/** @format int64 */
total: number;
}
export interface CatalogNode {
/**
* Список дочерних узлов
* @example [{"id":1,"img":"vol0/catalog/icons/1.svg","is_section":true,"name":"VIDEO","node_order":0,"parent_id":0,"section_id":1,"total":6482,"children":[{"id":65,"img":"","is_section":false,"name":"Обучающие видео","node_order":1,"parent_id":0,"section_id":1,"total":0,"children":[]},{"id":66,"img":"","is_section":false,"name":"Спорт","node_order":2,"parent_id":0,"section_id":1,"total":0,"children":[]},{"id":67,"img":"","is_section":false,"name":"Мастер-класс","node_order":3,"parent_id":0,"section_id":1,"total":0,"children":[]}]},{"id":2,"img":"vol0/catalog/icons/2.svg","is_section":true,"name":"AUDIO","node_order":0,"parent_id":0,"section_id":2,"total":1983,"children":[{"id":73,"img":"","is_section":false,"name":"Обучение","node_order":1,"section_id":2,"total":0,"children":[]},{"id":74,"img":"","is_section":false,"name":"Медитации","node_order":2,"parent_id":0,"section_id":2,"total":0,"children":[]},{"id":75,"img":"","is_section":false,"name":"Мастер-класс","node_order":3,"parent_id":0,"section_id":2,"total":0,"children":[]}]}]
*/
children?: CatalogNode[];
/**
* URI адрес на иконку категории
* @example ""
*/
img: string;
/**
* Название узла
* @example "Каталог"
*/
name: string;
/**
* Указывает на id родителя подкатегории.
* @format int64
*/
parent_id: number;
/**
* Список `id` (идентификатор узла). Путь до элемента каталога.
* @example null
*/
path?: number[] | null;
/**
* Идентификатор узла.
*
* Если `is_section` = `true`, то `id` является идентификатором катагории(`section`).
*
* Если `is_section` = `false`, то `id` является идентификатором подкатеогрии(`is_path`).
* @format int64
*/
id: number;
/**
* Признак, является ли узел категорией(`section`)
* @example false
*/
is_section: boolean;
/**
* Порядок элементов подкатегорий, которые находятся на одном уровне
* @format int64
*/
node_order: number;
/**
* Идентификатор категории (`section`). Если `is_section` = `false`, то `section_id` указывает на родительскую категорию.
* @format int64
*/
section_id: number;
/**
* Общее количество предложений в этой категории. Поле заполняется только у категорий (`section`).
* @format int64
*/
total: number;
}
export interface Tag {
/**
* Идентификатор тега
* @format int64
* @example 1
*/
id?: number;
/**
* Название тега
* @example "бизнес"
*/
value?: string;
/**
* Перевод названия тега
* @example "biznes"
*/
value_translit?: string;
/**
* Вес тега
* @format float64
* @example 100
*/
weight?: number;
}
export interface OfferCreateContent {
/**
* Идентификатор категории контента:
* - `1` — Видео
* - `2` — Аудиоконтент
* - `4` — Документ
* @format int64
* @example 1
*/
category_id: number;
/**
* Идентификатор контента</br>
* @format int64
* @example 8942
*/
content: number;
}
export interface KeysLoadRequest {
/**
* Список ключей.
*
* **Ограничения:**
* - Максимальное количество ключей — **1000**
* - Максимальная длина ключа — **200 символов**
* @maxItems 1000
* @example ["0181-c2a38--6379-69d8ae","4444-m2d2--5555-77f7ff","21fd-1234--3333-4444ff"]
*/
keys: string[];
/**
* Идентификатор предложения
* @format int64
* @example 4251
*/
offer_id: number;
}
export interface KeysResponseList {
/**
* Список ключей
* @example [{"id":42,"value":"0181-c2a38--6379-69d8ae","created_at":"2022-06-15T09:19:02Z","buyed_at":"2022-07-03T011:30:30Z"},{"id":43,"value":"4444-m2d2--5555-77f7ff","created_at":"2022-06-15T12:19:02Z","deleted_at":"2023-02-03T16:22:02Z"}]
*/
items: KeyResponse[];
/**
* Общее количество ключей
* @format int64
* @example 10
*/
total: number;
}
export interface IllustrationResponse {
/**
* Список URI адресов обложки разного разрешения
* @example ["vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/480.jpg","vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/1280.jpg","vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/1920.jpg"]
*/
uris: string[];
/**
* Идентификатор пользователя
* @format int64
* @example 483611
*/
userId: number;
}
export interface UploadInitRequest {
/**
* Название контента.</br>Максимальная длина — **500 символов.**
* @maxLength 500
* @example "Книга `Иван Тургенев: Отцы и дети'"
*/
title: string;
/**
* Описание контента.</br>Максимальная длина — **1000 символов.**
* @maxLength 1000
* @example "Очень хорошая книга."
*/
description: string;
/**
* Идентификатор категории контента:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `4` — Документ
* @example 4
*/
catalog_id: 1 | 2 | 4;
/**
* Тип файла:
* - Видеоконтент:
* - `video/mp4`
* - Аудиоконтент:
* - `audio/mpeg`
* - Документ:
* - `application/pdf`
* - `application/epub+zip`
* - `text/plain`
* @example "application/epub+zip"
*/
content_type: "video/mp4" | "audio/mpeg" | "text/plain" | "application/pdf" | "application/epub+zip";
/**
* Для оптимальной скорости загрузки контента следует разбить файл на фреймы по 2 Мб. В массиве указываются индекс каждого фрейма и его размер.</br>
* @example [{"index":1,"size":2097152},{"index":2,"size":2097152},{"index":3,"size":1048576}]
*/
parts: ChunkPart[];
/** Метаданные. Дополнительная информация о контенте. */
meta: ContentMeta;
}
export interface UploadInitResponse {
/**
* Идентификатор контента
* @format int64
* @example 493292
*/
content_id?: number;
/**
* Уникальный идентификатор. Это идентификатор необходим для загрузки самого файла в методе [Загрузка контента (файла)](#operation/contentUploadChunk)
* @example "25f5e4c9-2cac-11ef-adbf-9cc2c45608a"
*/
uuid?: string;
}
export interface UploadChunkResponse {
/**
* Количество переданных фреймов (частей контента)
* @example 3
*/
chunk?: number;
/**
* URI адреса загруженного файла
* @example "vol19/924/e9e5d152ea3d9018bd061c62f75efbdf/content"
*/
uri?: string;
}
/** Метаданные. Дополнительная информация о контенте. */
export interface ContentMeta {
/**
* URI адреса обложки контента
* @example ["vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/480.jpg","vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/1280.jpg","vol4/id_48361197/fc99358aedea2a0cf68c8dcd7f2a3696/1920.jpg"]
*/
thumbnail: string[];
/**
* Имя исходного файла
* @maxLength 100
* @example "Иван_Тургенев:_Отцы_и_дети.epub"
*/
source_file_name?: string;
/**
* Возрастное ограничение
* @example "16+"
*/
rating?: "0+" | "6+" | "12+" | "14+" | "16+" | "18+";
/**
* Оригинальное название контента
* @maxLength 100
* @example "Иван_Тургенев:_Отцы_и_дети"
*/
original_name?: string;
/**
* Актер озвучивающий аудиоконтент
* @maxLength 100
* @example "Кузнецов В.Б."
*/
voice?: string;
/**
* [ISBN](https://en.wikipedia.org/wiki/ISBN) (Международный стандартный книжный номер)
* - Каждый ISBN уникален
* - Состоит из 13 символов, начиная с префикса "978" или "979"
* @example "978-5-389-04996-3"
*/
bisac?: string;
/**
* Количество страниц в книге (файле)
* @format int32
* @example 354
*/
pages?: number;
/**
* Автор контента
* @maxLength 100
* @example "Иван Тургенев"
*/
author?: string;
/**
* Автор перевода, также известный как переводчик, это человек, который занимается переводом текста из одного языка на другой.
* @maxLength 100
* @example "Hare Richard"
*/
translator?: string;
/**
* Продолжительность контента
* @example "00:05:11"
*/
duration?: string;
}
export interface ProblemDetails400 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 400
*/
status?: number;
/**
* Короткое описание ошибки
* @example "bad request"
*/
title: string;
/**
* Развернутое описание ошибки
* @example "value 'five' is invalid for parameter offer_id"
*/
detail?: string;
/** Служебная информация ошибки */
code?: string;
/**
* Массив ошибок.
*
* Для передачи нескольких ошибок.
*/
errors?: ProblemDetails400[];
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface ProblemDetails401 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 401
*/
status?: number;
/**
* Короткое описание ошибки
* @example "unauthorized"
*/
title: string;
/**
* Развернутое описание ошибки
* @example "authorization required"
*/
detail?: string;
/** Служебная информация ошибки */
code?: string;
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface ProblemDetails403 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 403
*/
status?: number;
/**
* Короткое описание ошибки
* @example "forbidden"
*/
title: string;
/** Служебная информация ошибки */
code?: string;
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface ProblemDetails404 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 404
*/
status?: number;
/**
* Короткое описание ошибки
* @example "not found"
*/
title: string;
/**
* Развернутое описание ошибки
* @example "content with id 789 not found"
*/
detail?: string;
/** Служебная информация ошибки */
code?: string;
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface ProblemDetails500 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 500
*/
status?: number;
/**
* Короткое описание ошибки
* @example "internal server error"
*/
title: string;
/** Служебная информация ошибки */
code?: string;
/**
* Массив ошибок.
*
* Для передачи нескольких ошибок.
*/
errors?: ProblemDetails500[];
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface ProblemDetails502 {
/**
* Дубликат HTTP статус-код
* @format int32
* @example 502
*/
status?: number;
/**
* Короткое описание ошибки
* @example "bad gateway"
*/
title: string;
/** Служебная информация ошибки */
code?: string;
/**
* Массив ошибок.
*
* Для передачи нескольких ошибок.
*/
errors?: ProblemDetails502[];
/**
* Идентификатор запроса.
*
* Дубликат заголовка `X-Request-Id`.
* @example "b709d59bd0791513350332ffe5f813c1"
*/
requestId: string;
/**
* Имя сервиса
* @example "gateway-dev"
*/
origin?: string;
}
export interface KeyRedeemedResponse {
/**
* Идентификатор ключа
* @format int64
* @example 54321
*/
id: number;
/**
* Ключ
* @example "0181-c2a38--6379-69d8ae"
*/
value: string;
/**
* Дата создания ключа
* @example "2024-05-10T09:25:50Z"
*/
created_at: string;
/**
* Дата покупки ключа
* @example "2024-05-13T11:08:46Z"
*/
buyed_at: string;
/**
* Идентификатор предложения
* @format int64
* @example 42124
*/
offer_id: number;
/**
* Название предложения
* @example "Игра Red Dead Redemption (Steam)"
*/
offer_title: string;
/**
* Цена предложения
* @format int64
* @example 2490
*/
offer_price: number;
}
export interface UpdateContentRequest {
/**
* Название контента.</br>Максимальная длина — **500 символов.**
* @maxLength 500
* @example "Книга 'Иван Тургенев: Отцы и дети'"
*/
title?: string | null;
/**
* Описание контента.</br>Максимальная длина — **1000 символов.**
* @maxLength 1000
* @example "Очень хорошая книга."
*/
description?: string | null;
}
export interface ChunkPart {
/**
* Индекс фрейма (фрагмента)
* @format int64
*/
index: number;
/**
* Размер фрейма (фрагмента) в байтах
* @format int64
*/
size: number;
}
export interface Content {
/**
* Идентификатор контента
* @format int64
* @example 5321
*/
id: number;
/**
* Идентификатор автора
* @format int64
* @example 93224
*/
author_id: number;
/**
* Название контента
* @example "Книга 'Иван Тургенев: Отцы и дети'"
*/
title: string;
/**
* Описание контента
* @example "Очень хорошая книга."
*/
description: string;
/**
* Тип файла:
* - Видеоконтент:
* - `video/mp4`
* - Аудиоконтент:
* - `audio/mpeg`
* - Документ:
* - `application/pdf`
* - `application/epub+zip`
* - `text/plain`
*
* @example "application/epub+zip"
*/
content_type: "video/mp4" | "audio/mpeg" | "text/plain" | "application/pdf" | "application/epub+zip";
/**
* URI адрес контента
* @example "vol19/924/e9e55159ea3d9018bd061c62f75efbdf/content"
*/
uri: string;
/** Список с информацией о дополнительных файлах */
files: {
/**
* Тип контента
* @example "application/fb2"
*/
contentType?: string;
/**
* Размер файла
* @format int64
* @example 3665547
*/
size?: number;
/**
* URI адрес на файл
* @example "vol13/689/98235be67bdefcew2a33c5f0e55b17eb/output.fb2"
*/
uri?: string;
}[];
/**
* URI адрес на плейлист контента.
*
* Если контент является аудио или видео контентом, то файл декодируется в плейлист.
* @example "vol14/147/f2671cfb67bd8c200b9464vd6f0dd97d/output.m3u8"
*/
playlist: string;
/**
* Хранит в себе метаданные контента:
* - `bisac` — ISBN (Международный стандартный книжный номер)
* - `voice` — Актер озвучивающий аудиоконтент
* - `author` — Автор контента
* - `rating` — Возрастное ограничение
* - `preview` — Короткий отрезок контента для предварительного просмотра
* - `duration` — Продолжительность контента
* - `thumbnail` — Список обложки для контента разного разрешения
* - `dimensions` — Список разрешений видео
* - `duration_ms` — Продолжительность контента в миллисекундах
* - `translator` — Автор перевода
* - `original_name` — Оригинальное название контента
* - `pages` — Количество страниц в контенте
* - `encoded_videos` — Список информации (размер, разрешение) для декодированного видео
* - `encoded_audios` — Список информации (размер, битрейт) для декодированного аудио
*/
meta?: any;
/**
* Идентификатор категории контента:
* - `1` — Видеоконтент
* - `2` — Аудиоконтент
* - `4` — Документ
* @format int64
* @example 4
*/
category_id: 1 | 2 | 4;
/**
* Статус контента:
* - `0` — Создан
* - `1` — Загружено на сервер
* - `2` — Опубликован
* - `3` — Ошибка в обработке или публикации
* - `4` — Обрабатывается
* - `5` — Отправлено на сервер
* @format int32
* @example 2
*/
status: number;
/**
* Дата создания, UTC +3 (Москва)
* @example "2024-06-10T07:29:30Z"
*/
created: string;
/**
* Дата обновления, UTC +3 (Москва)
* @example "2024-06-17T22:12:13Z"
*/
updated: string;
}
export interface ContentList {
/** Список контента */
items: Content[];
/**
* Общее количество записей, соответствующих заданным критериям выборки.
*
* Параметры:
* - `take` (integer): Количество записей, которые необходимо вернуть в текущем ответе. Например, если `take` равно 10, то в ответе будет не более 10 записей.
* - `skip` (integer): Количество записей, которые необходимо пропустить перед началом выборки. Например, если `skip` равно 20, то выборка начнется с 21-й записи.
*
* Поле `total` показывает полное количество записей, соответствующих условиям фильтрации, без учета параметров `take` и `skip`.
*/
total: Total;
}
export interface UploadGalleryResponse {
/**
* Список URI адресов на медиафайлы
* @example ["vol42/352/91b751bfb753ff365afbc8dca21b7f87/video.mp4","vol42/352/91b751bfb753ff365afbc8dca21b7f87/0_1280.jpg","vol42/352/91b751bfb753ff365afbc8dca21b7f87/1_1280.png"]
*/
uris?: string[];
}
export interface KeysRedeemedResponseList {
/** Список проданных ключей */
items: KeyRedeemedResponse[];
/**
* Общее количество записей, соответствующих заданным критериям выборки.
*
* Параметры:
* - `take` (integer): Количество записей, которые необходимо вернуть в текущем ответе. Например, если `take` равно 10, то в ответе будет не более 10 записей.
* - `skip` (integer): Количество записей, которые необходимо пропустить перед началом выборки. Например, если `skip` равно 20, то выборка начнется с 21-й записи.
*
* Поле `total` показывает полное количество записей, соответствующих условиям фильтрации, без учета параметров `take` и `skip`.
*/
total: Total;
}
/**
* Общее количество записей, соответствующих заданным критериям выборки.
*
* Параметры:
* - `take` (integer): Количество записей, которые необходимо вернуть в текущем ответе. Например, если `take` равно 10, то в ответе будет не более 10 записей.
* - `skip` (integer): Количество записей, которые необходимо пропустить перед началом выборки. Например, если `skip` равно 20, то выборка начнется с 21-й записи.
*
* Поле `total` показывает полное количество записей, соответствующих условиям фильтрации, без учета параметров `take` и `skip`.
* @format int64
* @example 10
*/
export type Total = number;
export type QueryParamsType = Record<string | number, any>;
export type ResponseFormat = keyof Omit<Body, "body" | "bodyUsed">;
export interface FullRequestParams extends Omit<RequestInit, "body"> {
/** set parameter to `true` for call `securityWorker` for this request */
secure?: boolean;
/** request path */
path: string;
/** content type of request body */
type?: ContentType;
/** query params */
query?: QueryParamsType;
/** format of response (i.e. response.json() -> format: "json") */
format?: ResponseFormat;
/** request body */
body?: unknown;
/** base url */
baseUrl?: string;
/** request cancellation token */
cancelToken?: CancelToken;
}
export type RequestParams = Omit<FullRequestParams, "body" | "method" | "query" | "path">;
export interface ApiConfig<SecurityDataType = unknown> {
baseUrl?: string;
baseApiParams?: Omit<RequestParams, "baseUrl" | "cancelToken" | "signal">;
securityWorker?: (securityData: SecurityDataType | null) => Promise<RequestParams | void> | RequestParams | void;
customFetch?: typeof fetch;
}
export interface HttpResponse<D extends unknown, E extends unknown = unknown> extends Response {
data: D;
error: E;
}
type CancelToken = Symbol | string | number;
export enum ContentType {
Json = "application/json",
FormData = "multipart/form-data",
UrlEncoded = "application/x-www-form-urlencoded",
Text = "text/plain",
}
export class HttpClient<SecurityDataType = unknown> {
public baseUrl: string = "https://devapi-digital.wildberries.ru";
private securityData: SecurityDataType | null = null;
private securityWorker?: ApiConfig<SecurityDataType>["securityWorker"];
private abortControllers = new Map<CancelToken, AbortController>();
private customFetch = (...fetchParams: Parameters<typeof fetch>) => fetch(...fetchParams);
private baseApiParams: RequestParams = {
credentials: "same-origin",
headers: {},
redirect: "follow",
referrerPolicy: "no-referrer",
};
constructor(apiConfig: ApiConfig<SecurityDataType> = {}) {
Object.assign(this, apiConfig);
}
public setSecurityData = (data: SecurityDataType | null) => {
this.securityData = data;
};
protected encodeQueryParam(key: string, value: any) {
const encodedKey = encodeURIComponent(key);
return `${encodedKey}=${encodeURIComponent(typeof value === "number" ? value : `${value}`)}`;
}
protected addQueryParam(query: QueryParamsType, key: string) {
return this.encodeQueryParam(key, query[key]);
}
protected addArrayQueryParam(query: QueryParamsType, key: string) {
const value = query[key];
return value.map((v: any) => this.encodeQueryParam(key, v)).join("&");
}
protected toQueryString(rawQuery?: QueryParamsType): string {
const query = rawQuery || {};
const keys = Object.keys(query).filter((key) => "undefined" !== typeof query[key]);
return keys
.map((key) => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key)))
.join("&");
}
protected addQueryParams(rawQuery?: QueryParamsType): string {
const queryString = this.toQueryString(rawQuery);
return queryString ? `?${queryString}` : "";
}
private contentFormatters: Record<ContentType, (input: any) => any> = {
[ContentType.Json]: (input: any) =>
input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input,
[ContentType.Text]: (input: any) => (input !== null && typeof input !== "string" ? JSON.stringify(input) : input),
[ContentType.FormData]: (input: any) =>
Object.keys(input || {}).reduce((formData, key) => {
const property = input[key];
formData.append(
key,
property instanceof Blob
? property
: typeof property === "object" && property !== null
? JSON.stringify(property)
: `${property}`,
);
return formData;
}, new FormData()),
[ContentType.UrlEncoded]: (input: any) => this.toQueryString(input),
};
protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams {
return {
...this.baseApiParams,
...params1,
...(params2 || {}),
headers: {
...(this.baseApiParams.headers || {}),
...(params1.headers || {}),
...((params2 && params2.headers) || {}),
},
};
}
protected createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => {
if (this.abortControllers.has(cancelToken)) {
const abortController = this.abortControllers.get(cancelToken);
if (abortController) {
return abortController.signal;
}
return void 0;
}
const abortController = new AbortController();
this.abortControllers.set(cancelToken, abortController);
return abortController.signal;
};
public abortRequest = (cancelToken: CancelToken) => {
const abortController = this.abortControllers.get(cancelToken);
if (abortController) {
abortController.abort();
this.abortControllers.delete(cancelToken);
}
};
public request = async <T = any, E = any>({
body,
secure,
path,
type,
query,
format,
baseUrl,
cancelToken,
...params
}: FullRequestParams): Promise<HttpResponse<T, E>> => {
const secureParams =
((typeof secure === "boolean" ? secure : this.baseApiParams.secure) &&
this.securityWorker &&
(await this.securityWorker(this.securityData))) ||
{};
const requestParams = this.mergeRequestParams(params, secureParams);
const queryString = query && this.toQueryString(query);
const payloadFormatter = this.contentFormatters[type || ContentType.Json];
const responseFormat = format || requestParams.format;
return this.customFetch(`${baseUrl || this.baseUrl || ""}${path}${queryString ? `?${queryString}` : ""}`, {
...requestParams,
headers: {
...(requestParams.headers || {}),
...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}),
},
signal: (cancelToken ? this.createAbortSignal(cancelToken) : requestParams.signal) || null,
body: typeof body === "undefined" || body === null ? null : payloadFormatter(body),
}).then(async (response) => {
const r = response.clone() as HttpResponse<T, E>;
r.data = null as unknown as T;
r.error = null as unknown as E;
const data = !responseFormat
? r
: await response[responseFormat]()
.then((data) => {
if (r.ok) {
r.data = data;
} else {
r.error = data;
}
return r;
})
.catch((e) => {
r.error = e;
return r;
});
if (cancelToken) {
this.abortControllers.delete(cancelToken);
}
if (!response.ok) throw data;
return data;
});
};
}
/**
* @title Wildberries Цифровой
* @baseUrl https://devapi-digital.wildberries.ru
*
* По вопросам работы с WBD API, обращайтесь в <a href="https://digital.wildberries.ru/support" target="_blank">техническую поддержку</a>.
*/
export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
api = {
/**
* @description Максимум 50 запросов в секунду Метод позволяет добавить ключи для предложения по идентификатору. <div class="description_important"> Предложение должно быть из категории (<code>section</code>): <ul> <li>Ключи активации — <code>3</code></li> <li>Купоны и развлечения — <code>12</code></li> <li>Подарочные сертификаты — <code>13</code></li> </ul> </div>
*
* @tags Ключи активации
* @name LoadKeys
* @summary Добавить ключи активации
* @request POST:/api/v1/keys-api/keys
* @secure
*/
loadKeys: (data: KeysLoadRequest, params: RequestParams = {}) =>
this.request<void, ProblemDetails401 | ProblemDetails403 | ProblemDetails404 | ProblemDetails500>({
path: `/api/v1/keys-api/keys`,
method: "POST",
body: data,
secure: true,
type: ContentType.Json,
...params,
}),
/**
* @description Максимум 100 запросов в секунду Метод позволяет удалить ключи активации по их идентификаторам <div class="description_important"> Доступ к методу предоставляется через заявку в <a href="https://digital.wildberries.ru/support" target="_black">техническую поддержку</a>. </div>
*
* @tags Ключи активации
* @name DeleteKeysByIDs
* @summary Удалить ключи активации
* @request DELETE:/api/v1/keys-api/keys
* @secure
*/
deleteKeysByIDs: (
query: {
/** Список идентификаторов ключей */
ids: number[];
},
params: RequestParams = {},
) =>
this.request<
KeysDeleteResponse,
ProblemDetails400 | ProblemDetails401 | ProblemDetails403 | ProblemDetails404 | ProblemDetails500
>({
path: `/api/v1/keys-api/keys`,
method: "DELETE",
query: query,
secure: true,
format: "json",
...params,
}),
/**
* @description Максимум 100 запросов в секунду Метод позволяет получить список купленных ключей с использованием фильтрации. ### Описание параметров фильтрации: - `offer_id` — Фильтрация по идентификатору предложения. Позволяет выбрать ключи, связанные с определенным предложением. - `skip` — Смещение. Указывает, сколько записей нужно пропустить в результирующем наборе.<br/> **Например**, если `skip` равно 20, то выборка начнется с 21-й записи. - `take` — Количество записей для получения. Указывает, сколько ключей должно быть возвращено в ответе.<br/> **Например**, если `take` равно 10, то в ответе будет не более 10 записей. - `date_from` — Фильтрация по дате покупки начиная с указанной даты (включительно).<br/> Формат даты: **RFC3339**. - `date_to` — Фильтрация по дате покупки до указанной даты (не включительно).<br/> Формат даты: **RFC3339**.
*
* @tags Ключи активации
* @name GetRedeemedKeys
* @summary Получить купленные ключи
* @request GET:/api/v1/keys-api/keys/redeemed
* @secure
*/
getRedeemedKeys: (
query?: {
/**
* Фильтрация по идентификатору предложения. Позволяет выбрать ключи, связанные с определенным предложением.
* @format int64
*/
offer_id?: number;
/**
* Смещение. Указывает, сколько записей нужно пропустить в результирующем наборе. Используется для реализации пагинации.
* @format int64
* @default 0
*/
skip?: number;
/**
* Количество записей для получения. Указывает, сколько ключей должно быть возвращено в ответе.
* @format int64
* @default 50
*/
take?: number;
/**
* Фильтрация по дате покупки начиная с указанной даты (включительно).
*
* Формат даты: **RFC3339** (`2023-06-17T19:20:30Z`).
*/
date_from?: string;
/**
* Фильтрация по дате покупки до указанной даты (не включительно).
*
* Формат даты: **RFC3339** (`2024-10-18T19:20:30Z`).
*/
date_to?: string;
},
params: RequestParams = {},
) =>
this.request<KeysRedeemedResponseList, ProblemDetails401 | ProblemDetails500>({
path: `/api/v1/keys-api/keys/redeemed`,
method: "GET",
query: query,
secure: true,
format: "json",
...params,
}),
/**
* @description Максимум 100 запросов в секунду Метод позволяет получить информацию о количестве ключей у конкретного предложения.
*
* @tags Ключи активации
* @name OfferKeysCountGet
* @summary Получить количество ключей для предложения
* @request GET:/api/v1/offer/keys/{offer_id}
* @secure
*/
offerKeysCountGet: (offerId: number, params: RequestParams = {}) =>
this.request<KeysCountResponse, ProblemDetails401 | ProblemDetails404 | ProblemDetails500>({
path: `/api/v1/offer/keys/${offerId}`,
method: "GET",
secure: true,
format: "json",
...params,
}),
/**
* @description Максимум 100 запросов в секунду Метод позволяет получить список загруженных вами ключей для конкретного предложения. <div class="description_important"> Доступ к методу предоставляется через заявку в <a href="https://digital.wildberries.ru/support" target="_black">техническую поддержку</a>. </div>
*
* @tags Ключи активации
* @name OfferKeysGet
* @summary Получить список ключей
* @request GET:/api/v1/offer/keys/{offer_id}/list
* @secure
*/
offerKeysGet: (
offerId: number,
query?: {
/**
* Количество записей для получения. Указывает, сколько ключей должно быть возвращено в ответе
* @format uint32
* @default 50
*/
take?: number;
/**
* Смещение. Указывает, сколько записей нужно пропустить в результирующем наборе. Используется для реализации пагинации
* @format uint32
* @default 0
*/
skip?: number;
/**
* Указывает, будут ли в ответе присутствовать удалённые ключи
* @default true
*/
deleted?: boolean;
/**
* Указывает, будут ли в ответе присутствовать проданные ключи
* @default true
*/
sold?: boolean;
/**
* Указывает, будут ли в ответе присутствовать зарезервированные ключи
* @default true
*/
reserved?: boolean;
/**
* Указывает, будут ли в ответе присутствовать ключи с истекшим сроком действия
* @default true
*/
expired?: boolean;
},
params: RequestParams = {},
) =>
this.request<
KeysResponseList,
ProblemDetails400 | ProblemDetails401 | ProblemDetails403 | ProblemDetails404 | ProblemDetails500
>({
path: `/api/v1/offer/keys/${offerId}/list`,
method: "GET",
query: query,
secure: true,
format: "json",
...params,
}),
/**
* @description Максимум 50 запросов в секунду Метод позволяет создать новое предложение.</br> #### Обязательные поля: - `title` — Название предложения - `description` — Описание предложения - `tags` — Теги предложения - `section` — Категория предложения - `catalog_path` — Подкатегория предложения. - `age_rating` — Возрастное ограничение предложения - `price` — Цена предложения #### Добавить обложку Обложка для предложения загружается **отдельно после создания предложения**.</br> Вам необходимо воспользоваться методом [Добавить или обновить обложку предложения](#operation/offersUploadThumbnail). #### Добавить дополнительные медиа-файлы 1. Загрузить медиафайлы с помощью метода [Загрузить медиа-файл для предложения](#operation/contentGallery), метод возвращает список URI адресов загруженных медиа-файлов 2. Добавить URI медиа-файлов в поле `gallery` #### Категория и подкатеогрия предложения Воспользуйтесь методом [Получить категории и их подкатегории](#operation/GetCatalog) для получения идентификатора подкатегории и правильного сопоставления с категорией. ### Предложение из категории "Услуги" `section` — `8` Доступ к публикации контента этой категории предоставляется через заявку в <a href="https://digital.wildberries.ru/support" target="_blank">техническую поддержку</a>. ### Предложение c уникальными ключами Предложение c уникальными ключами относятся к категориям (`section`): - **Ключи активации** — `3` - **Купоны и развлечения** — `12` - **Подарочные сертификаты** — `13` Обязательные данные: - Ключи к предложению - Инструкция по активации ключа #### Загрузка ключей Список ключей передается в поле `keys` вашего запроса при создании предложения.</br> В дальнейшем вы можете добавлять ключи с помощью метода [Добавить ключи активации](#operation/LoadKeys). #### Добавление инструкции по активации ключа Инструкцию по активации ключа необходимо добавить в поле `meta` в формате **JSON** используя следующий пример.</br> Чтобы сделать текст более привлекательным и удобочитаемым, **используйте перенос строки** `\n`. **Пример:**</br> ```json { "meta":{ "key_instruction": "Инструкция по активации\n1. Зайдите на сайт ...\n2.Вставьте ключ в поле ..." } } ``` ### Предложение с контентом Предложение с контентом относится к категориям (`section`): - **Видеоконтент** — `1` - **Аудиоконтент** — `2` - **Электронные книги** — `4` - **Аудиокниги** — `5` - **Цифровые товары** — `6` Обязательные данные: - Контент для предложения #### Добавление контента Если вы ещё не добавили контент в личный кабинет продавца, то вы можете это сделать по [инструкции](./#tag/Kontent/Kak-dobavit-novyj-kontent:). Для добавления контента вам необходимо передать в поле `content` список данных используя пример ниже.</br> **Пример:**</