Automatisez la création et les mises à jour du catalogue via API

Note
Si vous utilisez des systèmes externes comme PlayFab, l’App Store ou Google Play, suivez les instructions pour importer les données depuis ces plateformes.

Vous pouvez automatiser la création et les mises à jour du catalogue via les appels Shop Builder API. L’automatisation permet de maintenir le catalogue à jour sans y consacrer beaucoup de temps.

Cela réduit le temps nécessaire à la maintenance et à la mise à jour des :

  • catalogues contenant beaucoup d’objets
  • prix locaux
Avis

Pour maintenir l’engagement des utilisateurs, il est crucial de garder le catalogue des objets à jour côté Xsolla après sa création. Nous recommandons de procéder à ces mises à jour pour refléter chaque modification apportée de votre côté, comme l’ajout de nouveaux objets ou la modification des prix.

Vous pouvez :

Une autorisation de base est requise pour utiliser les appels API de création et de mise à jour des objets et des promotions. Passez le code Authorization:Basic <your_authorization_basic_key>, où <your_authorization_basic_key> est la paire merchant ID:API key encodée conformément à la norme Base64. Accédez au Compte éditeur pour trouver les paramètres suivants :

  • Merchant ID est affiché :
    • Dans la section Company settings > Company ;
    • Dans l'URL de la barre d'adresse du navigateur sur n'importe quelle page du Compte éditeur. L'URL est au format suivant : https://publisher.xsolla.com/<merchant_id>/.

Création et mise à jour des objets

Xsolla prend en charge les types d’objets en jeu suivants :

  • objets virtuels
  • monnaies virtuelles
  • packages de monnaie virtuelle
  • lots

Pour simplifier l’intégration (par exemple dans les applications mobiles), vous pouvez utiliser des objets virtuels, un type universel permettant d’implémenter toute logique d’achat dans le jeu. Cela unifie le traitement des données et évite les redondances dans l’architecture du catalogue.

Pour créer de nombreux objets, créez un script qui appelle la méthode API du type d’objet requis le nombre de fois nécessaire.

Avis

La liste des paramètres renvoyés en réponse à la demande des objets diffère de la liste des paramètres que vous devez passer lors de la mise à jour du catalogue. Outre les paramètres requis et mis à jour, passez dans l’appel de mise à jour des objets les paramètres renvoyés en réponse à la demande des objets.

Exemple :

Dans l’appel Lire un objet virtuel, l’objet limits contenant les données de limite est retourné. Si vous souhaitez mettre à jour uniquement le prix ou le nom de l’objet, passez les données actuelles de limits dans l’appel Mettre à jour un objet virtuel. Si vous ne passez pas limits, les données de limite seront supprimées lorsque l’objet est mis à jour par l’appel Mettre à jour un objet virtuel.

Pour ajouter des objets au catalogue, utilisez les appels API suivants :

Pour mettre à jour le catalogue :

  1. Récupérez les données du catalogue via les appels API suivants :
  2. Passez les nouvelles valeurs des paramètres via les appels API suivants :

Script pour la création automatique d'objets via API

Pour créer de nombreux objets sur la base de données de votre système, vous pouvez utiliser l’automatisation à l’aide de l’API.

Vous devez :

Si vous souhaitez utiliser des groupes d’objets, créez-les à l’avance dans le Compte éditeur.

Si vous souhaitez utiliser plusieurs types d’objets, ceux-ci doivent être créés dans l’ordre suivant :

  1. Groupes d’objets dans le Compte éditeur ;
  2. Monnaies virtuelles ;
  3. Objets virtuels ;
  4. Packages de monnaie virtuelle ;
  5. Lots.

Voici un exemple de script qui appelle de manière répétée la méthode Créer un objet virtuel afin de créer des objets virtuels.

Le script est développé en utilisant JavaScript et le moteur d’exécution JavaScript — Node.js.

  1. Importez la fonction fetch du module “node-fetch” pour envoyer des requêtes HTTP au serveur Xsolla.
Copy
Full screen
Small screen
1import fetch from "node-fetch";
  1. Définissez les constantes nécessaires à l’autorisation de la requête. Au lieu de <your project_id from PA> et <your api key from PA>, insérez vos valeurs pour l’ID de projet et la clé API, qui seront encodées en Base64 pour une utilisation ultérieure dans les requêtes 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. Pour éviter de dépasser les limites de débit de l’API, implémentez un mécanisme de délai entre les requêtes. Vous pouvez :
    • Utiliser la fonction d’aide sleep pour définir un délai fixe entre chaque requête.
    • Utiliser la fonction d’aide delay pour implémenter un backoff exponentiel. Dans ce cas, le délai entre les tentatives augmente après chaque erreur 429 Too Many Requests, avec un temps d’attente aléatoire supplémentaire (jitter) pour mieux répartir la charge.
Option de délai fixe :
Copy
Full screen
Small screen
1function sleep(ms) {
2
3   return new Promise(resolve => setTimeout(resolve, ms));
4
5}

Option de backoff exponentiel :

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. Implémentez la fonction getItems, spécifique à votre système, pour récupérer les données des objets depuis votre système.
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. Implémentez la fonction prepareData, spécifique à votre système, pour formater les données des objets conformément au format de données dans l’appel API Créer un objet virtuel.
Copy
Full screen
Small screen
1function prepareData(items) {
2
3   // format items in accordance with API requirements
4
5   return formattedItems;
6
7}
  1. Ajoutez la fonction createItem, qui envoie une requête POST à l’API Xsolla pour créer un objet virtuel.
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. Ajoutez la fonction checkItemExist, qui vérifie l’existence d’un objet virtuel avec une UGS spécifique. Cette fonction envoie une requête GET à l’API Xsolla :
    • Si la réponse retourne un code HTTP 404, l’objet avec l’UGS spécifiée n’est pas trouvé et doit être créé ;
    • Si la réponse retourne un code HTTP 200, l’objet avec l’UGS spécifiée est trouvé et n’a pas besoin d’être créé.
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. Ajoutez la fonction createItems, qui parcourt la liste des objets et vérifie l’existence du côté de Xsolla d’un objet avec une UGS de votre système. Si aucun objet avec une telle UGS n’est trouvé, la fonction le crée. Les informations de progression s’affichent dans la 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. Ajouter la fonction run qui appelle toutes les fonctions ci-dessus dans le bon ordre.
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}

Le code complet :

Cet article vous a été utile ?
Merci !
Que pouvons-nous améliorer ? Message
Nous sommes désolés de l'apprendre
Dites-nous pourquoi vous n'avez pas trouvé cet article utile. Message
Merci pour votre commentaire !
Nous examinerons votre message et l'utiliserons pour améliorer votre expérience.
Dernière mise à jour: 13 Février 2026

Faute de frappe ou autre erreur dans le texte ? Sélectionnez le texte concerné et appuyez sur Ctrl+Entrée.

Signaler un problème
Nous améliorons continuellement notre contenu grâce à vos commentaires.
Indiquez votre adresse e-mail pour un suivi
Merci pour votre commentaire !
Impossible d'envoyer votre commentaire
Réessayez plus tard ou contactez-nous à doc_feedback@xsolla.com.