> ## Documentation Index
> Fetch the complete documentation index at: https://docs.armin.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# Pagination

> Cursor-basierte Pagination für Ticket-, View- und Nachrichtenlisten.

Alle Public API v1 Listen nutzen **Cursor-Pagination**. Es gibt keinen `page`- oder `offset`-Parameter.

## Parameter

| Parameter | Default                                 | Max | Beschreibung                            |
| --------- | --------------------------------------- | --- | --------------------------------------- |
| `limit`   | 40 (Tickets), 50 (Views), 30 (Messages) | 100 | Seitengröße                             |
| `cursor`  | —                                       | —   | Opaker Token aus der vorherigen Antwort |

## Response-Form

```json theme={null}
{
  "success": true,
  "data": [ ... ],
  "pagination": {
    "has_more": true,
    "next_cursor": "2026-07-20T10:00:00.000Z|019b0e3d-e88a-715c-b540-ea11ac058052"
  }
}
```

| Feld          | Bedeutung                                                       |
| ------------- | --------------------------------------------------------------- |
| `has_more`    | `true`, wenn eine weitere Seite existiert                       |
| `next_cursor` | Als `cursor` im nächsten Request; fehlt oder `null` wenn fertig |

<Tip>
  Ticket-Listen haben **keine Gesamtanzahl**. Für „Wie viele Tickets passen zum Filter?“ nutze `count` einer gespeicherten Ansicht aus `GET /views`.
</Tip>

## Walkthrough — Tickets paginieren

**Seite 1:**

```bash theme={null}
curl -sS -H "cx-api-key: $KEY" \
  "https://api.armin.cx/public/v1/tickets?limit=40"
```

**Seite 2** (`next_cursor` aus Seite 1):

```bash theme={null}
curl -sS -H "cx-api-key: $KEY" \
  "https://api.armin.cx/public/v1/tickets?limit=40&cursor=2026-07-20T10:00:00.000Z%7C019b..."
```

URL-kodiere den Cursor, wenn er `|` oder andere Sonderzeichen enthält.

**Stopp**, wenn `has_more` `false` ist oder `next_cursor` fehlt.

## Views und Messages

Gleiches Muster für:

* `GET /public/v1/views` — Default `limit=50`
* `GET /public/v1/tickets/:ticketNumber/messages` — Default `limit=30`, `order=asc` für chronologische Threads

## Anti-Pattern — Offset-Polling

**Nicht** mit Offset oder ständigem Neu-Laden von Seite 1 arbeiten:

```bash theme={null}
# ❌ Falsch — v1 hat keinen page/offset-Parameter
GET /public/v1/tickets?page=2

# ❌ Falsch — verschwendet Requests, kann bei parallelen Writes duplizieren oder Lücken erzeugen
while true; do GET /public/v1/tickets?limit=40; sleep 1; done
```

Stattdessen:

1. `next_cursor` aus jeder Antwort speichern.
2. Nächste Seite nur bei `has_more: true`.
3. Bei [Rate Limits](/de/api/rate-limits) (`429`) backoff.

## Cursor-Stabilität

Cursor sind opak und an die Sortierung gebunden (`created_at` desc bei Tickets). Nicht manuell parsen oder bauen — immer den von der API gelieferten Wert verwenden.

Ist ein Cursor ungültig, starte ohne `cursor` neu.
