> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kameleoon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Importer un catalogue de produits dans Kameleoon à l'aide de la Product Recommendation API

> Importez un catalogue de produits dans Kameleoon à l'aide de la Product Recommendation API, y compris les catégories, les produits et les mises à jour de disponibilité.

La Product Recommendation API est la méthode préférée pour les imports de catalogues dépassant 50 000 produits. Utilisez cet endpoint au lieu des réimports quotidiens complets du catalogue.

Ce tutoriel décrit les étapes et les pièges courants pour importer un catalogue de produits dans Kameleoon à l'aide de la Product Recommendation API.

La Product Recommendation API suit les principes RESTful.

Le processus d'import comprend ces étapes consécutives :

* **[Import Categories](../all-endpoints/Import/import-categories)** : envoyez une requête `POST` pour vous assurer que toutes les catégories sont à jour avant de télécharger les produits.
* **[Import and Update Products](../all-endpoints/Import/import-product)** : envoyez une requête `PUT` pour importer le catalogue de produits dans le compte Kameleoon.
* **[Update available products](../all-endpoints/Import/update-products)** : requête `PATCH` pour mettre à jour la disponibilité des produits.

<Note>
  L'API fournit également un endpoint dédié à la modification de la disponibilité des produits existants dans Kameleoon, qui est une approche plus légère.
</Note>

## Données

* **Shop ID** `eehj3eu84299kg5ghw5a6743r8` & **Shop Secret** `pmd5362597thrgq8k256ep01t0`
  * Trouvez-les dans **Recommendations** > **Settings** > **Store settings** dans l'application Kameleoon. Contactez le Customer Success Manager pour obtenir la clé si nécessaire.

