# Poussez des documents depuis vos propres systèmes
Source: https://nordvec.com/fr/docs/guides/how-to/push-documents#remplacer-une-source-de-données-entière

## Remplacer une source de données entière [#remplacer-une-source-de-données-entière]

Lorsque votre système peut lister tout ce qu'une source de données doit contenir, envoyez la liste complète sous la forme d'une **session de téléchargement**, et les documents qu'elle ne contient plus sont déplacés vers la corbeille lorsque la session se ferme. Les sessions nécessitent une clé API d'indexation portant `index:delete` ainsi que `index:write`, car la fermeture supprime des documents ; la clé qui ouvre une session est la seule qui puisse la poursuivre.

1. Envoyez la première page avec `"isFirstPage": true`. Il s'agit de la page `0`.
2. Envoyez chaque page suivante avec son `pageIndex` (`1`, `2`, ...), dans n'importe quel ordre.
   Une page envoyée deux fois n'est comptée qu'une fois, donc une nouvelle tentative est toujours sûre.
3. Envoyez la dernière page avec `"isLastPage": true` et son `pageIndex`. Une liste
   qui tient en une seule page envoie `isFirstPage` et `isLastPage` ensemble. La
   dernière page peut ne contenir aucun document.

Chaque page utilise le même `uploadId`, et chaque réponse contient la progression de la session sous `upload`. La session ne se ferme que lorsque chaque page de `0` à la dernière est arrivée. La fermer déplace vers la corbeille chaque document de la source de données qui n'a pas été nommé par une page de la session et qui existait avant l'ouverture de celle-ci. Toute autre poussée vers la source de données pendant l'exécution de la session conserve le document qu'elle nomme : une poussée unique, un lot sans champs de session, une mise à jour des permissions, et une nouvelle poussée de contenu inchangé de la même manière. La corbeille conserve ce que la fermeture y a déplacé pendant 30 jours ; pousser à nouveau un document le ramène, tout comme la restauration de la session entière (voir ci-dessous).

Une session qui ne reçoit aucune page pendant 24 heures expire et se termine sans rien supprimer. Une page refusée reçoit une réponse `409 Conflict`, n'écrit rien, et son `data.reason` explique pourquoi :

| `reason`                                               | Que faire                                                                                                                                                                                                                                                                                                                                                               |
| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_incomplete`                                    | Envoyez les pages listées dans `missingPageIndexes`, puis envoyez à nouveau la dernière page                                                                                                                                                                                                                                                                            |
| `deletion_confirmation_required`                       | La fermeture déplacerait vers la corbeille plus de 20 % de la source de données. Si cela est correct, envoyez à nouveau la dernière page avec `"confirmDeletions"` défini à `wouldTombstone`                                                                                                                                                                            |
| `deletion_confirmation_too_large`                      | `confirmDeletions` est supérieur au nombre de documents que la source de données contenait lors de l'ouverture de la session. Envoyez le nombre que vous prévoyez de supprimer                                                                                                                                                                                          |
| `upload_in_progress`                                   | Une session est ouverte sur cette source de données. Si c'est votre clé, terminez-la, attendez son expiration ou recommencez avec `"forceRestartUpload": true` sur votre première page. Si une autre clé l'a ouverte, `forceRestartUpload` ne la remplace qu'une fois qu'elle n'a reçu aucune page pendant une heure, à partir de l'heure indiquée dans `restartableAt` |
| `upload_expired`, `upload_missing`, `upload_restarted` | La session a disparu ; commencez-en une nouvelle avec un nouveau `uploadId`                                                                                                                                                                                                                                                                                             |
| `upload_closed`, `upload_id_reused`                    | Le `uploadId` est épuisé ; utilisez-en un nouveau                                                                                                                                                                                                                                                                                                                       |
| `page_index_required`                                  | Votre clé a une session ouverte sur cette source de données ; envoyez `pageIndex` avec la page                                                                                                                                                                                                                                                                          |

Pour reprendre après un plantage, lisez la session avec `GET /documents/push/upload?tenantId=...&datasource=...&uploadId=...` (portée `index:status`). Son `missingPageIndexes` liste les pages encore à envoyer.

### Annuler la fermeture d'une session [#annuler-la-fermeture-dune-session]

Si une session a supprimé des documents qu'elle n'aurait pas dû, par exemple parce que la liste envoyée était incomplète, restaurez-les en un seul appel :

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

La clé qui a ouvert la session peut la restaurer, et un administrateur d'espace de travail connecté à Nordvec peut le faire pour une session ouverte par n'importe quelle clé. Chaque document que la fermeture a déplacé dans la corbeille revient avec son contenu d'origine, et la réponse en compte le nombre : `restored` sont de nouveau actifs, `purged` avaient déjà été définitivement supprimés par la corbeille, et `skipped` avaient changé depuis la fermeture (repoussés ou supprimés à nouveau) et ont été laissés tels quels. Restaurer une session deux fois répond avec les comptes de la première restauration et `"replayed": true`, et met en file d'attente tout document restauré toujours en attente d'indexation. Répéter une restauration qui n'a pas abouti est donc sans risque. Une session peut être restaurée jusqu'à 35 jours après sa fermeture, et tant que la corbeille contient encore un document qu'elle a supprimé. Une restauration refusée est répondue avec `409 Conflict` et son `data.reason` :

| `reason`                 | Signification                                                                                                                                                                                                                                                |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `upload_not_closed`      | La session ne s'est jamais fermée, donc elle n'a rien supprimé                                                                                                                                                                                               |
| `upload_in_progress`     | Une session est ouverte sur la source de données. Restaurez-la une fois qu'elle est fermée ou expirée                                                                                                                                                        |
| `restore_purged`         | Plus de 30 jours se sont écoulés, et la corbeille a supprimé tous les documents. Repoussez-les                                                                                                                                                               |
| `workspace_not_entitled` | Le forfait actuel de votre espace de travail ne permet pas la restauration depuis la corbeille                                                                                                                                                               |
| `corpus_cap_exceeded`    | Le rétablissement des documents dépasserait la limite de documents de votre espace de travail, donc aucun n'est revenu. `data.wouldRestore` indique combien il en faut et `data.headroom` combien il en reste. Libérez de l'espace, puis restaurez à nouveau |