Skip to content

Lager und Inventur – Vollständige API-Referenz ​

Fach-API für Lager, Bestand, manuelle Buchung, Umlagerung, Wareneingang und Inventur. Basis ist https://core-backend.reybex.com/api (Staging: https://io-staging-partner.reybex.com/api). Authentifizierung wie im API: --header "authorization: Basic $TOKEN".

Artikel unter Artikelstamm-Verwaltung, die Bestellung vor dem Wareneingang unter Einkauf-Verwaltung. Die Artikel-Lagerzeile (materialStock, Pickplatz, Meldebestand) bleibt im Artikelstamm, Abschnitt Bestand.

Der Bestand StockList entsteht durch Buchungen. Er wird gelesen, nicht als Beleg angelegt. Der schreibende Weg für Zugang und Abgang ohne Bestellung ist POST /api/stockHead/book.

1. Grundlagen ​

ObjektRolle
WarehouseLager, Suchschlüssel code, sonst name
StockPlaceLagerplatz, Suchschlüssel stockplaceCode oder name, immer mit Lager
StockMoveTypeBewegungsart, Code moveTypeCode
InvDocTypeInventurbelegart der Lagerbuchung
StockHead / StockItemGebuchter Lagerbeleg und seine Positionen
StockListAktueller Bestand je Artikel, Lager, Platz, Charge, Variante
StockTakingHeadInventur. Zählen ändert den Bestand erst mit postedStatus

Die Zahlen in den Beispielen sind Beispiel-Ids eines Mandanten. 7001 ist Lager HAUPT, 8001 der Platz WE-01, 100100 der Artikel ART-1000, 100200 der Artikel LM-2000, 6001 die Einheit ST.

1.1 Zwei Datumsformate ​

AufrufFormat
POST /api/stockHead/bookdd.MM.yyyy
POST /api/stock/transfer, POST /api/stock/transferFifoyyyy-MM-dd
POST /api/incomingGoods/yyyy-MM-dd
Inventur, Feld reloadStockDeadlineyyyy-MM-dd

1.2 Antwort- und Fehlerformat ​

Lesen eines Inventurbelegs kapselt den Datensatz:

json
{
  "data": { "id": 90001, "docNumber": "INV-10001" },
  "meta": { "domain": "StockTakingHead", "total": 1 }
}
SituationHTTPKörper
Datensatz nicht gefundenoft 404{ "error": "…" }
Fachlicher AbbruchStatus der Ausnahme{ "error": "…" }
POST /api/incomingGoods/bookVouchers – gesperrte Ressource500Text zur Sperre
POST /api/incomingGoods/bookVouchers – Constraint oder zu große Daten400Text zum Datenbankfehler
Fehlende Anmeldung401—

2. Lager und Lagerplatz ​

Lager und Lagerplatz sind Domänen. Anlegen und ändern: POST /api/domains/warehouse und POST /api/domains/stockPlace. Die Antwort ist { "id": … }.

2.1 Lager ​

json
{
  "code": "HAUPT",
  "name": "Hauptlager",
  "isStockkeeping": true,
  "isDefault": true,
  "isStockplaceMust": true,
  "isActiveForAvailabilityCheck": true,
  "isPriceEvaluation": true
}
FeldBedeutung
code, nameSuchschlüssel
isStockkeepingLager führt Bestand
isStockplaceMustJede Buchung braucht einen Lagerplatz
isDefaultStandardlager
isExternalFremdlager
isConsignmentStockKonsignation
isVirtualVirtuelles Lager
isTransitTransit
isAvailabilityCheckDisabledVerfügbarkeit ignoriert dieses Lager
isNoMrpDisposition ignoriert das Lager
isNegativeStockAllowed steht am PlatzNegativbestand am Lagerplatz
incomingGoodsStockPlaceStandardplatz des Wareneingangs, wenn der Aufruf keinen Platz sendet
customer, vendor, stockOwnerPartner am Lager, Suchschlüssel customerNo

Lesen: GET /api/domains/warehouse?code=eq(HAUPT)&take=1.

2.2 Lagerplatz ​

Der Platz hängt am Lager. stockplaceCode ist je Lager eindeutig.

