# Dokumente aus deinen eigenen Systemen pushen
Source: https://nordvec.com/de/docs/guides/how-to/push-documents#gesamte-datenquelle-ersetzen

## Gesamte Datenquelle ersetzen [#gesamte-datenquelle-ersetzen]

Wenn dein System alles auflisten kann, was eine Datenquelle enthalten soll, sende die vollständige Liste als eine **Upload-Session**, und die Dokumente, die sie nicht mehr enthält, werden in den Papierkorb verschoben, sobald die Session abgeschlossen ist. Sessions benötigen einen Indexing-API-Schlüssel, der sowohl `index:delete` als auch `index:write` enthält, da das Abschließen Dokumente entfernt; der Schlüssel, der eine Session eröffnet, ist der einzige, der sie fortsetzen kann.

1. Sende die erste Seite mit `"isFirstPage": true`. Das ist Seite `0`.
2. Sende jede weitere Seite mit ihrem `pageIndex` (`1`, `2`, ...), in beliebiger Reihenfolge.
   Eine Seite, die zweimal gesendet wird, zählt einmal, daher ist ein erneuter Versuch immer sicher.
3. Sende die letzte Seite mit `"isLastPage": true` und ihrem `pageIndex`. Eine Auflistung,
   die auf eine Seite passt, sendet `isFirstPage` und `isLastPage` zusammen. Die
   letzte Seite darf keine Dokumente enthalten.

Jede Seite verwendet denselben `uploadId`, und jede Antwort enthält den Fortschritt der Session unter `upload`. Die Session schließt erst, wenn jede Seite von `0` bis zur letzten eingetroffen ist. Durch das Schließen werden alle Dokumente in der Datenquelle, die keine Seite der Session benannt hat und die vor dem Öffnen der Session existierten, in den Papierkorb verschoben. Jeder andere Push in die Datenquelle während der Session läuft, behält das Dokument, das er benennt: ein einzelner Push, ein Batch ohne Session-Felder, eine Aktualisierung der Berechtigungen und ein erneutes Pushen unveränderten Inhalts gleichermaßen. Der Papierkorb behält, was das Schließen dorthin verschoben hat, für 30 Tage; ein erneutes Pushen eines Dokuments holt es zurück, und das Gleiche gilt für das Wiederherstellen der gesamten Session (siehe unten).

Eine Sitzung, die 24 Stunden lang keine Seite erhält, läuft ab und schließt ohne Entfernungen. Eine abgelehnte Seite wird mit `409 Conflict` beantwortet, schreibt nichts und ihr `data.reason` erklärt den Grund:

