Automatisering
Arbejd videre, som du gør nu.
Dit PIM, ERP, DAM eller en delt mappe har allerede data og billeder. Vælg den første opskrift, der passer: de virker med alle Open Brand Exchange-portaler.
$ 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: exportHvilken opskrift passer til dig?
| Du har… | Brug | Kode nødvendig |
|---|---|---|
| en CSV eller zip på en webadresse, SFTP-server eller S3-bucket | Planlagt import | ingen |
| en mappe, hvor eksporter lander | obx watch | ingen |
| en server eller pc, der kører job om natten | cron eller Opgavestyring | én linje |
| dine eksporter i et Git-repository | GitHub Action | én YAML-fil |
| n8n, Make eller Zapier | HTTP-trin | ingen (visuelt) |
| en udvikler, der kobler dit PIM eller ERP på | API'et direkte | lidt |
Ét format til alt
Alle måder at udgive på læser det samme: en products.csv med én linje pr. størrelse og billeder med navnet {style}_{color}_{position}.jpg (varenummer, farve, position). Når du har det, virker alle opskrifterne nedenfor.
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.jpgDet skal du bruge
Gå til Automatisk upload → Adgangsnøgler i din administration, og opret en ny nøgle. Så har du to værdier: adressen på din portal (OBX_URL) og selve nøglen (OBX_TOKEN). Nøglen vises kun én gang.
export OBX_URL=https://brands.kestrel.example
export OBX_TOKEN=obxi_… # admin → Automatic upload → Access keys (shown once)Giv hvert system sin egen nøgle. Så kan du tilbagekalde én uden at bryde de andre.
1. Planlagt import (uden kode)
I din administration: Automatisk upload → Planlagte importer → Tilføj planlagt import. Vælg kilden, og hvor ofte den skal køre.
- Webadresse (HTTPS): adressen på en products.csv eller en zip med products.csv og billeder. Loginoplysninger gemmes krypteret.
- SFTP: server, bruger, adgangskode eller nøgle og mappen med eksporten.
- S3-bucket: AWS S3, Cloudflare R2, MinIO eller Backblaze: endpoint, bucket, mappe og en skrivebeskyttet nøgle.
Vælg "Kun tilføj og opdater" eller "Tag også manglende varer offline". Den anden tager også det offline, der forsvandt fra filen, men stopper, hvis mere end halvdelen af et brand ville forsvinde, så en defekt eksport aldrig tømmer jeres katalog. "Test forbindelse" viser, hvilke filer den ville læse.
obx-værktøjet
obx er ét program til Windows, macOS og Linux. Det læser OBX_URL og OBX_TOKEN fra miljøet, uploader kun nye eller ændrede billeder, laver webversionerne efter behov og venter, til din portal har behandlet alt. Kør det så tit, du vil: uændrede varer koster ingenting.
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 errorsExitkode 0 = alt i orden, 2 = færdig, men nogle linjer havde fejl (de vises), 1 = mislykkedes.
2. En mappe, der udgiver sig selv: obx watch
Lad dit PIM, ERP eller en kollega gemme eksporter i en mappe. obx watch udgiver, så snart noget ændrer sig, og springer billeder over, der er uændrede. Kør det som tjeneste eller med 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 eller Windows Opgavestyring
# 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
Gem OBX_URL og OBX_TOKEN som repository secrets. Det samme virker i GitLab CI, Bitbucket eller Azure DevOps: installér obx, og kør 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 eller Zapier
Brug et almindeligt HTTP Request-trin med headeren Authorization: Bearer efterfulgt af din nøgle. Alle trin kan trygt gentages: at sende de samme data to gange ændrer intet.
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>Portal til Cloudflare laver ikke selv webversioner af fotos. Udgiv der med obx eller via "Importer" i jeres administration: de laver dem for jer. Fotos, der kommer ind på anden vis, fx via en planlagt import, vises indtil da i original størrelse.
PATCH {OBX_URL}/obx/v1/ingest/products/KO-1001
Authorization: Bearer obxi_…
Content-Type: application/merge-patch+json
{"status": "unpublished"}Vil du have besked, når der sker noget? Tilføj i din administration en notifikation (webhook) for en færdig import eller en ny adgangsanmodning, og lad den starte en trigger i n8n, Make eller Zapier.
6. API'et direkte (for udviklere)
En integration husker, hvad den sendte sidst, og sender kun ændringer, i batches. Eller send CSV'en, som den er, og lad portalen læse den.
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>Alle detaljer står i specifikationen:Ingest API ·automatiseringsopskrifter ·Go-SDK ·Udviklere