json
{
  "stockplaceCode": "WE-01",
  "name": "Wareneingang 01",
  "warehouse": { "code": "HAUPT" },
  "isDefault": true,
  "isStockkeeping": true,
  "isPickplace": true,
  "isNegativeStockAllowed": false,
  "pickOrder": 10
}
FeldBedeutung
stockplaceCode, nameSuchschlüssel, immer zusammen mit warehouse
isDefaultStandardplatz. Die Inventur nimmt ihn, wenn kein Platz gesendet wird
isPickplaceKommissionierplatz
isNegativeStockAllowedNegativer Bestand erlaubt
reservationCheckTypePrüfung der Reservierung
ignorePickAvailabilityVerfügbarkeit beim Kommissionieren ignorieren
pickOrderWegreihenfolge

Lesen: GET /api/domains/stockPlace?stockplaceCode=eq(WE-01)&take=20. Ein Platz über die Fach-API: GET /api/stockPlace/{id}. Die Platzliste der Buchungsmaske: GET /api/stockHead/stockList.

3. Bewegungsart und Belegart ​

GET /api/domains/stockMoveType?take=100 und GET /api/domains/invDocType?take=100.

StockMoveType.statPostway: 0 Wareneingang, 1 Warenausgang, 2 nicht anzeigen. statFactor 1 erhöht die Statistik, -1 verringert sie.

Ohne Bewegungsart setzt POST /api/stockHead/book bei positiver Menge 110 und bei negativer Menge 120. bookingSource purchase setzt 210. POST /api/incomingGoods/bookIncomingGoods setzt immer 210.

CodeVerwendung
110Manueller Zugang und POST /api/incomingGoods/bookVouchers
120Manueller Abgang und DELETE /api/incomingGoods/cancelVouchers
210Wareneingang zur Bestellung
450 / 451Umlagerungspaar. Fehlt targetCode, wird aus 450 die Gegenart 451

InvDocType:

FeldBedeutung
isArrivalZugang
isDepartureAbgang
isManualManuelle Buchung
isStockTakingInventur. Die Anlage sucht die erste Belegart mit diesem Schalter

GET /api/stockHead/stockHeadManualBooking liefert Lager, Bewegungsarten und die Schalter isLicenseKeyUsed und isBatchnumUsed.

4. Bestand ​

StockList je Kombination aus Artikel, Lager, Platz, Sonderbestand, Charge, Variante, Attributcode und NVE.

FeldBedeutung
totalGesamtbestand
availVerfügbar
reservedReserviert
blockedGesperrt
qualityQualitätssperre
batchnum, vendorBatchnum, expiryDateCharge, Lieferantencharge, Mindesthaltbarkeit
variantCode, attributeCodeVariante und Attribut
licenseKeyLizenzschlüssel
nveVersandeinheit
specialstockSonderbestand
unitMengeneinheit der Zeile

4.1 Lesen ​

Kompakte Liste:

GET /api/stock/simpleList?materialId=100100&warehouseId=7001&stockplaceId=8001

Die Zeile enthält Artikel-Id und SKU, total, avail, Lager, Platz und Charge.

Bestandsliste ohne Werte: GET /api/stock/ und GET /api/stock/stockListWithoutValue. Mit exportingFormat=csv kommt die Datei inv03.csv. Mit exportingFormat=pdf ein Bericht inventoryList.

Bestand mit Vorlauf: GET /api/stock/currentStockAmounts. Export über isExport=1.

Bewertungsliste: GET /api/stock/listStock. Export über isExport=1, Datei inv05.csv.

Historie: GET /api/stock/stockHistory.

Summe: POST /api/stock/getSumOfStocks

json
{
  "warehouseId": 7001,
  "matCode": "ART-1000",
  "stockPlaceId": 8001
}

Response: { "totalSum": 50 }

materialId statt matCode ist ebenfalls möglich. Optional attributeCode.

Bestandszeile direkt: GET /api/stockList/{id}. Variantenzeilen: GET /api/stockList/variants. Archivsicht: GET /api/stockList/dataVault/stock.

Reservierungen: GET /api/stock/reservations. Neu aufbauen: POST /api/stock/regenerateStockReservationList, Antwort { "success": true }. Bestand aus den Reservierungen nachziehen: POST /api/stock/syncStockListFromReservations, dieselbe Antwort.

Lizenzschlüssel eines Artikels: GET /api/stock/licenseKeyStocksBySku?sku=ART-1000.

5. Manuelle Buchung ​

POST /api/stockHead/book bucht Zugang oder Abgang. Der Body ist flach. Jede Position ist eine Liste mit demselben Index, nicht ein Objekt unter items[].

Das Datum hat die Form dd.MM.yyyy.

5.1 Zugang ​

