Automatisation

Continuez à travailler comme aujourd'hui.

Votre PIM, votre ERP, votre DAM ou un dossier partagé contient déjà les données et les photos. Choisissez la première recette qui vous convient : elles fonctionnent avec tous les portails Open Brand Exchange.

Terminal
$ obx push ./export
Publishing to brands.kestrel.example (Kestrel, Kestrel Trail)
images: 27 checked, 3 uploaded (4.2 MB) in 3s
Done: rows: 40, images: 27 → new: 2 · updated: 3 · unchanged: 35
publish.ymlGitHub Action
# .github/workflows/publish.yml
on:
  push:
    paths: ["export/**"]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: openbrandexchange/obx-go/push-action@v0
        with:
          url: ${{ secrets.OBX_URL }}
          token: ${{ secrets.OBX_TOKEN }}
          folder: export

Quelle recette vous convient ?

Vous avez…UtilisezCode nécessaire
un CSV ou un zip sur une adresse web, un serveur SFTP ou un bucket S3Import planifiéaucun
un dossier où arrivent les exportsobx watchaucun
un serveur ou un PC qui exécute des tâches la nuitcron ou Planificateur de tâchesune ligne
vos exports dans un dépôt GitGitHub Actionun fichier YAML
n8n, Make ou ZapierÉtapes HTTPaucun (visuel)
un développeur qui connecte votre PIM ou ERPL'API directementun peu

Un seul format pour tout

Chaque méthode lit la même chose : un products.csv avec une ligne par taille, et des photos nommées {style}_{color}_{position}.jpg (référence, couleur, position). Une fois cela en place, toutes les recettes ci-dessous fonctionnent.

products.csv (abrégé)
brand,style_number,name:en,name:nl,item_type,season,materials,color_code,color_name:en,size,gtin
Kestrel,KO-1001,Merino Crew Sweater,Merino trui met ronde hals,sweater,AW26,main: 100% merino_wool,NVY,Navy,S,2000100101018
Kestrel,KO-1001,Merino Crew Sweater,Merino trui met ronde hals,sweater,AW26,main: 100% merino_wool,NVY,Navy,M,2000100101025
Noms des fichiers photo
images/
  KO-1001_NVY_1.jpg     ← style KO-1001, colour NVY, position 1 (front)
  KO-1001_NVY_2.jpg
  KO-1001_NVY_3.jpg

Le format d'import complet

Ce qu'il vous faut

Dans votre administration, ouvrez Envoi automatique → Clés d'accès et créez une nouvelle clé. Vous avez alors deux valeurs : l'adresse de votre portail (OBX_URL) et la clé elle-même (OBX_TOKEN). La clé n'est affichée qu'une seule fois.

export OBX_URL=https://brands.kestrel.example
export OBX_TOKEN=obxi_…   # admin → Automatic upload → Access keys (shown once)

Donnez à chaque système sa propre clé. Vous pourrez ainsi en révoquer une sans casser les autres.

1. Import planifié (sans code)

Dans votre administration : Envoi automatique → Imports planifiés → Ajouter un import planifié. Choisissez la source et la fréquence.

  • Adresse web (HTTPS): l'adresse d'un products.csv, ou d'un zip contenant products.csv et les photos. Les identifiants sont stockés chiffrés.
  • SFTP: serveur, utilisateur, mot de passe ou clé, et le dossier de l'export.
  • Bucket S3: AWS S3, Cloudflare R2, MinIO ou Backblaze : endpoint, bucket, dossier et une clé en lecture seule.

Choisissez « Ajouter et mettre à jour uniquement » ou « Mettre aussi hors ligne les articles absents ». La seconde option retire aussi ce qui a disparu du fichier, mais s'arrête si plus de la moitié d'une marque devait disparaître, afin qu'un export défectueux ne vide jamais votre catalogue. « Tester la connexion » montre les fichiers qui seraient lus.

L'outil obx

