# Einträge

Die Methoden dieser Seite arbeiten mit den Einträgen einer Liste. Feldwerte werden im Objekt `data` übergeben: Der Schlüssel ist der `slug` des Feldes, der Wert hat das Format seines Typs. Die Formate aller Typen stehen auf der Seite [Listen](https://support.watbot.org/de/api/lists#feldtypen).

## getListItems

Gibt die Einträge einer Liste seitenweise zurück — mit Filter nach Feldwerten und Sortierung.

```endpoint
GET POST https://watbot.org/de/api/v1/getListItems
```

| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `schema_id` | String | ja | ID der Liste |
| `limit` | Ganzzahl | nein | Einträge pro Seite — 1 bis 1000, standardmäßig 50 |
| `page` | Ganzzahl | nein | Seitennummer, standardmäßig `1` |
| `order_by` | String | nein | Sortierung: `slug` des Feldes und Richtung, durch Komma getrennt — `preis,desc`. Die Richtung ist `asc` (aufsteigend, Standard) oder `desc`. Sortieren lässt sich auch nach `created_at` und `updated_at`. Ein anderes Feld oder eine andere Richtung — `422` |
| `filters` | Objekt | nein | Filter nach Feldwerten — siehe unten |
| `contact_id` | Ganzzahl | nein | Nur Einträge, die über ein Feld vom Typ `contact` mit diesem Kontakt verknüpft sind |
| `bot_id` | Ganzzahl | nein | Nur Einträge, die über ein Feld vom Typ `bot` mit diesem Bot verknüpft sind |

Zum Beispiel Latte ab 250 ml, die größten zuerst:

```bash title="Anfrage"
curl -X POST "https://watbot.org/de/api/v1/getListItems" \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "schema_id": "6650a1f2c3d4e5f6a7b8c9d0",
    "filters": {"volumen": ">=,250", "bezeichnung": "like,%latte%"},
    "order_by": "volumen,desc",
    "limit": 20
  }'
```

```json title="Antwort 200"
{
  "data": [
    {
      "id": "6650b7a1c3d4e5f6a7b8c9e1",
      "created_at": "2026-10-03T08:05:00+00:00",
      "updated_at": "2026-10-03T08:05:00+00:00",
      "bezeichnung": "Latte mit Hafermilch",
      "preis": 4.6,
      "foto": {
        "type": "image",
        "mime_type": "image/jpeg",
        "created_at": null,
        "name": "latte.jpg",
        "size": 0,
        "storage": "url",
        "caption": null,
        "meta": {"width": null, "height": null, "duration": null, "codec": null},
        "url": "https://example.com/karte/latte.jpg"
      },
      "verfuegbar": true,
      "volumen": 350
    }
  ],
  "links": {
    "first": "…/v1/getListItems?page=1",
    "last": "…/v1/getListItems?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "…/v1/getListItems",
    "per_page": 20,
    "to": 1,
    "total": 1
  }
}
```

```json title="Antwort 422"
{
  "message": "The limit field must not be greater than 1000.",
  "errors": {
    "limit": ["The limit field must not be greater than 1000."]
  }
}
```

Jeder Eintrag enthält `id`, `created_at`, `updated_at` und die Werte aller Felder der Liste, auch der ausgeblendeten und der verschlüsselten (entschlüsselt). Ist ein Eintrag mit einem Kontakt oder Bot verknüpft, enthält er zusätzlich `contact_id` oder `bot_id`.

### Filter

In `filters` ist der Schlüssel der `slug` des Feldes und der Wert eines von beiden:

- `"Wert"` oder einfach ein JSON-Wert — das Feld ist gleich dem Wert: `{"bezeichnung": "Cappuccino"}`, `{"volumen": 250}`, `{"verfuegbar": true}`;
- `"Operator,Wert"` — ein Vergleich: `{"volumen": ">=,250"}`.

| Operator | Bedeutung |
|---|---|
| `=` | gleich |
| `!=`, `<>` | ungleich |
| `<`, `<=`, `>`, `>=` | kleiner, kleiner oder gleich, größer, größer oder gleich |
| `like` | passt zum Muster: `%` — beliebige Zeichen, `_` — ein Zeichen. Groß- und Kleinschreibung spielen keine Rolle. Ohne `%` muss der ganze Wert übereinstimmen |
| `not like` | passt nicht zum Muster |

Ein Operator wird nur erkannt, wenn der Text vor dem ersten Komma ein Operator aus der Tabelle ist. Sonst ist der ganze String der Wert: `{"bezeichnung": "Flat White, groß"}` findet den Eintrag „Flat White, groß“. Beginnt der Wert selbst mit einem Operator und einem Komma, etwa `">, 5"`, geben Sie den Operator ausdrücklich an: `"=,>, 5"`.

Bedingungen für verschiedene Felder werden mit „und“ verknüpft.

Wie der Wert verglichen wird, hängt vom Feldtyp ab:

| Feldtyp | Wert im Filter | Operatoren |
|---|---|---|
| `string` | Text. Eine JSON-Zahl wird als Text verglichen | alle |
| `number` | Eine Zahl: `250`, `"250"`, `"4.5"` | alle außer `like` und `not like` |
| `money` | Ein Betrag in Haupteinheiten, wie beim Schreiben: `5` oder `"4.99"` | alle außer `like` und `not like` |
| `bool` | `true`, `false`, `"true"`, `"false"`, `1`, `0` | `=`, `!=` |
| `date` | Ein Datum: `"2026-10-15"`. Verglichen wird der Tag in UTC: `"2026-10-15"` findet auch einen Eintrag vom 15. Oktober, 14:30, und `"<=,2026-10-15"` alles bis zum Ende dieses Tages | alle außer `like` und `not like` |
| `datetime` | Datum und Uhrzeit: `"2026-10-15 14:30"` oder `"2026-10-15T14:30:00+02:00"`. Eine Uhrzeit ohne Zeitzone gilt als UTC | alle außer `like` und `not like` |
| `contact`, `bot` | ID des Kontakts oder Bots | alle außer `like` und `not like` |

Ein Muster für `like` und `not like` darf höchstens 255 Zeichen lang sein und höchstens 10 `%`-Zeichen enthalten; mehrere `%` hintereinander zählen als eines.

Ein Wert, der nicht zum Feld passt (Text in einem `number`-Feld, `like` bei einem Betrag, ein Objekt statt eines Wertes), — `422` mit einem Fehler an `filters.<slug>`. Ist `filters` kein Objekt, steht der Fehler an `filters`.

Eine Bedingung wird ohne Fehlermeldung übersprungen, wenn die Liste kein Feld mit diesem `slug` hat, das Feld verschlüsselt ist, es eine Datei oder ein Bild ist oder der Wert `null` ist.

In einer `GET`-Anfrage wird der Filter in der Adresse übergeben: `filters[volumen]=>=,250`. Sonderzeichen müssen kodiert werden: `%` als `%25`.

### Seiten

Die Gesamtzahl der Einträge und Seiten steht in `meta.total` und `meta.last_page`, die Adresse der nächsten Seite in `links.next` (`null` auf der letzten). Ohne `order_by` ist die Reihenfolge der Einträge nicht festgelegt: Wenn Sie Seite für Seite durchgehen, geben Sie eine Sortierung an, zum Beispiel `created_at`.

Fehler:

- Die Liste existiert nicht — `404`: `{"message": "Schema not found", "error": "Schema not found", "errors": {"schema_id": ["Schema not found"]}}`.
- Die Liste gehört zu einem fremden Projekt — `403`.
- Ungültige Angaben in `order_by` oder `filters` — `422`.

## addListItem

Legt einen Eintrag in einer Liste an.

```endpoint
GET POST https://watbot.org/de/api/v1/addListItem
```

| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `schema_id` | String | ja | ID der Liste |
| `data` | Objekt | ja | Feldwerte: Der Schlüssel ist der `slug`, der Wert hat das Format des Feldtyps |

```bash title="Anfrage"
curl -X POST "https://watbot.org/de/api/v1/addListItem" \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "schema_id": "6650a1f2c3d4e5f6a7b8c9d0",
    "data": {
      "bezeichnung": "Cappuccino",
      "preis": 3.9,
      "foto": {
        "url": "https://example.com/karte/cappuccino.jpg",
        "storage": "url",
        "name": "cappuccino.jpg",
        "type": "image"
      },
      "verfuegbar": true,
      "volumen": 300
    }
  }'
```

```json title="Antwort 201"
{
  "data": {
    "id": "6650b7a1c3d4e5f6a7b8c9e2",
    "created_at": "2026-10-03T08:10:00+00:00",
    "updated_at": "2026-10-03T08:10:00+00:00",
    "bezeichnung": "Cappuccino",
    "preis": 3.9,
    "foto": {
      "type": "image",
      "mime_type": null,
      "created_at": null,
      "name": "cappuccino.jpg",
      "size": 0,
      "storage": "url",
      "caption": null,
      "meta": {"width": null, "height": null, "duration": null, "codec": null},
      "url": "https://example.com/karte/cappuccino.jpg"
    },
    "verfuegbar": true,
    "volumen": 300
  }
}
```

```json title="Antwort 422"
{
  "message": "The data.bezeichnung field is required.",
  "errors": {
    "data.bezeichnung": ["The data.bezeichnung field is required."]
  }
}
```

Besonderheiten und Fehler:

- Pflichtfelder (`is_required: true`) müssen ausgefüllt sein, sonst `422`. Felder, die in `data` fehlen, bleiben leer. Schlüssel, die keine Felder der Liste sind, werden ignoriert.
- Ein Wert vom falschen Typ — `422` mit einem Fehler an `data.<slug>`: zum Beispiel Text in einem `number`-Feld oder die ID eines nicht existierenden Kontakts.
- Ein fremder Kontakt oder fremder Bot in den Feldern `contact` und `bot` — `403`.
- Datumswerte kommen in der Antwort als String in UTC, wie bei `getListItems`: `"2026-10-15T00:00:00.000000Z"`.
- Die Liste existiert nicht — `404`, wie bei `getListItems`; die Liste gehört zu einem fremden Projekt — `403`.

## updateListItem

Ändert die Feldwerte eines Eintrags. Felder, die in `data` fehlen, bleiben unverändert.

```endpoint
GET POST https://watbot.org/de/api/v1/updateListItem
```

| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `item_id` | String | ja | ID des Eintrags |
| `data` | Objekt | ja | Neue Feldwerte: Der Schlüssel ist der `slug`, der Wert hat das Format des Feldtyps |

Zum Beispiel ein neuer Preis und die Kennzeichnung „nicht verfügbar“:

```bash title="Anfrage"
curl -X POST "https://watbot.org/de/api/v1/updateListItem" \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "item_id": "6650b7a1c3d4e5f6a7b8c9e2",
    "data": {"preis": 4.2, "verfuegbar": false}
  }'
```

```json title="Antwort 200"
{
  "data": {
    "id": "6650b7a1c3d4e5f6a7b8c9e2",
    "created_at": "2026-10-03T08:10:00+00:00",
    "updated_at": "2026-10-03T09:30:00+00:00",
    "bezeichnung": "Cappuccino",
    "preis": 4.2,
    "foto": {
      "type": "image",
      "mime_type": null,
      "created_at": null,
      "name": "cappuccino.jpg",
      "size": 0,
      "storage": "url",
      "caption": null,
      "meta": {"width": null, "height": null, "duration": null, "codec": null},
      "url": "https://example.com/karte/cappuccino.jpg"
    },
    "verfuegbar": false,
    "volumen": 300
  }
}
```

```json title="Antwort 404"
{
  "message": "Item not found",
  "error": "Item not found",
  "errors": {
    "item_id": ["Item not found"]
  }
}
```

Die Antwort enthält den ganzen Eintrag.

Besonderheiten und Fehler:

- Geprüft werden nur die übergebenen Felder. Ein Pflichtfeld darf nicht leer übergeben werden — `422`.
- Ein Feld leeren können Sie mit dieser Methode nicht: `null` und leere Werte werden übersprungen, das Feld behält seinen bisherigen Wert.
- Datumswerte kommen in der Antwort als String in UTC, wie bei `getListItems`.
- Der Eintrag existiert nicht, wurde gelöscht oder seine Liste wurde gelöscht — `404`. Der Fehlertext steht in `error` und `message`; aus Kompatibilitätsgründen auch in `errors.item_id`.
- Der Eintrag gehört zu einer Liste in einem fremden Projekt — `403`.

## deleteListItem

Löscht einen Eintrag.

```endpoint
GET POST https://watbot.org/de/api/v1/deleteListItem
```

| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `item_id` | String | ja | ID des Eintrags |

```bash title="Anfrage"
curl -X POST "https://watbot.org/de/api/v1/deleteListItem" \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"item_id": "6650b7a1c3d4e5f6a7b8c9e2"}'
```

```json title="Antwort 404"
{
  "message": "Item not found",
  "error": "Item not found",
  "errors": {
    "item_id": ["Item not found"]
  }
}
```

Eine erfolgreiche Antwort hat den Code `204` und keinen Inhalt.

Fehler:

- Der Eintrag existiert nicht, wurde bereits gelöscht oder seine Liste wurde gelöscht — `404`, wie bei [`updateListItem`](#updatelistitem).
- Der Eintrag gehört zu einer Liste in einem fremden Projekt — `403`.