json
{
  "bookingSource": "manual",
  "stockHead.docDate": "13.10.2026",
  "stockHead.postDate": "13.10.2026",
  "stockHead.invDocType.id": 8802,
  "stockHead.description": "Anfangsbestand Tasche",
  "items.number": [10],
  "items.matCode": ["ART-1000"],
  "items.name": ["Tasche"],
  "items.quantity": ["50"],
  "items.total": ["50"],
  "items.warehouse.id": ["7001"],
  "items.unit.id": ["6001"],
  "items.stockPlaceCode": ["WE-01"],
  "items.stockMoveType.moveTypeCode": ["110"]
}

8802 ist die Id einer manuellen Zugangs-Belegart (isArrival, isManual). 6001 ist die Einheit ST.

Response

json
{
  "message": "…",
  "stockHead": { "id": 220100 },
  "isBatchnumMissing": false
}

message enthält die vergebene Belegnummer. Ist die Charge pflichtig und fehlt sie, setzt der Aufruf isBatchnumMissing und bucht nicht. areMissingBatchnumsIgnored true überspringt diese Prüfung.

Fehlende Menge: message.no.stock.item.quantity.entered.error. Fehlende Einheit: message.no.stock.item.unit.selected.error.

5.2 Abgang ​

Negative Menge wird positiv gespeichert. Ohne Bewegungsart wird daraus 120.

json
{
  "bookingSource": "manual",
  "stockHead.docDate": "13.10.2026",
  "stockHead.postDate": "13.10.2026",
  "stockHead.invDocType.id": 8803,
  "stockHead.description": "Schwund Tasche",
  "items.number": [10],
  "items.matCode": ["ART-1000"],
  "items.name": ["Tasche"],
  "items.quantity": ["-2"],
  "items.total": ["-2"],
  "items.warehouse.id": ["7001"],
  "items.unit.id": ["6001"],
  "items.stockPlaceCode": ["WE-01"],
  "items.stockMoveType.moveTypeCode": ["120"]
}

8803 ist die manuelle Abgangs-Belegart (isDeparture, isManual).

5.3 Charge ​

Am Artikel müssen isLotEnabled und bei MHD isShelfLife gesetzt sein.

json
{
  "bookingSource": "manual",
  "stockHead.docDate": "13.10.2026",
  "stockHead.postDate": "13.10.2026",
  "stockHead.invDocType.id": 8802,
  "stockHead.description": "Zugang Charge",
  "items.number": [10],
  "items.matCode": ["LM-2000"],
  "items.name": ["Haferdrink 1 l"],
  "items.quantity": ["24"],
  "items.total": ["24"],
  "items.warehouse.id": ["7001"],
  "items.unit.id": ["6001"],
  "items.stockPlaceCode": ["WE-01"],
  "items.batchnum": ["LOT-2026-10-A"],
  "items.stockMoveType.moveTypeCode": ["110"]
}

Vorhandene Chargen: GET /api/stockHead/batchnumStocks. Details: POST /api/stockHead/batchnumDetails. Verfügbare Chargen: POST /api/stockHead/availableBatchNumbers.

5.4 Variante ​

Jede Variante ist ein eigener Index. variantCode ist die Kennung aus dem Artikelstamm.

json
{
  "bookingSource": "manual",
  "stockHead.docDate": "13.10.2026",
  "stockHead.invDocType.id": 8802,
  "items.number": [10, 20],
  "items.matCode": ["VAR-4000", "VAR-4000"],
  "items.name": ["Shirt", "Shirt"],
  "items.quantity": ["20", "15"],
  "items.total": ["20", "15"],
  "items.warehouse.id": ["7001", "7001"],
  "items.unit.id": ["6001", "6001"],
  "items.stockPlaceCode": ["WE-01", "WE-01"],
  "items.variantCode": ["ROT-M", "BLAU-L"],
  "items.stockMoveType.moveTypeCode": ["110", "110"]
}

5.5 Beleg lesen, ändern, stornieren ​

GET /api/stockHead/220100 liest einen Beleg. Ohne Id ist es die Belegliste. Mehrere Belege der Zoom-Liste: GET /api/stockHead/listForZoom.

POST /api/stockHead/ ändert einen vorhandenen Beleg. Ohne id kommt die Meldung, dass die Ressource nicht gefunden wurde. Der Aufruf legt keinen Beleg an.

json
{
  "id": 220100,
  "description": "Anfangsbestand korrigiert"
}

Response: die Id 220100.

Storno der Positionen: POST /api/stockHead/cancelStockHead

json
{ "stockItems": [230011] }

Response: { "success": true }

