Bestandsdaten der Warenwirtschaft

API Dokumentation – Bestand / Artikel-Inventar

Endpunkte zum Abruf von Artikelstammdaten inklusive aktueller Lagerbestände,
Reservierungen und Gesamtbestand über
https://ihre-catama-url/api/inventory/list und
https://ihre-catama-url/api/inventory/byid, zum Buchen von
Wareneingängen / Bestandsabgängen über
https://ihre-catama-url/api/inventory/book, zum Anlegen von
Artikeln und Arbeitswerten über
https://ihre-catama-url/api/articles/create und
https://ihre-catama-url/api/laborvalues/create, sowie für
die Stammdaten-Lookups über
https://ihre-catama-url/api/articles/categories,
https://ihre-catama-url/api/articles/fabricators und
https://ihre-catama-url/api/articles/deliverers.

Authentifizierung
Alle Endpunkte erfordern den Parameter token mit dem gültigen
catama_public_api_token (Systemeinstellungen > API).
Bei ungueltigem oder fehlendem Token wird HTTP 401 mit dem Body
{ "data": [], "status": 0, "message": "Invalid Token" } zurückgegeben.
Der Tokenvergleich erfolgt zeitkonstant (hash_equals); ein nicht
konfiguriertes catama_public_api_token wird ebenfalls als ungültig
behandelt.



GET
https://ihre-catama-url/api/inventory/list

Liefert eine Liste aller aktiven Artikel inklusive Stammdaten, Lieferanten-
und Hersteller-Bezeichnung, Kategorie sowie der aktuellen Lagerbestände
(Gesamtbestand, Reserviert, Gesamtbestand inkl. Reservierungen).

Parameter

Name Typ Beschreibung
token string API-Token Pflicht
take integer Anzahl der zu liefernden Datensätze (max. 5000; größere Werte werden auf 5000 begrenzt) optional
offset integer Anzahl der zu überspringenden Datensätze (Pagination, ≥ 0) optional
statusid integer Filter auf status_type (Standard: 1) optional
Hinweis: Es werden ausschließlich Artikel mit
status = 1 (aktiv) zurückgegeben. Wird take
weggelassen, liefert die API alle gefilterten Datensätze in einer Antwort
– bei sehr großen Lagern empfehlen wir die Pagination über
take und offset zu nutzen.
Beispiel-Aufrufe
GET https://ihre-catama-url/api/inventory/list?token=xxx
    (alle aktiven Artikel)

GET https://ihre-catama-url/api/inventory/list?token=xxx&take=50&offset=0
    (erste 50 Artikel)

GET https://ihre-catama-url/api/inventory/list?token=xxx&take=50&offset=50&statusid=2
    (Datensatz 51-100, nur Artikel mit status_type = 2)
Erfolgreiche Antwort (JSON)
{
  "data": {
    "1234": {
      "id": 1234,
      "intern_id": "ART-00123",
      "kind": "article",
      "name": "Bremsscheibe vorne",
      "variant": "VW Golf VII",
      "order_code": "BS-1234-VW",
      "deliverer_id": 5,
      "deliverer": "Topring AG",
      "fabricator_id": 12,
      "fabricator": "Brembo",
      "category_id": 8,
      "category": "Bremsen",
      "classification_id": 1,
      "status_type": 1,
      "unit_id": 1,
      "unit": "Stk.",

      "purchase_price": 52.00,
      "purchase_price_express": 58.00,
      "purchase_price_weekorder": 49.00,
      "uvp_price": 119.00,
      "retail_price": 89.50,

      "stock_quantity": 12.00,
      "stock_reserved": 4.00,
      "stock_quantity_total": 16.00,
      "stock_min_quantity": 5.00,
      "stock_max_quantity": 50.00,
      "storage_area_1": "A-12-3",
      "storage_area_2": "",

      "order_quantity_default": 1,
      "default_dosage": 0,
      "ean_id": "4012345678901",
      "similar_id": 0,

      "is_deliverable": 1,
      "is_oldpart_item": 0,
      "is_transit_item": 0,
      "is_diff_tax": 0,
      "is_outlay": 0,
      "is_investment_type": 0,
      "inventory_management": 1,
      "print_label_on_receiving": 0,

      "comment": "",
      "description_txt": "",
      "internal_comment": "",

      "freefield_1": "",
      "freefield_2": "",
      "freefield_3": ""
    }
  },
  "status": 1,
  "message": "Success"
}
Hinweis zur Struktur: Das Feld data ist ein
assoziatives Objekt, dessen Schlüssel die jeweilige Artikel-ID ist
(nicht ein numerisch indiziertes Array). Die Felder sind alphabetisch sortiert
ausgegeben.



