Automatize a criação do catálogo e as atualizações usando a API

Observação
Se você utiliza sistemas externos como PlayFab, App Store ou Google Play, siga as instruções para importar dados deles.

Você pode automatizar a criação e atualização do catálogo com chamadas da Shop Builder API. Com a automação, você pode manter seu catálogo atualizado sem gastar muito tempo nele.

Isso reduz o tempo necessário para gerenciar e atualizar:

  • catálogos que contêm diversos itens
  • preços locais
Aviso

Para manter o engajamento do usuário, é importante manter o catálogo de itens atualizado no lado Xsolla depois da criação. Recomendamos atualizar o catálogo no lado Xsolla quando as atualizações ocorrerem do seu lado, tal como ao adicionar itens ou alterar preços.

Você pode:

A autorização básica é usada para chamadas de API para criar e atualizar itens e promoções. Passe o Authorization:Basic <your_authorization_basic_key>, onde <your_authorization_basic_key> é o par merchant ID:API key codificado de acordo com o padrão Base64. Vá para a Conta de Distribuidor para encontrar estes parâmetros:

  • O Merchant ID é exibido:
    • Na seção Company settings > Company.
    • No URL na barra de endereços do navegador em qualquer página da Conta de Distribuidor. O URL tem o seguinte formato: https://publisher.xsolla.com/<merchant_id>/.

Criação e atualização de itens

A Xsolla suporta os seguintes tipos de itens de jogo:

  • itens virtuais
  • moedas virtuais
  • pacotes de moedas virtuais
  • conjuntos

Para simplificar a integração (por exemplo, em aplicativos móveis), você pode usar itens virtuais — um tipo universal para implementar qualquer lógica de compra no jogo. Isso vai unificar o processamento de dados e evitar a redundância na sua arquitetura de catálogos.

Se você precisar criar diversos itens, você pode criar um script que chama o método API do tipo de item necessário diversas vezes.

Aviso

A lista de parâmetros retornada em resposta às solicitações de itens difere da lista de parâmetros que você precisa passar ao atualizar o catálogo. Além dos parâmetros necessários e atualizados, passe os parâmetros na chamada de atualização de itens que são retornados em resposta à solicitação dos itens.

Exemplo:

Na chamada Obter item virtual, um objeto limits com dados limitados pelo usuário é retornado. Se você quiser atualizar apenas o preço ou nome do item, passe os dados atuais do objeto limits na chamada Atualizar item virtual. Se você não passar o objeto limits, os dados do limite serão excluídos quando o item for atualizado pela chamada Atualizar item virtual.

Para adicionar itens ao catálogo, use as seguintes chamadas de API:

Para atualizar o catálogo:

  1. Obtenha dados do catálogo com as seguintes chamadas de API:
  2. Passe novos valores de parâmetros com as seguintes chamadas de API:

Script para a criação automática de itens via API

Se você precisa criar diversos itens com base nos dados do seu sistema, você pode automatizar esse processo usando a API.

Você precisa:

Se você quiser usar grupos de itens, crie-os antecipadamente pela Conta de Distribuidor.

Se quiser usar múltiplos tipos de itens, eles devem ser criados na seguinte ordem:

  1. grupos de itens na Conta de Distribuidor.
  2. Moedas virtuais.
  3. Itens virtuais.
  4. Pacotes de moedas virtuais.
  5. Conjuntos.

Abaixo está um exemplo de um script que chama repetidamente o método Obter pedido para criar itens virtuais.

O script é desenvolvido usando JavaScript e o tempo de execução do JavaScript — Node.js.

  1. Importe a função fetch do módulo “node-fetch” para enviar solicitações ao servidor Xsolla.
Copy
Full screen
Small screen
1import fetch from "node-fetch";
  1. Defina as constantes necessárias para solicitar a autorização. Em vez de <your project_id from PA> e <your api key from PA>, insira seus valores no ID de projeto e chave API, que será codificado usando Base64 para o uso subsequente nas solicitações 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 um mecanismo de atraso ao enviar solicitações para evitar exceder os limites de taxa da API. Você pode:
    • Usar a função de ajuda sleep para determinar um atraso fixo entre as solicitações.
    • Usar a função de ajuda delay para implementar um atraso exponencial. Neste caso, o tempo de espera entre as solicitações repetidas aumenta após cada erro 429 Too Many Requests, com um valor aleatório adicional (jitter) adicionado para distribuir a carga.
Opção de atraso fixo:
Copy
Full screen
Small screen
1function sleep(ms) {
2
3   return new Promise(resolve => setTimeout(resolve, ms));
4
5}

Opção de atraso 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 a função getItems, que é específica ao seu sistema, para receber dados de itens do seu 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 a função prepareData, que é específica ao seu sistema, para formatar os dados do item de acordo com o formato de dados na chamada de API Obter pedido.
Copy
Full screen
Small screen
1function prepareData(items) {
2
3   // format items in accordance with API requirements
4
5   return formattedItems;
6
7}
  1. Adicione a função createItem, que envia uma solicitação POST à API Xsolla para criar um item 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. Adicione a função checkItemExist, que verifica se um item virtual com um SKU especificado existe. A função envia uma solicitação GET à API Xsolla:
    • Se uma resposta com um código HTTP 404 for recebida, o item com o SKU especificado não foi encontrado, e precisa ser criado.
    • Se uma resposta com um código HTTP 200 for recebido, o item com o SKU especificado foi encontrado e não precisa ser criado.
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. Adicione a função createItems, que passa pela lista de itens e verifica se há um item com um SKU do seu sistema no lado Xsolla. Se não houver um item com esse SKU, a função o cria. A informação de progresso é exibida no console.
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. Adicione a função run que chama todas as funções na ordem correta.
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}

O código completo:

Este artigo foi útil?
Obrigado!
Podemos melhorar alguma coisa? Mensagem
Que pena ouvir isso
Explique porque este artigo não foi útil para você. Mensagem
Obrigado pelo seu feedback!
Avaliaremos sua mensagem e a usaremos para melhorar sua experiência.
Última atualização: 13 de Fevereiro de 2026

Encontrou um erro de texto ou digitação? Selecione o texto e pressione Ctrl+Enter.

Relatar um problema
Nós sempre avaliamos nossos conteúdos. Seu feedback nos ajuda a melhorá-los.
Forneça um e-mail para que possamos responder
Obrigado pelo seu feedback!
Não conseguimos enviar seu feedback
Tente novamente mais tarde ou contate-nos via doc_feedback@xsolla.com.