obx est un programme unique pour Windows, macOS et Linux. Il lit OBX_URL et OBX_TOKEN dans l'environnement, n'envoie que les photos nouvelles ou modifiées, crée les versions web si nécessaire et attend que votre portail ait tout traité. Lancez-le aussi souvent que vous voulez : les articles inchangés ne coûtent rien.

obx info                                            # check the token, see limits and brands
obx push --csv products.csv --images ./images       # publish a CSV and a folder (or zip) of images
obx push --package export.zip                       # the same, as one zip
obx push --csv products.csv --images ./images --mirror   # also take offline what is no longer in the file
obx push --csv products.csv --images ./images --dry-run  # only check, change nothing
obx watch ./outbox                                  # keep publishing whatever lands in a folder
obx status                                          # recent jobs and their errors

Code de sortie 0 = tout va bien, 2 = terminé mais certaines lignes contenaient des erreurs (elles sont listées), 1 = échec.

Télécharger obx · obx-go

2. Un dossier qui se publie tout seul : obx watch

Laissez votre PIM, votre ERP ou un collègue déposer les exports dans un dossier. obx watch publie dès que quelque chose change et ignore les photos restées identiques. Lancez-le comme service, ou avec Docker :

obx watch /data/outbox
Docker
docker run -d --restart unless-stopped \
  -e OBX_URL -e OBX_TOKEN \
  -v /data/outbox:/outbox \
  ghcr.io/openbrandexchange/obx watch /outbox

3. cron ou Planificateur de tâches Windows

Linux ou macOS
# crontab -e: every night at 02:30
30 2 * * * OBX_URL=https://brands.kestrel.example OBX_TOKEN=obxi_… /usr/local/bin/obx push --csv /exports/products.csv --images /exports/images >> /var/log/obx.log 2>&1
Windows (PowerShell, une seule fois)
$action = New-ScheduledTaskAction -Execute "C:\Tools\obx.exe" -Argument "push --csv D:\Export\products.csv --images D:\Export\images"
$trigger = New-ScheduledTaskTrigger -Daily -At 2:30am
[Environment]::SetEnvironmentVariable("OBX_URL", "https://brands.kestrel.example", "Machine")
[Environment]::SetEnvironmentVariable("OBX_TOKEN", "obxi_…", "Machine")
Register-ScheduledTask -TaskName "Publish to OBX" -Action $action -Trigger $trigger -User "SYSTEM"

4. GitHub Action

Enregistrez OBX_URL et OBX_TOKEN comme secrets du dépôt. Cela fonctionne de la même façon dans GitLab CI, Bitbucket ou Azure DevOps : installez obx et lancez obx push.

# .github/workflows/publish.yml  (secrets: OBX_URL, OBX_TOKEN)
name: Publish product content
on:
  push:
    branches: [main]
    paths: ["export/**"]
  schedule:
    - cron: "30 2 * * *"
  workflow_dispatch:
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install obx
        run: |
          curl -fsSL https://github.com/openbrandexchange/obx-go/releases/latest/download/obx_linux_amd64.tar.gz | tar -xz obx
          sudo mv obx /usr/local/bin/
      - name: Publish
        env:
          OBX_URL: ${{ secrets.OBX_URL }}
          OBX_TOKEN: ${{ secrets.OBX_TOKEN }}
        run: obx push --csv export/products.csv --assets-csv export/assets.csv --images export/images

5. n8n, Make ou Zapier

Utilisez une simple étape HTTP Request avec l'en-tête Authorization: Bearer suivi de votre clé. Chaque étape peut être répétée sans risque : envoyer deux fois les mêmes données ne change rien.

Article (par exemple quand il change dans votre PIM)
PUT {OBX_URL}/obx/v1/ingest/products/KO-1001
Authorization: Bearer obxi_…
Content-Type: application/json

