Optimus CLI

Euer ERP kann keine API anbinden? Kein Problem. Mit der Optimus CLI integriert ihr die USt-ID-Prüfung automatisiert in jedes System - ganz ohne Entwicklung.

Exportiert eure Daten als CSV, und die CLI übernimmt den Rest: USt-IDs prüfen, Firmendaten validieren, Firmendaten anreichern, Abweichungen erkennen und Korrekturen zurückgeben.

Einmal eingerichtet, läuft alles automatisch im Hintergrund. Bei Fragen sprechen Sie uns gerne an: Kontakt

optimus.exe Prod: webapp.optimussoftware.de Test: demo-webapp.optimussoftware.de

Die CLI kennt zwei Hauptbefehle: check prüft USt-IDs gegen die Optimus API und schreibt eine Ergebnis-CSV. import legt Stammdaten in der WebApp an oder aktualisiert bestehende Einträge.

Voraussetzungen

optimus.exe ist als self-contained Single-File publiziert - die .NET 8 Runtime ist direkt in die EXE eingebettet. Auf dem Zielrechner muss nichts installiert werden. Einfach die EXE in einen beliebigen Ordner legen und ausführen.

Kein .NET, kein Installer, keine Abhängigkeiten. Die optimus.exe läuft auf jedem Windows-Rechner direkt aus dem Ordner heraus.

Betriebssystem

Die CLI ist für Windows x64 gebaut. Windows 10 / Windows Server 2019 oder neuer wird empfohlen.

Netzwerk

Die CLI benötigt ausgehenden HTTPS-Zugriff (Port 443) auf:

UmgebungHost
Produktionwebapp.optimussoftware.de
Testdemo-webapp.optimussoftware.de
ℹ️ Falls ein Proxy oder eine Firewall im Einsatz ist, müssen diese Hosts freigegeben sein. Die CLI unterstützt die Systemproxy-Einstellungen von Windows automatisch.

Authentifizierung

Alle API-Aufrufe benötigen einen Bearer-Token. Den Token erstellt ihr in der WebApp unter Einstellungen → API-Token generieren.

Den Token könnt ihr auf drei Wegen übergeben - am sichersten ist die Umgebungsvariable:

MethodeBeispiel
CLI-Flag--token eyJ...
Umgebungsvariableset OPTIMUS_TOKEN=eyJ...
YAML-Dateinicht direkt unterstützt - lieber Env-Variable

Konfigurationspriorität

Wenn dieselbe Option an mehreren Stellen definiert ist, gilt diese Reihenfolge - links gewinnt immer:

CLI-Flag YAML (--map) Umgebungsvariable Default
💡 Empfehlung: Legt alle festen Einstellungen (Delimiter, Spalten-Mapping, Duplikat-Modus) in der YAML-Datei ab. CLI-Flags nur für einmalige Abweichungen wie --env test oder -v.

check - USt-IDs prüfen

Liest eine CSV-Datei (oder alle CSVs in einem Ordner), prüft jede USt-ID über die Optimus API und schreibt eine Ergebnis-CSV mit Status und optionalen Korrekturen.

optimus check <pfad> [optionen]
# Einfache Prüfung
optimus check kunden.csv --map mapping.yml --token eyJ...

# Mit PDF-Prüfbericht (digital signiert)
optimus check kunden.csv --map mapping.yml --token eyJ... --pdf --sign --pdf-dir ./evidence

import - Stammdaten importieren

Liest eine CSV und legt für jede Zeile einen Stammdateneintrag in der WebApp an (POST) oder aktualisiert bestehende Einträge (PUT) - abhängig vom gewählten Duplikat-Modus.

optimus import <pfad> [optionen]
# Import mit Overwrite, matchKey aus ustId + PLZ
optimus import C:\optimus\import --map mapping.yml --token eyJ...

Allgemeine Optionen

Diese Optionen gelten für beide Befehle: check und import.

Basis

FlagBeschreibungDefault
<pfad>Pflicht. Pfad zur CSV-Datei oder zu einem Ordner (Ordner-Modus).-
--map <datei>Pfad zur YAML-Mapping-Datei. Empfohlen für alles außer Schnelltests.-
--token <jwt>Bearer-Token für die API. Alternativ via Umgebungsvariable OPTIMUS_TOKEN.$OPTIMUS_TOKEN
--env <test|prod>Wechselt zwischen Test- und Produktivumgebung. test spricht demo-webapp.optimussoftware.de an.prod
--out <datei>Pfad für die Ergebnis-CSV. Wird automatisch angelegt wenn nicht angegeben.{input}_result.csv
--dry-runLiest und validiert die CSV, führt aber keinen API-Aufruf durch. Nützlich zum Testen des Mappings.false

Ausgabe & Debugging

FlagBeschreibungDefault
-v / --verboseZeigt für jede Zeile detaillierte Informationen - was geprüft wurde, welches Ergebnis kam, ob Fehler aufgetreten sind.false
-q / --quietUnterdrückt alle Ausgaben außer Fehlermeldungen. Sinnvoll für automatisierte Abläufe.false

