← Alle Themen · API
In diesem Artikel 7 Kapitel
API: Artikel-Endpunkte
GET /items
Artikel suchen und abrufen. Gibt Artikel mit optionalen Unterdaten (Texte, Barcodes, Varianten, Bestände etc.) zurück.
URL: GET /public_api/<token>/items
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
sku | String | Nein | Suche nach SKU (Prefix-Suche, z.B. sku=ABC findet ABC-001, ABC-002 etc.) |
id | Integer | Nein | Suche nach Artikel-ID |
barcode | String | Nein | Suche nach exaktem Barcode |
manufacturer | Integer | Nein | Filter nach Hersteller-ID |
statusId | Integer | Nein | Filter nach Artikel-Status-ID |
itemdata | String | Nein | Volltextsuche in Artikeltexten (Teilwort-Suche) |
updatedAfter | Integer | Nein | Nur Artikel die nach diesem Unix-Timestamp aktualisiert wurden |
warehouseId | Integer | Nein | Filter nach Lager-ID (nur in Kombination mit warehouse_limit) |
warehouse_limit | String | Nein | Bestandsfilter. Mögliche Werte: positive_phy (physischer Bestand > 0), positive_net (Nettobestand > 0), zero_phy (physischer Bestand <= 0), zero_net (Nettobestand <= 0) |
showVariants | Integer | Nein | 1 = Varianten des Artikels mit laden |
with | Array | Nein | Auswahl der Unterdaten. Mögliche Werte: texts, sales_prices, images, images_links, properties, barcodes, markets, clients, bundles, logs, stocks. Standard: ["all"] (alle außer logs) |
page | Integer | Nein | Seite für Paginierung (Standard: 1) |
limit | Integer | Nein | Ergebnisse pro Seite (Standard: 25) |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items?sku=T-SHIRT&showVariants=1&page=1&limit=10" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"id": 123,
"parentId": 123,
"sku": "T-SHIRT-001",
"isMain": 1,
"manufacturerId": 5,
"manufacturer": "Markenname",
"model": "Modell-A",
"externalId": "EXT-123",
"purchasePrice": 5.99,
"weightG": 200,
"widthMM": 300,
"lengthMM": 400,
"heightMM": 20,
"statusId": 1,
"isBundle": 0,
"isBundleComponent": 0,
"createdAt": 1700000000,
"updatedAt": 1700100000,
"stockUpdatedAt": 1700100000,
"texts": [
{
"id": 1,
"itemId": 123,
"lang": "de",
"textKey": "name",
"textValue": "T-Shirt Blau"
}
],
"salesPrices": [
{
"id": 1,
"itemId": 123,
"salesPriceId": 1,
"price": 19.99,
"updatedAt": 1700000000
}
],
"images": [
{
"id": 1,
"itemId": 123,
"imageName": "bild1.jpg",
"position": 1
}
],
"imageLinks": [],
"properties": [
{
"id": 1,
"itemId": 123,
"propertieId": 1,
"propertieValue": "Baumwolle"
}
],
"barcodes": [
{
"id": 1,
"itemId": 123,
"barcodeId": 1,
"code": "4006381333931"
}
],
"markets": [
{
"id": 1,
"itemId": 123,
"market": "amazon",
"active": 1
}
],
"clients": [
{
"id": 1,
"itemId": 123,
"clientId": 1,
"active": 1
}
],
"bundles": [],
"stocks": [
{
"warehouseId": 1,
"id": 10,
"name": "A-01-01",
"stock": 50,
"warehouseName": "Hauptlager",
"itemId": 123,
"reserved": 5,
"stockNet": 45
}
],
"variants": [
{
"id": 124,
"parentId": 123,
"sku": "T-SHIRT-001-M",
"isMain": 0,
"barcodes": [],
"attributes": [],
"salesPrices": [],
"properties": [],
"markets": [],
"clients": [],
"bundles": [],
"stocks": []
}
]
}
],
"count": 1,
"pages": 1,
"used_page": 1,
"warehouses": [
{
"id": 1,
"name": "Hauptlager",
"active": 1
}
]
}
Fehler-Antwort
{
"valid": false,
"error": "Keine Artikel gefunden"
}
POST /items
Erstellt einen neuen Artikel oder aktualisiert einen bestehenden Artikel inklusive Varianten, Texten, Barcodes, Verkaufspreisen und weiteren Daten.
URL: POST /public_api/<token>/items
Request-Body (JSON)
Der Request-Body muss ein item-Objekt enthalten:
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.itemId | Integer oder "new" | Ja | Artikel-ID oder "new" für neuen Artikel |
item.sku | String | Ja | SKU / Artikelnummer (darf nicht leer sein, muss bei neuen Artikeln eindeutig sein) |
item.manufacturerId | Integer | Nein | Hersteller-ID |
item.model | String | Nein | Modellbezeichnung |
item.externalId | String | Nein | Externe ID |
item.purchasePrice | Float | Nein | Einkaufspreis |
item.weightG | Integer | Nein | Gewicht in Gramm |
item.widthMM | Integer | Nein | Breite in Millimeter |
item.lengthMM | Integer | Nein | Länge in Millimeter |
item.heightMM | Integer | Nein | Höhe in Millimeter |
item.statusId | Integer | Nein | Status-ID |
Texte (optional)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.texts[].lang | String | Ja | Sprachcode, z.B. "de", "en" |
item.texts[].name | String | Nein | Artikelname (Textschlüssel name) |
item.texts[].name2 | String | Nein | Zweiter Name (Textschlüssel name2) |
item.texts[].name3 | String | Nein | Dritter Name (Textschlüssel name3) |
item.texts[].name4 | String | Nein | Vierter Name (Textschlüssel name4) |
item.texts[].desc | String | Nein | Beschreibung (Textschlüssel desc) |
Verkaufspreise (optional)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.salesPrices[].id | Integer | Ja | Verkaufspreis-ID |
item.salesPrices[].value | Float | Ja | Preis |
Barcodes (optional)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.barcodes[].id | Integer | Ja | Barcode-Typ-ID |
item.barcodes[].value | String | Ja | Barcode-Wert (z.B. EAN) |
Bilder (optional, nur bei bestehenden Artikeln)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.images[].itemId | Integer | Ja | Artikel-ID |
item.images[].imageName | String | Ja | Dateiname des Bildes |
item.images[].position | Integer | Ja | Position / Reihenfolge |
item.images[].links | Array | Nein | Array von Varianten-IDs, denen dieses Bild zugeordnet wird |
Eigenschaften (optional, nur bei bestehenden Artikeln)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.properties[].itemId | Integer | Ja | Artikel-ID |
item.properties[].propertieId | Integer | Ja | Eigenschaft-ID |
item.properties[].value | String | Nein | Eigenschaftswert (leer oder fehlend = Eigenschaft wird gelöscht) |
Märkte (optional, nur bei bestehenden Artikeln)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.markets[].itemId | Integer | Ja | Artikel-ID |
item.markets[].market | String | Ja | Marktplatz-Bezeichnung (z.B. "amazon", "ebay") |
item.markets[].value | Integer | Nein | 1 = aktiv, 0 = inaktiv |
Mandanten (optional, nur bei bestehenden Artikeln)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.clients[].itemId | Integer | Ja | Artikel-ID |
item.clients[].clientId | Integer | Ja | Mandanten-ID |
item.clients[].value | Integer | Nein | 1 = aktiv, 0 = inaktiv |
Bundles (optional, nur bei bestehenden Artikeln)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.bundles[].itemId | Integer | Ja | Bundle-Artikel-ID (der Artikel, der das Bundle ist) |
item.bundles[].bundleItemId | Integer | Ja | Komponenten-Artikel-ID |
item.bundles[].quantity | Integer | Ja | Menge der Komponente im Bundle |
Varianten (optional)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.variants[].itemId | Integer oder "new" | Ja | Varianten-ID oder "new" |
item.variants[].sku | String | Ja | SKU der Variante (muss eindeutig sein) |
item.variants[].model | String | Nein | Modellbezeichnung |
item.variants[].externalId | String | Nein | Externe ID |
item.variants[].purchasePrice | Float | Nein | Einkaufspreis |
item.variants[].weightG | Integer | Nein | Gewicht in Gramm |
item.variants[].widthMM | Integer | Nein | Breite in Millimeter |
item.variants[].lengthMM | Integer | Nein | Länge in Millimeter |
item.variants[].heightMM | Integer | Nein | Höhe in Millimeter |
item.variants[].salesPrices | Array | Nein | Verkaufspreise (gleiches Format wie oben) |
item.variants[].barcodes | Array | Nein | Barcodes (gleiches Format wie oben) |
item.variants[].attributes | Array | Nein | Attribute (s.u.) |
item.variants[].bundles | Array | Nein | Bundles (gleiches Format wie oben) |
Varianten-Attribute:
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
item.variants[].attributes[].id | Integer | Ja | Attribut-ID |
item.variants[].attributes[].value | String | Ja | Attribut-Wert (z.B. "M", "Blau") |
Beispiel-Request (neuer Artikel)
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{
"item": {
"itemId": "new",
"sku": "HOODIE-001",
"manufacturerId": 5,
"weightG": 500,
"statusId": 1,
"texts": [
{
"lang": "de",
"name": "Hoodie Schwarz",
"desc": "Bequemer Hoodie aus Baumwolle"
}
],
"barcodes": [
{ "id": 1, "value": "4006381333931" }
],
"salesPrices": [
{ "id": 1, "value": 39.99 }
],
"variants": [
{
"itemId": "new",
"sku": "HOODIE-001-M",
"weightG": 500,
"attributes": [
{ "id": 1, "value": "M" }
]
},
{
"itemId": "new",
"sku": "HOODIE-001-L",
"weightG": 520,
"attributes": [
{ "id": 1, "value": "L" }
]
}
]
}
}'
Erfolgreiche Antwort
{
"valid": true,
"id": 456
}
Fehler-Antworten
{
"valid": false,
"error": "Hauptartikel - SKU bereits vorhanden"
}
{
"valid": false,
"error": "Hauptartikel - SKU darf nicht leer sein"
}
{
"valid": false,
"error": "Variante - SKU HOODIE-001-M bereits vorhanden"
}
PUT /items/item_status
Ändert den Status eines Artikels.
URL: PUT /public_api/<token>/items/item_status
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
statusId | Integer | Ja | Neue Status-ID |
Beispiel-Request
curl -X PUT "https://meinefirma.scanalot.io/public_api/<token>/items/item_status" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{ "itemId": 123, "statusId": 2 }'
Erfolgreiche Antwort
{
"valid": true
}
Fehler-Antwort
{
"valid": false
}
GET /items/stock
Ruft die Bestandsdaten eines Artikels pro Lagerort ab.
URL: GET /public_api/<token>/items/stock
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
warehouseId | Integer | Nein | Filter nach Lager-ID (ohne diesen Parameter werden alle Lager zurückgegeben) |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/stock?itemId=123" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"warehouseId": 1,
"id": 10,
"name": "A-01-01",
"stock": 50,
"warehouseName": "Hauptlager",
"itemId": 123,
"qrCode": "a1b2c3d4e5f6g7h"
}
]
}
Fehler-Antwort
{
"valid": false,
"error": "Kein Bestand gefunden"
}
POST /items/stock_incoming
Bucht einen Wareneingang. Die angegebene Menge wird zum bestehenden Bestand am Lagerort addiert.
URL: POST /public_api/<token>/items/stock_incoming
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
locationId | Integer | Ja* | Lagerort-ID |
warehouseId | Integer | Ja* | Lager-ID |
stock | Integer | Ja | Menge (muss > 0 sein) |
barcode | String | Nein | QR-Code des Lagerorts (Alternative zu locationId + warehouseId) |
*Pflicht, wenn barcode nicht angegeben ist. Wenn barcode angegeben wird, werden locationId und warehouseId automatisch ermittelt.
Beispiel-Request
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/stock_incoming" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{
"itemId": 123,
"locationId": 10,
"warehouseId": 1,
"stock": 25
}'
Alternativ mit Barcode:
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/stock_incoming" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{
"itemId": 123,
"barcode": "a1b2c3d4e5f6g7h",
"stock": 25
}'
Erfolgreiche Antwort
{
"valid": true
}
Fehler-Antworten
{
"valid": false,
"error": "Artikel nicht gefunden"
}
{
"valid": false,
"error": "Lagerort nicht gefunden"
}
{
"valid": false,
"error": "Menge darf nicht 0 sein"
}
POST /items/stock_correction
Führt eine Bestandskorrektur für einen oder mehrere Artikel an bestimmten Lagerorten durch. Der Bestand wird auf den angegebenen Wert gesetzt (nicht addiert).
URL: POST /public_api/<token>/items/stock_correction
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
corrections | Array | Ja | Array von Korrektur-Objekten |
corrections[].itemId | Integer | Ja | Artikel-ID |
corrections[].locationId | Integer | Ja | Lagerort-ID |
corrections[].warehouseId | Integer | Ja | Lager-ID |
corrections[].stock | Integer | Ja | Neuer Bestandswert |
Beispiel-Request
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/stock_correction" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{
"corrections": [
{ "itemId": 123, "locationId": 10, "warehouseId": 1, "stock": 50 },
{ "itemId": 124, "locationId": 10, "warehouseId": 1, "stock": 30 }
]
}'
Erfolgreiche Antwort
{
"valid": true,
"errors": [],
"count": 0,
"success": 2
}
Antwort mit Teilfehlern
{
"valid": true,
"errors": ["ItemId 999 correction failed"],
"count": 1,
"success": 1
}
Fehler-Antwort
{
"valid": false,
"error": "param corrections missing"
}
PUT /items/stock_rebook
Bucht Bestand von einem Lagerort auf einen anderen um. Wenn die gewünschte Menge den verfügbaren Bestand am alten Lagerort übersteigt, wird der gesamte verfügbare Bestand umgebucht.
URL: PUT /public_api/<token>/items/stock_rebook
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
oldLocation | Integer | Ja | Lagerort-ID des Quell-Lagerorts |
oldWarehouse | Integer | Ja | Lager-ID des Quell-Lagers |
newLocation | Integer | Ja* | Lagerort-ID des Ziel-Lagerorts |
newWarehouse | Integer | Ja* | Lager-ID des Ziel-Lagers |
stock | Integer | Ja | Umzubuchende Menge (muss > 0 sein) |
barcode | String | Nein | QR-Code des Ziel-Lagerorts (Alternative zu newLocation + newWarehouse) |
*Pflicht, wenn barcode nicht angegeben ist. Wenn barcode angegeben wird, werden newLocation und newWarehouse automatisch ermittelt.
Beispiel-Request
curl -X PUT "https://meinefirma.scanalot.io/public_api/<token>/items/stock_rebook" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{
"itemId": 123,
"oldLocation": 10,
"oldWarehouse": 1,
"newLocation": 20,
"newWarehouse": 1,
"stock": 15
}'
Erfolgreiche Antwort
{
"valid": true
}
Fehler-Antworten
{
"valid": false,
"error": "Artikel nicht gefunden"
}
{
"valid": false,
"error": "Alter Lagerort nicht gefunden"
}
{
"valid": false,
"error": "Neuer Lagerort nicht gefunden"
}
{
"valid": false,
"error": "Menge darf nicht 0 sein"
}