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.
Alle Endpunkte erfordern den Parameter
token mit dem gültigencatama_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 nichtkonfiguriertes
catama_public_api_token wird ebenfalls als ungültigbehandelt.
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 |
status = 1 (aktiv) zurückgegeben. Wird takeweggelassen, 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.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)
{
"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"
}
data ist einassoziatives Objekt, dessen Schlüssel die jeweilige Artikel-ID ist
(nicht ein numerisch indiziertes Array). Die Felder sind alphabetisch sortiert
ausgegeben.
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 |
id oder ist es kein gültiger positiver Integer (z. B.0, leer oder als Array übergeben), antwortet die API mitHTTP 400 und dem Body{ "data": [], "status": 0, "message": "Parameter id is required and must be > 0" }.GET https://ihre-catama-url/api/inventory/byid?token=xxx&id=1234
{
"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"
}
data ein leeres Objekt{}, status bleibt 1 undmessage ist "Success".
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 |
beiden Parameter
article_id oder intern_id übergebenwerden. Wird per
intern_id gesucht und finden sich mehrere Artikelmit derselben Nummer, antwortet die API mit
HTTP 409 und Angabeder Trefferanzahl.
Bestandsführung aktiviert haben (
articles.inventory_management = 1).Andernfalls wird die Buchung mit
HTTP 422 abgewiesen.POST https://ihre-catama-url/api/inventory/book
Body: token=xxx&intern_id=ART-00123&quantity=5&booking_id=LS-2026-4711¬e=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)
{
"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 |
UPDATE… SET quantity = quantity + delta aufarticles_inventory. Parallele Buchungen serialisieren am InnoDB-Row-Lock,Buchungen gehen nicht verloren.
Snapshot-Hinweis:
stock_before ist eine separateLesung vor dem UPDATE. Bei stark parallelem Schreibverkehr kann sie von
stock_after - quantity abweichen. Wer einen 100% konsistentenVorher-Wert braucht, sollte aus
stock_after.quantity - data.booking.quantityrechnen.
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.
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 |
GET https://ihre-catama-url/api/articles/categories?token=xxx
{
"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. |
bzw. archivierte Datensätze sind nicht enthalten.
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 |
GET https://ihre-catama-url/api/articles/fabricators?token=xxx
{
"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). |
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 |
GET https://ihre-catama-url/api/articles/deliverers?token=xxx
{
"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). |
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“).
articleaddform_package_positions samt Paketrelationen und sindbewusst 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 |
(
branch_id) gegen aktive Datensätze. Es existiert keinDB-UNIQUE-Constraint, deshalb sollte parallelisierter Multi-Insert mit identischer
intern_id vermieden werden.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)
{
"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) |
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.
Request-Felder
Identisch zu /api/articles/create (siehe oben).
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)
{
"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
}
}
}
quantity oderinventory_management werden in der Antwort meist 0 sein— Arbeitswerte werden üblicherweise nicht bestandsgeführt.
Felder-Referenz
| 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 |
| 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“) |
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 |
stock_quantity_total = stock_quantity + stock_reserved.Diese Summe entspricht dem Wert
(quantity + reserved), wie er inder Bestandsliste der Anwendung als „Gesamtbestand inkl. Reserviert“
ausgewiesen wird.
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 |
| 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 |
| 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. |