Zum Hauptinhalt springen

Mit der Luminovo API Ihre Einkaufsprozesse beschleunigen

Schnellerer Einkauf durch automatisiertes Abrufen von Preisen

Verfasst von Luminovo Support

Einkauf ist komplex und zeitaufwendig

Und Luminovo hilft Einkäufern bei EMS oder OEMs, schneller und zu besseren Konditionen einzukaufen. Da das ERP-System das führende System für den Einkauf ist, müssen die Bestellungen im ERP-System erstellt werden, bevor sie versendet werden.

Es gibt zwei verschiedene Einkaufsszenarien, die unsere Kunden mit Luminovo abdecken können.

  1. Projektbasierter Einkauf. Jedes Projekt wird separat eingekauft.

  2. Konsolidierter Einkauf. Mehrere Projekte werden gebündelt und in einem Zug eingekauft.

In diesem Dokument geht es darum, beide Szenarien zu automatisieren. Alles Folgende lässt sich bereits manuell in der Luminovo-Oberfläche erledigen – ein*e Einkäufer*in kann ein Projekt öffnen, die ausgewählten Angebote, Mengen und Preise ablesen und von Hand ins ERP eintippen. Der Punkt hier ist der automatisierte Weg: diese Daten direkt zwischen ERP und Luminovo über die API auszutauschen, sodass Einkäufer*innen das manuelle Abtippen überspringen, Übertragungsfehler vermeiden und stets mit aktuellen Preisen und Verfügbarkeiten arbeiten.

Die beschriebenen API-Endpunkte sind die Bausteine für diesen automatisierten Datenaustausch.