Für die Rechnungsprüfung schließen: POST /api/stockHead/closeForVerification mit demselben Körper { "stockItems": [230011] }.

Lieferant der Belegliste: GET /api/stockHead/stockHeadListVendors.

Palette einem Partner zuordnen: POST /api/stockHead/palletCustomer

json
{ "nve": "00340123450000000018", "customerId": 30001 }

30001 ist Kunde KD-1000. Antwort { "success": true }.

Schließtoleranz der zugehörigen Bestellung: POST /api/stockHead/checkIfClosingGapsAreUndercut mit { "stockHeadIds": [220100] }.

6. Umlagerung ​

POST /api/stock/transfer bucht Quelle und Ziel in einem Beleg. sourceCode und targetCode sind Bewegungsarten. Lager und Platz der Quelle werden per id und stockplaceCode gelesen, der Artikel per matCode. Das Datum ist yyyy-MM-dd.

6.1 Platzwechsel ​

json
{
  "sourceCode": "450",
  "targetCode": "451",
  "docDate": "2026-10-13",
  "description": "Von WE-01 nach KOMM-01",
  "stockListItems": [
    {
      "quantity": 10,
      "material": { "matCode": "ART-1000", "name": "Tasche" },
      "unit": { "id": 6001 },
      "sourceWarehouse": { "id": 7001 },
      "sourceStockplace": { "stockplaceCode": "WE-01" },
      "targetWarehouse": { "id": 7001 },
      "targetStockplace": { "stockplaceCode": "KOMM-01" }
    }
  ]
}

Response: { "success": true }

Fehlt Charge oder MHD an einem chargen- oder MHD-pflichtigen Artikel, bleibt die Buchung bestehen und die Antwort enthält warnings mit message.stock.transfer.batch.missing oder message.stock.transfer.expiry.date.missing.

Dieselbe Charge auf demselben Platz und Lager setzt die Buchung auf intern (isInternTransfer).

6.2 Charge umlagern ​

json
{
  "sourceCode": "450",
  "targetCode": "451",
  "docDate": "2026-10-13",
  "description": "Charge auf Kommissionierung",
  "stockListItems": [
    {
      "quantity": 12,
      "material": { "matCode": "LM-2000", "name": "Haferdrink 1 l" },
      "unit": { "id": 6001 },
      "sourceWarehouse": { "id": 7001 },
      "sourceStockplace": { "stockplaceCode": "WE-01" },
      "targetWarehouse": { "id": 7001 },
      "targetStockplace": { "stockplaceCode": "KOMM-01" },
      "sourceBatchnum": "LOT-2026-10-A",
      "targetBatchnum": "LOT-2026-10-A",
      "sourceExpiryDate": "2027-04-30",
      "targetExpiryDate": "2027-04-30"
    }
  ]
}

6.3 Fifo ​

POST /api/stock/transferFifo nimmt genau eine Zeile in stockListItems und verbraucht den Bestand von der ältesten Charge. Mehr als eine Zeile: only.select.one.stock.item. Keine Zeile: select.stock.item. Menge größer als der Bestand: quantity.is.bigger.than.total.stocks. Kein Bestand: total.stock.not.found.

json
{
  "sourceCode": "120",
  "description": "Fifo-Abgang",
  "stockListItems": [
    {
      "quantity": 6,
      "enteredQuantity": 6,
      "docDate": "2026-10-13",
      "material": { "matCode": "LM-2000" },
      "sourceWarehouse": { "id": 7001 },
      "sourceStockplace": { "id": 8001 },
      "enteredUnit": { "id": 6001 }
    }
  ]
}

Response: { "success": true }

7. Wareneingang ​

Die Bestellung bucht keinen Bestand. Offene Positionen kommen aus der Einkauf-Verwaltung. Gebucht wird hier.

7.1 Aus der Bestellung ​

POST /api/incomingGoods/

vendor, invDoctype und material werden per id gelesen. purItemId ordnet die Einkaufsposition zu. Datum yyyy-MM-dd. Die Menge wird als Betrag gebucht.

json
{
  "vendor": { "id": 31001 },
  "purHeadId": 210100,
  "invDoctype": { "id": 8801 },
  "docDate": "2026-10-13",
  "postDate": "2026-10-13",
  "delNoteDocNumber": "LS-L-100",
  "description": "Wareneingang BE-10001",
  "isParked": false,
  "incomingGoods": [
    {
      "material": { "id": 100200 },
      "quantity": 24,
      "unit": 6001,
      "warehouseId": 7001,
      "stockPlaceCode": "WE-01",
      "batchnum": "LOT-2026-10-A",
      "expiryDate": "2027-04-30",
      "purItemId": 41011
    }
  ]
}

