
# Télécharger un export de données utilisateur

`GET /v1/jobs/user-exports/{job_id}/download` · autorisation `users:export`

Fournit un lien à usage unique vers le paquet d'un [export de données utilisateur](/docs/api/management/users/export) terminé. Chaque appel écrit un enregistrement `user_export.downloaded` dans le journal d'audit de gestion avant l'émission du lien.

## Requête

| Paramètre | Dans | Obligatoire | Description |
|---|---|---|---|
| `job_id` | chemin | oui | Identifiant de la tâche, préfixé `job_`. |

Une tâche créée avec `include_ip: true` exige aussi `audit-events:read_ip` sur l'identifiant qui effectue le téléchargement.

## Réponse

`302 Found` avec un corps vide. `Location` est un lien relatif sur le même hôte, `/downloads/user-exports/{environment_id}/{job_id}/{token}`. La réponse contient `Cache-Control: no-store` et `Referrer-Policy: no-referrer`.

- Le lien est valide pendant 15 minutes et ne fonctionne qu'une fois : le jeton est consommé à la première requête, même si le transfert est interrompu. Appelez à nouveau cette opération pour obtenir un nouveau lien.
- Le lien ne nécessite aucun identifiant ; le jeton est le seul identifiant. Gardez `Location` secret et ne le journalisez pas.
- Le fichier est chiffré au repos avec la clé de l'environnement ; aucune URL présignée de stockage n'est donc utilisée. KeenAuth le déchiffre et le diffuse.

Suivre le lien avec `GET` renvoie `200 OK` avec `Content-Type: application/zip`, `Content-Length` et `Content-Disposition: attachment; filename="user-export-job_….zip"`. `HEAD` est refusé avec `405` afin que les aperçus de liens ne consomment pas le jeton. Comparez le SHA-256 du fichier avec `file.sha256` de la tâche. Si la connexion se termine avant que `Content-Length` octets ne soient reçus, le paquet est incomplet : supprimez-le et demandez un nouveau lien. Un lien invalide, déjà utilisé ou expiré renvoie `404 not_found`.

## Erreurs

Chaque erreur est un corps `application/problem+json` avec un `code` stable.

| HTTP | `code` | Quand |
|---|---|---|
| 401 | `unauthenticated` | La clé d'API est absente, invalide ou révoquée. |
| 403 | `insufficient_permissions` | La clé ne dispose pas de `users:export`, ou la tâche a été créée avec `include_ip` et la clé ne dispose pas de `audit-events:read_ip` (`required_permissions` les liste toutes les deux). |
| 404 | `not_found` | La tâche n'existe pas, appartient à un autre environnement, ou l'identifiant est mal formé. Sur le lien : le jeton est invalide, déjà utilisé ou expiré. |
| 409 | `conflict` | La tâche n'est pas encore terminée, ou son fichier a expiré. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; respectez `Retry-After`. Le lien lui-même autorise 10 requêtes par minute et par adresse IP. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez plus tard. |

## Exemple

```bash
curl -L -o user-export.zip \
  https://api.eu.keenauth.com/v1/jobs/user-exports/job_01j9xk3m7q8r2s4t6v8w0y2z4e/download \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

L'outil CLI suit lui-même le lien, écrit le paquet dans un fichier (jamais sur la sortie standard), refuse d'écraser un fichier existant et affiche la taille et le SHA-256 de ce qu'il a écrit :

```bash
keenauth jobs user-exports download job_01j9xk3m7q8r2s4t6v8w0y2z4e --file user-export.zip
```

## Données personnelles

Ce point de terminaison contient des données personnelles : profil de l'utilisateur final. [Données personnelles dans les API KeenAuth](/docs/policies/personal-data) décrit ce qui est stocké, pendant combien de temps et comment elles sont supprimées. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.