<Frame>
  ![](https://storage.googleapis.com/kameleoon-storage-documentation/developers/images/api-tutorial/store-key.jpg)
</Frame>

* **Webhooks** `http://www.webhook.com/importCategoriesApiResponses/` & `http://www.webhook.com/importProductsApiResponses/`
  * Les webhooks garantissent l'achèvement de l'étape **Import Categories** avant l'import du catalogue et vérifient l'achèvement de la requête **Import Products**.
* **Catalogue de produits actuel dans Kameleoon :**

```json theme={null}
[
{
    "id": "PD1", // String (max 64). Required
    "group_id": "Shoe", // String (max 64). Optional
    "name": "Sneaker", // String (max 255). Required
    "price": "1", // Float (positive). Required
    "oldprice": "2", // Float (positive). Optional
    "currency": "USD", // Currency code: USD, EUR. Required.
    "url": "https://example.com/product", // String (URL). Required
    "picture": "https://example.com/product/image.png", // String (URL). Required
    "available": true, // Boolean (true, false). Required
    "categories": ["shoeID"], // Array of categories IDs. Required.
    "locations": [ 
    {
        "location": "USA",
        "delivery_types": {
            "store": 10,
            "stock": 50  }
    },
    {
        "location": "CAN",
        "price": 60
    }
    ]
},
{
    "id": "PD2", // String (max 64). Required
    "group_id": "Glass", // String (max 64). Optional
    "name": "Sunglasses", // String (max 255). Required
    "price": "1", // Float (positive). Required
    "oldprice": "2", // Float (positive). Optional
    "currency": "USD", // Currency code: USD, EUR. Required.
    "url": "https://example.com/product", // String (URL). Required
    "picture": "https://example.com/product/image.png", // String (URL). Required
    "available": true, // Boolean (true, false). Required
    "categories": ["glassID"], // Array of categories IDs. Required.
    "locations": [ 
    {
        "location": "USA",
        "delivery_types": {
            "store": 10,
            "stock": 50  }
    },
    {
        "location": "CAN",
        "price": 60
    }
    ]
}
]
```

* **Catégories actuelles dans Kameleoon :**

```json theme={null}
[ {{
            "id": "glassID",
            "name": "Glass"
        },
        {
            "id": "shoesID",
            "name": "shoes",
        },
}]
```

* **Produits à importer dans Kameleoon :**
  * Le prix de PD2 (Glass) est passé à trois et il y a un nouveau produit avec une nouvelle catégorie (`"id": "BootID", "name": "Boot")`

```json theme={null}
{
    "id": "PD3", // String (max 64). Required
    "group_id": "Boot", // String (max 64). Optional
    "name": "Standard Boot", // String (max 255). Required
    "price": "1", // Float (positive). Required
    "oldprice": "2", // Float (positive). Optional
    "currency": "USD", // Currency code: USD, EUR. Required.
    "url": "https://example.com/product", // String (URL). Required
    "picture": "https://example.com/product/image.png", // String (URL). Required
    "available": true, // Boolean (true, false). Required
    "categories": ["bootID"], // Array of categories IDs. Required.
    "locations": [ 
    {
        "location": "USA",
        "delivery_types": {
            "store": 10,
            "stock": 50  }
    },
    {
        "location": "CAN",
        "price": 60
    }
    ]
}
```

## Importer des catégories

Utilisez l'[endpoint Import categories](../all-endpoints/Import/import-categories) pour cette étape.

<Important>
  Avant de télécharger des produits, vous devez télécharger une liste à jour des catégories dans notre base de données.
</Important>

Les données sont envoyées sous forme de chaîne JSON dans le corps de la requête. **Envoyez toutes les catégories dans une seule requête `POST`.**

L'exemple suivant envoie toutes les catégories, existantes et nouvelles, pour permettre l'import de nouveaux produits :

```bash theme={null}
curl -X POST -L 'https://api.products.kameleoon.com/import/categories' \
             -H 'Content-Type: application/json' \
             -d '{
   "shop_id":"eehj3eu84299kg5ghw5a6743r8",
   "shop_secret":"pmd5362597thrgq8k256ep01t0",
   "items":[
      {
         "id":"slassID",
         "name":"Glass"
      },
      {
         "id":"shoesID",
         "name":"shoes"
      },
      {
         "id":"bootID",
         "name":"boots"
      }
   ],
   "webhook":"http://www.webhook.com/importCategoriesApiResponses/"
}'
```

<Note>
  Le `webhook` notifie le développeur à l'achèvement de la requête. Lorsque toutes les catégories spécifiées sont importées et disponibles, une requête `POST` est envoyée au webhook désigné.

  Utilisez le `webhook` pour les imports de catégories de grande envergure, car le traitement peut prendre plusieurs minutes.

  Si vous importez des produits via l'[endpoint d'import de produits](../all-endpoints/Import/import-product), le webhook garantit que toutes les catégories sont traitées avant de commencer l'import des produits. Les produits sans catégorie connue sont ignorés lors de l'import.

  **Exemple d'une requête réussie :**

  ```json theme={null}
  { "status": "success"}
  ```

  Exemple d'une requête échouée :

  ```json theme={null}
  { "status": "error",  "message": "MESSAGE"}
  ```
</Note>

## Importer et mettre à jour des produits

Utilisez l'[endpoint Import Products](../all-endpoints/Import/import-product#liste-des-paramètres-pour-l’objet-items) pour cette étape.
La limite de l'API est de 40 requêtes par minute, avec un maximum d'une requête toutes les 1,5 secondes.
La limite de poids des requêtes est de 35 mégaoctets.

<Important>
  Pour mettre à jour des produits spécifiques, fournissez tous les paramètres obligatoires pour chaque produit dans la requête. L'omission des propriétés obligatoires fait que l'import ignore ces produits, laissant la base de données inchangée. Par exemple, la mise à jour d'un prix de produit nécessite d'inclure tous les paramètres obligatoires, tels que category, name, picture et tags.

  Les valeurs omises pour les propriétés non obligatoires sont supprimées de la base de données.

  Consultez les champs obligatoires dans la [documentation de l'endpoint](../all-endpoints/Import/import-product#liste-des-paramètres-pour-l’objet-items).
</Important>

L'exemple suivant envoie le produit mis à jour `PD2`, avec les champs `price` et `oldprice` modifiés, et le nouveau produit `PD3`. Le produit `PD1` est omis car il reste inchangé.

```bash theme={null}
# !!! IMPORTANT: Wait for a successful POST request to the webhook endpoint
# (http://www.webhook.com/importCategoriesApiResponses)
# from the Import Categories step before making this call.

#Check that all required fields are filled for each product

curl -X PUT -L 'https://api.products.kameleoon.com/import/products' \
             -H 'Content-Type: application/json' \
             -d '{
   "shop_id":"eehj3eu84299kg5ghw5a6743r8",
   "shop_secret":"pmd5362597thrgq8k256ep01t0",
   "items":[
{
    "id": "PD3", // String (max 64). Required
    "group_id": "Boot", // String (max 64). Optional
    "name": "StandardBoot", // String (max 255). Required
    "price": "1", // Float (positive). Required
    "oldprice": "2", // Float (positive). Optional
    "currency": "USD", // Currency code: USD, EUR. Required.
    "url": "https://example.com/product", // String (URL). Required
    "picture": "https://example.com/product/image.png", // String (URL). Required
    "available": true, // Boolean (true, false). Required
    "categories": ["bootID"], // Array of categories IDs. Required.
    "locations": [ 
    {
        "location": "USA",
        "delivery_types": {
            "store": 10,
            "stock": 50  }
    },
    {
        "location": "CAN",
        "price": 60
    }
    ]
},
{
    "id": "PD2", // String (max 64). Required
    "group_id": "Glass", // String (max 64). Optional
    "name": "Sunglasses", // String (max 255). Required
    "price": "3", // Float (positive). Required
    "oldprice": "1", // Float (positive). Optional
    "currency": "USD", // Currency code: USD, EUR. Required.
    "url": "https://example.com/product", // String (URL). Required
    "picture": "https://example.com/product/image.png", // String (URL). Required
    "available": true, // Boolean (true, false). Required
    "categories": ["glassID"], // Array of categories IDs. Required.
    "locations": [ 
    {
        "location": "USA",
        "delivery_types": {
            "store": 10,
            "stock": 50  }
    },
    {
        "location": "CAN",
        "price": 60
    }
    ]
}
   ],
   "webhook":"http://www.webhook.com/importProductsApiResponses/"
}'

# check for the result of the request, which will be sent 
# to the provided webhook http://www.webhook.com/importProductsApiResponses/
```

## Mettre à jour les produits disponibles

Utilisez l'[endpoint Update available products](../all-endpoints/Import/update-products) pour gérer le statut du stock.

Cet endpoint met à jour la liste des produits disponibles en utilisant leurs IDs.

Dans ce scénario, le produit `PD1` est marqué comme indisponible en fournissant les IDs pour `PD2` et `PD3` et en omettant l'ID pour `PD1`.

```bash theme={null}
curl -X PATCH -L 'https://api.products.kameleoon.com/import/products' \
             -H 'Content-Type: application/json' \
             -d '{
   "shop_id":"eehj3eu84299kg5ghw5a6743r8",
   "shop_secret":"pmd5362597thrgq8k256ep01t0",
   "items":["PD2","PD3"],
}'
```

## Recommandations clés

1. **Ordre du workflow**\
   Importez toujours les catégories avant les produits

2. **Complétude des données**\
   Les imports de produits nécessitent tous les champs obligatoires

3. **Stratégie de webhook**\
   Essentielle pour surveiller les imports volumineux

4. **Conseils de performance**

   * Lot de produits ≤35 Mo
   * Limite de débit : 40 requêtes/minute
   * Utilisez uniquement l'endpoint Update available products pour modifier la disponibilité d'un produit.

5. **Gestion des erreurs**

   * Vérifiez les IDs de catégorie
   * Vérifiez les formats des champs
   * Surveillez les réponses du webhook