31001 ist Lieferant L-1000. 210100 ist Bestellung BE-10001. 41011 ist die Position. 8801 ist die Zugangs-Belegart.

Die Antwort ist der gesendete Körper plus message, docNumbers, stockItemIds und je Zeile stockHeadIds. Fehlt Charge oder MHD, steht der Hinweis in warnings. Die Buchung bleibt.

Ohne stockPlaceCode verwendet POST /api/incomingGoods/bookIncomingGoods den Wareneingangsplatz des Lagers. Fehlt auch der: message.stock.for.warehouse.not.exists.error. Dieser zweite Aufruf setzt die Bewegungsart fest auf 210 und verlangt material.id.

json
{
  "material": { "id": 100200 },
  "quantity": 24,
  "warehouseId": 7001,
  "stockPlaceCode": "WE-01",
  "paletQuantity": 1,
  "batchnum": "LOT-2026-10-A",
  "expiryDate": "2027-04-30"
}

paletQuantity 0 wird zu 1. Die Antwort ist die Liste der gebuchten Positionen mit matCode, Lager, Platz und NVE.

7.2 Storno und Scan ​

Bereits gebuchte Eingänge einer Buchungsnummer: GET /api/incomingGoods/getBookedGoodsByBookNumber/{buchungsnummer}.

Storno: POST /api/incomingGoods/cancelIncomingGoods

json
{ "ids": [24001] }

24001 ist die Id eines IncomingGoodsLog. Ist die Menge nicht mehr am Platz, bleibt der Eintrag und die Antwort enthält errors mit stock.already.transferred. Sonst werden die Lagerpositionen storniert.

Scan einer offenen Fertigungs- oder Bestellnummer: POST /api/incomingGoods/scan mit { "scanCode": "BE-10001" }. Mehrere offene Fertigungsaufträge zur Nummer: incomming.scan.multiple.prodOrder.error.

POST /api/incomingGoods/process bucht den gescannten Fertigungsauftrag (prodOrder true, id, produce) oder die Bestellung.

Toleranz vor der Buchung: POST /api/incomingGoods/deliveryTolerance mit vendorId und bookings.

Belegzuordnung des Eingangs: POST /api/incomingGoodsRelation/getRelations, speichern POST /api/incomingGoodsRelation/, offene Einkaufspositionen GET /api/incomingGoodsRelation/listPurItems.

Nicht importierte Eingänge des Benutzers: GET /api/incomingGoodsLog/listNotDoneImportByUser.

8. Inventur ​

POST /api/stockTakingHead/ legt den Zählbeleg an. Das Lager wird per warehouse.id gelesen, ein Suchschlüssel reicht hier nicht. Die Belegart ist die erste mit isStockTaking. Fehlt sie: no.invDocType.for.stock.taking. Fehlt das Lager: warehouse.not.found.

Die Nummer kommt aus dem Nummernkreis der Belegart. Die Bewegungsarten für Zugang und Abgang setzt die Anlage aus den Inventur-Bewegungsarten.

searchType.id bestimmt die Positionen:

idPositionen
1Je Lagerplatz
2Je Artikel
3Keine. Der Kopf bleibt leer
4Aktueller Bestand
5Inventurzuordnung
6Aktueller Positionsbestand

Optional filtern matCode, matCodeFrom und matCodeTo. Ohne stockPlace.id gilt der Standardplatz des Lagers.

8.1 Zählbeleg anlegen ​

json
{
  "warehouse": { "id": 7001 },
  "stockPlace": { "id": 8001 },
  "searchType": { "id": 4 }
}

Response: { "id": 90001 }

Leerer Kopf für eine eigene Zählliste: "searchType": { "id": 3 }.

Lesen: GET /api/stockTakingHead/90001. Die Liste ohne Id enthält Belegnummer, Datum, Status, Lager und Belegart.

8.2 Position ergänzen ​

POST /api/stockTakingHead/findMaterial rechnet den Sollbestand. Pflicht sind materialId und stockplaceId.

json
{
  "materialId": 100100,
  "stockplaceId": 8001
}

Die Antwort enthält actualTotal, actualAvail, actualReserved und den Artikel. Unbekannter Artikel: material.not.found.

Dieselbe Position an den Beleg schreiben, noch ohne Buchung (postedStatus false). materialId, stockPlaceId, unitId und enteredUnitId werden zu den Verknüpfungen aufgelöst.