GET
https://ihre-catama-url/api/inventory/byid

Liefert einen einzelnen Artikel anhand seiner Datenbank-ID mit identischer
Feldstruktur wie https://ihre-catama-url/api/inventory/list.

Parameter

Name Typ Beschreibung
token string API-Token Pflicht
id integer Datenbank-ID des Artikels (articles.id), positive Ganzzahl > 0 Pflicht
Fehlt id oder ist es kein gültiger positiver Integer (z. B.
0, leer oder als Array übergeben), antwortet die API mit
HTTP 400 und dem Body
{ "data": [], "status": 0, "message": "Parameter id is required and must be > 0" }.
Beispiel-Aufruf
GET https://ihre-catama-url/api/inventory/byid?token=xxx&id=1234
Erfolgreiche Antwort (JSON)
{
  "data": {
    "1234": {
      "id": 1234,
      "intern_id": "ART-00123",
      "name": "Bremsscheibe vorne",
      "stock_quantity": 12.00,
      "stock_reserved": 4.00,
      "stock_quantity_total": 16.00,
      ...
    }
  },
  "status": 1,
  "message": "Success"
}
Wird die ID nicht gefunden, ist data ein leeres Objekt
{}, status bleibt 1 und
message ist "Success".



POST
https://ihre-catama-url/api/inventory/book
Neu

Bucht einen Wareneingang (positive Menge) oder Bestandsabgang (negative Menge)
gegen einen Artikel. Aktualisiert articles_inventory.quantity atomar
(InnoDB-Row-Lock) und legt einen Eintrag im Wareneingangs-/Buchungsjournal
(articles_purchase_journal) an. Liefert den Bestand vor und nach
der Buchung in der Antwort zurück.

Request-Felder (form-encoded oder JSON-Body)

Name Typ Beschreibung
token string API-Token Pflicht
article_id integer Datenbank-ID des Artikels (articles.id). Wird vorrangig genutzt, wenn gesetzt. optional
intern_id string Artikelnummer. Wird verwendet, wenn article_id nicht gesetzt ist; muss systemweit eindeutig sein. optional
quantity float (signed) Buchungsmenge. Positiv = Wareneingang (Zugang), negativ = Abgang. Komma- oder Punkt-Dezimaltrenner. Darf nicht 0 sein. Pflicht
booking_id string Lieferschein-/Buchungsnummer. Wenn leer, generiert das System eine eindeutige Buchungs-ID im Format xxxx-xxxx-xxxx. optional
date string Buchungsdatum. Akzeptiert dd.mm.YYYY, YYYY-MM-DD oder Unix-Timestamp. Default: heute. optional
note string Buchungsvermerk / interner Hinweis. optional
purchase_price float EK pro Stück für diese Buchung. Fallback: articles_inventory.purchase_price aus dem Artikelstamm. optional
deliverer_id integer Abweichender Lieferant für die Buchung (articles_deliverer_rel.did). Ohne Angabe wird der primäre Lieferant des Artikels verwendet. optional
user_id integer User-ID, die als added_by im Buchungsjournal hinterlegt wird. Default: 0 (= API-System). optional
branch_id integer Filial-ID für die Buchung. Default: 1. optional
Identifikation des Artikels: Es muss genau einer der
beiden Parameter article_id oder intern_id übergeben
werden. Wird per intern_id gesucht und finden sich mehrere Artikel
mit derselben Nummer, antwortet die API mit HTTP 409 und Angabe
der Trefferanzahl.
Voraussetzung Bestandsführung: Der angegebene Artikel muss
Bestandsführung aktiviert haben (articles.inventory_management = 1).
Andernfalls wird die Buchung mit HTTP 422 abgewiesen.
Beispiel-Aufrufe
POST https://ihre-catama-url/api/inventory/book
Body: token=xxx&intern_id=ART-00123&quantity=5&booking_id=LS-2026-4711&note=Lieferung+Brembo
    (Wareneingang +5 mit Lieferschein-Nr. und Notiz)

