
# Scarica un'esportazione dei dati utente

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

Restituisce un link monouso al pacchetto di una [esportazione dei dati utente](/docs/api/management/users/export) completata. Ogni chiamata scrive un record `user_export.downloaded` nel log di audit della gestione prima che il link venga emesso.

## Richiesta

| Parametro | In | Obbligatorio | Descrizione |
|---|---|---|---|
| `job_id` | path | sì | ID del job, con prefisso `job_`. |

Un job creato con `include_ip: true` richiede anche `audit-events:read_ip` sulla credenziale che effettua il download.

## Risposta

`302 Found` con corpo vuoto. `Location` è un link relativo sullo stesso host, `/downloads/user-exports/{environment_id}/{job_id}/{token}`. La risposta contiene `Cache-Control: no-store` e `Referrer-Policy: no-referrer`.

- Il link è valido per 15 minuti e funziona una sola volta: il token viene consumato alla prima richiesta, anche se il trasferimento viene interrotto. Chiama di nuovo questa operazione per ottenere un nuovo link.
- Il link non richiede credenziali; il token è l'unica credenziale. Tieni `Location` riservato e non registrarlo nei log.
- Il file è cifrato a riposo con la chiave dell'ambiente, quindi non viene usato alcun URL prefirmato dello storage; KeenAuth decifra e trasmette il file.

Seguendo il link con `GET` si ottiene `200 OK` con `Content-Type: application/zip`, `Content-Length` e `Content-Disposition: attachment; filename="user-export-job_….zip"`. `HEAD` viene rifiutato con `405` così che le anteprime dei link non consumino il token. Confronta il SHA-256 del file con `file.sha256` del job. Se la connessione termina prima che siano arrivati `Content-Length` byte, il pacchetto è incompleto; eliminalo e richiedi un nuovo link. Un link non valido, già usato o scaduto restituisce `404 not_found`.

## Errori

Ogni errore è un corpo `application/problem+json` con un `code` stabile.

| HTTP | `code` | Quando |
|---|---|---|
| 401 | `unauthenticated` | La chiave API è mancante, non valida o revocata. |
| 403 | `insufficient_permissions` | La chiave non ha `users:export`, oppure il job è stato creato con `include_ip` e la chiave non ha `audit-events:read_ip` (`required_permissions` elenca entrambe). |
| 404 | `not_found` | Il job non esiste, appartiene a un altro ambiente, oppure l'ID non è valido. Sul link: il token non è valido, è già stato usato o è scaduto. |
| 409 | `conflict` | Il job non è ancora completato, oppure il suo file è scaduto. |
| 429 | `rate_limited` | È stato superato il limite di richieste; rispetta `Retry-After`. Il link stesso consente 10 richieste al minuto per indirizzo IP. |
| 503 | `service_unavailable` | Una dipendenza è temporaneamente non disponibile; riprova più tardi. |

## Esempio

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

La CLI segue il link da sola, scrive il pacchetto in un file (mai sull'output standard), rifiuta di sovrascrivere un file esistente e stampa dimensione e SHA-256 di ciò che ha scritto:

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

## Dati personali

Questo endpoint contiene dati personali: profilo dell'utente finale. [Dati personali nelle API di KeenAuth](/docs/policies/personal-data) descrive cosa viene memorizzato, per quanto tempo viene conservato e come viene cancellato. Non inviare in nessun campo categorie particolari di dati personali (salute, dati biometrici, religione, opinioni politiche, orientamento sessuale).
