Skip to content

Einkaufverwaltung – Vollständige API-Referenz ​

Fach-API für Einkaufsbelege: Anfrage, Mengenkontrakt, Bestellung, Abruf und die Kette bis zum Wareneingang. Basis ist https://core-backend.reybex.com/api (Staging: https://io-staging-partner.reybex.com/api). Authentifizierung wie im API: --header "authorization: Basic $TOKEN".

Verkaufsbelege stehen unter Auftragsverwaltung. Lieferanten unter Kunden- und Lieferantenverwaltung. Artikel unter Artikelstamm-Verwaltung, Stammdaten unter Prüftabellen-Verwaltung.

Alle 41 Endpunkte hängen an /api/purHead. Der normale Schreibweg ist POST /api/purHead/.

1. Grundlagen ​

Ein Einkaufsbeleg ist ein PurHead mit Positionen PurItem. Der Lieferant ist ein Kunde mit Kontaktart Lieferant (vendor). Die Belegart docType entscheidet, ob der Datensatz Anfrage, Mengenkontrakt, Bestellung, Abruf oder Fracht-Bestellung ist. Welche Art auf welche folgen darf, steht in PurHeadDocRule.

Die Pfeile sind die übliche fachliche Kette. Ob ein Folgebeleg erlaubt ist, entscheidet die Regel des Mandanten, gelesen über GET /api/purHead/docTypes/{id}.

1.1 Zwei Speicherformen ​

AufrufBodyWann
POST /api/purHead/Objekt unter dem Schlüssel purHeadNormale Anlage und Änderung
POST /api/purHead/lightDer Belegkopf selbst, ohne Umschlag purHeadKompakte Änderung, Antwort ist die Light-Sicht
POST /api/purHead/prepareAndCreateFlache Importfelder (vendorNumber, docType als Name, items[].material als Zeichenkette)Import mit Code-Auflösung
POST /api/purHead/createPurchaseFlache Felder plus Ids für Lager, Lagerplatz und Einheit; Positionen über Varianten-skuBestellung vom Typ 2, nur wenn jede Position eine Variante hat

POST /api/purHead/ antwortet mit:

json
{ "id": 210100, "docNumber": "BE-10001" }

Die Zahlen in den Beispielen sind Beispiel-Ids eines Mandanten. Sie stammen aus einem vorherigen Lesen. In Responses liefert die API die gespeicherte id.

1.2 Suchschlüssel ​

Am Belegkopf von POST /api/purHead/ eine bekannte id oder einen Suchschlüssel senden.

ZielSuchschlüssel
Lieferant vendorcustomerNo
Artikel am Kopf, falls als ToOnematCode, sonst sku
Lagercode, sonst name
LagerplatzstockplaceCode oder name, immer mit warehouse
Währung, Einheit, Steuer, Zahlungsbedingung, Belegartcode, sonst type, sonst name

In items[] bleibt die Artikel-id. Ein Suchschlüssel in dieser Liste legt keine bestehende Position an. Dieselbe Regel gilt für Verkaufspositionen.

GET /api/purHead/ mit vendorId und docTypeId sowie POST /api/purHead/createFromProposal lesen den Lieferanten und die Belegart per id. Das sind Vorbelegungsaufrufe, kein Speichern.

1.3 Antwort- und Fehlerformat ​

Lesen eines Belegs kapselt den Datensatz:

json
{
  "data": { "id": 210100, "docNumber": "BE-10001" },
  "meta": {
    "domain": "PurHead",
    "total": 1
  }
}

meta kann requiredFields, readOnlyFields, hiddenFields, invisibleFields und purItemMetaData enthalten.

SituationHTTPKörper
Beleg nicht gefundenStatus aus der Ausnahme, oft 404{ "error": "…" }
POST /api/purHead/createPurchase – doppelte docNumber412{ "error": "…" }
POST /api/purHead/createPurchase – Constraint oder zu große Daten400{ "error": "…" }
Fachlicher Abbruch500 oder der Status der Ausnahme{ "error": "…" } oder { "data": { "error": "…" } }
Fehlende Anmeldung401—

2. Belegarten ​

PurDocType.type:

typeBedeutung
0Anfrage
1Mengenkontrakt
2Bestellung
3Abruf
8Fracht-Bestellung (Kürzel Strecke)

Bei einer Strecken-Disposition aus offenen Vorschlägen sucht die Anlage zuerst einen Belegtyp mit type 4 und verwendet sonst Typ 2. Für Typ 4 gibt es keinen eigenen Übersetzungseintrag.

Weitere Schalter der Belegart:

