Cómo automatizar las actualizaciones del catálogo

Puede automatizar la creación y actualización del catálogo con las llamadas a la Shop Builder API. Con la automatización, puede mantener su catálogo actualizado sin invertir mucho tiempo. La automatización del catálogo le permite crear y actualizar artículos y promociones e importar datos de sistemas externos.

Esto reduce el tiempo necesario para mantener y actualizar:

  • catálogos que contienen muchos artículos
  • promociones de cualquier tipo
  • precios en función del país

Aviso

Para mantener el compromiso de los usuarios, es esencial mantener actualizado el catálogo de artículos en el lado de Xsolla después de crearlo. Recomendamos actualizar el catálogo en el lado de Xsolla cuando se produzcan actualizaciones en su lado, como cuando se añadan artículos o se cambien los precios.

Puede:

La autorización básica se utiliza para las llamadas API. Introduzca la Authorization:Basic <your_authorization_basic_key>, en la cual <your_authorization_basic_key> es el par Merchant ID:clave de API codificado según el estándar Base64. Vaya a Cuenta del editor para encontrar estos parámetros:

  • Merchant ID se muestra:
    • En Company settings > Company.
    • En la URL de la barra de direcciones del navegador de cualquier página de Cuenta del editor. La URL tiene el siguiente formato: https://publisher.xsolla.com/<merchant_id>/.

Crear y actualizar artículos

Si necesita crear varios artículos, puede crear un script que invoque el método API del tipo de artículo requerido el número de veces que sea necesario.

Aviso

La lista de parámetros que se devuelve como respuesta a la solicitud de artículos es diferente de la lista de parámetros que debe transmitir al actualizar el catálogo. Además de los parámetros requeridos y actualizados, transmita los parámetros en el método de actualización de artículos que se devuelven como respuesta a la solicitud de artículos.

Ejemplo:

En el método Obtener artículo virtual, se devuelve un objeto limits con los datos del límite del usuario. Si desea actualizar solamente el precio o el nombre del artículo, transmita los datos actuales del objeto limits en el método Actualizar artículo virtual. Si no transmite el objeto limits, los datos del límite se eliminarán cuando se actualice el artículo mediante el método Actualizar artículo virtual.

Artículos virtuales

Para actualizar el catálogo:

  1. Obtenga datos del catálogo con el método de API Obtener artículo virtual o Obtener la lista de todos los artículos virtuales.
  2. Transmita los nuevos valores del parámetro con el método de API Actualizar artículo virtual.

Para crear artículos virtuales, utilice el método de API Crear artículo virtual.

Moneda virtual

Para actualizar el catálogo:

  1. Obtenga datos del catálogo con el método de API Obtener lista de monedas virtuales.
  2. Transmita los nuevos valores del parámetro con el método de API Actualizar la moneda virtual.

Para crear moneda virtual, utilice el método de API Crear moneda virtual.

Paquetes de moneda virtual

Para actualizar el catálogo:

  1. Obtenga datos del catálogo con el método de API Obtener lista de monedas virtuales.
  2. Transmita los nuevos valores del parámetro con el método de API Actualizar el paquete de moneda virtual.

Para crear un paquete moneda virtual, utilice el método de API Crear un paquete de moneda virtual.

Lotes

Para actualizar el catálogo:

  1. Obtenga datos del catálogo con el método de API Obtener lista de lotes.
  2. Transmita los nuevos valores de los parámetros con el método de API Actualizar lote.

Para crear un lote, utilice el método de API Crear lote.
Si desea agregar claves del juego, restricciones por países o precios a los lotes, utilice las instrucciones.

Crear y actualizar promociones

Aviso
La lista de parámetros necesarios cuando se usan las llamadas API para actualizar promociones no coincide con la lista de parámetros devueltos por las llamadas API para recuperar promociones. Al invocar los métodos API para actualizar promociones, debe transmitir lo siguiente:
  • los parámetros requeridos
  • los parámetros que desea cambiar
  • todos los demás parámetros devueltos por el método de recuperación de promociones

Cupones

Nota
Para asegurarse de que las promociones con Cupones funcionan correctamente, primero debe crear una promoción y, después, generar códigos para esta promoción.

Para actualizar la promoción:

  1. Obtenga datos del catálogo con los métodos de API Obtener cupón promocional o Obtener la lista de promociones con cupones.
  2. Transmita los nuevos valores de los parámetros con el método de API Actualizar promoción con cupones.
  3. Active la promoción con el método de API Activar promoción con cupones.

Para crear una promoción, utilice los métodos de API Crear promoción con cupones y, a continuación, Crear código de cupón para crear códigos de cupón personalizados o Generar códigos de cupón para generar códigos de cupón aleatorios.
Para desactivar una promoción, utilice el método de API Desactivar promoción con cupones.

Códigos promocionales

Nota
Para asegurarse de que las promociones con Código promocional funcionan correctamente, primero debe crear una promoción y, después, generar códigos para esta promoción.

Para actualizar la promoción:

  1. Obtenga datos del catálogo con los métodos de API Obtener la lista de promociones de códigos promocionales o Obtener la lista de promociones de códigos promocionales.
  2. Transmita los nuevos valores de los parámetros con el método de API Actualizar promoción de códigos promocionales.
  3. Active la promoción con el método de API Activar promoción.

