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.

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

Hvilken opskrift passer til dig?

Du har…BrugKode nødvendig
en CSV eller zip på en webadresse, SFTP-server eller S3-bucketPlanlagt importingen
en mappe, hvor eksporter landerobx watchingen
en server eller pc, der kører job om nattencron eller Opgavestyringén linje
dine eksporter i et Git-repositoryGitHub Actionén YAML-fil
n8n, Make eller ZapierHTTP-triningen (visuelt)
en udvikler, der kobler dit PIM eller ERP påAPI'et direktelidt

É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.

products.csv (forkortet)
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
Filnavne på billeder
images/
  KO-1001_NVY_1.jpg     ← style KO-1001, colour NVY, position 1 (front)
  KO-1001_NVY_2.jpg
  KO-1001_NVY_3.jpg

Det fulde importformat

Det 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 errors

Exitkode 0 = alt i orden, 2 = færdig, men nogle linjer havde fejl (de vises), 1 = mislykkedes.

Download obx · obx-go

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/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 eller Windows Opgavestyring

Linux eller 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, én gang)
$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/images

5. 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.

Vare (for eksempel når den ændres i dit 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}]}]}
Farve og størrelse med 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"}
Billede: først oplysningerne, så selve filen
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.

Tage noget offline
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.

Spring billeder over, som portalen allerede har, og send én batch
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"
En CSV og en zip med billeder på én gang
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