FeldWirkung
numberRangeNummernkreis der docNumber
useInMrpBelegart wird in der Disposition berücksichtigt
isTransferUmlagerungs-Einkauf; nur diese Belege erscheinen in der Transferliste
lowerDeliveryToleranceProzent, ab dem eine geringere Wareneingangsmenge die Position schließt
upperDeliveryToleranceProzent, bis zu dem eine höhere Wareneingangsmenge erlaubt ist
isPurOrderClosedAfterFirstInboundBestellung gilt nach dem ersten Wareneingang als geschlossen
automaticOrderSendMailNach dem Speichern wird der Beleg per E-Mail versendet
checkOpenOrderToAddMaterialsOffene Bestellung wird beim Hinzufügen von Artikeln geprüft
invDocTypeInventurbelegart für den Wareneingang
scanProductScan-Vorgabe an der Wareneingangsposition

Belegarten lesen: GET /api/domains/purDocType?take=100.

3. Belegkette ​

PurHeadDocRule verbindet fromDocType mit toDocType. Es gibt keine Preis- oder Stücklisten-Schalter an dieser Regel. Die erlaubten Ziele eines Belegs:

GET /api/purHead/docTypes/{id}

{id} ist die Id der Quell-Belegart. Die Antwort ist eine Liste { "id", "translatedName" } der Zielarten.

3.1 Vorlage mit Vorgänger ​

GET /api/purHead/?vendorId={lieferantId}&docTypeId={zielArtId}&refPurHeadId={quellBelegId}

legt nichts an. Die Antwort ist ein vorbelegter Kopf: Positionen und Adressen kommen vom Vorgänger, die Belegart ist das Ziel. Speichern erfolgt danach mit POST /api/purHead/.

Dieselbe Vorlage mit Dispositionsvorschlägen: POST /api/purHead/createFromProposal.

json
{
  "vendorId": 31001,
  "docTypeId": 32002,
  "proposals": [
    { "id": 33001, "quantity": 24, "unitId": 6001 }
  ]
}

33001 ist die Id eines offenen Dispositionsvorschlags. 32002 ist die Id der Ziel-Belegart Bestellung. Der Aufruf speichert nicht.

3.2 Abhängigkeiten vor dem Speichern ​

AbhängigkeitLesen
LieferantGET /api/domains/customer?customerNo=eq(L-1000)&take=1
BelegartGET /api/domains/purDocType?take=100
Währung, Zahlungsbedingung, Einheit, SteuerPrüftabellen
Artikel, Variante, ChargeArtikelstamm
Lager und LagerplatzGET /api/domains/warehouse, GET /api/domains/stockPlace
FolgebelegartGET /api/purHead/docTypes/{quellArtId}
EinkaufstextbausteineGET /api/purHead/getDefaultPurTexts/{belegartId}
Nachschlagelisten für die MaskeGET /api/purHead/lookupData

lookupData liefert Einkaufs-Steuerschlüssel, Frachten, Lager sowie Positions-, Kopf- und Fracht-Rabattarten.

Fehlt die Belegart bei der Vorlage, bricht der Aufruf mit purDocType nicht gefunden ab. Fehlt der Lieferant, mit vendor.not.found.error. Fehlt der Vorgänger, mit refPurHead.not.found.error.

4. Wichtige Felder ​

4.1 Kopf PurHead ​

FeldBedeutung
docTypeBelegart
docNumberBelegnummer; ohne Wert aus dem Nummernkreis
vendorLieferant
docDateBelegdatum, Standard heute
deliveryDateLieferdatum
endDateEndedatum, bei Kontrakten das Laufzeitende
requisitionDateAnforderungsdatum
cargoReadyDate, estimatedDepartureDate, estimatedArrivalDateBereitstellung, Abfahrt, Ankunft
currency, exchangeRateWährung und Kurs; Kurs wird bei der Vorlage aus Hauswährung und Lieferantenwährung berechnet
paymcondZahlungsbedingung, aus dem Lieferanten vorbelegt
description, notes, terms, commentLineTexte
intOrderNumInterne Bestellnummer
containerNumberContainer; wird aus der Auftragsposition übernommen, wenn der Vorschlag eine hat
deliveryStatus0 offen, 1 teilweise, 2 komplett, 3 überliefert (offene Menge negativ). Die Ankunftsliste zeigt dafür die Texte Offen, Teilweise offen, Geschlossen und Zusammengefasst
invoiceStatusRechnungsstatus des Kopfes
isSend, isEmailSend, isEdiSend, isPrintVersandkennzeichen
isCompletedManuallyManuell abgeschlossen
isDeleteLogisch gelöscht
refPurHeadVorgängerbeleg
nettAmount, vatAmount, grossAmount, totalAmount, totalDiscountAmountBeträge
delivery* / invoice* / main*Adress-Snapshots, beim Anlegen aus dem Lieferanten kopiert
itemsPositionen

4.2 Position PurItem ​