json
{
  "id": 90001,
  "postedStatus": false,
  "items": [
    {
      "materialId": 100100,
      "stockPlaceId": 8001,
      "enteredUnitId": 6001,
      "unitId": 6001,
      "enteredQuantity": 48,
      "itemnum": 10
    }
  ]
}

enteredQuantity ist die gezählte Menge. Sie wird mit dem Einheitenfaktor in total umgerechnet. reloadStockValues true liest actualTotal und actualAvail neu. reloadStockDeadline ist dann das Datum yyyy-MM-dd, bis zu dem die Buchungen zählen.

Response: { "id": 90001 }

Eine Position entfernen: GET /api/stockTakingHead/removeItem?stockTakingItemId=91001. Antwort { "success": true }.

Positionen, die im Bestand sind und im Zählbeleg fehlen: GET /api/stockTakingHead/missingItems/90001. Es wird nichts gespeichert. Die Zählmenge dieser Vorschläge ist 0, der Sollbestand ist der Bestand zum Zeitpunkt des Aufrufs.

Differenzliste: GET /api/stockTakingHead/diffList?stockTakingHeadId=90001. Enthalten sind nur Zeilen, deren gezählte Menge vom Sollbestand abweicht.

8.3 Zählung buchen ​

postedStatus true schließt den Beleg und bucht die Differenz. Gezählt mehr als der Sollbestand wird Zugang, gezählt weniger wird Abgang. Eine Differenz 0 erzeugt keine Lagerposition.

json
{
  "id": 90001,
  "postedStatus": true,
  "postDate": "2026-10-13",
  "items": [
    {
      "id": 91001,
      "materialId": 100100,
      "stockPlaceId": 8001,
      "enteredUnitId": 6001,
      "unitId": 6001,
      "enteredQuantity": 48,
      "itemnum": 10
    }
  ]
}

Der Beleg ist danach isClosed. Ein zweites Speichern mit Positionen ersetzt die Positionsliste des Kopfes.

Löschen ist logisch: DELETE /api/stockTakingHead/

json
{ "ids": [90001] }

Response: { "success": true }

8.4 CSV ​

POST /api/stockTakingHead/importCsv liest eine CSV in einen vorhandenen Zählbeleg. stockTakingHead.id ist Pflicht. Unbekannter Beleg: nicht gefunden.

Deutsche Spalten: Artikel-Nr., Lagerplatz, Gezählte Menge, Eingegebene Einheit, Chargen Nr., MHD, Variante, NVE, Sonderbestand, Lizenzschlüssel.

Die Antwort zählt createCounter, updateCounter, skipCounter und failCounter. Fehler stehen in errors.

9. Weitere Beispiele ​

9.1 Anfangsbestand mehrerer Artikel ​

Zwei Indizes, ein Beleg.

json
{
  "bookingSource": "manual",
  "stockHead.docDate": "13.10.2026",
  "stockHead.postDate": "13.10.2026",
  "stockHead.invDocType.id": 8802,
  "stockHead.description": "Anfangsbestand",
  "items.number": [10, 20],
  "items.matCode": ["ART-1000", "LM-2000"],
  "items.name": ["Tasche", "Haferdrink 1 l"],
  "items.quantity": ["50", "24"],
  "items.total": ["50", "24"],
  "items.warehouse.id": ["7001", "7001"],
  "items.unit.id": ["6001", "6001"],
  "items.stockPlaceCode": ["WE-01", "WE-01"],
  "items.batchnum": [null, "LOT-2026-10-A"],
  "items.stockMoveType.moveTypeCode": ["110", "110"]
}

9.2 Vom Auftrag bis zur Umlagerung ​

  1. Artikel und Lagerplatz anlegen.
  2. Anfangsbestand mit Abschnitt Zugang.
  3. Bestand prüfen: GET /api/stock/simpleList?materialId=100100&warehouseId=7001.
  4. Auftrag anlegen, siehe Auftragsverwaltung.
  5. Ware auf den Kommissionierplatz legen, Abschnitt Platzwechsel.

9.3 Von der Bestellung zum Bestand ​

  1. Lieferant und Bestellung, siehe Einkauf.
  2. Offene Positionen POST /api/purHead/purHeadIncomingGoods mit { "ids": [210100] }.
  3. Buchung mit Abschnitt Aus der Bestellung.
  4. Bestand der Charge: GET /api/stock/simpleList?materialId=100200&warehouseId=7001&batchnum=LOT-2026-10-A.

