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.
$ 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# .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: exportQuelle recette vous convient ?
| Vous avez… | Utilisez | Code nécessaire |
|---|---|---|
| un CSV ou un zip sur une adresse web, un serveur SFTP ou un bucket S3 | Import planifié | aucun |
| un dossier où arrivent les exports | obx watch | aucun |
| un serveur ou un PC qui exécute des tâches la nuit | cron ou Planificateur de tâches | une ligne |
| vos exports dans un dépôt Git | GitHub Action | un fichier YAML |
| n8n, Make ou Zapier | Étapes HTTP | aucun (visuel) |
| un développeur qui connecte votre PIM ou ERP | L'API directement | un 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.
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,2000100101025images/
KO-1001_NVY_1.jpg ← style KO-1001, colour NVY, position 1 (front)
KO-1001_NVY_2.jpg
KO-1001_NVY_3.jpgCe 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 errorsCode de sortie 0 = tout va bien, 2 = terminé mais certaines lignes contenaient des erreurs (elles sont listées), 1 = échec.
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/outboxdocker run -d --restart unless-stopped \
-e OBX_URL -e OBX_TOKEN \
-v /data/outbox:/outbox \
ghcr.io/openbrandexchange/obx watch /outbox3. cron ou Planificateur de tâches Windows
# 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$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/images5. 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.
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}]}]}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"}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à.
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.
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"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