Waren abrufen
Gibt eine paginierte Liste aller Waren und Leistungen des Unternehmens zurück, sortiert nach interner ID aufsteigend. Mit gesetztem term sortiert die Liste stattdessen nach Relevanz.
Request
GET /api/oauth/v2/resource/wares
Header
| Header | Wert |
|---|---|
Authorization | Bearer {access_token} |
Query-Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offset | integer | Nein | Startposition (Standard: 0) |
limit | integer | Nein | Anzahl Ergebnisse (Standard: 50, Max: 200) |
type | string | Nein | Filtert auf ware oder service |
status | string | Nein | Filtert nach Status. Erlaubte Werte: active, archived, deleted, all. Kommagetrennte Mehrfachwerte möglich, Standard all. Siehe Konventionen |
categoryId | string (UUID) | Nein | Nur Waren einer bestimmten Kategorie zurückgeben |
term | string | Nein | Freitextsuche über Name, interne Nummer und Nummer |
Hinweis:
/waresunterstützt keine inkrementellen Filter (updatedSince,deletedSinceo.ä.). Stammdatenänderungen wie Preis, Name oder Kategorie erkennst du nur über einen periodischen Vollabgleich. Für Bestandsänderungen brauchst du keinen Vollabgleich von/waresselbst: Jede Bestandsänderung erzeugt eine Lagerbewegung, undstockNewder jüngsten Bewegung je Ware trägt den aktuellen Bestand. Für die Bestandsverfolgung kannst du/wares/movementsmitcreatedSince/createdUntilinkrementell abfragen.
Response
Erfolg (200 OK)
Beispiel: mit lizenzierter Lagerverwaltung
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Hyaluronsäure-Serum",
"description": "30 ml Serum für die tägliche Anwendung",
"number": "1042",
"internalNumber": "HYA-030",
"type": "ware",
"price": 39.90,
"vat": 20,
"color": "#00adba",
"sellable": true,
"deliverable": true,
"invoiceSortIndex": 0,
"archived": false,
"deleted": false,
"category": "d4e5f6a7-b8c9-0123-defa-123456789012",
"groups": [{ "name": "Aktion" }],
"storages": ["f6a7b8c9-d0e1-2345-fabc-345678901234"],
"distributors": ["b2c3d4e5-f6a7-8901-bcde-f12345678901"],
"tenancies": ["f0e1d2c3-b4a5-6789-fedc-ba9876543210"],
"stock": {
"stockEffective": 24,
"stockAvailable": 22,
"stockMinimum": 5,
"stockTarget": 30,
"purchasingPriceNet": 18.50,
"sellingPriceNet": 33.25,
"unit": "Stück",
"unitBase": 1,
"unitBaseSign": false,
"deliveryNotice": null,
"storageNotice": null,
"distributorNotice": null
}
}
],
"meta": {
"total": 128,
"offset": 0,
"limit": 50
}
}Beispiel: ohne lizenzierte Lagerverwaltung
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Hyaluronsäure-Serum",
"description": "30 ml Serum für die tägliche Anwendung",
"number": "1042",
"internalNumber": "HYA-030",
"type": "ware",
"price": 39.90,
"vat": 20,
"color": "#00adba",
"sellable": true,
"deliverable": true,
"invoiceSortIndex": 0,
"archived": false,
"deleted": false,
"category": "d4e5f6a7-b8c9-0123-defa-123456789012",
"groups": [],
"storages": [],
"distributors": [],
"tenancies": ["f0e1d2c3-b4a5-6789-fedc-ba9876543210"]
}
],
"meta": {
"total": 128,
"offset": 0,
"limit": 50
}
}Hinweis: Ohne die Lizenz Lagerverwaltung fehlt der Schlüssel
stockim Response-Objekt komplett – er ist nichtnull. Prüfe in deiner Integration auf das Vorhandensein des Schlüssels, nicht auf seinen Wert.
Hinweis: Der
stock-Block enthält kein Feld für offene Bestellungen. Ob für eine Ware eine offene Bestellung existiert, ermittelst du überGET /wares/purchases?wareId={uuid}.
Response-Felder
| Feld | Typ | Beschreibung |
|---|---|---|
data | Array | Liste der Waren |
data[].id | string (UUID) | Eindeutige ID der Ware |
data[].name | string | Name der Ware |
data[].description | string | null | Beschreibungstext |
data[].number | string | null | Artikelnummer |
data[].internalNumber | string | null | Interne Nummer |
data[].type | string | ware oder service |
data[].price | number | null | Verkaufspreis (brutto) |
data[].vat | number | Umsatzsteuersatz in Prozent (z.B. 20) |
data[].color | string | Farbe als Hex-Code |
data[].sellable | boolean | Ob die Ware verkäuflich ist |
data[].deliverable | boolean | Ob die Ware lieferbar ist |
data[].invoiceSortIndex | integer | Sortierposition auf der Rechnung |
data[].archived | boolean | Ob die Ware archiviert ist |
data[].deleted | boolean | Ob die Ware gelöscht ist |
data[].category | string (UUID) | null | ID der zugeordneten Warenkategorie, nachladbar über Warenkategorie anzeigen |
data[].groups | Array | Zugeordnete Schnellauswahl-Gruppen |
data[].groups[].name | string | Name der Schnellauswahl-Gruppe (keine id, da Gruppen keine UUID haben) |
data[].storages | Array<string (UUID)> | IDs der zugeordneten Lagerorte, nachladbar über Lagerort anzeigen |
data[].distributors | Array<string (UUID)> | IDs der zugeordneten Lieferanten, nachladbar über Lieferant anzeigen |
data[].tenancies | Array<string (UUID)> | IDs der zugeordneten Mandanten |
data[].stock | object | Nur vorhanden, wenn die Lizenz Lagerverwaltung aktiv ist und der Besitzer-Benutzer deines API-Zugangs die Berechtigung Lagerverwaltung: Anzeigen hat. Fehlt der Schlüssel sonst komplett |
data[].stock.stockEffective | number | Tatsächlicher Bestand |
data[].stock.stockAvailable | number | Verfügbarer Bestand (abzüglich Reservierungen) |
data[].stock.stockMinimum | number | Mindestbestand |
data[].stock.stockTarget | number | Zielbestand |
data[].stock.purchasingPriceNet | number | null | Einkaufspreis (netto) |
data[].stock.sellingPriceNet | number | null | Verkaufspreis (netto) |
data[].stock.unit | string | null | Einheit (z.B. "Stück") |
data[].stock.unitBase | number | null | Basismenge der Einheit |
data[].stock.unitBaseSign | boolean | Kennzeichen der Basiseinheit (Standard: false). Enthält kein Kürzel wie „Stk“ |
data[].stock.deliveryNotice | string | null | Hinweis zur Lieferung |
data[].stock.storageNotice | string | null | Hinweis zur Lagerung |
data[].stock.distributorNotice | string | null | Hinweis zum Lieferanten |
meta.total | integer | Gesamtanzahl der Waren |
meta.offset | integer | Aktuelle Startposition |
meta.limit | integer | Anzahl der zurückgegebenen Einträge |
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/wares?offset=0&limit=50&type=beispiel&status=beispiel&categoryId=b2c3d4e5-f6a7-8901-bcde-f01234567890&term=Muster" \
-H "Authorization: Bearer {access_token}"Mögliche Fehler
| Status | Code | Beschreibung |
|---|---|---|
| 400 | validation_error | Ungültiger Wert für type oder status, oder categoryId ist kein gültiges UUID-Format |
| 401 | invalid_client | Ungültiger oder fehlender Access Token |
| 403 | insufficient_scope | Scope wares nicht vorhanden |