Sincronización por CSV: especificación completa
Especificación del CSV de artículos: campos, límites, atributos de coche y moto, y envío por SFTP o por URL.
Para la sincronización entre los clientes y Portal Hero utilizamos un sistema de ficheros CSV. El principal fichero CSV es el de artículos (o feed de artículos), donde se listan todos los artículos que se publican en los distintos portales. En este fichero se encuentran los artículos con sus características.
Funcionamiento de la sincronización
La manera de identificar cada artículo será mediante el campo id en el que nos basaremos como identificador único para decidir si un artículo se actualiza o deja de existir. Cuando un artículo aparezca por primera vez en el feed de artículos, éste se subirá a todos los portales seleccionados por el cliente. Cuando un artículo deje de estar presente en el feed se marcará como vendido y cuando se cambie cualquier dato del artículo también será actualizado en los portales. Para tener más detalles de la sincronización en sí puedes consultarlos aquí.
El formato general de estos archivos CSV es el siguiente:
- Campos separados por comas
- La cabecera tiene que estar presente para poder identificar los campos
- Campos delimitados por doble comilla (si es necesario o siempre)
- Codificación del archivo UTF-8
Compartición de archivos
Tenemos dos opciones para hacernos llegar el archivo:
- SFTP
Disponemos de un SFTP para compartir los archivos y facilitar el intercambio de información de manera segura. Se facilitarán los datos de acceso al SFTP (usuario y contraseña) durante el proceso de onboarding.
El resto de datos comunes de conexión son los siguientes:- Host:
sftp.portalhero.pro - Port:
2222
Además el SFTP está securizado y restringido a nivel de red y necesitaremos una o varias IPs para añadirlas a nuestra lista de IPs de acceso permitidas.
Dentro del SFTP hay creada una carpeta llamada upload donde se escribirán los archivos: Para el de artículos el nombre del archivo será: item_feed.csv - Host:
- url
El feed de artículos puede ser enviado también vía una URL pública desde donde el proceso de Portal Hero lo descargará en cada ejecución diaria del proceso.
La URL deberá ser informada por parte del cliente durante el proceso de onboarding. En caso de requerir más medidas de seguridad, puedes facilitarnos cualquier header(s) que añadiremos a la petición.
Formato de los archivos CSV
Relación de los campos, tipología de detalles y ejemplos del archivo CSV de artículos:
| Nombre | Tipo | Obligatorio | Descripción | Ejemplo |
|---|---|---|---|---|
| id | string | Si | Identificador único del artículo. Tiene que ser único para todos los artículos y es el que usaremos para hacer referencia a los artículos en nuestras comunicaciones. (Longitud máxima: 150 caracteres) | wer432r |
| price | double | Si | Precio en € con una precisión de 2 decimales (no obligatorios) del artículo. | 344.95 |
| external_category | string | Si | Identificador de la categoría donde subir el artículo. Debe ser un texto con la categoría, no un identificador numérico. Puede ser directamente la categoría que haya en tu sistema. | Camisetas manga corta |
| status | string | Si | Condición del artículo. Los valores están acotados a una enumeración que también se proporciona más adelante. | good |
| title | string | Si | Título del artículo. Máximo 60 caracteres. | Camiseta verde |
| description | string | Si | Descripción del artículo. Máximo 600 caracteres. | Camiseta verde talla M… |
| images | list string | Si | Campo compuesto creado con la concatenación mediante "|" (pipe) de las diferentes urls de las imágenes del artículo. Estas tienen que ser públicamente accesibles y en formato jpg. Máximo 10 imágenes. | https://image-cdn.com/image1.jpg|https://image-cdn.com/image2.jpg|https://image-cdn.com/image3.jpg |
| store | list string | No | Identificador de la cuenta en el portal donde publicar este artículo. Solo es necesario en caso de contar con más de una cuenta donde publicar artículos. En el caso de tener más de una cuenta o más de un portal asociado al producto, tiene que ser una lista de enteros separados por "|" (pipe). | 2|F5 |
| portal_status | string | No | Estado de publicación del artículo. Estados posibles: “active”, “reserved” | active |
| shipping | bool | No | Booleano para indicar si se aceptan envíos dentro del portal para el artículo. | true |
| shipping_weight_kg | int | No | Campo asociado al campo "shipping", es necesario si el campo shipping es true. Indica el peso en kg (redondeado hacia arriba sin decimales) del artículo. | 3 |
| free_shipping | bool | No | Booleano para indicar si es el vendedor el que asume los costes del envío y por tanto son gratis para el comprador. | true |
| hashtags | string | No | Campo compuesto creado con la concatenación mediante "|" (pipe) de los diferentes hashtags. Cada uno de ellos es una sola palabra sin espacios y sin la almohadilla (#) precedente. | bluetooth|bajoconsumo|geek |
| brand | String | No | Marca del artículo | Apple |
| model | String | No | Modelo del artículo | iPhone 15 pro |
| stock | int | No | Número de artículos | 3 |
| attributes | str | No | Campo para atributos adicionales del artículo. Dependiendo de la categoría, algunos de estos atributos pueden ser obligatorios. * | additional attributes |
* Para los artículos de coches, se deben proporcionar los siguientes atributos en el campo 'attributes' como una cadena JSON serializada:
Respecto al campo status que hace referencia al estado de los artículos, las opciones son las siguientes:
["new", "as_good_as_new", "good", "fair", "has_given_it_all"]
Atributos del Coche
Los atributos del coche son un conjunto de características que describen un coche. Se utilizan en el feed y para publicarlo en los marketplaces.
| Nombre | Tipo | Obligatorio | Descripción | Ejemplo |
|---|---|---|---|---|
| version | String | Yes | Versión del motor o nivel de acabado del coche. | 1.6 TDI |
| year | Int | Yes | Año de fabricación. | 2018 |
| km | Int | Yes | Kilometraje en kilómetros. | 60000 |
| horse_power | Int | Yes | Potencia del motor en CV (DIN). | 105 |
| doors | Int | No | Número de puertas. | 5 |
| body_type | String | No | Tipo de cuerpo o estilo. Valores posibles:'small_car', 'coupe_cabrio', 'sedan', 'family_car', 'mini_van', 'four_x_four', 'van', 'others' | sedan |
| engine | String | yes | Tipo de combustible. Valores posibles:'gasoil', 'gasolina', 'electric_hybrid', 'others' | gasoil |
| gear_box | String | Yes | Tipo de caja de cambios. Valores posibles are:'manual', 'automatic' | manual |
Ejemplo (python):
car_attrs = {
"version": "1.6 TDI Toyota",
"year": "2018",
"horse_power": 100,
"mileage": 12000,
"engine": "gasoil",
"gearbox": "manual"
}
attributes = json.dumps(car_attrs)
Atributos de la moto
Para integrar motos, el artículo debe incluir la información específica del vehículo. Los datos técnicos se envían serializados como JSON en el campo 'attributes', mientras que la marca y el modelo viajan en los campos 'brand' y 'model' del CSV.
El campo 'external_category' debe tomar uno de los valores '2', 'Motos', 'Motorbikes' para que el artículo se procese como moto. Esta integración requiere tener activo el servicio de ERP de motos en tu cuenta.
Los valores de 'brand' y 'model' tienen que coincidir exactamente con los de nuestra taxonomía de motos. Para consultar los valores válidos disponemos de dos endpoints públicos (requieren autenticación y el servicio ERP de motos activo):
GET /motorbike_brands— devuelve la lista completa de marcas disponibles, con su 'uid' y 'value'.GET /motorbike_models?brand_id={uid}— devuelve los modelos asociados a la marca indicada mediante 'brand_id'.
Ten en cuenta que el título del artículo se genera automáticamente a partir de la marca, el modelo, la versión (si se informa) y el año, por lo que el valor del campo 'title' será sobrescrito en las motos.
| Nombre | Tipo | Obligatorio | Descripción | Ejemplo |
|---|---|---|---|---|
| year | Int | Si | Año de matriculación. Valor entre 1950 y el año siguiente al actual. | 2020 |
| version | String | No | Nombre comercial o versión del modelo. Se añade al título generado automáticamente. | modelo actual |
| km | Int | Si | Kilometraje en kilómetros. No puede ser negativo. | 5420 |
| horse_power | Int | No | Potencia del motor en CV. Tiene que ser un valor positivo. | 47 |
| engine_capacity_cc | Int | No | Cilindrada del motor en centímetros cúbicos. Tiene que ser un valor positivo. | 400 |
| fuel_type | String | No | Tipo de combustible. Valores posibles: 'gasoline', 'electric'. Si no se informa, por defecto es 'gasoline'. | gasoline |
| license_plate | String | No | Matrícula del vehículo. | 1234 ABC |
Ejemplo (python):
motorbike_attrs = {
"year": 2020,
"version": "modelo actual",
"km": 5420,
"horse_power": 47,
"engine_capacity_cc": 400,
"fuel_type": "gasoline",
"license_plate": "1234 ABC"
}
attributes = json.dumps(motorbike_attrs)