POST https://ihre-catama-url/api/inventory/book
Body: token=xxx&article_id=1234&quantity=-2
    (Abgang -2, booking_id wird automatisch generiert, EK aus Artikelstamm)

POST https://ihre-catama-url/api/inventory/book
Body: token=xxx&article_id=1234&quantity=10&purchase_price=48.50&date=2026-05-21&deliverer_id=7
    (Wareneingang mit eigenem EK, festem Datum und abweichendem Lieferanten)
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "status": 1,
  "message": "Success",
  "data": {
    "article": {
      "id": 1234,
      "intern_id": "ART-00123",
      "name": "Bremsscheibe vorne",
      "matched_by": "intern_id"
    },
    "booking": {
      "booking_id": "a1b2-c3d4-e5f6",
      "booking_id_generated": true,
      "quantity": 5,
      "direction": "in",
      "purchase_price": 52.00,
      "purchase_price_source": "request",
      "date": "2026-05-21",
      "note": "Lieferschein 4711",
      "deliverer_id": 7,
      "user_id": 0,
      "branch_id": 1,
      "purchase_journal_id": 98765
    },
    "stock_before": { "quantity": 10.00, "reserved": 2.00, "quantity_total": 12.00 },
    "stock_after":  { "quantity": 15.00, "reserved": 2.00, "quantity_total": 17.00 }
  }
}

Antwort-Felder

Feld Typ Beschreibung
data.article.id integer Datenbank-ID des gebuchten Artikels
data.article.intern_id string Interne Artikelnummer
data.article.name string Artikelbezeichnung
data.article.matched_by string Wodurch der Artikel gefunden wurde: id, intern_id oder barcode
data.booking.booking_id string Verwendete Buchungs-/Lieferschein-Nr. (eingehend oder auto-generiert)
data.booking.booking_id_generated boolean true, wenn die booking_id vom System erzeugt wurde, false wenn vom Aufrufer geliefert
data.booking.quantity float Gebuchte Menge (signiert, identisch zum Request)
data.booking.direction string "in" bei positiver Menge, "out" bei negativer
data.booking.purchase_price float Tatsächlich verwendeter EK pro Stück
data.booking.purchase_price_source string "request" wenn aus Request-Parameter, "article" wenn aus Artikelstamm
data.booking.date string Verwendetes Buchungsdatum (YYYY-MM-DD)
data.booking.note string Buchungsvermerk (1:1 wie im Request)
data.booking.deliverer_id integer|null Verwendeter Lieferant; null, wenn der Artikel-Standardlieferant gezogen wurde
data.booking.user_id integer In articles_purchase_journal.added_by hinterlegte User-ID
data.booking.branch_id integer In articles_purchase_journal.branch_id hinterlegte Filial-ID
data.booking.purchase_journal_id integer Auto-Increment-ID der erzeugten Buchungsjournal-Zeile (0, wenn kein Lookup möglich)
data.stock_before object Bestand vor der Buchung: quantity, reserved, quantity_total
data.stock_after object Bestand nach der Buchung: gleiche Felder
Atomarität: Die Bestandsaktualisierung erfolgt als atomares
UPDATE… SET quantity = quantity + delta auf
articles_inventory. Parallele Buchungen serialisieren am InnoDB-Row-Lock,
Buchungen gehen nicht verloren.
Snapshot-Hinweis: stock_before ist eine separate
Lesung vor dem UPDATE. Bei stark parallelem Schreibverkehr kann sie von
stock_after - quantity abweichen. Wer einen 100% konsistenten
Vorher-Wert braucht, sollte aus stock_after.quantity - data.booking.quantity
rechnen.



Lookup-Endpoints für die Artikel-Anlage

Vorbereitende Read-Endpoints, die die gültigen IDs für
category_id, fabricator_id und deliverer_id
liefern. Verwende die zurückgegebenen IDs anschließend beim Anlegen
von Artikeln/Arbeitswerten via /api/articles/create und
/api/laborvalues/create.

GET
https://ihre-catama-url/api/articles/categories

