Ressources · CSV et feeds

Synchronisation par CSV : spécification complète

Spécification du CSV d'articles : champs, limites, attributs de voiture et de moto, et envoi par SFTP ou par URL.

Pour la synchronisation entre les clients et Portal Hero, nous utilisons un système de fichiers CSV. Le principal fichier CSV est celui des articles (ou flux d'articles), où sont listés tous les articles publiés sur les différents portails. Ce fichier contient les articles avec leurs caractéristiques.

Fonctionnement de la synchronisation

La manière d'identifier chaque article se fait via le champ id, sur lequel nous nous baserons comme identifiant unique pour décider si un article est mis à jour ou cesse d'exister. Lorsqu'un article apparaît pour la première fois dans le flux d'articles, il est envoyé sur tous les portails sélectionnés par le client. Lorsqu'un article n'est plus présent dans le flux, il est marqué comme vendu, et lorsqu'une donnée de l'article change, il est également mis à jour sur les portails. Pour plus de détails sur la synchronisation elle-même, vous pouvez les consulter ici.

Le format général de ces fichiers CSV est le suivant :

  • Champs séparés par des virgules
  • L'en-tête doit être présent pour pouvoir identifier les champs
  • Champs délimités par des guillemets doubles (si nécessaire ou toujours)
  • Encodage du fichier UTF-8

Partage des fichiers

Nous avons deux options pour nous transmettre le fichier :

  • SFTP
    Nous disposons d'un SFTP pour partager les fichiers et faciliter l'échange d'informations de manière sécurisée. Les données d'accès au SFTP (identifiant et mot de passe) seront fournies lors du processus d'onboarding.
    Les autres données de connexion communes sont les suivantes :
    • Host : sftp.portalhero.pro
    • Port : 2222

    De plus, le SFTP est sécurisé et restreint au niveau réseau et nous aurons besoin d'une ou plusieurs IPs pour les ajouter à notre liste d'IPs d'accès autorisées.
    À l'intérieur du SFTP, un dossier nommé upload est créé où les fichiers seront écrits : pour celui des articles, le nom du fichier sera : item_feed.csv
  • url
    Le flux d'articles peut également être envoyé via une URL publique depuis laquelle le processus de Portal Hero le téléchargera à chaque exécution quotidienne du processus.
    L'URL devra être renseignée par le client lors du processus d'onboarding. Si des mesures de sécurité supplémentaires sont nécessaires, vous pouvez nous fournir n'importe quel(s) header(s) que nous ajouterons à la requête.

Format des fichiers CSV

Liste des champs, typologie des détails et exemples du fichier CSV d'articles :

NomTypeObligatoireDescriptionExemple
idstringOuiIdentifiant unique de l'article. Il doit être unique pour tous les articles et c'est celui que nous utiliserons pour référencer les articles dans nos communications. (Longueur maximale : 150 caractères)wer432r
pricedoubleOuiPrix en € avec une précision de 2 décimales (non obligatoires) de l'article.344.95
external_categorystringOuiIdentifiant de la catégorie où publier l'article. Il doit s'agir d'un texte avec la catégorie, pas d'un identifiant numérique. Il peut s'agir directement de la catégorie présente dans votre système.Camisetas manga corta
statusstringOuiCondition de l'article. Les valeurs sont limitées à une énumération également fournie plus loin.good
titlestringOuiTitre de l'article. Maximum 60 caractères.Camiseta verde
descriptionstringOuiDescription de l'article. Maximum 600 caractères.Camiseta verde talla M…
imageslist stringOuiChamp composé créé par la concaténation au moyen de "|" (pipe) des différentes urls des images de l'article. Celles-ci doivent être accessibles publiquement et au format jpg. Maximum 10 images.https://image-cdn.com/image1.jpg|https://image-cdn.com/image2.jpg|https://image-cdn.com/image3.jpg
storelist stringNonIdentifiant du compte sur le portail où publier cet article. Nécessaire uniquement si vous disposez de plusieurs comptes où publier des articles. Si vous avez plus d'un compte ou plus d'un portail associé au produit, il doit s'agir d'une liste d'entiers séparés par "|" (pipe).2|F5
portal_statusstringNonÉtat de publication de l'article. États possibles : “active”, “reserved”active
shippingboolNonBooléen pour indiquer si les expéditions sont acceptées au sein du portail pour l'article.true
shipping_weight_kgintNonChamp associé au champ "shipping", nécessaire si le champ shipping est true. Indique le poids en kg (arrondi à l'entier supérieur sans décimales) de l'article.3
free_shippingboolNonBooléen pour indiquer si c'est le vendeur qui assume les frais d'expédition et donc s'ils sont gratuits pour l'acheteur.true
hashtagsstringNonChamp composé créé par la concaténation au moyen de "|" (pipe) des différents hashtags. Chacun d'eux est un seul mot sans espaces et sans le dièse (#) précédent.bluetooth|bajoconsumo|geek
brandStringNonMarque de l'articleApple
modelStringNonModèle de l'articleiPhone 15 pro
stockintNonNombre d'articles3
attributesstrNonChamp pour des attributs supplémentaires de l'article. Selon la catégorie, certains de ces attributs peuvent être obligatoires. *additional attributes

* Pour les articles de voitures, les attributs suivants doivent être fournis dans le champ 'attributes' sous forme de chaîne JSON sérialisée :

Concernant le champ status qui fait référence à l'état des articles, les options sont les suivantes :

["new", "as_good_as_new", "good", "fair", "has_given_it_all"]

Attributs de la voiture

Les attributs de la voiture sont un ensemble de caractéristiques qui décrivent une voiture. Ils sont utilisés dans le flux et pour la publier sur les marketplaces.

NomTypeObligatoireDescriptionExemple
versionStringOuiVersion du moteur ou niveau de finition de la voiture.1.6 TDI
yearIntOuiAnnée de fabrication.2018
kmIntOuiKilométrage en kilomètres.60000
horse_powerIntOuiPuissance du moteur en CV (DIN).105
doorsIntNonNombre de portes.5
body_typeStringNonType de carrosserie ou style. Valeurs possibles :'small_car', 'coupe_cabrio', 'sedan', 'family_car', 'mini_van', 'four_x_four', 'van', 'others'sedan
engineStringOuiType de carburant. Valeurs possibles :'gasoil', 'gasolina', 'electric_hybrid', 'others'gasoil
gear_boxStringOuiType de boîte de vitesses. Valeurs possibles :'manual', 'automatic'manual

Exemple (python) :

car_attrs = {
    "version": "1.6 TDI Toyota",
    "year": "2018",
    "horse_power": 100,
    "mileage": 12000,
    "engine": "gasoil",
    "gearbox": "manual"
}

attributes = json.dumps(car_attrs)

Attributs de la moto

Pour intégrer des motos, l'article doit inclure les informations spécifiques du véhicule. Les données techniques sont envoyées sérialisées en JSON dans le champ 'attributes', tandis que la marque et le modèle voyagent dans les champs 'brand' et 'model' du CSV.

Le champ 'external_category' doit prendre l'une des valeurs '2', 'Motos', 'Motorbikes' pour que l'article soit traité comme une moto. Cette intégration nécessite d'avoir le service ERP de motos actif sur votre compte.

Les valeurs de 'brand' et 'model' doivent correspondre exactement à celles de notre taxonomie de motos. Pour consulter les valeurs valides, nous disposons de deux endpoints publics (ils nécessitent une authentification et le service ERP de motos actif) :

  • GET /motorbike_brands — renvoie la liste complète des marques disponibles, avec leur 'uid' et 'value'.
  • GET /motorbike_models?brand_id={uid} — renvoie les modèles associés à la marque indiquée au moyen de 'brand_id'.

Notez que le titre de l'article est généré automatiquement à partir de la marque, du modèle, de la version (si renseignée) et de l'année, de sorte que la valeur du champ 'title' sera écrasée pour les motos.

NomTypeObligatoireDescriptionExemple
yearIntOuiAnnée de mise en circulation. Valeur entre 1950 et l'année suivant l'année actuelle.2020
versionStringNonNom commercial ou version du modèle. Il est ajouté au titre généré automatiquement.modelo actual
kmIntOuiKilométrage en kilomètres. Ne peut pas être négatif.5420
horse_powerIntNonPuissance du moteur en CV. Doit être une valeur positive.47
engine_capacity_ccIntNonCylindrée du moteur en centimètres cubes. Doit être une valeur positive.400
fuel_typeStringNonType de carburant. Valeurs possibles : 'gasoline', 'electric'. Si non renseigné, par défaut c'est 'gasoline'.gasoline
license_plateStringNonPlaque d'immatriculation du véhicule.1234 ABC

Exemple (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)