Spalten-Mapping (alternativ zur YAML)

FlagCSV-Spalte für …
--col-ustid <name>USt-ID (Pflichtfeld)
--col-name <name>Firmenname
--col-street <name>Straße
--col-zip <name>Postleitzahl
--col-city <name>Ort
--col-ref <name>Externe Referenz (z.B. Kunden-Nr.)

CSV-Format (Eingabe)

FlagBeschreibungDefault
--in-delimiter <z>Trennzeichen der Eingabe-CSV. Erlaubt: ; , \t |. Wird automatisch erkannt wenn nicht gesetzt.Auto
--in-encoding <enc>Zeichenkodierung der Eingabe-CSV. Relevant bei Windows-Exports (oft windows-1252).utf-8
--no-headerSetzen wenn die CSV keine Kopfzeile hat. Spalten werden dann per Position gemappt.false
--skip-rows <n>Überspringt n Zeilen vor dem Header. Nützlich bei CSVs mit Metadaten am Anfang.0

CSV-Format (Ausgabe)

FlagBeschreibungDefault
--out-delimiter <z>Trennzeichen für die Ergebnis-CSV.wie Eingabe
--out-encoding <enc>Encoding der Ergebnis-CSV.utf-8
--no-bomDeaktiviert das BOM-Zeichen in der Ausgabe. BOM wird von Excel für die korrekte Darstellung von Umlauten benötigt.false

Optionen - nur check

PDF-Prüfbericht

FlagBeschreibungDefault
--pdfErstellt für jede geprüfte USt-ID einen PDF-Prüfbericht.false
--no-pdfDeaktiviert PDFs explizit - überschreibt die YAML-Einstellung.false
--signSigniert den PDF-Bericht digital. Erfordert --pdf.false
--pdf-dir <ordner>Ordner in dem die PDFs gespeichert werden.neben Ergebnis-CSV
--pdf-timestampHängt einen Zeitstempel an den PDF-Dateinamen - verhindert Überschreiben bei Wiederholungsläufen.false

Prüfverhalten

FlagBeschreibungDefault
--transliterationAktiviert Zeichensatz-Transliteration. Hilfreich wenn Sonderzeichen in der CSV anders kodiert sind als erwartet.false
--company-vat-id <id>Eigene USt-ID für die qualifizierte Prüfung (Bestätigungsverfahren). Muss vorab durch Optimus freigeschaltet werden.Account-USt-ID
--batch-size <n>Anzahl paralleler API-Calls. Bei stabiler Verbindung kann erhöht werden, bei Timeouts reduzieren.500
--out-columns <liste>Komma-getrennte Liste der Spalten in der Ergebnis-CSV. Shortcut all gibt alle Spalten aus.alle

Benachrichtigung

FlagBeschreibungDefault
--notifySendet nach Abschluss eine Monitoring-E-Mail.false
--email-pdfVersendet die PDFs per E-Mail (erfordert --pdf).false

Optionen - nur import

FlagBeschreibungDefault
--on-duplicate <modus>Verhalten bei bereits vorhandenen Einträgen. Mögliche Werte: append (immer neu anlegen), overwrite (aktualisieren), skip (überspringen). Siehe Duplikat-Logik.append
--match-key <felder>Komma-getrennte Felder die als Schlüssel für den Duplikat-Abgleich verwendet werden. Pflichtfeld ist immer ustId. Weitere erlaubte Felder: externalReference, street, city, zip.ustId
--batch-size <n>Anzahl paralleler API-Calls. Standard ist 5 (niedriger als bei check, da Schreiboperationen stabiler laufen bei geringerer Parallelität).5

YAML - columns

Mappt die Spaltennamen eurer CSV auf die internen Felder der Optimus API. Gilt für check und import. Nur ustId ist Pflicht.

# mapping.yml
columns:
  ustId:              "UStIdNr"        # Pflicht
  name:               "Bezeichnung"
  street:             "Strasse"
  zip:                "PLZ"
  city:               "Ort"
  externalReference:  "Kontonummer"   # z.B. Kunden-Nr. aus ERP

YAML - input

Steuert wie die Eingabe-CSV eingelesen wird. Alle Felder optional - Auto-Detection greift wenn nichts definiert ist.

input:
  delimiter:        ";"          # ";" | "," | "\t" | "|"
  encoding:         "utf-8"      # oder "windows-1252" für Windows-Exporte
  hasHeader:        true
  skipRows:         0
  trimWhitespace:   true         # Leerzeichen an Feldrändern entfernen

YAML - output (nur check)

Steuert Format und Inhalt der Ergebnis-CSV.