Liefert alle aktiven Warengruppen aus articles_category_rel
(status = 1), alphabetisch sortiert. prefix wird
bei aktivem „Auto-Vergabe der Artikelnummer pro Warengruppe“ in
den Systemeinstellungen für das ID-Schema verwendet.

Request-Parameter

Name Typ Beschreibung
token string API-Token Pflicht
Beispiel-Aufruf
GET https://ihre-catama-url/api/articles/categories?token=xxx
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "data": [
    { "id": 7,  "name": "Bremsen", "prefix": "BR" },
    { "id": 12, "name": "Filter",  "prefix": "FI" }
  ],
  "status": 1,
  "message": "Success"
}

Antwort-Felder

Feld Typ Beschreibung
data[].id integer Datenbank-ID der Warengruppe (articles_category_rel.cid) — verwendbar als category_id in /api/articles/create bzw. /api/laborvalues/create.
data[].name string Anzeigename der Warengruppe (category_name).
data[].prefix string ID-Prefix der Warengruppe. Leer, wenn nicht gepflegt.
Es werden ausschließlich aktive Warengruppen geliefert. Inaktive
bzw. archivierte Datensätze sind nicht enthalten.

GET
https://ihre-catama-url/api/articles/fabricators
Neu

Liefert alle aktiven Hersteller aus articles_fabricator_rel
(fabricator_status = 1), alphabetisch sortiert.

Request-Parameter

Name Typ Beschreibung
token string API-Token Pflicht
Beispiel-Aufruf
GET https://ihre-catama-url/api/articles/fabricators?token=xxx
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "data": [
    { "id": 1,  "name": "Bosch" },
    { "id": 12, "name": "Brembo" },
    { "id": 7,  "name": "Mann-Filter" }
  ],
  "status": 1,
  "message": "Success"
}

Antwort-Felder

Feld Typ Beschreibung
data[].id integer Datenbank-ID des Herstellers (articles_fabricator_rel.fid) — verwendbar als fabricator_id in /api/articles/create bzw. /api/laborvalues/create.
data[].name string Anzeigename des Herstellers (fabricator_name).
Es werden ausschließlich aktive Hersteller geliefert.

GET
https://ihre-catama-url/api/articles/deliverers
Neu

Liefert alle aktiven Lieferanten aus articles_deliverer_rel
(deliverer_status = 1), alphabetisch sortiert.

Request-Parameter

Name Typ Beschreibung
token string API-Token Pflicht
Beispiel-Aufruf
GET https://ihre-catama-url/api/articles/deliverers?token=xxx
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "data": [
    { "id": 3, "name": "AT-Spezialteile GmbH" },
    { "id": 1, "name": "Lieferant Mueller" }
  ],
  "status": 1,
  "message": "Success"
}

Antwort-Felder

Feld Typ Beschreibung
data[].id integer Datenbank-ID des Lieferanten (articles_deliverer_rel.did) — verwendbar als deliverer_id in /api/articles/create bzw. /api/laborvalues/create.
data[].name string Anzeigename des Lieferanten (deliverer_name).
Es werden ausschließlich aktive Lieferanten geliefert.



POST
https://ihre-catama-url/api/articles/create
Neu

Legt einen neuen Artikel an (entspricht articles.kind = "article").
Schreibt Stamm- und Bestandsdaten in articles sowie
articles_inventory; bei initialem quantity > 0 wird
zusätzlich automatisch ein Eintrag in articles_purchase_journal
erzeugt („Anfangsbestand zur Artikelanlage“).

Diese API legt explizit keine Pakete an. Pakete benötigen
articleaddform_package_positions samt Paketrelationen und sind
bewusst nicht Bestandteil dieses Endpoints.

Request-Felder (form-encoded oder JSON-Body)