| `reason`                                               | Was zu tun ist                                                                                                                                                                                                                                                                                                                                                                |
| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_incomplete`                                    | Sende die in `missingPageIndexes` aufgelisteten Seiten, dann die letzte Seite erneut                                                                                                                                                                                                                                                                                          |
| `deletion_confirmation_required`                       | Das Schließen würde mehr als 20 % der Datenquelle in den Papierkorb verschieben. Wenn das korrekt ist, sende die letzte Seite erneut mit `"confirmDeletions"` auf `wouldTombstone` gesetzt                                                                                                                                                                                    |
| `deletion_confirmation_too_large`                      | `confirmDeletions` ist größer als die Anzahl der Dokumente, die die Datenquelle hielt, als die Session geöffnet wurde. Sende die Anzahl, die du entfernen möchtest                                                                                                                                                                                                            |
| `upload_in_progress`                                   | Eine Session ist für diese Datenquelle geöffnet. Wenn es dein Schlüssel ist, beende sie, warte, bis sie abläuft, oder beginne von vorne mit `"forceRestartUpload": true` auf deiner ersten Seite. Wenn ein anderer Schlüssel sie geöffnet hat, ersetzt `forceRestartUpload` sie erst, wenn sie eine Stunde lang keine Seite erhalten hat, ab dem Zeitpunkt in `restartableAt` |
| `upload_expired`, `upload_missing`, `upload_restarted` | Die Session ist verschwunden; starte eine neue mit einem neuen `uploadId`                                                                                                                                                                                                                                                                                                     |
| `upload_closed`, `upload_id_reused`                    | Der `uploadId` ist aufgebraucht; verwende einen neuen                                                                                                                                                                                                                                                                                                                         |
| `page_index_required`                                  | Dein Schlüssel hat eine Session für diese Datenquelle geöffnet; sende `pageIndex` mit der Seite                                                                                                                                                                                                                                                                               |

Um nach einem Absturz fortzufahren, lies die Sitzung mit `GET /documents/push/upload?tenantId=...&datasource=...&uploadId=...` (Bereich `index:status`) aus. Ihr `missingPageIndexes` listet die noch zu sendenden Seiten auf.

### Eine Session-Schließung rückgängig machen [#eine-session-schließung-rückgängig-machen]

Wenn eine Session Dokumente entfernt hat, die nicht entfernt werden sollten, zum Beispiel weil die gesendete Liste unvollständig war, kannst du sie mit einem Aufruf wiederherstellen:

```bash
curl https://nordvec.com/api/v1/documents/push/upload/restore \
  -H "Authorization: Bearer $NORDVEC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tenantId": "YOUR_WORKSPACE_ID", "datasource": "confluence-export", "uploadId": "nightly-2026-09-28" }'
```

Der Schlüssel, der die Sitzung geöffnet hat, kann sie wiederherstellen, und das gilt auch für einen Arbeitsbereich-Admin, der bei Nordvec angemeldet ist, für eine von jedem Schlüssel geöffnete Sitzung. Jedes Dokument, das das Schließen in den Papierkorb verschoben hat, kommt mit dem Inhalt zurück, den es hatte, und die Antwort zählt sie: `restored` sind wieder live, `purged` waren bereits endgültig vom Papierkorb gelöscht, und `skipped` hatten sich seit dem Schließen geändert (erneut gepusht oder erneut entfernt) und blieben unverändert. Das Wiederherstellen einer Sitzung zweimal antwortet mit den Zählungen der ersten Wiederherstellung und `"replayed": true` und stellt jedes wiederhergestellte Dokument, das noch auf die Indexierung wartet, in die Warteschlange, sodass das Wiederholen einer fehlgeschlagenen Wiederherstellung sicher ist. Eine Sitzung kann bis zu 35 Tage nach ihrem Schließen wiederhergestellt werden, und so lange, wie der Papierkorb noch ein Dokument enthält, das sie entfernt hat. Eine abgelehnte Wiederherstellung wird mit `409 Conflict` und ihrem `data.reason` beantwortet:

| `reason`                 | Bedeutung                                                                                                                                                                                                                                                         |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_not_closed`      | Die Sitzung wurde nie abgeschlossen, daher hat sie keine Dokumente entfernt                                                                                                                                                                                       |
| `upload_in_progress`     | Eine Sitzung ist für die Datenquelle geöffnet. Stelle sie wieder her, sobald sie abgeschlossen oder abgelaufen ist                                                                                                                                                |
| `restore_purged`         | Es sind mehr als 30 Tage vergangen, und der Papierkorb hat jedes der Dokumente gelöscht. Pushe sie erneut                                                                                                                                                         |
| `workspace_not_entitled` | Der Plan des Arbeitsbereichs erlaubt derzeit keine Wiederherstellung aus dem Papierkorb                                                                                                                                                                           |
| `corpus_cap_exceeded`    | Das Zurückbringen der Dokumente würde das Dokumentenlimit des Arbeitsbereichs überschreiten, daher kam keines zurück. `data.wouldRestore` ist, wie viele benötigt werden, und `data.headroom`, wie viele passen. Schaffe Platz, dann stelle sie erneut wieder her |