FeldBedeutung
materialArtikel, in der Liste per id
positionPositionsnummer, üblich in Zehnerschritten
quantityBestellmenge
price, priceUnitEinkaufspreis und Preiseinheit
unitMengeneinheit
warehouse, stockplaceLager und Lagerplatz
variantCodeVariantenkennung
attributeCodeAttributcode
batchnumCharge
expiryDateMindesthaltbarkeit
vendorMatCode, vendorMatNameArtikelnummer und Name des Lieferanten
deliveryDate, confirmedDeliveryDateWunsch- und bestätigtes Datum
deliveryStatus0 offen, 1 teilweise, 2 geliefert, 3 überliefert
deliveredQuantityBereits eingegangene Menge
incomingGoodQuantityOffene Menge analog zur Verkaufs-openQuantity
isCompletedManuallyPosition manuell geschlossen
isThirdPartyStreckengeschäft
salItemRequirementsVerkaufsposition, die den Bedarf ausgelöst hat
proposalDispositionsvorschlag
containerNumberContainer der Position
refItemVorgängerposition beim Kopieren

5. Lesen und suchen ​

5.1 Ein Beleg (GET /api/purHead/{id}) ​

bash
curl --header "authorization: Basic $TOKEN" \
  "https://core-backend.reybex.com/api/purHead/210100"

Unbekannte Id: Ressource nicht gefunden.

5.2 Liste (GET /api/purHead/) ​

Ohne id und ohne vendorId ist die Antwort die Einkaufsliste (purchaseList) inklusive der Verkaufsbelegnummern, die an den Positionen hängen.

Mehrere Köpfe in einem Aufruf: POST /api/purHead/list mit { "ids": [210100, 210101] }.

5.3 Suche (GET /api/purHead/findPurchase) ​

QueryErgebnis
docNumber=BE-10001{ "id": 210100 }
vendorId=31001Offene Belege dieses Lieferanten (deliveryStatus unter 2) mit Gewicht und Positionszahl

5.4 Light-Sicht (GET /api/purHead/light/{id}) ​

Kompakte Positionssicht. Speichern dieser Sicht: POST /api/purHead/light mit dem Beleg als Body, nicht unter purHead. Die Antwort ist wieder die Light-Sicht. Hat die Belegart automaticOrderSendMail, geht nach dem Speichern die Bestellmail heraus.

6. Bestellung anlegen ​

Zuerst Lieferant, Belegart Bestellung (type 2), Artikel, Einheit, Lager und Steuer lesen. Dann speichern.

6.1 Einzelartikel ​

POST /api/purHead/

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Bestellung" },
    "currency": { "code": "EUR" },
    "paymcond": { "code": "30" },
    "docDate": "2026-10-12",
    "deliveryDate": "2026-10-20",
    "description": "Nachbestellung Tasche",
    "items": [
      {
        "position": 10,
        "quantity": 50,
        "price": 4.2,
        "priceUnit": 1,
        "material": { "id": 100100 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "19" },
        "deliveryDate": "2026-10-20"
      }
    ]
  }
}

100100 ist die Id des Artikels ART-1000 aus GET /api/domains/material?matCode=eq(ART-1000)&take=1.

Response

json
{ "id": 210100, "docNumber": "BE-10001" }

6.2 Anfrage ​