9.4 Inventur eines Platzes ​

  1. Zählbeleg mit searchType 1 oder 4.
  2. Mengen setzen, postedStatus false.
  3. Differenzliste lesen.
  4. Mit postedStatus true buchen.
  5. Bestand erneut lesen.

10. Endpoint-Katalog ​

10.1 Bestand /api/stock ​

MethodePfadBedeutung
GET/api/stock/{id}Bestandsliste ohne Werte
GET/api/stock/simpleListKompakte Zeilen
GET/api/stock/stockHistoryHistorie
GET/api/stock/listStockBestandsbewertung
GET/api/stock/currentStockAmountsBestand mit Vorlauf
GET/api/stock/stockListWithoutValueBestandsliste, CSV oder PDF
POST/api/stock/transferUmlagerung
POST/api/stock/transferFifoFifo-Abbuchung einer Zeile
POST/api/stock/getSumOfStocksSumme total
GET/api/stock/assemblyBaugruppenzeitraum, Antwort { "success": true }
GET/api/stock/reservationsReservierungen
POST/api/stock/regenerateStockReservationListReservierungsliste neu
POST/api/stock/syncStockListFromReservationsBestand aus Reservierungen
GET/api/stock/licenseKeyStocksBySkuLizenzschlüssel je SKU
GET/api/stock/executeStockReservationListSyncJobStartet den Reservierungsabgleich

10.2 Lagerbeleg /api/stockHead ​

MethodePfadBedeutung
GET/api/stockHead/{id}Ein Beleg oder die Liste
POST/api/stockHead/Vorhandenen Beleg ändern
POST/api/stockHead/bookZugang oder Abgang buchen
GET/api/stockHead/stockHeadManualBookingLager und Bewegungsarten der Maske
GET/api/stockHead/stockHeadListVendorsLieferanten
GET/api/stockHead/listForZoomZoom-Liste
GET/api/stockHead/stockListLagerplätze
GET/api/stockHead/availableSerialNumbersSeriennummern
POST/api/stockHead/batchnumDetailsChargendetails
GET/api/stockHead/batchnumStocksChargenbestände
GET/api/stockHead/licenseKeyStocksLizenzbestände
POST/api/stockHead/availableBatchNumbersVerfügbare Chargen
POST/api/stockHead/asAttributeCodeAttributcode aus params
POST/api/stockHead/cancelStockHeadPositionen stornieren, Body stockItems
POST/api/stockHead/closeForVerificationFür die Prüfung schließen, Body stockItems
POST/api/stockHead/checkStockAvailMaterialDruckprüfung, Body stockItems als Liste von Positions-Ids
POST/api/stockHead/checkStockAvailMaterialForStockListDruckprüfung, Body stockLists als Liste von Bestands-Ids
POST/api/stockHead/splitBuchung teilen
POST/api/stockHead/palletCustomerNVE einem Partner zuordnen
GET/api/stockHead/buildAllStatisticsStatistik neu rechnen
POST/api/stockHead/checkIfClosingGapsAreUndercutSchließtoleranz, Body stockHeadIds

10.3 Bestandsliste, Platz, Metadaten ​

MethodePfadBedeutung
GET/api/stockList/{id}Eine Bestandszeile oder die Liste
GET/api/domains/stockListBestandszeilen über Generic Domain lesen
GET/api/stockList/variantsVarianten
GET/api/stockList/dataVault/stockArchiv
GET/api/stockPlace/{id}Ein Lagerplatz
POST/api/stockListMetaData/Metadaten der Zeile, prodDate als yyyy-MM-dd'T'HH:mm:ss. Antwort { "id" }
GET/api/materialStock/{id}Artikel-Lagerzeile, siehe Artikelstamm
POST/api/materialStock/Artikel-Lagerzeile speichern
DELETE/api/materialStock/{id}Artikel-Lagerzeile löschen
GET/api/materialStock/getPickplaceListPickplätze
POST/api/materialStock/pickplacePickplatz setzen
GET/api/materialStock/getMaterialIncomeDetailEingangsdetail

10.4 Wareneingang ​