{"style_number": "KO-1001",
 "name": {"en": "Merino Crew Sweater", "nl": "Merino trui met ronde hals"},
 "item_type": "sweater", "season": "AW26",
 "materials": [{"part": "main", "fibers": [{"fiber": "merino_wool", "percentage": 100}]}]}
Couleur et taille, avec son EAN
PUT {OBX_URL}/obx/v1/ingest/variants/2000100101025
Authorization: Bearer obxi_…
Content-Type: application/json

{"product_external_id": "KO-1001", "gtin": "2000100101025",
 "color": {"code": "NVY", "name": {"en": "Navy"}}, "size": "M"}
Photo : d'abord les informations, puis le fichier lui-même
PUT {OBX_URL}/obx/v1/ingest/assets/KO-1001_NVY_1
Authorization: Bearer obxi_…
Content-Type: application/json

{"product_external_id": "KO-1001", "color_code": "NVY",
 "role": "packshot", "view": "front", "position": 1}

PUT {OBX_URL}/obx/v1/ingest/assets/KO-1001_NVY_1/files/original
Authorization: Bearer obxi_…
Content-Type: image/jpeg

<the image file as binary body>

Le Portail pour Cloudflare ne crée pas lui-même de versions web des photos. Publiez-y avec obx ou via « Imports » dans votre administration : ils les créent pour vous. Les photos arrivées autrement, par exemple par un import planifié, sont affichées en taille d'origine d'ici là.

Retirer quelque chose
PATCH {OBX_URL}/obx/v1/ingest/products/KO-1001
Authorization: Bearer obxi_…
Content-Type: application/merge-patch+json

{"status": "unpublished"}

Vous voulez être prévenu quand il se passe quelque chose ? Dans votre administration, ajoutez une notification (webhook) pour un import terminé ou une nouvelle demande d'accès, et faites-lui déclencher n8n, Make ou Zapier.

6. L'API directement (pour les développeurs)

Une intégration retient ce qu'elle a envoyé la dernière fois et n'envoie que les changements, par lots. Ou envoyez le CSV tel quel et laissez le portail le lire.

Ignorer les photos que le portail possède déjà, puis envoyer un lot
URL="$OBX_URL/obx/v1/ingest"; AUTH="Authorization: Bearer $OBX_TOKEN"

# 1. Upload only the images the node does not have yet (addressed by sha256).
for f in images/*.jpg; do
  sha=$(shasum -a 256 "$f" | cut -d' ' -f1)
  curl -sf -I -H "$AUTH" "$URL/blobs/$sha" >/dev/null || \
    curl -sf -X PUT -H "$AUTH" -H 'Content-Type: image/jpeg' --data-binary @"$f" "$URL/blobs/$sha"
done

# 2. One batch of up to 1000 operations (NDJSON), processed in order.
cat > batch.ndjson <<'EOF'
{"op":"upsert","kind":"product","external_id":"KO-1001","data":{"style_number":"KO-1001","name":{"en":"Merino Crew Sweater"}}}
{"op":"upsert","kind":"variant","external_id":"2000100101025","data":{"product_external_id":"KO-1001","gtin":"2000100101025","color":{"code":"NVY"},"size":"M"}}
{"op":"unpublish","kind":"product","external_id":"KO-0999"}
EOF
curl -s -X POST -H "$AUTH" -H 'Content-Type: application/x-ndjson' \
  -H "Idempotency-Key: nightly-$(date +%F)" --data-binary @batch.ndjson "$URL/batch"
Un CSV et un zip de photos en une fois
curl -s -X POST -H "Authorization: Bearer $OBX_TOKEN" \
  -F [email protected] -F [email protected] \
  -F 'options={"mode":"upsert"};type=application/json' \
  "$OBX_URL/obx/v1/ingest/imports"          # returns a job; poll $OBX_URL/obx/v1/ingest/jobs/<id>

Tous les détails sont dans la spécification :Ingest API ·recettes d'automatisation ·SDK Go ·Développeurs