Para crear una promoción, utilice los métodos de API Crear promoción de códigos promocionales y, luego, Crear código de promoción de códigos promocionales para crear códigos promocionales personalizados o Generar códigos para una promoción de códigos promocionales para generar códigos promocionales aleatorios.
Para desactivar una promoción, utilice el método de API Desactivar promoción de códigos promocionales.

Descuentos

Para actualizar la promoción:

  1. Obtenga datos del catálogo con los métodos de API Obtener promoción del artículo o Obtener lista de promociones del artículo.
  2. Transmita los nuevos valores de los parámetros con el método de API Actualizar la promoción del artículo.
  3. Active la promoción con el método de API Activar promoción.

Para crear una promoción, use el método de API Crear promoción de descuento para un artículo.
Para desactivar una promoción, utilice el método de API Desactivar promoción.

Bonificaciones

Para actualizar la promoción:

  1. Obtenga datos del catálogo con los métodos de API Obtener una promoción de bonificación o Obtenga la lista de promociones de bonificación.
  2. Transmita los nuevos valores de los parámetros con el método de API Actualizar la promoción de bonificación.
  3. Active la promoción con el método de API Activar promoción.

Para crear una promoción, use el método de API Crear promoción de bonificación.
Para desactivar una promoción, utilice el método de API Desactivar promoción.

Creación automática de artículos mediante API

Si tiene que crear numerosos artículos a partir de los datos de su sistema, puede automatizar este proceso mediante la API.

Tendrá que:

Si quiere utilizar grupos de artículo, créelos antes en la interfaz de la Cuenta del editor.

Si pretende usar varios tipos de artículos, deben crearse en el siguiente orden:

  1. Grupos de artículos en Cuenta del editor.
  2. Monedas virtuales.
  3. Artículos virtuales.
  4. Paquetes de moneda virtual.
  5. Lotes.

A continuación, presentamos un ejemplo de script que invoca repetidamente el método Crear artículo virtual para crear artículos virtuales.

El script se desarrolla utilizando JavaScript y el tiempo de ejecución de JavaScript: Node.js.

  1. Importe la función fetch del módulo “node-fetch” para enviar solicitudes HTTP al servidor de Xsolla.
Copy
Full screen
Small screen
1import fetch from "node-fetch";
  1. Establezca las constantes necesarias para la autorización de la solicitud. En lugar de <your project_id from PA> y <your api key from PA>, ingrese sus valores para el ID del proyecto y la clave de API, que se codificarán usando Base64 para su posterior uso en las solicitudes a la 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. Implemente un mecanismo de retraso al enviar solicitudes para evitar superar los límites de frecuencia de la API. Puede:
    • Usar la función de ayuda sleep para establecer un retraso fijo entre solicitudes.
    • Usar la función de ayuda delay para implementar el retroceso exponencial. En este caso, el tiempo de espera entre solicitudes repetidas aumenta después de cada error 429 Too Many Requests, con un valor aleatorio adicional (jitter) añadido para distribuir la carga.
Opción de retraso fijo:
Copy
Full screen
Small screen
1function sleep(ms) {
2
3   return new Promise(resolve => setTimeout(resolve, ms));
4
5}

Opción de retroceso exponencial:

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. Implemente la función getItems, específica de su sistema, para recuperar los datos de los artículos desde su sistema.
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. Implemente la función prepareData, específica de su sistema, para dar formato a los datos del artículo según el formato de datos definido en la llamada API Crear artículo virtual.
Copy
Full screen
Small screen
1function prepareData(items) {
2
3   // format items in accordance with API requirements
4
5   return formattedItems;
6
7}
  1. Agregue la función createItem, la cual envía una solicitud POST a la API de Xsolla para crear un artículo virtual.
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. Agregue la función checkItemExist, la cual comprueba si existe un artículo virtual con un código de artículo (SKU) especificado. La función envía una solicitud GET a la API de Xsolla:
    • Si se recibe una respuesta con un código HTTP 404, el artículo con el SKU especificado no se localiza y hay que crearlo.
    • Si se recibe una respuesta con un código HTTP 200, el artículo con el SKU especificado se localiza y no hay que crearlo.
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. Agregue la función createItems, la cual analiza la lista de artículos y comprueba si existe un artículo con un código de artículo (SKU) de su sistema en el lado de Xsolla. Si no hay ningún artículo con ese SKU, la función lo crea. La información del progreso se visualiza en la consola.
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. Agregue la función run que invoca todas las funciones anteriores en el orden correcto.
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}

El código completo

Actualizar mediante importación desde sistemas externos

Siga las instrucciones para importar datos de sistemas externos como PlayFab, App Store o Google Play.

¿Te ha resultado útil este artículo?
¡Gracias!
¿Hay algo en lo que podamos mejorar? Mensaje
Lo sentimos
Por favor, cuéntanos por qué no te ha resultado útil este artículo. Mensaje
¡Gracias por tu mensaje!
Nos ayudará a mejorar tu experiencia.
Última actualización: 10 de Octubre de 2025

¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.

Informar de un problema
Nos esforzamos por ofrecer contenido de calidad. Tus comentarios nos ayudan a mejorar.
Déjanos tu correo electrónico para que te podamos responder
¡Gracias por tu mensaje!
No hemos podido enviar sus comentarios
Vuelva a intentarlo más tarde o escríbanos a doc_feedback@xsolla.com.