> ## 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.

# Importar un catálogo de productos a Kameleoon usando la Product Recommendation API

> Importe un catálogo de productos a Kameleoon usando la Product Recommendation API, incluyendo categorías, productos y actualizaciones de disponibilidad.

La Product Recommendation API es el método preferido para importaciones de catálogos que superen los 50.000 productos. Utilice este endpoint en lugar de reimportar todo el catálogo a diario.

Este tutorial describe los pasos y los problemas habituales para importar un catálogo de productos a Kameleoon usando la Product Recommendation API.

La Product Recommendation API sigue principios RESTful.

El proceso de importación implica estos pasos consecutivos:

* **[Import Categories](../all-endpoints/Import/import-categories)**: Envíe una solicitud `POST` para asegurarse de que todas las categorías estén actualizadas antes de subir los productos.
* **[Import and Update Products](../all-endpoints/Import/import-product)**: Envíe una solicitud `PUT` para importar el catálogo de productos en la cuenta de Kameleoon.
* **[Update available products](../all-endpoints/Import/update-products)**: Solicitud `PATCH` para actualizar la disponibilidad de los productos.

<Note>
  La API también ofrece un endpoint dedicado a cambiar la disponibilidad de productos existentes en Kameleoon, que es un enfoque más ligero.
</Note>

## Datos

* **Shop ID** `eehj3eu84299kg5ghw5a6743r8` y **Shop Secret** `pmd5362597thrgq8k256ep01t0`
  * Localícelos en **Recommendations** > **Settings** > **Store settings** en la aplicación Kameleoon. Contacte con el Customer Success Manager para obtener la clave si es necesario.

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

* **Webhooks** `http://www.webhook.com/importCategoriesApiResponses/` y `http://www.webhook.com/importProductsApiResponses/`
  * Los webhooks garantizan la finalización del paso **Import Categories** antes de la importación del catálogo y verifican la finalización de la solicitud **Import Products**.
* **Catálogo de productos actual en 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
    }
    ]
}
]
```

* **Categorías actuales en Kameleoon:**

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

* **Productos a importar en Kameleoon:**
  * El precio de PD2 (Glass) ha cambiado a tres y hay un nuevo producto con una nueva categoría (`"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
    }
    ]
}
```

## Importar categorías

Utilice el [endpoint Import categories](../all-endpoints/Import/import-categories) para este paso.

<Important>
  Antes de subir los productos, debe subir a nuestra base de datos una lista actualizada de categorías.
</Important>

Los datos se envían como una cadena JSON dentro del cuerpo de la solicitud. **Envíe todas las categorías en una única solicitud `POST`.**

El siguiente ejemplo envía todas las categorías —tanto existentes como nuevas— para permitir la importación de los nuevos productos:

```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>
  El `webhook` notifica al desarrollador al completarse la solicitud. Cuando todas las categorías especificadas se hayan importado y estén disponibles, se envía una solicitud `POST` al webhook designado.

  Utilice el `webhook` para importaciones grandes de categorías, ya que el procesamiento puede llevar varios minutos.

  Si importa productos utilizando el [endpoint import product](../all-endpoints/Import/import-product), el webhook garantiza que todas las categorías se procesen antes de iniciar la importación de productos. Los productos sin una categoría conocida se ignoran durante la importación.

  **Ejemplo de una solicitud exitosa:**

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

  Ejemplo de una solicitud fallida:

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

## Importar y actualizar productos

Utilice el [endpoint Import Products](../all-endpoints/Import/import-product#lista-de-parámetros-para-el-objeto-items) para este paso.
El límite de la API es de 40 solicitudes por minuto, con un máximo de una solicitud cada 1,5 segundos.
El límite de peso de la solicitud es de 35 megabytes.

<Important>
  Para actualizar productos específicos, proporcione todos los parámetros obligatorios para cada producto en la solicitud. Omitir propiedades obligatorias hace que la importación ignore esos productos, dejando la base de datos sin cambios. Por ejemplo, actualizar el precio de un producto requiere incluir todos sus parámetros obligatorios, como categoría, nombre, imagen y etiquetas.

  Los valores omitidos en propiedades no obligatorias se eliminan de la base de datos.

  Revise los campos obligatorios en la [documentación del endpoint](../all-endpoints/Import/import-product#lista-de-parámetros-para-el-objeto-items).
</Important>

El siguiente ejemplo envía el producto actualizado `PD2`, con los campos `price` y `oldprice` modificados, y el nuevo producto `PD3`. Se omite el producto `PD1` porque permanece sin cambios.

```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/
```

## Actualizar productos disponibles

Utilice el [endpoint Update available products](../all-endpoints/Import/update-products) para gestionar el estado del stock.

Este endpoint actualiza la lista de productos disponibles usando sus IDs.

En este escenario, el producto `PD1` se marca como no disponible al proporcionar los IDs de `PD2` y `PD3` y omitir el ID de `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"],
}'
```

## Recomendaciones clave

1. **Orden del flujo de trabajo**
   Importe siempre las categorías antes que los productos

2. **Integridad de los datos**
   Las importaciones de productos requieren todos los campos obligatorios

3. **Estrategia con webhooks**
   Esencial para supervisar importaciones grandes

4. **Consejos de rendimiento**

   * Lotes de productos ≤35 MB
   * Límite de velocidad: 40 solicitudes/minuto
   * Utilice únicamente el endpoint Update available products para cambiar la disponibilidad de un producto.

5. **Gestión de errores**

   * Verifique los IDs de categoría
   * Compruebe los formatos de los campos
   * Supervise las respuestas de los webhooks
