# Documenten pushen vanuit jouw eigen systemen
Source: https://nordvec.com/nl/docs/guides/how-to/push-documents#vervang-een-volledige-gegevensbron

## Vervang een volledige gegevensbron [#vervang-een-volledige-gegevensbron]

Als jouw systeem alles kan opsommen wat een gegevensbron moet bevatten, stuur dan de volledige lijst als één **uploadsessie**, en de documenten die er niet meer in staan, worden naar de prullenbak verplaatst wanneer de sessie sluit. Sessies hebben een indexing API-sleutel nodig die zowel `index:delete` als `index:write` bevat, omdat het sluiten documenten verwijdert; de sleutel die een sessie opent, is de enige die deze kan voortzetten.

1. Stuur de eerste pagina met `"isFirstPage": true`. Dit is pagina `0`.
2. Stuur elke volgende pagina met zijn `pageIndex` (`1`, `2`, ...), in willekeurige volgorde.
   Een pagina die twee keer wordt verstuurd, telt één keer, dus een herhaling is altijd veilig.
3. Stuur de laatste pagina met `"isLastPage": true` en zijn `pageIndex`. Een lijst die in één pagina past, verstuurt `isFirstPage` en `isLastPage` samen. De laatste pagina mag geen documenten bevatten.

Elke pagina gebruikt dezelfde `uploadId`, en elk antwoord bevat de voortgang van de sessie onder `upload`. De sessie sluit pas wanneer elke pagina van `0` tot de laatste is aangekomen. Het sluiten verplaatst elk document in de gegevensbron dat geen enkele pagina van de sessie heeft genoemd en dat bestond voordat de sessie werd geopend, naar de prullenbak. Elke andere push naar de gegevensbron terwijl de sessie loopt, behoudt het document dat het noemt: een enkele push, een batch zonder sessievelden, een machtigingenupdate en een her-push van ongewijzigde inhoud. De prullenbak bewaart wat het sluiten ernaartoe heeft verplaatst voor 30 dagen; het opnieuw pushen van een document haalt het terug, net als het herstellen van de hele sessie (zie hieronder).

Een sessie die 24 uur lang geen pagina ontvangt, verloopt en wordt afgesloten zonder iets te verwijderen. Een geweigerde pagina krijgt een antwoord met `409 Conflict`, schrijft niets weg, en de `data.reason` geeft aan waarom:

| `reason`                                               | Wat te doen                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_incomplete`                                    | Stuur de pagina's vermeld in `missingPageIndexes`, en daarna de laatste pagina opnieuw                                                                                                                                                                                                                                                                         |
| `deletion_confirmation_required`                       | Het sluiten zou meer dan 20% van de gegevensbron naar de prullenbak verplaatsen. Als dat juist is, stuur de laatste pagina opnieuw met `"confirmDeletions"` ingesteld op `wouldTombstone`                                                                                                                                                                      |
| `deletion_confirmation_too_large`                      | `confirmDeletions` is groter dan het aantal documenten dat de gegevensbron bevatte toen de sessie werd geopend. Stuur het aantal dat je verwacht te verwijderen                                                                                                                                                                                                |
| `upload_in_progress`                                   | Er is een sessie actief op deze gegevensbron. Als het jouw sleutel is, voltooi deze, wacht tot deze verloopt, of begin opnieuw met `"forceRestartUpload": true` op jouw eerste pagina. Als een andere sleutel deze heeft geopend, vervangt `forceRestartUpload` deze pas nadat er een uur lang geen pagina is ontvangen, vanaf het tijdstip in `restartableAt` |
| `upload_expired`, `upload_missing`, `upload_restarted` | De sessie is verdwenen; start een nieuwe met een nieuwe `uploadId`                                                                                                                                                                                                                                                                                             |
| `upload_closed`, `upload_id_reused`                    | De `uploadId` is verbruikt; gebruik een nieuwe                                                                                                                                                                                                                                                                                                                 |
| `page_index_required`                                  | Jouw sleutel heeft een sessie actief op deze gegevensbron; stuur `pageIndex` met de pagina                                                                                                                                                                                                                                                                     |

Om na een crash verder te gaan, lees de sessie uit met `GET /documents/push/upload?tenantId=...&datasource=...&uploadId=...` (scope `index:status`). De `missingPageIndexes` vermeldt de pagina's die nog moeten worden verstuurd.

### Ongedaan maken van het sluiten van een sessie [#ongedaan-maken-van-het-sluiten-van-een-sessie]

Als een sessie documenten heeft verwijderd die niet verwijderd hadden mogen worden, bijvoorbeeld omdat de lijst die het heeft verzonden onvolledig was, herstel ze dan in één aanroep:

```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" }'
```

De sleutel die de sessie heeft geopend, kan deze herstellen, en dat geldt ook voor een beheerder van de werkruimte die is ingelogd op Nordvec, voor een sessie die is geopend door elke sleutel. Elk document dat het sluiten naar de prullenbak heeft verplaatst, komt terug met de inhoud die het had, en het antwoord telt ze: `restored` zijn weer live, `purged` waren al definitief verwijderd door de prullenbak, en `skipped` zijn veranderd sinds het sluiten (opnieuw gepusht, of opnieuw verwijderd) en zijn ongewijzigd gelaten. Het tweemaal herstellen van een sessie antwoordt met de aantallen van de eerste herstelactie en `"replayed": true`, en zet elk hersteld document dat nog wacht om geïndexeerd te worden in de wachtrij, dus het herhalen van een herstelactie die niet heeft geantwoord, is veilig. Een sessie kan tot 35 dagen na het sluiten worden hersteld, en zolang de prullenbak nog een document bevat dat deze heeft verwijderd. Een geweigerd herstel wordt beantwoord met `409 Conflict` en de `data.reason`:

| `reason`                 | Wat het betekent                                                                                                                                                                                                                                 |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `upload_not_closed`      | De sessie is nooit gesloten, dus er is niets verwijderd                                                                                                                                                                                          |
| `upload_in_progress`     | Er is een sessie actief op de gegevensbron. Herstel deze nadat deze is gesloten of verlopen                                                                                                                                                      |
| `restore_purged`         | Er zijn meer dan 30 dagen verstreken en de prullenbak heeft elk document verwijderd. Push ze opnieuw                                                                                                                                             |
| `workspace_not_entitled` | Het abonnement van de werkruimte staat momenteel niet toe om uit de prullenbak te herstellen                                                                                                                                                     |
| `corpus_cap_exceeded`    | Het terugbrengen van de documenten zou de documentlimiet van de werkruimte overschrijden, dus er is er geen teruggekomen. `data.wouldRestore` is hoeveel er nodig zijn en `data.headroom` hoeveel er passen. Maak ruimte vrij en herstel opnieuw |