MethodePfadBedeutung
GET/api/incomingGoods/{id}Maskendaten zum Artikel
POST/api/incomingGoods/Wareneingang buchen
POST/api/incomingGoods/bookIncomingGoodsBuchung mit Bewegungsart 210
POST/api/incomingGoods/bookVouchersZugang über Belegnummer und SKU, Bewegungsart 110
DELETE/api/incomingGoods/cancelVouchersGegenbuchung, Bewegungsart 120
POST/api/incomingGoods/cancelIncomingGoodsEingang stornieren, Body ids
GET/api/incomingGoods/getBookedGoodsByBookNumber/{id}Gebuchte Zeilen einer Nummer
POST/api/incomingGoods/scanOffenen Auftrag zur Nummer suchen
POST/api/incomingGoods/processGescannten Auftrag buchen
POST/api/incomingGoods/deliveryToleranceLiefertoleranz
GET/api/incomingGoods/startImportGoodsNächste Eingangsnummer, Lager und Platz des Benutzers
POST/api/incomingGoods/fetchInrayCsvEingangsdatei lesen
POST/api/incomingGoods/setInrayCsvImportedDatei als importiert markieren
GET/api/incomingGoodsLog/{id}Ein Eingangsprotokoll
GET/api/incomingGoodsLog/listNotDoneImportByUserOffene Importe des Benutzers
POST/api/incomingGoodsRelation/getRelationsZuordnungen
POST/api/incomingGoodsRelation/Zuordnung speichern
GET/api/incomingGoodsRelation/listPurItemsOffene Einkaufspositionen

bookVouchers erwartet incomingGoods[] mit warehouseId, stockplaceId, unitCode oder unit, purHeadDocNumber, materialSku oder variantSku und einer nicht leeren Liste expiryDates.licenseKeys. Fehlt die Zugangs-Belegart: no.invDocType.found. Fehlt Bewegungsart 110: stockMoveType.not.found.

10.5 Inventur ​

MethodePfadBedeutung
GET/api/stockTakingHead/{id}Ein Zählbeleg oder die Liste
POST/api/stockTakingHead/Anlegen oder Zählung speichern
DELETE/api/stockTakingHead/Logisch löschen, Body ids
POST/api/stockTakingHead/findMaterialSollbestand einer Position
GET/api/stockTakingHead/diffListDifferenzen, Query stockTakingHeadId
GET/api/stockTakingHead/missingItems/{id}Fehlende Bestandszeilen, nichts wird gespeichert
GET/api/stockTakingHead/removeItemPosition löschen, Query stockTakingItemId
POST/api/stockTakingHead/importCsvCSV in einen Zählbeleg
POST/api/mobileStockTaking/Mobile Zählung, Antwort { "success": true }
GET/api/mobileStockTaking/Daten zu matCode und warehouseId
GET/api/mobileStockTaking/validateBelegnummer prüfen
GET/api/mobileStockTaking/stockListForStockTakingBestand für die mobile Zählung
POST/api/mobileStockTaking/saveForInventurV2Zählung Inventur V2
POST/api/mobileStockTaking/saveEmptyStockplaceLeeren Platz zählen

11. Häufige Fehler ​

SituationUrsache
warehouse.not.foundInventur ohne warehouse.id
no.invDocType.for.stock.takingKeine Belegart mit isStockTaking
no.invDocType.foundKeine manuelle Zugangs- oder Abgangs-Belegart
stockMoveType.not.foundCode 110 oder 120 fehlt oder ist deaktiviert
material.not.foundArtikel-Id der Inventur oder des Wareneingangs unbekannt
message.stock.for.warehouse.not.exists.errorWeder Platzcode noch Wareneingangsplatz am Lager
message.no.stock.item.quantity.entered.errorMenge der manuellen Buchung fehlt oder ist keine Zahl
message.no.stock.item.unit.selected.errorEinheit der manuellen Buchung fehlt
message.negative.stock.item.quantity.entered.errorNegative Menge an einer Bestellposition
message.stockItem.misses.batchnum.errorCharge pflichtig und leer. Mit areMissingBatchnumsIgnored trotzdem buchen
no.open.positions.for.orderBestellung hat keine offene Position zum Artikel
quantity.not.setWareneingang ohne Menge
select.stock.itemFifo ohne Zeile
only.select.one.stock.itemFifo mit mehr als einer Zeile
quantity.is.bigger.than.total.stocksFifo-Menge über dem Bestand
stock.already.transferredStorno, die Menge liegt nicht mehr auf dem Platz
Beleg ändern schlägt fehlPOST /api/stockHead/ ohne vorhandene id
Umlagerung findet den Artikel nichtmaterial.matCode weicht ab
Inventur bucht nichtpostedStatus ist false. Die Differenz entsteht erst beim Abschluss

Nur für reybex-Partner. Nicht für Endkunden bestimmt.