docType.name ist der Name der Anfrage-Belegart (type 0). Der Preis darf 0 sein.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Anfrage" },
    "currency": { "code": "EUR" },
    "docDate": "2026-10-12",
    "deliveryDate": "2026-11-02",
    "description": "Preisanfrage Haferdrink",
    "items": [
      {
        "position": 10,
        "quantity": 240,
        "price": 0,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

Response: { "id": 210010, "docNumber": "AF-10001" }

Daraus wird eine Bestellung in zwei Schritten. Zuerst die Vorlage, nichts wird gespeichert. 32002 ist die Bestell-Belegart, 31001 der Lieferant:

GET /api/purHead/?vendorId=31001&docTypeId=32002&refPurHeadId=210010

Dann den Kopf aus der Antwort unter purHead speichern. Mindestinhalt, wenn die Vorlage schon die Positionen enthält:

json
{
  "purHead": {
    "vendor": { "id": 31001 },
    "docType": { "id": 32002 },
    "refPurHead": { "id": 210010 },
    "currency": { "code": "EUR" },
    "items": [
      {
        "position": 10,
        "quantity": 240,
        "price": 0.89,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

6.3 Mengenkontrakt und Abruf ​

Kontrakt, type 1. endDate ist das Laufzeitende.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Mengenkontrakt" },
    "currency": { "code": "EUR" },
    "docDate": "2026-10-12",
    "endDate": "2027-10-11",
    "description": "Jahreskontrakt Haferdrink",
    "items": [
      {
        "position": 10,
        "quantity": 2000,
        "price": 0.82,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

Response: { "id": 210020, "docNumber": "MK-10001" }

Erlaubte Ziele: GET /api/purHead/docTypes/{kontraktArtId}. Der Abruf (type 3) übernimmt einen Teil der Kontraktmenge. 32003 ist die Abruf-Belegart.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "id": 32003 },
    "refPurHead": { "id": 210020 },
    "currency": { "code": "EUR" },
    "deliveryDate": "2026-10-27",
    "items": [
      {
        "position": 10,
        "quantity": 120,
        "price": 0.82,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "refItem": { "id": 41021 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

41021 ist die Kontraktposition. Ein Suchschlüssel an refItem legt die Vorgängerposition nicht an.

6.4 Variantenartikel ​

Der Kopf bleibt eine normale Bestellung. Jede Variante ist eine eigene Position mit variantCode. Die Varianten-Id stammt aus Varianten.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Bestellung" },
    "currency": { "code": "EUR" },
    "items": [
      {
        "position": 10,
        "quantity": 20,
        "price": 8.5,
        "priceUnit": 1,
        "material": { "id": 100400 },
        "variantCode": "ROT-M",
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "19" }
      },
      {
        "position": 20,
        "quantity": 15,
        "price": 8.5,
        "priceUnit": 1,
        "material": { "id": 100400 },
        "variantCode": "BLAU-L",
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "19" }
      }
    ]
  }
}

100400 ist der Kopfartikel VAR-4000. Attributwerte an der Position liest GET /api/purHead/attribute?purItemId={id} oder ?materialId={id}.

6.5 Set-Artikel ​

Der Einkauf führt keine Set-Positionsliste wie der Verkauf. Der Set-Artikel wird als eine Position mit der Artikel-id des Sets bestellt. Die Stückliste bleibt am Artikel, siehe Stückliste. Komponenten, die selbst beschafft werden, sind eigene Bestellpositionen. 100300 ist SET-3000.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Bestellung" },
    "currency": { "code": "EUR" },
    "deliveryDate": "2026-10-20",
    "items": [
      {
        "position": 10,
        "quantity": 25,
        "price": 3.4,
        "priceUnit": 1,
        "material": { "id": 100300 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

6.6 Charge und Mindesthaltbarkeit ​

Am Artikel müssen isLotEnabled und bei MHD isShelfLife gesetzt sein. Charge und Datum stehen an der Einkaufsposition. Den Bestand bucht der Wareneingang, nicht das Speichern der Bestellung.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Bestellung" },
    "currency": { "code": "EUR" },
    "items": [
      {
        "position": 10,
        "quantity": 24,
        "price": 0.89,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "batchnum": "LOT-2026-10-A",
        "expiryDate": "2027-04-30",
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

100200 ist LM-2000.

6.7 Preis und Menge vor dem Speichern ​

POST /api/purHead/findMaterial berechnet Preis, Steuer und Einheiten einer Position. Pflicht ist materialId. Weitere Felder: customerId (Lieferant), quantity, docTypeId, currencyId, docDate im Format yyyy-M-dd, variantCode, profitCenterId, refItemId, proposalId.

json
{
  "materialId": 100100,
  "customerId": 31001,
  "quantity": 50,
  "docTypeId": 32002,
  "currencyId": 1,
  "docDate": "2026-10-12",
  "variantCode": null
}

Fehlt der Artikel: material.not.found. Fehlt jede Einheit am Artikel: material.units.not.found.

Palettenvolumen: POST /api/purHead/calculatePallet mit materialId und unitId, optional quantity. Antwort: volume, palletTotal.

6.8 Ändern und löschen ​

Änderung: derselbe POST /api/purHead/ mit purHead.id.

json
{
  "purHead": {
    "id": 210100,
    "deliveryDate": "2026-10-24"
  }
}

Löschen: DELETE /api/purHead/ mit { "ids": [210100] }. Antwort: { "ids": [210100] }. Das Löschen ist logisch (isDelete).

7. Aus der Disposition ​

7.1 Vorschlag prüfen ​

POST /api/purHead/checkProposal

json
{ "proposalIdList": [33001, 33002] }

Antwort: { "isProposalOrdered": true }, wenn mindestens ein Vorschlag schon bestellt ist. Alternativ akzeptiert der Aufruf proposalIds.

7.2 Bestellungen aus Vorschlägen ​

POST /api/purHead/createOrdersFromMrp

json
{
  "proposals": [
    { "id": 33001, "quantity": 24 },
    { "id": 33002, "quantity": 10 }
  ]
}

Offene Vorschläge werden nach Lieferant, Strecke und Lieferadresse gruppiert. Pro Gruppe entsteht eine Bestellung. Strecke sucht Belegtyp 4, sonst Typ 2. Es gibt keine offenen Vorschläge: createOrdersFromMrp.no.valid.openProposals.error.

Antwort enthält purHeadIds.

Dieselbe Gruppierung als ungespeicherte Vorlage liefert POST /api/purHead/createFromProposal (Abschnitt Vorlage).

7.3 Streckengeschäft ​

POST /api/purHead/createDropshippingOrders

json
{ "purHeadId": 210100 }

Der Beleg muss Positionen haben, die einem Streckenlieferanten zugeordnet sind. Bleiben Positionen übrig, bricht der Aufruf ab (dropshipping.order.not.all.items.ordered). Erfolg: { "id": 210100 }, isSend wird gesetzt.

Meldungen zur Bestellung: GET /api/purHead/findCommMessagesForPurHead.

8. Wareneingang ​

Die Bestellung bucht keinen Bestand. Der Wareneingang liest die offenen Positionen und bucht danach über die Lager-API.

8.1 Offene Belege ​

GET /api/purHead/listDocumentsForArrival

Liefert ungelöschte Belege mit mindestens einer offenen, lagergeführten Position (deliveryStatus unter 2, keine Strecke). Enthalten sind Belegnummer, Lieferant, Lager, Positionszahl, Menge und die Verkaufsbelegnummern des Bedarfs.

GET /api/purHead/listForArrival ist die Ankunftsliste.

8.2 Offene Positionen ​

POST /api/purHead/getOpenPurItems

Mindestens eines von docNumbers, vendor.id, containerNumbers.

json
{
  "docNumbers": ["BE-10001"],
  "vendor": { "id": 31001 },
  "warehouse": { "id": 7001 }
}

Die Antwort enthält je Position matCode, openQuantity, batchnum, purItemId, Lager und Einheit.

8.3 Buchungsvorschlag ​

POST /api/purHead/purHeadIncomingGoods

json
{ "ids": [210100] }

ids sind Einkaufsbeleg-Ids. Die Antwort:

FeldInhalt
incomingGoods[]Artikel, offene Menge, Charge, MHD, Variante, Lager, purHead, purItem
incomingGoods[].moveTypeCodeBewegungsart 110, sofern sie aktiv ist
containerNumberContainer der Positionen, kommagetrennt
invDoctypeManuelle Zugangs-Belegart

Response für Bestellung 210100, Position 41011, Artikel LM-2000:

json
{
  "incomingGoods": [
    {
      "id": 100200,
      "matCode": "LM-2000",
      "name": "Haferdrink 1 l",
      "isLotEnabled": true,
      "isShelfLife": true,
      "quantity": 24,
      "batchnum": "LOT-2026-10-A",
      "expiryDate": "2027-04-30",
      "moveTypeCode": "110 Wareneingang",
      "stockMoveType": { "id": 11001, "translatedName": "110 Wareneingang", "moveTypeCode": "110" },
      "warehouseId": 7001,
      "warehouse": { "id": 7001, "translatedName": "Hauptlager" },
      "purHead": { "id": 210100, "docNumber": "BE-10001" },
      "purItem": { "id": 41011 }
    }
  ],
  "containerNumber": "",
  "invDoctype": { "id": 8801, "translatedName": "Wareneingang" }
}

Gebucht wird der Wareneingang mit diesen Zeilen über Lager und Inventur, nicht dieser Endpunkt selbst. Chargenartikel: batchnum und expiryDate aus der Position in die Buchung übernehmen. Siehe Bestand in der Artikelstamm-Verwaltung.

GET /api/purHead/getArrivals/{id} liest die bereits gebuchten Zugänge eines Belegs.

8.4 Positionen manuell schließen ​

POST /api/purHead/closeItems

json
{ "purItemIds": [41011, 41012] }

Jede Position mit deliveryStatus unter 2 wird auf geliefert gesetzt (deliveredQuantity = quantity, isCompletedManually). Sind danach alle Positionen des Kopfes geliefert oder gelöscht, wird der Kopf manuell abgeschlossen. Antwort: { "success": true }.

Unter- und Überlieferung ohne manuelles Schließen steuern lowerDeliveryTolerance und upperDeliveryTolerance an der Belegart. closingGap am Kopf schließt den Beleg, wenn der gelieferte Anteil den Prozentwert erreicht.

8.5 Eingangsrechnung ​

GET /api/purHead/getVouchers/{id} liest die dem Beleg zugeordneten Eingangsbelege.

POST /api/purHead/verificationItemList mit { "ids": [41011] } liest Rechnungsprüfungspositionen zu diesen Einkaufspositionen: Belegnummer, Status, Menge, Preis, Netto, Brutto.

9. Shortcut-Anlage ​

9.1 POST /api/purHead/prepareAndCreate ​

Flacher Import. Der Endpoint speichert am Ende über denselben Weg wie POST /api/purHead/.

FeldAuflösung
vendorNumberLieferantennummer
docTypeName der Belegart
currencyWährungscode, sonst Hauswährung
paymentConditionCode der Zahlungsbedingung
profitCenterCode
departmentName oder E-Mail der Einkaufsabteilung
languageSprachcode
shipping, freightName
vatRateSteuersatz, Einkaufssteuer
items[].materialZeichenkette, Artikel oder Variante
items[].warehouseLagercode
items[].unitEinheitencode, sonst ST
items[].quantity, price, vatRateMenge, Preis, Steuer der Position

vendorNumber immer setzen. Wird kein Lieferant gefunden, verwendet der Endpoint einen vorhandenen Lieferanten des Mandanten.

Ohne totalAmount werden die Kopfbeträge berechnet (calculateHeadAmounts).

json
{
  "vendorNumber": "L-1000",
  "docType": "Bestellung",
  "currency": "EUR",
  "language": "de",
  "paymentCondition": "30",
  "profitCenter": "B2B",
  "shipping": "Spedition",
  "vatRate": 19,
  "items": [
    {
      "material": "ART-1000",
      "quantity": 50,
      "price": 4.2,
      "unit": "ST",
      "warehouse": "HAUPT",
      "vatRate": 19
    }
  ]
}

Response: { "id": 210100, "docNumber": "BE-10001" }

9.2 POST /api/purHead/createPurchase ​

Legt eine Bestellung vom Typ 2 an. Die Belegnummer darf noch nicht existieren.

FeldPflichtBedeutung
currencyjaWährungscode, aktiv
vendorNojaLieferantennummer
warehouseIdjaLager-Id
stockplaceIdjaLagerplatz-Id
unitIdjaEinheits-Id, gilt für alle Positionen
docNumberjaBelegnummer, eindeutig
docDate, deliveryDatejaDatum
intOrderNumneinInterne Nummer
profitCenterneinCode der Profitcenter
purDepartmentIdneinId der Einkaufsabteilung
items[].skujaSKU einer Variante
items[].quantity, pricejaMenge und Preis

Ein Artikel ohne Variante zu dieser SKU bricht mit material variant not found ab. Steuer und Variantenkennung werden gesetzt. Für Einzelartikel ohne Variante POST /api/purHead/ verwenden.

7001 ist Lager HAUPT, 8001 Lagerplatz WE-01, 6001 Einheit Stück.

json
{
  "currency": "EUR",
  "vendorNo": "L-1000",
  "warehouseId": 7001,
  "stockplaceId": 8001,
  "unitId": 6001,
  "docNumber": "BE-10002",
  "docDate": "2026-10-12",
  "deliveryDate": "2026-10-20",
  "intOrderNum": "INT-44",
  "profitCenter": "B2B",
  "items": [
    { "sku": "VAR-4000-ROT-M", "quantity": 20, "price": 8.5 },
    { "sku": "VAR-4000-BLAU-L", "quantity": 15, "price": 8.5 }
  ]
}

Die Antwort ist der gespeicherte Beleg. Existiert BE-10002 schon, ist der Status 412.

10. E-Mail, Texte, Anhänge ​

AufrufWirkung
GET /api/purHead/getPurHeadEmailModel/{id}Betreff, Körper, Empfänger, Anhänge, Kontakte
POST /api/purHead/sendPurHeadAsMail{ "ids": [210100] }. Antwort success und failedList
GET /api/purHead/getPurHeadEmailsGesendete Mails
GET /api/purHead/emailHistoryMail-Historie, optional since
GET /api/purHead/getTexts/{id}Texte des Belegs
GET /api/purHead/getDefaultPurTexts/{belegartId}Textbausteine der Belegart
GET /api/purHead/getAttachments/{id}Anhänge

Hat die Belegart automaticOrderSendMail, versendet schon das Speichern die Mail.

11. Transfer, Umsatz, Lieferantenportal ​

MethodePfadBedeutung
GET/api/purHead/salesTransfers/purchaseEinkaufspositionen zu einer Umlagerungs-Verkaufsposition. Query id ist die SalesItem-Id, isDelivered filtert gelieferte Zeilen. Beide Belegarten müssen isTransfer sein
POST/api/purHead/salesTransfers/purchaseDieselbe Liste mit Body id und isDelivered
GET/api/purHead/purItemTurnoversPositionsumsätze
GET/api/purHead/orderSalesItemsVerkaufspositionen, die sich bestellen lassen
GET/api/purHead/quickPurHeadsBelege des angemeldeten Lieferantenportals
GET/api/purHead/purHeadStatusStatusliste des Portals, Query statusType
POST/api/purHead/quickPurHeadsPortal ändert eine Position: purItem.id, quantity, price, deliveryDate, notes, optional isCancel, attributeCodes, shippingCost

Die drei quick-Endpunkte gelten für das Lieferantenportal, nicht für die normale Mandanten-Integration.

12. Weitere Beispiele ​

12.1 Drei Positionen in einer Bestellung ​

Einzelartikel, Variante und Charge in einem Beleg. Die Artikel-Ids stammen aus dem vorherigen Lesen.

json
{
  "purHead": {
    "vendor": { "customerNo": "L-1000" },
    "docType": { "name": "Bestellung" },
    "currency": { "code": "EUR" },
    "paymcond": { "code": "30" },
    "docDate": "2026-10-12",
    "deliveryDate": "2026-10-20",
    "description": "Sammelbestellung KW 42",
    "items": [
      {
        "position": 10,
        "quantity": 50,
        "price": 4.2,
        "priceUnit": 1,
        "material": { "id": 100100 },
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "19" }
      },
      {
        "position": 20,
        "quantity": 20,
        "price": 8.5,
        "priceUnit": 1,
        "material": { "id": 100400 },
        "variantCode": "ROT-M",
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "19" }
      },
      {
        "position": 30,
        "quantity": 24,
        "price": 0.89,
        "priceUnit": 1,
        "material": { "id": 100200 },
        "batchnum": "LOT-2026-10-A",
        "expiryDate": "2027-04-30",
        "unit": { "code": "ST" },
        "warehouse": { "code": "HAUPT" },
        "vatKey": { "code": "7" }
      }
    ]
  }
}

12.2 Preis der Position ändern ​

210100 ist die Bestellung, 41011 die Position.

json
{
  "purHead": {
    "id": 210100,
    "items": [
      {
        "id": 41011,
        "price": 0.95,
        "isPriceSetManually": true
      }
    ]
  }
}

Preis vor dem Anlegen: POST /api/purHead/findMaterial

json
{
  "materialId": 100200,
  "customerId": 31001,
  "quantity": 24,
  "docTypeId": 32002,
  "currencyId": 1,
  "docDate": "2026-10-12",
  "variantCode": null
}

Die Antwort liefert unter anderem materialPurPrice, priceUnit und deliveryDate. Diese drei Felder übernimmt die Vorlage aus der Disposition in die Position.

12.3 Disposition bis Bestellung ​

Prüfung, ob die Vorschläge schon bestellt sind:

json
{ "proposalIdList": [33001, 33002] }

Antwort { "isProposalOrdered": false }. Dann speichern:

json
{
  "proposals": [
    { "id": 33001, "quantity": 24 },
    { "id": 33002, "quantity": 10 }
  ]
}

POST /api/purHead/createOrdersFromMrp. Antwort enthält purHeadIds, zum Beispiel [210100]. Strecke sucht Belegtyp 4 und fällt sonst auf Typ 2 zurück.

Dieselbe Auswahl ungespeichert vorlegen: POST /api/purHead/createFromProposal mit vendorId, docTypeId und proposals, siehe Vorlage.

12.4 Wareneingang und Rest schließen ​

Offene Positionen der Bestellung BE-10001:

json
{
  "docNumbers": ["BE-10001"],
  "vendor": { "id": 31001 }
}

Buchungsvorschlag: { "ids": [210100] }, Response in Buchungsvorschlag. Nach der Buchung einer Teilmenge die Restposition schließen:

json
{ "purItemIds": [41012] }

Antwort { "success": true }. Die Position gilt als geliefert, auch wenn die gebuchte Menge kleiner war.

12.5 Mail und Portal ​

POST /api/purHead/sendPurHeadAsMail baut die Mail aus der Vorlage der Belegart. Empfänger stehen nicht im Body.

json
{ "ids": [210100] }
json
{
  "success": true,
  "failedList": []
}

Ein Fehler: { "success": false, "failedList": [{ "purHeadId": 210100, "message": "…" }] }.

Das Lieferantenportal ändert eine Position. POST /api/purHead/quickPurHeads

json
{
  "purItem": {
    "id": 41011,
    "quantity": 20,
    "price": 0.9,
    "deliveryDate": "2026-10-28",
    "notes": "Teillieferung bestätigt",
    "shippingCost": 12
  }
}

Storno der Position im Portal: "isCancel": true statt Menge und Preis. Antwort { "success": true }. Dieser Aufruf gilt für das Portal, nicht für die Mandanten-Integration.

Staffel und Import ​

Staffelpreise liegen unter /api/purPriceScaled/. Der Einkaufspreis, der in den Verkauf übernommen wird, unter /api/purSalesPrice/. Der Import ist POST /api/purSalesPrice/purSalesPriceImport. Ein Skript an der Position ist POST /api/purItem/scriptBlock. Der Körper von POST /api/purPriceScaled/ und POST /api/purSalesPrice/ ist der Datensatz.

13. Endpoint-Katalog ​

MethodePfadBedeutung
GET/api/purHead/{id}Ein Beleg, Vorlage (vendorId + docTypeId) oder Liste
POST/api/purHead/listMehrere Belege, Body ids
POST/api/purHead/Anlegen und ändern, Body purHead
DELETE/api/purHead/Logisch löschen, Body ids
GET/api/purHead/light/{id}Kompakte Sicht
POST/api/purHead/lightKompakte Sicht speichern
POST/api/purHead/prepareAndCreateFlacher Import
POST/api/purHead/createPurchaseBestellung Typ 2 über Varianten-SKU
POST/api/purHead/createFromProposalUngespeicherte Vorlage aus Vorschlägen
POST/api/purHead/createOrdersFromMrpBestellungen aus Vorschlägen speichern
POST/api/purHead/checkProposalOb Vorschläge schon bestellt sind
POST/api/purHead/createDropshippingOrdersStreckenbestellung anstoßen, Body purHeadId
GET/api/purHead/docTypes/{id}Erlaubte Folgebelegarten
POST/api/purHead/findMaterialPreis, Steuer, Einheiten einer Position
POST/api/purHead/calculatePalletVolumen und Paletten
GET/api/purHead/findPurchaseSuche nach docNumber oder vendorId
GET/api/purHead/listForArrivalAnkünfte
GET/api/purHead/listDocumentsForArrivalOffene Belege für den Wareneingang
POST/api/purHead/getOpenPurItemsOffene Positionen
POST/api/purHead/purHeadIncomingGoodsBuchungsvorschlag, Body ids
GET/api/purHead/getArrivals/{id}Gebuchte Zugänge
POST/api/purHead/closeItemsPositionen manuell schließen
GET/api/purHead/getVouchers/{id}Eingangsbelege
POST/api/purHead/verificationItemListRechnungsprüfungszeilen, Body ids
GET/api/purHead/getTexts/{id}Texte
GET/api/purHead/getDefaultPurTexts/{id}Standardtexte der Belegart
GET/api/purHead/getAttachments/{id}Anhänge
GET/api/purHead/getPurHeadEmailModel/{id}Mail-Dialog
POST/api/purHead/sendPurHeadAsMailBelege mailen, Body ids
GET/api/purHead/getPurHeadEmailsGesendete Mails
GET/api/purHead/emailHistoryMail-Historie
GET/api/purHead/findCommMessagesForPurHeadKommunikationsmeldungen
GET/api/purHead/attributeAttribute einer Position oder eines Artikels
GET/api/purHead/lookupDataSteuer, Fracht, Lager, Rabattarten
GET/api/purHead/purItemTurnoversPositionsumsätze
GET/api/purHead/orderSalesItemsBestellbare Verkaufspositionen
GET/api/purHead/salesTransfers/purchaseTransferpositionen
POST/api/purHead/salesTransfers/purchaseTransferpositionen
GET/api/purHead/quickPurHeadsLieferantenportal, Liste
POST/api/purHead/quickPurHeadsLieferantenportal, Position ändern
GET/api/purHead/purHeadStatusLieferantenportal, Status
POST/api/purItem/scriptBlockSkript an der Position
GET/api/purPriceScaled/{id}Eine Staffel
POST/api/purPriceScaled/Staffel speichern
DELETE/api/purPriceScaled/{id}Staffel löschen
GET/api/domains/purPriceEinkaufsinfosätze über Generic Domain lesen
POST/api/domains/purPriceEinkaufsinfosätze über Generic Domain speichern
DELETE/api/domains/purPriceEinkaufsinfosätze über Generic Domain löschen
GET/api/domains/purPriceScaledPreisstaffeln über Generic Domain lesen
GET/api/domains/purPriceVariantVariantenpreise über Generic Domain lesen
GET/api/domains/purPriceDiscountRabattstaffeln über Generic Domain lesen
GET/api/domains/purPriceAttributeAttributpreise über Generic Domain lesen
GET/api/purSalesPrice/{id}Ein Einkaufs-Verkaufspreis
POST/api/purSalesPrice/Preis speichern
DELETE/api/purSalesPrice/Preis löschen
POST/api/purSalesPrice/purSalesPriceImportPreise importieren
POST/api/verificationHead/importVerificationRechnungsprüfung aus Einkaufsdaten erzeugen
GET/api/verificationHead/getVendorListLieferantenliste für die Rechnungsprüfung

14. Häufige Fehler ​

MeldungUrsache
purHead.docType.not.found.errorVorlage ohne gültige docTypeId
vendor.not.found.errorvendorId zeigt auf keinen Lieferanten
refPurHead.not.found.errorVorgängerbeleg fehlt
material.not.foundfindMaterial ohne Artikel
material.units.not.foundArtikel ohne Einheit
createOrdersFromMrp.no.valid.openProposals.errorKein offener Vorschlag
dropshipping.order.not.all.items.orderedStrecke konnte nicht alle Positionen zuordnen
vendor.not.found / currency.is.not.found / warehouse.not.found / stockPlace.not.found / unit.not.found / purDocType.not.foundcreatePurchase ohne Stammdaten
Belegnummer existiertcreatePurchase mit vorhandener docNumber
material variant not found with skucreatePurchase mit Artikel ohne Variante
Ressource gesperrtGleichzeitiges Speichern, erneut versuchen

15. Ablauf Bestellung bis Wareneingang ​

  1. Lieferant, Belegart Bestellung, Artikel, Einheit, Lager und Steuer lesen.
  2. Bei Variante variantCode setzen, bei Charge batchnum und expiryDate.
  3. POST /api/purHead/ speichern, id und docNumber merken.
  4. Optional POST /api/purHead/sendPurHeadAsMail.
  5. POST /api/purHead/purHeadIncomingGoods mit der Beleg-Id lesen.
  6. Wareneingang mit Menge, Charge und Lager buchen.
  7. Restmengen mit POST /api/purHead/closeItems abschließen, wenn keine weitere Lieferung kommt.
  8. Eingangsbeleg über GET /api/purHead/getVouchers/{id} prüfen.

Fachlicher Hintergrund: Bestellungen, Bestellanforderungen, Lieferanten.

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