← Alle Themen · API
In diesem Artikel 18 Kapitel
- GET /items
- POST /items
- PUT /items/itemstatus
- GET /items/stock
- POST /items/stockincoming
- POST /items/stockcorrection
- PUT /items/stockrebook
- DELETE /items/{id}
- GET /items/stockmovements
- GET /items/barcodelookup
- GET /items/stats
- GET /items/logs
- GET /items/log
- POST /items/imageupload
- DELETE /items/image
- POST /items/bundle
- DELETE /items/bundle
- Artikel-Stammdaten
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"
}
DELETE /items/{id}
Löscht einen Artikel inklusive Varianten, Bildern, Texten, Barcodes, Preisen, Beständen und Bundle-Verknüpfungen. Bei einem Hauptartikel werden auch sämtliche Varianten mit entfernt.
URL: DELETE /public_api/<token>/items/{id}
URL-Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Ja | Artikel-ID (Hauptartikel oder Variante) |
Beispiel-Request
curl -X DELETE "https://meinefirma.scanalot.io/public_api/<token>/items/123" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{ "valid": true }
Fehler-Antwort
{ "valid": false, "error": "cant find item" }
GET /items/stock_movements
Gibt Warenbewegungen (Zu-/Abgänge, Umbuchungen, Korrekturen) aus dem Lagerbuch zurück. Es handelt sich um die historisch gebuchten Lagerort-Bewegungen aus scanalot_warehouse_locations_movements.
URL: GET /public_api/<token>/items/stock_movements
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer oder all_<parentId> | Nein | Filter nach Artikel. 123 = exakt diese Variante, all_123 = Hauptartikel + alle Varianten |
reasonKey | String | Nein | Filter nach Buchungsgrund (z.B. incoming, outgoing, correction, rebook) |
userId | Integer | Nein | Filter nach Benutzer, der die Buchung ausgelöst hat |
locationId | Integer | Nein | Filter nach Lagerort-ID |
warehouseId | Integer | Nein | Filter nach Lager-ID |
createdFrom | String (YYYY-MM-DD) | Nein | Von-Datum. Nur zusammen mit createdTo wirksam |
createdTo | String (YYYY-MM-DD) | Nein | Bis-Datum. Nur zusammen mit createdFrom wirksam |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/stock_movements?itemId=123&createdFrom=2026-01-01&createdTo=2026-01-31" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"id": 999,
"user": "Max Mustermann",
"warehouse": "Hauptlager",
"location": "A-01-01",
"sku": "T-SHIRT-001",
"reasonKey": "incoming",
"reasonValue": "Wareneingang Lieferschein 4711",
"change": 10,
"oldStock": 40,
"newStock": 50,
"bookedAt": 1700000000,
"bookedAtFormat": "15.11.2023 12:00"
}
]
}
Fehler-Antwort
{ "valid": false, "error": "Keine Warenbewegungen gefunden" }
GET /items/barcode_lookup
Sucht einen Artikel anhand eines Barcodes. Es wird zuerst in den Artikel-Barcodes gesucht, dann als Fallback auf die SKU gematcht. Liefert zusätzlich alle Lagerorte mit Bestand > 0 zurück.
URL: GET /public_api/<token>/items/barcode_lookup
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
barcode | String | Ja | Zu suchender Barcode oder SKU |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/barcode_lookup?barcode=4006381333931" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"id": 124,
"sku": "T-SHIRT-001-M",
"parentId": 123,
"name": "T-Shirt Blau",
"stocks": [
{
"warehouseId": 1,
"id": 10,
"name": "A-01-01",
"stock": 25,
"warehouseName": "Hauptlager",
"itemId": 124
}
]
}
]
}
Fehler-Antworten
{ "valid": false, "error": "Barcode fehlt" }
{ "valid": false, "error": "Artikel nicht gefunden" }
GET /items/stats
Liefert eine Verkaufs- und Retouren-Statistik pro Artikel über einen definierten Zeitraum. Berücksichtigt werden ausschließlich Positionen vom Typ item auf nicht gelöschten Aufträgen.
URL: GET /public_api/<token>/items/stats
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemIds[] | Integer-Array | Ja | Artikel-IDs, zu denen Statistik ermittelt werden soll (mehrfach übergeben, z.B. itemIds[]=1&itemIds[]=2) |
days | Integer | Nein | Zeitraum in Tagen rückwirkend. Standard: 30 |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/stats?itemIds[]=123&itemIds[]=124&days=90" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"itemId": 123,
"sales": 42,
"salesGross": 839.58,
"returns": 2,
"returnsGross": 39.98,
"currency": "EUR"
}
]
}
Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
itemId | Integer | Artikel-ID |
sales | Integer | Verkaufte Stückzahl (Auftragstyp order) |
salesGross | Float | Summe Brutto-Umsatz |
returns | Integer | Retournierte Stückzahl (Auftragstyp return) |
returnsGross | Float | Summe Brutto-Retouren |
currency | String | Währung (z.B. EUR) |
GET /items/logs
Gibt die Metadaten der Marktplatz-Change-Logs eines Artikels zurück (ohne Payload). Payload je Eintrag kann über GET /items/log nachgeladen werden.
URL: GET /public_api/<token>/items/logs
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/logs?itemId=123" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": [
{
"taskId": "a1b2c3",
"market": "amazon",
"account": "DE Marketplace",
"inserted": 1700000000,
"createdAtFormat": "15.11.2023 12:00",
"state": "unknown"
}
]
}
Fehler-Antwort
{ "valid": false, "error": "Keine Logs gefunden" }
GET /items/log
Gibt den vollständigen Log-Eintrag inklusive Request- und Response-Daten zurück.
URL: GET /public_api/<token>/items/log
Request-Parameter (Query-String)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
taskId | String | Ja | Task-ID aus GET /items/logs |
Beispiel-Request
curl -X GET "https://meinefirma.scanalot.io/public_api/<token>/items/log?itemId=123&taskId=a1b2c3" \
-H "Authorization: <api-token>"
Erfolgreiche Antwort
{
"valid": true,
"data": {
"itemId": 123,
"taskId": "a1b2c3",
"market": "amazon",
"account": "DE Marketplace",
"sendData": "{...}",
"responseData": "{...}",
"inserted": 1700000000
}
}
Fehler-Antwort
{ "valid": false, "error": "Eintrag nicht gefunden" }
POST /items/image_upload
Lädt ein Bild (JPG/PNG) hoch und ordnet es dem Artikel zu. Der Request muss multipart/form-data sein.
URL: POST /public_api/<token>/items/image_upload
Request-Felder (multipart/form-data)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID (Variante oder Hauptartikel) |
file | File | Ja | Bild-Datei (image/jpeg, image/png oder image/jpg) |
Beispiel-Request
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/image_upload" \
-H "Authorization: <api-token>" \
-F "itemId=123" \
-F "file=@/pfad/zum/bild.jpg"
Erfolgreiche Antwort
{
"valid": true,
"path": "/documents/files/<hash>/<hash>_bild.jpg"
}
Fehler-Antworten
{ "valid": false, "error": "Filetype not allowed" }
{ "valid": false, "error": "cant upload file" }
DELETE /items/image
Entfernt ein hochgeladenes Artikel-Bild. Die zugehörige Datei im Dateisystem wird mit gelöscht.
URL: DELETE /public_api/<token>/items/image
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Artikel-ID |
imageName | String | Ja | Dateiname wie in GET /items unter images[].imageName zurückgegeben |
Beispiel-Request
curl -X DELETE "https://meinefirma.scanalot.io/public_api/<token>/items/image" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{ "itemId": 123, "imageName": "abc_bild.jpg" }'
Erfolgreiche Antwort
{ "valid": true }
Fehler-Antwort
{ "valid": false, "error": "Image not found" }
POST /items/bundle
Legt eine Bundle-Komponente an oder aktualisiert deren Menge. Der Zielartikel wird dadurch zum Bundle, die Komponente wird als Bundle-Bestandteil markiert.
URL: POST /public_api/<token>/items/bundle
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Bundle-Artikel-ID (der zusammengesetzte Artikel) |
bundleItemId | Integer | Ja* | Komponenten-Artikel-ID |
sku | String | Ja* | SKU der Komponente (Alternative zu bundleItemId) |
quantity | Integer | Nein | Menge der Komponente im Bundle. Standard 1, muss > 0 sein |
*Entweder bundleItemId oder sku muss angegeben werden.
Beispiel-Request
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/bundle" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{ "itemId": 500, "sku": "T-SHIRT-001-M", "quantity": 2 }'
Erfolgreiche Antwort
{ "valid": true }
Fehler-Antworten
{ "valid": false, "error": "Menge darf nicht kleiner als 1 sein" }
{ "valid": false, "error": "Kein Artikel gefunden" }
DELETE /items/bundle
Entfernt eine Bundle-Komponente. Hat das Bundle nach dem Entfernen keine Komponenten mehr, wird isBundle zurückgesetzt. Analog bei der Komponente mit isBundleComponent, falls sie Teil keines anderen Bundles mehr ist.
URL: DELETE /public_api/<token>/items/bundle
Request-Body (JSON)
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
itemId | Integer | Ja | Bundle-Artikel-ID |
bundleItemId | Integer | Ja | Komponenten-Artikel-ID |
Beispiel-Request
curl -X DELETE "https://meinefirma.scanalot.io/public_api/<token>/items/bundle" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{ "itemId": 500, "bundleItemId": 124 }'
Erfolgreiche Antwort
{ "valid": true }
Artikel-Stammdaten
Alle Stammdaten-Endpunkte folgen dem gleichen Schema:
GETlistet alle Einträge oder einen einzelnen Eintrag peridPOSTlegt einen neuen Eintrag an (id = "new") oder aktualisiert einen bestehendenDELETElöscht den Eintrag per URL-Parameter
Alle Antworten enthalten valid sowie bei GET das Feld data als Array.
Status
Verwaltet die Artikel-Status (Freigabestatus für Marktplatz-Export, z.B. „Aktiv", „Entwurf", „Archiviert"). Zugehörige Seite im Backend: Artikel → Status.
GET /items/status
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Status-ID. Ohne id werden alle Status geliefert |
{
"valid": true,
"data": [
{ "statusId": 1, "name": "Aktiv", "statusColor": "#28a745", "textColor": "#ffffff" }
]
}
POST /items/status
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
statusId | Integer | Ja | Status-ID (bestehend oder neu, es wird upsert genutzt) |
name | String | Ja | Anzeigename |
statusColor | String | Nein | Hintergrundfarbe als HEX-Code |
textColor | String | Nein | Textfarbe als HEX-Code |
Beispiel-Request:
curl -X POST "https://meinefirma.scanalot.io/public_api/<token>/items/status" \
-H "Authorization: <api-token>" \
-H "Content-Type: application/json" \
-d '{ "statusId": 10, "name": "Entwurf", "statusColor": "#6c757d", "textColor": "#ffffff" }'
DELETE /items/status/{id}
curl -X DELETE "https://meinefirma.scanalot.io/public_api/<token>/items/status/10" \
-H "Authorization: <api-token>"
Attribute
Varianten-Attribute (z.B. „Größe", „Farbe"). Werden an Varianten über POST /items als item.variants[].attributes[] zugeordnet. Backend-Seite: Artikel → Attribute.
GET /items/attributes
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Attribut-ID |
{
"valid": true,
"data": [
{ "id": 1, "name": "Größe" },
{ "id": 2, "name": "Farbe" }
]
}
POST /items/attributes
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer oder "new" | Ja | Attribut-ID oder "new" |
name | String | Ja | Attribut-Name |
DELETE /items/attributes/{id}
Löscht das Attribut und entfernt es gleichzeitig aus allen Varianten (scanalot_items_attributes wird mit attributeId = id bereinigt).
Eigenschaften
Freie Artikel-Eigenschaften (z.B. „Material", „Gewicht laut Hersteller"). Werden an Artikel über POST /items als item.properties[] zugeordnet. Backend-Seite: Artikel → Eigenschaften.
GET /items/properties
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Eigenschafts-ID |
order | Integer | Nein | 1 = alphabetisch nach name sortieren |
{
"valid": true,
"data": [
{ "id": 1, "name": "Material" }
]
}
POST /items/properties
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer oder "new" | Ja | Eigenschafts-ID oder "new" |
name | String | Ja | Name |
DELETE /items/properties/{id}
Löscht die Eigenschaft und alle zugeordneten Werte (scanalot_item_properties_values wird mit propertieId = id bereinigt).
Hersteller
Hersteller-Stammdaten. Zuordnung an Artikeln über item.manufacturerId in POST /items. Backend-Seite: Artikel → Hersteller.
GET /items/manufacturer
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Hersteller-ID |
{
"valid": true,
"data": [
{ "id": 1, "name": "Markenname" }
]
}
POST /items/manufacturer
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer oder "new" | Ja | Hersteller-ID oder "new" |
name | String | Ja | Herstellername |
DELETE /items/manufacturer/{id}
Löscht den Hersteller und setzt bei allen Artikeln mit diesem Hersteller manufacturerId = 0 zurück.
Barcodes (Barcode-Typen)
Barcode-Typen (z.B. „EAN", „ASIN", „Hersteller-SKU"). Werden an Artikel über POST /items als item.barcodes[] zugeordnet. Backend-Seite: Artikel → Barcodes.
GET /items/barcodes
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Barcode-Typ-ID |
{
"valid": true,
"data": [
{ "id": 1, "name": "EAN" },
{ "id": 2, "name": "ASIN" }
]
}
POST /items/barcodes
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer oder "new" | Ja | Barcode-Typ-ID oder "new" |
name | String | Ja | Name |
DELETE /items/barcodes/{id}
Löscht den Barcode-Typ. Zugeordnete Artikel-Barcodes mit diesem Typ werden mit entfernt.
Verkaufspreise (Preis-Typen)
Preis-Typen (z.B. „UVP", „Amazon DE", „eBay"). Werden an Artikel über POST /items als item.salesPrices[] zugeordnet. Backend-Seite: Artikel → Verkaufspreise.
GET /items/sales_prices
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer | Nein | Filter nach Preis-Typ-ID |
{
"valid": true,
"data": [
{ "id": 1, "name": "UVP" },
{ "id": 2, "name": "Amazon DE" }
]
}
POST /items/sales_prices
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
id | Integer oder "new" | Ja | Preis-Typ-ID oder "new" |
name | String | Ja | Name |
DELETE /items/sales_prices/{id}
Löscht den Preis-Typ. Zugeordnete Artikel-Preise mit diesem Typ werden mit entfernt.