Beide Szenarien nutzen nur die öffentliche API (https://api.luminovo.com, Doku unter docs.luminovo.com).


Die zwei Szenarien auf einen Blick

Szenario 1 – Projektbasierter Einkauf

Szenario 2 – Konsolidierter (Sammel-)Einkauf

Auslöser

Das Angebot eines einzelnen Projekts wird angenommen

Das ERP hat den Bedarf über viele Projekte aggregiert

Arbeitseinheit

Ein Projekt / Sourcing-Szenario

Eine flache Liste von IPNs

Wer das Angebot auswählt

Luminovo (die Sourcing-Auswahl im Projekt)

Das ERP, aus allen von Luminovo zurückgegebenen Angeboten

Richtung

Die ausgewählten Beschaffungsoptionen aus dem Projekt ziehen

Aktualisieren, dann alle Angebote je IPN ziehen; das ERP entscheidet

Kern-Endpunkte

GET /sourcing-scenarios/{id}/purchase-optionsGET /offers/{id}

GET /components/ipn/{ipn}POST /offers/refresh (in dev) → POST /offers/find

Ergebnis im ERP

Bestellung je ausgewähltem Angebot erstellt

Beste Preise in die Einkaufsmaske vorbefüllt; der*die Einkäufer*in entscheidet

Beide Szenarien enden gleich: Die Bestellung wird im ERP erstellt und ausgeführt. Luminovo liefert nur die bepreisten Sourcing-Daten.

Die Automatisierungen auf Luminovo-Seite sind rein lesend. Nichts wird von Luminovo bestellt oder per E-Mail versendet. Die endgültige Einkaufsentscheidung wird immer im ERP-System getroffen.

Wie der Datenaustausch funktioniert

Wichtig zu betonen – der Austausch zwischen dem ERP-System und Luminovo läuft über die API von Luminovo. Es muss immer eine Instanz geben, die diesen Austausch initiiert (= Aufrufe an die API von Luminovo macht). Dieses System ist entweder Ihr ERP oder eine Middleware, die Sie möglicherweise betreiben. Luminovo überträgt niemals selbst aktiv Daten in Ihr ERP-System, es stellt die Daten nur bereit, jederzeit zum Laden bereit.


Szenario 1 – Projektbasierter Einkauf

Ablauf

  1. Der Kunde fragt ein Angebot an. Das EMS erhält eine Anfrage von seinem Kunden.

  2. Importieren Sie die BOM in ein Projekt (RfQ) in Luminovo – wird manuell von Nutzer*innen erledigt.

  3. Bearbeiten Sie die BOM und erstellen Sie das Angebot an den Kunden. Das Sourcing läuft gegen die Lieferanten-APIs; Luminovo wählt je Position ein Angebot innerhalb des Sourcing-Szenarios des Projekts aus.

  4. Das Angebot wird angenommen → der*die Nutzer*in löst den Abruf aus. Das ERP holt die Beschaffungsoptionen des Projekts – die einzukaufenden Mengen und das ausgewählte Angebot – und erstellt die Bestellung(en) im ERP.

Optional kann die Integration vor Schritt 4 die Lieferantenangebote aktualisieren (POST /offers/refresh, in Entwicklung) und dann die Sourcing-Auswahl erneut ausführen (POST /sourcing-scenarios/run-selection), sodass Preise/Verfügbarkeit zum Bestellzeitpunkt aktuell sind – das adressiert die Frage „Wie alt ist dieses Angebot?" (Angebote können zum Beispiel so konfiguriert werden, dass sie nach 7 Tagen als veraltet und nach 28 als abgelaufen gelten).

Endpunkte

1. GET /sourcing-scenarios/{id}/purchase-options„ausgelegt dafür, dass ERP-Systeme Bestellungen erstellen."

Pfadparameter id = die UUID des Sourcing-Szenarios (aus dem Projekt zu beziehen über GET /rfqs/{id} oder GET /sourcing-scenarios).

Gibt purchase_options[] zurück, ein Eintrag je ausgewähltem Angebot:

Feld

Bedeutung – warum das ERP es braucht

offer_id

Handle auf das ausgewählte Angebot. Auflösen mit GET /offers/{id}.

quantity

Anzahl der zu bestellenden Angebotseinheiten (die einzukaufende Menge).

unit_of_measurement

Was eine Angebotseinheit ist (z. B. 1 Stück oder 5 m Kabel).

purchase_quantity

Komfort-Gesamtmenge in Basiseinheiten = quantity × unit_of_measurement.value.

minimum_order_quantity (MOQ)

Aus der ausgewählten Preisstaffel – die Bestellung muss ≥ diesem Wert sein.

minimum_packaging_quantity (MPQ)

Die Bestellung muss ein Vielfaches davon sein.

unit_price.amount + unit_price.currency

Preis pro Angebotseinheit in der Originalwährung des Angebots – keine Umrechnung.

Löst einen häufigen Währungsschmerzpunkt.

ERPs benötigen typischerweise die ursprüngliche Bestellwährung (z. B. USD für einen US-Distributor), nicht einen bereits in die Tenant-Währung (z. B. EUR) umgerechneten Wert. purchase-options gibt unit_price in der Originalwährung mit einem ISO-4217-Code zurück.

2. GET /offers/{id} (oder POST /offers/bulk für mehrere auf einmal) – löst jede offer_id in den vollständigen Datensatz auf, den das ERP auf der Bestellposition braucht:

Feld

Verwendung in der Bestellung

linked_partmpn, manufacturer{id,name}

Herstellerteilenummer + Hersteller für die Bestellposition.

linked_location (Lieferant) → name, number

Der Lieferant und seine ERP-Vendor-Nummer – oft verwendet, um freizugeben, welche Lieferanten für die Bestellerstellung gültig sind.

linked_location.stock_location

Niederlassung / Region des Lieferanten (z. B. Europa, Asien).

supplier_part_number (SPN)

Die eigene Teilenummer des Lieferanten zum Bestellen.

offer_number

Angebotsreferenz des Lieferanten, zur Abstimmung.

price_type

ListPrice / ContractPrice / QuotePrice / kundenverhandelt.

price_breaks[]minimum_order_quantity, minimum_packaging_quantity, unit_price

Vollständige Preisstaffel-Leiter in Originalwährung.

availabilityfactory_lead_time, factory_quantity, stock

Lieferzeit + Bestand für die Liefertermin-Planung.

packaging

Reel / Tape / Tray / Tube / Bulk …

valid_from, valid_until

Gültigkeitsfenster des Angebots – prüfen Sie vor dem Bestellen, ob der Preis noch aktuell ist.

cancellation_policyis_non_cancellable_non_returnable

NCNR / Stornofenster.

one_time_costs[]

Werkzeug-/NRE-/Einrichtungskosten (meist Custom Parts).

unit_of_measurement, kind (StandardPart/CustomPart)

Einheitenbasis; Custom Parts tragen die staffelweise lead_time innerhalb von price_breaks statt in availability.


Szenario 2 – Konsolidierter (Sammel-)Projekteinkauf

Ablauf

  1. Der Bedarf wird auf der ERP-Seite aggregiert, sodass das ERP die maßgebliche Liste der einzukaufenden IPNs hält (über viele Projekte hinweg).

  2. Das ERP löst eine Aktualisierung der Angebote für diese IPNs in Luminovo aus, sodass Lieferantenpreise/-verfügbarkeit neu abgerufen und aktuell sind.

  3. Nach einer Verzögerung (die Aktualisierung braucht Zeit, um alle Angebote zu aktualisieren) holt das ERP alle Angebote für die angegebenen IPNs von Luminovo.

  4. Das ERP entscheidet, welche Angebote zu bevorzugen sind, anhand benutzerdefinierter Kriterien – z. B. bester Einkaufspreis oder kürzeste Lieferzeit.

  5. Preise werden in die Einkaufsmaske eingefügt, sodass der*die Einkäufer*in bereits die besten Preise sieht und entscheiden kann, wo eingekauft wird.

Endpunkte

1. GET /components/ipn/{ipn} – die Zuordnung IPN → Part.

Pfadparameter ipn. Gibt components[] zurück (einen je Revision), jeweils mit:

Feld

Verwendung

internal_part_number.value / .revision

Die IPN + Revision.

type

OffTheShelf oder Custom

linked_parts[] (OffTheShelf) → id, mpn, manufacturer{id,name}

Die Off-the-shelf-Part-ID (die „mpn_id", die den zu bepreisenden Part identifiziert) plus ihre MPN/Hersteller. Das ist die ID, die Sie in die Angebots-Endpunkte einspeisen.

risk_datarohs_compliant, reach_compliant, lifecycle_status, lifecycle_yteol

Compliance/Lebenszyklus, falls Sie das Bestellen davon abhängig machen möchten. Diese Daten sind immer ein Aggregat aus allen verbundenen MPNs. Mehr zu den Aggregationsregeln in der API-Dokumentation.

2. POST /offers/refresh – ruft Lieferanten-API-Angebote für die angegebenen Part(s) / mpn_id neu ab, sodass Preise und Verfügbarkeit aktuell sind.

Bauen Sie nach diesem Aufruf eine Verzögerung ein, bevor Sie abrufen – die Aktualisierung muss die Lieferanten-APIs ansprechen und alle Angebote aktualisieren; zu frühes Lesen liefert veraltete Daten. Luminovo hat noch keine Funktion, um den Status der Angebotsaktualisierung zu prüfen.

3. POST /offers/find (Doku-Titel „Get Offers By Part" – Hinweis: es ist POST, nicht GET) – der Sammel-Lesezugriff.

Request-Body = eine Menge von Part-IDs (Off-the-shelf, Custom oder IPN) – POST, damit Sie viele auf einmal übergeben können. Gibt zurück:

  • items[] – die Angebote (dieselbe reichhaltige OfferResponse-Struktur wie GET /offers/{id} oben): price_breaks[] (MOQ / MPQ / unit_price in Originalwährung), availability (factory_lead_time, stock), linked_location (Lieferant + ERP-Vendor-number), supplier_part_number, price_type, valid_from/valid_until, Verpackung usw. Das ist die Liste der Angebote mit den Preisen, MOQs und Lieferzeiten, nach denen das ERP rankt.

  • not_found_ids[] – Part-IDs, die nicht aufgelöst werden konnten (behandeln/protokollieren Sie diese).

Das Ranking in Schritt 4 (z. B. bester Preis vs. kürzeste Lieferzeit) erfolgt durch das ERP über items[] – Luminovo gibt jedes Angebot zurück; die eigenen Kriterien des Kunden bestimmen den Gewinner. Das Prinzip: Luminovo liefert die Daten; die Entscheidung und die Bestellung bleiben im ERP.


Was ein ERP braucht, um eine Bestellung zu erstellen – und woher es kommt

Konsolidierte Feldzuordnung (für eine kontierte Bestellung / „account-assigned PO"):

Bestellfeld (ERP)

Quelle in der Luminovo API

Hinweise

Lieferant / Vendor-Nummer

offer.linked_location.number

Hersteller + MPN

offer.linked_part.mpn, .manufacturer

IPN (interne Teilenummer)

GET /components/ipn/{ipn} / Projektposition

Die eigene Materialnummer des ERP wird über die IPN zugeordnet.

Lieferantenteilenummer (SPN)

offer.supplier_part_number

Bestellmenge

purchase_options.quantity / purchase_quantity (Sz. 1); gewählt aus price_breaks (Sz. 2)

Maßeinheit

unit_of_measurement

Stückpreis + Währung

purchase_options.unit_price / offer.price_breaks[].unit_price

Originalwährung, keine Umrechnung.

MOQ / MPQ

minimum_order_quantity / minimum_packaging_quantity

Die Bestellung muss ≥ MOQ und ein Vielfaches von MPQ sein.

Lieferzeit

offer.availability.factory_lead_time (Standard) / price_breaks[].lead_time (Custom)

Für die Liefertermin-Planung.

Angebotsgültigkeit

offer.valid_from / valid_until

Vor dem Bestellen die Preisaktualität prüfen.

Kontierung / Kostenstelle / Projekt

ERP-Seite

Nicht in Luminovo – vom ERP für die kontierte Bestellung bereitgestellt.

Liefer-/Bedarfstermin

ERP-Seite (aus aggregiertem Bedarf)

Einschränkungen, die klar benannt sein sollten

  • Die Bestellung wird aus dem ERP aufgegeben, niemals aus Luminovo. Auch Wareneingang und Rechnungseingang bleiben im ERP.

  • Keine Lieferanten-E-Mails aus Luminovo. Diese Lese-Endpunkte senden nichts – die endgültige Einkaufsentscheidung und die Bestellung bleiben im ERP.

  • Aktualität zählt. Führen Sie vor dem Bestellen die Auswahl erneut aus (Sz. 1) oder aktualisieren Sie die Angebote (Sz. 2); beachten Sie die Gültigkeitsdaten der Angebote.


Endpunkt-Kurzreferenz

#

Endpunkt

Methode

Szenario

Rolle

1

/sourcing-scenarios/{id}/purchase-options

GET

1

Ausgewählte Angebote + einzukaufende Mengen für ein Projekt

2

/offers/{id} (oder /offers/bulk)

GET / POST

1 (+2)

Vollständige Angebotsdetails hinter einer offer_id

3

/components/ipn/{ipn}

GET

2

IPN → Off-the-shelf-Part-ID (mpn_id) + MPN

4

/offers/refresh

POST

2

Lieferantenangebote neu abrufen (in Entwicklung; danach Verzögerung einplanen)

5

/offers/find

POST

2

Alle Angebote für eine Menge von Part-IDs → items[] + not_found_ids[]

/sourcing-scenarios/run-selection

POST

1 (opt.)

Die Sourcing-Auswahl des Projekts vor dem Bestellen aktualisieren

Alle Aufrufe: Basis-URL https://api.luminovo.com, Bearer- (JWT-)Authentifizierung und ein datenmodellspezifischer Accept-Header je Endpunkt. Behandeln Sie stets einen "Unknown"-Fall für jedes Enum (Vorwärtskompatibilitätsregel, wie in der API-Präambel angegeben).

Hat dies deine Frage beantwortet?