Автоматизация создания и обновления каталога с помощью API

Примечание
Если вы используете внешние системы PlayFab, App Store или Google Play, вы можете импортировать данные из них. Для этого воспользуйтесь инструкцией.

Вы можете автоматизировать создание и обновление каталога, используя методы Shop Builder API. Благодаря автоматизации вы сможете поддерживать каталог в актуальном состоянии, не тратя на это много времени

Это упростит и ускорит работу:

  • с каталогом, в котором содержится большое количество товаров;
  • региональными ценами.
Внимание

Чтобы поддерживать активность пользователей, важно обеспечивать актуальность каталога товаров на стороне Xsolla после его создания. Мы рекомендуем обновлять каталог на стороне Xsolla при обновлениях на вашей стороне, например при добавлении товаров или изменении цен.

Вы можете:

Методы API создания и обновления товаров и акций требуют базовой аутентификации. Передайте в запросе параметр Authorization:Basic <your_authorization_basic_key>, где <your_authorization_basic_key> — пара ID продавца:ключ API, закодированная по стандарту Base64. Значения параметров вы можете найти в Личном кабинете:

  • ID продавца указан:

Создание и обновление товаров

Xsolla поддерживает работу со следующими типами внутриигровых товаров:

  • виртуальные предметы;
  • виртуальные валюты;
  • пакеты виртуальной валюты;
  • бандлы.

Для упрощения интеграции (например, в мобильных приложениях) вы можете использовать универсальный тип — виртуальные предметы — для реализации любой логики внутриигровых покупок. Это позволит унифицировать обработку данных и избежать избыточности в архитектуре вашего каталога.

Если вам нужно создать большое количество товаров, вы можете создать скрипт, который вызовет метод API нужного типа товаров необходимое количество раз.

Внимание

Список параметров, который возвращается в ответе на запрос товаров, отличается от списка параметров, который вам требуется передать при обновлении каталога. Кроме обязательных и обновленных параметров, передайте в методе обновления товаров те параметры, которые вернулись в ответе на запрос товаров.

Пример:

В методе Получение виртуального предмета вернулся объект limits с данными об ограничениях на пользователя. Если вы хотите обновить только цену или название товара, в методе Обновление виртуального предмета передайте текущие данные объекта limits. Если вы не передадите объект limits, данные об ограничениях удалятся при обновлении товара методом Обновление виртуального предмета.

Чтобы добавить товары в каталог используйте следующие методы API:

Чтобы обновить товары в каталоге:

  1. Получите текущие данные из каталога с помощью методов API:
  2. Передайте новые значения параметров с помощью методов API:

Скрипт для автоматического создания товаров через API

Если вам нужно создать большое количество товаров на основе данных из вашей системы, вы можете автоматизировать этот процесс с помощью API.

Вам потребуется:

Если вы хотите использовать группы товаров, предварительно создайте их в Личном кабинете.

Если вы хотите использовать несколько типов товаров, они должны быть созданы в следующем порядке:

  1. Группы товаров в Личном кабинете.
  2. Виртуальные валюты.
  3. Виртуальные предметы.
  4. Пакеты виртуальной валюты.
  5. Бандлы.

Далее рассмотрен пример скрипта, который многократно вызывает метод API Создание виртуального предмета для создания виртуальных предметов.

Скрипт разработан с применением JavaScript и среды выполнения JavaScript — Node.js.

  1. Импортируйте функцию fetch модуля “node-fetch” для отправки HTTP-запросов к серверу Xsolla.
Copy
Full screen
Small screen
1import fetch from "node-fetch";
  1. Задайте константы, необходимые для авторизации запросов. Вместо <your project_id from PA> и <your api key from PA> подставьте ваши значения ID проекта и ключа API, которые будут закодированы по стандарту Base64 для последующего использования в API запросах.
Copy
Full screen
Small screen
1const projectId = <your project_id from PA>;
2
3const apiKey = <your api key from PA>;
4
5const buff = new Buffer(`${projectId}:${apiKey}`);
6
7const basicAuth = buff.toString('base64')
  1. Реализуйте механизм задержки при отправке запросов, чтобы не превышать ограничения частоты запросов к API. Вы можете:
    • Использовать вспомогательную функцию sleep, чтобы задать фиксированную задержку между запросами.
    • Использовать вспомогательную функцию delay, чтобы реализовать экспоненциальные задержки. В этом случае время ожидания между повторными запросами увеличивается после каждой ошибки 429 Too Many Requests с добавлением случайного значения (джиттера) для распределения нагрузки.
Вариант с использованием фиксированной задержки:
Copy
Full screen
Small screen
1function sleep(ms) {
2
3   return new Promise(resolve => setTimeout(resolve, ms));
4
5}

Вариант с использованием экспоненциальных задержек:

Copy
Full screen
Small screen
 1/** Pause for the specified number of milliseconds */
 2function delay(ms) {
 3  return new Promise((resolve) => setTimeout(resolve, ms));
 4}
 5
 6/**
 7 * A fetch wrapper that handles HTTP 429 responses:
 8 * - pure exponential backoff with jitter (ignores Retry-After);
 9 * - limited number of retry attempts.
10 */
11async function fetchWithRateLimit(
12  url,
13  options = {},
14  {
15    maxAttempts = 4,     // 1 initial attempt + 3 retries (balanced approach)
16    baseDelayMs = 1000,  // 1 second base delay (15x the 67ms interval for 15 RPS)
17    factor = 1.5,        // gentler backoff multiplier (1s → 1.5s → 2.25s → 3.4s)
18    maxDelayMs = 4000,   // 4 seconds max delay (prevents excessive waiting)
19    jitterMs = 300       // 300ms random jitter (spreads retries without long delays)
20  } = {}
21) {
22  let attempt = 0;
23
24  while (true) {
25    attempt += 1;
26    const res = await fetch(url, options);
27
28    if (res.status !== 429) return res;
29
30    // 429: calculate pause (exponential backoff + jitter)
31    const backoff = Math.min(
32      Math.floor(baseDelayMs * Math.pow(factor, attempt - 1)),
33      maxDelayMs
34    );
35    const jitter = Math.floor(Math.random() * (jitterMs + 1)); // 0..jitterMs
36    const waitMs = backoff + jitter;
37
38    if (attempt >= maxAttempts) {
39      // retry limit reached — return the last response
40      return res;
41    }
42
43    await delay(waitMs);
44  }
45}
  1. Реализуйте функцию getItems, специфичную для вашей системы, которая позволит получать данные о товарах из вашей системы.
Copy
Full screen
Small screen
1async function getItems() {
2
3   // receive items from the original system or read from a pre-prepared file
4
5   return items;
6
7}
  1. Реализуйте функцию prepareData, специфичную для вашей системы, которая форматирует данные о товарах в соответствии с форматом данных в методе API Создание виртуального предмета.
Copy
Full screen
Small screen
1function prepareData(items) {
2
3   // format items in accordance with API requirements
4
5   return formattedItems;
6
7}
  1. Добавьте функцию createItem, которая отправляет POST-запрос к Xsolla API для создания виртуального предмета.
Copy
Full screen
Small screen
 1async function createItem(item) {
 2
 3   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;
 4
 5
 6
 7   return await fetch(url, {
 8
 9       method: "POST",
10
11       headers: {
12
13           Authorization: `Basic ${basicAuth}`,
14
15           "Content-Type": "application/json"
16
17       },
18
19       body: JSON.stringify(item),
20
21   });
22
23}
  1. Добавьте функцию checkItemExist, которая проверяет, существует ли виртуальный товар с заданным артикулом (SKU). Для этого функция отправляет GET-запрос к Xsolla API:
    • Если получен ответ с 404 HTTP-кодом, товар с заданным артикулом не найден, его требуется создать.
    • Если получен ответ с 200 HTTP-кодом, товар с заданным артикулом найден и его не требуется создавать.
Copy
Full screen
Small screen
 1async function checkItemExist(sku) {
 2
 3   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
 4
 5   const response = await fetch(url, {
 6
 7       method: "GET",
 8
 9       headers: {
10
11           Authorization: `Basic ${basicAuth}`
12
13       }
14
15   });
16
17   return response.status !== 404;
18
19}
  1. Добавьте функцию createItems, которая проходит по списку товаров, и проверяет, есть ли товар с артикулом из вашей системы на стороне Xsolla. Если товара с таким артикулом нет, функция создает его. Информация о прогрессе выводится в консоль.
Copy
Full screen
Small screen
 1async function createItems(items) {
 2
 3   let success = 0;
 4
 5   let alreadyCreated = 0;
 6
 7   for (let i = 0; i < items.length; i++) {
 8
 9       const item = items[i];
10
11       if (item['sku'] === undefined) {
12
13           console.log(`${i} Field "sku" not specified`);
14
15           continue;
16
17       }
18
19       const sku = item['sku'];
20
21       if (await checkItemExist(sku)) {
22
23           console.log(`${i} Item with sku "${sku}" already created`);
24
25           alreadyCreated++;
26
27           continue;
28
29       }
30
31       const response = await createItem(item);
32
33       if (response.status === 201) {
34
35           console.log(`${i} Item with sku "${sku}" successfully created`)
36
37           success++;
38
39       } else {
40
41           const jsonData = await response.json();
42
43           console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
44
45           console.log(jsonData);
46
47       }
48
49       // add a delay so as not to run into rate limits
50
51       await sleep(500);
52
53   }
54
55   console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
56
57}
  1. Добавьте функцию run, которая вызывает все вышеперечисленные функции в правильном порядке.
Copy
Full screen
Small screen
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}

Полный код:

Была ли статья полезна?
Спасибо!
Что может сделать страницу еще лучше? Сообщение
Жаль, что так произошло
Расскажите, почему статья не была полезна. Сообщение
Спасибо за обратную связь!
Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
Последнее обновление: 13 февраля 2026

Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.

Сообщите о проблеме
Мы постоянно улучшаем качество нашей документации. Ваш отзыв поможет нам в этом.
Укажите email-адрес, чтобы мы могли связаться с вами
Спасибо за обратную связь!
Не получилось отправить ваш комментарий
Попробуйте еще раз позже или напишите нам на doc_feedback@xsolla.com.