Name Typ Beschreibung
token string API-Token Pflicht
name string Artikelbezeichnung (nicht leer). Pflicht
intern_id string Artikelnummer. Wenn leer und der Auto-Modus für Artikel ist in den Systemeinstellungen aktiv, vergibt das System automatisch eine ID. Andernfalls HTTP 400. Bereits vergebene IDs liefern HTTP 409. optional
category_id integer Warengruppe (articles_category_rel.cid). optional
fabricator_id integer Hersteller (articles_fabricator_rel.fid). optional
deliverer_id integer Lieferant (articles_deliverer_rel.did). optional
retail_price float VK netto. optional
retail_price_b float VK brutto. optional
uvp_price float UVP. optional
purchase_price float EK pro Stück. optional
tax_type integer MwSt-Schlüssel. optional
unit string Einheit (z. B. Stk). optional
description_txt string Beschreibungstext. optional
ean_id string EAN/Barcode. optional
inventory_management 0/1 Bestandsführung aktiv. Erforderlich, wenn der Artikel später via /api/inventory/book gebucht werden soll. optional
quantity float Initialbestand. Bei > 0 wird automatisch ein Buchungsjournaleintrag erzeugt. optional
min_quantity float Mindestbestand. optional
max_quantity float Höchstbestand. optional
weight float Gewicht. optional
freefield_1 … freefield_10 string Frei konfigurierbare Felder (Bezeichnung in den Systemeinstellungen). optional
branch_id integer Filiale, in der der Artikel angelegt wird. Beeinflusst auch die Eindeutigkeitsprüfung der intern_id. Default: 1. optional
user_id integer User-ID für articles.added_by. Default: 0 (= API-System). optional
Eindeutigkeit der intern_id: Prüfung erfolgt pro Filiale
(branch_id) gegen aktive Datensätze. Es existiert kein
DB-UNIQUE-Constraint, deshalb sollte parallelisierter Multi-Insert mit identischer
intern_id vermieden werden.
Beispiel-Aufrufe
POST https://ihre-catama-url/api/articles/create
Body: token=xxx&intern_id=ART-TEST-01&name=Bremsscheibe vorne&retail_price=89.50&
      retail_price_b=106.51&category_id=7&inventory_management=1&quantity=5
    (Vollanlage mit Initialbestand)

POST https://ihre-catama-url/api/articles/create
Body: token=xxx&name=Standardartikel
    (Minimal, intern_id wird auto-vergeben falls Auto-Modus aktiv)

POST https://ihre-catama-url/api/articles/create
Body: token=xxx&intern_id=ART-TEST-02&name=Mit Freifeldern&
      freefield_1=Hersteller-Code 12345&freefield_2=Variante A
    (Mit Frei-Feldern)
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "status": 1,
  "message": "Success",
  "data": {
    "article": {
      "id": 12345,
      "intern_id": "ART-TEST-01",
      "intern_id_generated": false,
      "kind": "article",
      "name": "Bremsscheibe vorne",
      "branch_id": 1,
      "category_id": 7,
      "fabricator_id": 12,
      "deliverer_id": 3,
      "retail_price": 89.50,
      "retail_price_b": 106.51,
      "uvp_price": 110.00,
      "purchase_price": 52.00,
      "unit": "Stk",
      "ean_id": "4012345678901",
      "inventory_management": 1,
      "quantity": 5,
      "min_quantity": 0,
      "max_quantity": 0
    }
  }
}

Antwort-Felder

Feld Typ Beschreibung
data.article.id integer Datenbank-ID des neu angelegten Artikels (articles.id)
data.article.intern_id string Verwendete Artikelnummer (eingehend oder auto-vergeben)
data.article.intern_id_generated boolean true, wenn die intern_id vom System auto-vergeben wurde
data.article.kind string Stets "article" bei diesem Endpoint
data.article.* (weitere) diverse Spiegel der gespeicherten Stamm-/Bestandsdaten (siehe Beispiel)



POST
https://ihre-catama-url/api/laborvalues/create
Neu

Legt einen neuen Arbeitswert an (entspricht articles.kind = "laborvalue").
Akzeptiert exakt dieselben Felder wie /api/articles/create; serverseitig
wird ausschließlich der kind-Diskriminator getauscht und der
Auto-ID-Modus über die separate Arbeitswert-Settings-Konfiguration ermittelt.
Bestandsfelder (quantity, inventory_management) werden für
Arbeitswerte typischerweise nicht gesetzt — sind aber harmlos, wenn doch.

Diese API legt keine Pakete an. Für Pakete ist ein eigener Endpoint vorgesehen.

Request-Felder

Identisch zu /api/articles/create (siehe oben).