output:
  delimiter:        ";"
  encoding:         "utf-8"
  bom:              true         # Empfohlen für Excel-Kompatibilität
  columns:                       # Welche Spalten sollen ausgegeben werden?
    - row
    - ust_id
    - ust_id_status
    - name
    - name_status
    - name_corrected
    - overall
    - checked_at
    - external_ref

Verfügbare Spalten-Shortcuts: all (alle Spalten), all_originals, all_statuses, all_corrections.

YAML - import (nur import)

Duplikat-Verhalten und Standardwerte für neu angelegte Einträge.

import:
  onDuplicate:      "overwrite"  # "append" | "overwrite" | "skip"
  matchKey:                      # Schlüssel für Duplikat-Erkennung
    - ustId                        # Pflicht
    - zip                          # optional: + PLZ, Straße, Stadt, ext. Ref.
  defaults:
    checkEnabled:     true        # Monitoring in der WebApp aktivieren
    emailNotification: false
    note:             "CLI Import"

YAML - folder

Konfiguration für den Ordner-Modus. Wird automatisch aktiv wenn <pfad> ein Ordner ist.

folder:
  pattern:              "*.csv"
  minAge:               0            # Min. Dateialter in Sekunden vor Verarbeitung
  onDuplicate:          "skip"       # Wenn Ergebnis-CSV schon existiert
  retryFromProcessing:  true         # Abgebrochene Läufe automatisch fortsetzen
  cleanupDoneAfterDays: null         # null = done-Ordner nie leeren

YAML - filter

Zeilen aus der CSV herausfiltern bevor sie verarbeitet werden.

filter:
  skipEmptyUstId:   true    # Zeilen ohne USt-ID werden übersprungen (SKIPPED)
  skipPattern:      "^#"    # Regex auf das USt-ID-Feld - hier: Kommentarzeilen

Duplikat-Logik (import)

Der matchKey bestimmt wie ein „Duplikat" erkannt wird - ein vorhandener Eintrag in der WebApp gilt als Treffer wenn alle matchKey-Felder übereinstimmen (case-insensitive).

ModusVerhalten
appendKein Abgleich - jede Zeile wird immer neu angelegt (POST). Sinnvoll wenn Duplikate gewollt sind.
skipWenn ein Treffer gefunden wird → Zeile überspringen (SKIPPED). Bestandsdaten bleiben unberührt.
overwriteWenn genau 1 Treffer → aktualisieren (PUT). Bei 2+ Treffern → AMBIGUOUS-Warnung, kein Update.
⚠️ Kommen innerhalb einer CSV mehrere Zeilen mit identischem matchKey vor, gewinnt die letzte Zeile (Last-Row-Wins).

Ordner-Modus

Wenn <pfad> ein Ordner ist, verarbeitet die CLI alle CSVs darin automatisch nacheinander. Die Dateien werden dabei in Unterordner verschoben:

C:\optimus\import\← Eingang (hier CSVs ablegen)
C:\optimus\import\processing\← Wird gerade verarbeitet
C:\optimus\import\done\← Erfolgreich abgeschlossen
C:\optimus\import\error\← Fehler (+ .err Datei mit Details)
C:\optimus\import\results\← Ergebnis-CSVs
💡 Mit retryFromProcessing: true in der YAML werden Dateien die beim letzten Lauf im processing-Ordner hängen geblieben sind, beim nächsten Start automatisch erneut verarbeitet.

Exit-Codes

Nützlich für Scripting und automatisierte Pipelines.

0
Erfolg
Alles OK, auch wenn Warnings aufgetreten sind.
1
CLI-Fehler
Konfiguration, Auth, Mapping oder IO-Fehler.
2
Validierungsfehler
Mindestens eine Zeile hat einen ERROR.
3
Temporärer Fehler
API-Timeout oder TEMP_ERROR → Retry empfohlen.
4
Kontingent erschöpft
HTTP 402 - API-Kontingent aufgebraucht.

Beispiele

USt-ID Prüfung - minimal

optimus check kunden.csv --map mapping.yml --token eyJ...

USt-ID Prüfung - mit PDF und Signierung

optimus check kunden.csv --map mapping.yml --token eyJ... \
  --pdf --sign --pdf-dir ./evidence

Testumgebung mit detailliertem Output

optimus import C:\optimus\import --map mapping.yml --token eyJ... --env test -v

Import im Ordner-Modus (Token via Umgebungsvariable)

set OPTIMUS_TOKEN=eyJ...
optimus import C:\optimus\import --map mapping.yml

Dry-Run - nur Mapping testen, kein API-Call

optimus import kunden.csv --map mapping.yml --dry-run -v

Minimale YAML für Import (Overwrite, matchKey: ustId + PLZ)

columns:
  ustId:             "UStIdNr"
  name:              "Bezeichnung"
  street:            "Strasse"
  zip:               "PLZ"
  city:              "Ort"
  externalReference: "Kontonummer"

input:
  delimiter: ";"

import:
  onDuplicate: overwrite
  matchKey: [ustId, zip]
  defaults:
    checkEnabled: true