Beispiel-Aufrufe
POST https://ihre-catama-url/api/laborvalues/create
Body: token=xxx&name=Reifenwechsel komplett&retail_price=29.00&unit=Std
    (intern_id wird auto-vergeben falls Auto-Modus für Arbeitswerte aktiv)

POST https://ihre-catama-url/api/laborvalues/create
Body: token=xxx&intern_id=AW-2026-0042&name=Bremsendiagnose&retail_price=45.00&
      retail_price_b=53.55&unit=Std&category_id=99
    (Mit eigener Nummer und Warengruppe)
Erfolgreiche Antwort (JSON, HTTP 200)
{
  "status": 1,
  "message": "Success",
  "data": {
    "article": {
      "id": 12346,
      "intern_id": "AW-2026-0042",
      "intern_id_generated": false,
      "kind": "laborvalue",
      "name": "Bremsendiagnose",
      "branch_id": 1,
      "category_id": 99,
      "fabricator_id": 0,
      "deliverer_id": 0,
      "retail_price": 45.00,
      "retail_price_b": 53.55,
      "uvp_price": 0,
      "purchase_price": 0,
      "unit": "Std",
      "ean_id": null,
      "inventory_management": 0,
      "quantity": 0,
      "min_quantity": 0,
      "max_quantity": 0
    }
  }
}
Hinweis: Felder wie quantity oder
inventory_management werden in der Antwort meist 0 sein
— Arbeitswerte werden üblicherweise nicht bestandsgeführt.



Felder-Referenz

Stammdaten / Identifikation
Feld Typ Beschreibung
id integer Datenbank-ID des Artikels (articles.id)
intern_id string Interne Artikelnummer (vom Anwender vergeben)
kind string Artikeltyp, z. B. article, laborvalue, package, divers
name string Artikelbezeichnung
variant string Variante / Zusatzbezeichnung
order_code string Bestell-/Herstellernummer
ean_id string EAN / Barcode
similar_id integer Verknüpfter Vergleichs-/Nachfolgeartikel
status_type integer Status-Typ des Artikels (Filter via statusid)
classification_id integer Klassifikations-ID
Lieferant, Hersteller, Kategorie
Feld Typ Beschreibung
deliverer_id integer ID des Lieferanten
deliverer string Name des Lieferanten
fabricator_id integer ID des Herstellers
fabricator string Name des Herstellers
category_id integer ID der Artikelkategorie
category string Name der Artikelkategorie
unit_id integer ID der Mengeneinheit
unit string Aufgelöste Einheit (z. B. „Stk.“, „Liter“)
Bestand & Lager

Alle Mengen sind numerisch (float, kann Nachkommastellen enthalten).

Feld Typ Beschreibung
stock_quantity float Gesamtbestand – aktuelle physische Lagermenge (articles_inventory.quantity)
stock_reserved float Reserviert – bereits für Aufträge / WAs reservierte Menge (articles_inventory.reserved)
stock_quantity_totalNeu float Gesamtbestand inkl. Reserviert – Summe aus stock_quantity + stock_reserved
stock_min_quantity float Mindestbestand (Meldebestand)
stock_max_quantity float Höchstbestand
storage_area_1 string Lagerort 1 / Hauptlagerplatz
storage_area_2 string Lagerort 2 / Alternativer Lagerplatz
inventory_management integer 0 = keine Bestandsführung, 1 = mit Bestandsführung
is_deliverable integer 1 = Artikel ist lieferbar, 0 = nicht lieferbar
order_quantity_default float Standard-Bestellmenge
default_dosage float Standard-Dosierung / Verbrauchsmenge je AW
Berechnung:
stock_quantity_total = stock_quantity + stock_reserved.
Diese Summe entspricht dem Wert (quantity + reserved), wie er in
der Bestandsliste der Anwendung als „Gesamtbestand inkl. Reserviert“
ausgewiesen wird.
Preise

Alle Preise sind Netto in der eingestellten Systemwährung.

Feld Typ Beschreibung
purchase_price float Einkaufspreis (Standard)
purchase_price_express float Einkaufspreis Express-Bestellung
purchase_price_weekorder float Einkaufspreis Wochenbestellung
uvp_price float Unverbindliche Preisempfehlung (UVP)
retail_price float Verkaufspreis / Endkundenpreis
Flags & Optionen
Feld Typ Beschreibung
is_oldpart_item integer 1 = Altteil-Artikel
is_transit_item integer 1 = Transitartikel (kein Lagerartikel)
is_diff_tax integer 1 = Differenzbesteuerung
is_outlay integer 1 = Auslage / durchlaufender Posten
is_investment_type integer 1 = Investitionsgut
print_label_on_receiving integer 1 = Etikett beim Wareneingang automatisch drucken
Beschreibungstexte
Feld Typ Beschreibung
comment string Öffentlicher Kommentar / Hinweis
description_txt string Ausführliche Artikelbeschreibung
internal_comment string Interner Kommentar (nicht für Kunden sichtbar)
freefield_1 … freefield_20 string 20 frei belegbare Zusatzfelder (z. B. für Alternativ-Artikelnummern). Werden bei der Suche mit berücksichtigt.



Mapping zu den geforderten Bestandsdaten

Anforderung API-Feld
Artikelname name
Artikelnummer (intern) intern_id
Artikelnummer (Hersteller / Bestellcode) order_code
Datenbank-ID id
Reserviert stock_reserved
Gesamtbestand stock_quantity
Gesamtbestand inkl. Reserviert stock_quantity_total Neu



Fehlerantworten

HTTP Endpoint Body Wann
401 alle { "data": [], "status": 0, "message": "Invalid Token" } Parameter token fehlt, ist leer oder stimmt nicht mit dem hinterlegten catama_public_api_token überein. Auch dann, wenn in den Systemeinstellungen kein API-Token konfiguriert wurde.
400 /byid { "status": 0, "message": "Parameter id is required and must be > 0" } Parameter id fehlt, ist nicht numerisch oder ≤ 0.
400 /book { "status": 0, "message": "Either article_id or intern_id must be provided" } Weder article_id noch intern_id wurde übergeben.
400 /book { "status": 0, "message": "Parameter quantity is required and must not be zero" } quantity fehlt, ist nicht numerisch oder gleich 0.
404 /book { "status": 0, "message": "Article not found" } Kein Artikel mit der übergebenen article_id bzw. intern_id gefunden.
409 /book { "status": 0, "message": "Article identifier is ambiguous", "matches": 3, "matched_by": "intern_id" } Die übergebene intern_id bzw. der Barcode trifft mehr als einen aktiven Artikel. Es wird nicht gebucht.
422 /book { "status": 0, "message": "Article is not stock managed (inventory_management = 0)" } Der Artikel existiert, hat aber keine Bestandsführung aktiviert. Buchung wird abgewiesen.
400 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Parameter name is required" } Pflichtfeld name fehlt oder ist leer.
400 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Parameter intern_id is required (auto-numbering disabled in system settings for this type)" } Keine intern_id übergeben und der Auto-Modus für diesen Typ ist in den Systemeinstellungen deaktiviert.
400 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Parameter category_id is required when auto-numbering is configured per category" } Es wurde keine intern_id übergeben, in den Systemeinstellungen ist die Auto-Vergabe nur pro Warengruppe (next_article_internid_auto_by_category) aktiv und es fehlt eine valide category_id (sonst würde die generierte ID kollidieren).
400 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Parameter <name> must be a scalar value (got array)" } Eines der Whitelist-Felder (z. B. quantity, retail_price, name) wurde in einem JSON-Body als Array oder Objekt übergeben statt als Skalar. Die Persistenz kann derartige Werte nicht sicher escapen.
409 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Article with this intern_id already exists in branch", "branch_id": 1 } Die übergebene intern_id ist in der Filiale (branch_id) bereits vergeben.
409 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Race condition: intern_id was just used by another concurrent request", "branch_id": 1 } Best-effort Erkennung einer Race Condition zwischen zwei parallelen Anlagen mit derselben intern_id. Der zweite Datensatz wird automatisch wieder gelöscht; der Aufruf kann mit einer anderen intern_id wiederholt werden.
500 /articles/create
/laborvalues/create
{ "data": [], "status": 0, "message": "Insert failed" } Die Persistenz hat status: 0 oder keine insert_id zurückgegeben. Tritt typischerweise nur bei DB-Fehlern auf.

Ähnliche Artikel