POST/v1/uploads/{upload_id}/complete
Completare un caricamento
complete_upload
Quando tutte le parti sono state ricevute, Sursa assembla il file, confronta lo SHA-256 dell’intero file con sha256 nel corpo ed esegue gli stessi controlli di un caricamento con una sola richiesta: il formato in base alla firma del contenuto e la scansione antivirus. Il risultato è ready, oppure rejected con reject_reason (checksum_mismatch, type_mismatch, unsupported_format, infected, scan_unavailable, unsafe_content). Ogni rifiuto da parte del controllo del formato o dell’antivirus viene scritto nel registro di audit come file.rejected.
Una risposta 200 indica che il risultato è pronto; 202 indica che il file è ancora in fase di controllo (processing) e il risultato arriva da GET /v1/uploads/{upload_id}. Se lo stato torna a pending (un riavvio di un’istanza dell’API ha interrotto il controllo), invia di nuovo complete. Ripetere complete dopo il risultato restituisce lo stesso risultato. Le parti mancanti restituiscono 409 uploads.incomplete (details.missing). Uno sha256 diverso da quello dichiarato alla creazione, o un parts[].etag diverso da una parte ricevuta, restituisce 422 uploads.checksum_mismatch. Un caricamento pronto e non usato resta disponibile per 24 ore. Aggiunto nella 1.62.0.
Autenticazione
Invia una chiave API nell’intestazione Authorization: Authorization: Bearer <chiave>.
Parametri di percorso
upload_idstringobbligatorioID del caricamento (
upl_seguito da 32 caratteri esadecimali).length ≤ 64
Parametri di intestazione
Idempotency-KeystringChiave per ripetere in sicurezza una scrittura: da 1 a 255 caratteri ASCII stampabili; si consiglia un UUID v4 per ogni operazione logica. Un nuovo tentativo con la stessa chiave entro 24 ore non esegue di nuovo l’operazione: restituisce la risposta salvata (stato, intestazioni e corpo) con l’intestazione
Idempotency-Replayed: true. La stessa chiave con un metodo, un percorso, unContent-Typeo un corpo diversi restituisce409 api.idempotency_mismatch; mentre la prima richiesta è ancora in esecuzione,409 api.idempotency_in_progressconRetry-After: 1. Dopo una risposta 5xx o 429 la chiave viene rilasciata e un nuovo tentativo esegue di nuovo l’operazione. La chiave vale per l’organizzazione e per chi effettua la chiamata (chiave API, utente o chiave di una fonte personalizzata).length ≥ 1, length ≤ 255
Corpo della richiesta
application/json
sha256stringobbligatorioLo SHA-256 dell’intero file.
partsarray of UploadPartRefControllo facoltativo delle parti: l’ETag di ogni parte come restituito da
PUT …/parts/{n}.items ≤ 1000
Risposte
200Il risultato è pronto: `ready` o `rejected`.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
Idempotency-Replayedtrueindica che la risposta è stata ripetuta da quella salvata per questaIdempotency-Key: l’operazione non è stata eseguita di nuovo.
application/json
idstringobbligatorioL’ID del caricamento (
upl_seguito da 32 caratteri esadecimali).filenamestringobbligatorioIl nome del file (senza cartelle).
content_typestringobbligatorioIl tipo di contenuto dichiarato; vuoto se non dichiarato.
sizeinteger (int64)obbligatorioLa dimensione del file in byte.
sha256string | nullobbligatorioLo SHA-256 del file, dichiarato alla creazione o al
complete;nullse non è ancora noto.part_sizeinteger (int64)obbligatorioLa dimensione di ogni parte tranne l’ultima (da 5 a 100 MiB).
part_countintegerobbligatorioIl numero di parti.
≥ 1, ≤ 1000
parts_receivedintegerobbligatorioIl numero di parti ricevute.
≥ 0
Le parti ricevute per numero (vuoto nella risposta di
POST /v1/uploads).reject_reasonstring | nullobbligatorioIl motivo del rifiuto (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. L’enumerazione può crescere;nullse non rifiutato.reject_detailsobject | nullobbligatorioDettagli del rifiuto (l’estensione, il formato dichiarato e quello rilevato, i checksum);
nullse non rifiutato.created_atstring (date-time)obbligatorioMomento della creazione del caricamento.
expires_atstring (date-time)obbligatorioIl termine per completare il caricamento e, una volta pronto, per usarlo.
completed_atstring (date-time) | nullobbligatorioMomento in cui il controllo è terminato (
readyorejected).consumed_atstring (date-time) | nullobbligatorioMomento in cui il caricamento è stato usato (da una scheda, un archivio o un’importazione).
202Il file è ancora in fase di controllo (`processing`).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
Idempotency-Replayedtrueindica che la risposta è stata ripetuta da quella salvata per questaIdempotency-Key: l’operazione non è stata eseguita di nuovo.
application/json
idstringobbligatorioL’ID del caricamento (
upl_seguito da 32 caratteri esadecimali).filenamestringobbligatorioIl nome del file (senza cartelle).
content_typestringobbligatorioIl tipo di contenuto dichiarato; vuoto se non dichiarato.
sizeinteger (int64)obbligatorioLa dimensione del file in byte.
sha256string | nullobbligatorioLo SHA-256 del file, dichiarato alla creazione o al
complete;nullse non è ancora noto.part_sizeinteger (int64)obbligatorioLa dimensione di ogni parte tranne l’ultima (da 5 a 100 MiB).
part_countintegerobbligatorioIl numero di parti.
≥ 1, ≤ 1000
parts_receivedintegerobbligatorioIl numero di parti ricevute.
≥ 0
Le parti ricevute per numero (vuoto nella risposta di
POST /v1/uploads).reject_reasonstring | nullobbligatorioIl motivo del rifiuto (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. L’enumerazione può crescere;nullse non rifiutato.reject_detailsobject | nullobbligatorioDettagli del rifiuto (l’estensione, il formato dichiarato e quello rilevato, i checksum);
nullse non rifiutato.created_atstring (date-time)obbligatorioMomento della creazione del caricamento.
expires_atstring (date-time)obbligatorioIl termine per completare il caricamento e, una volta pronto, per usarlo.
completed_atstring (date-time) | nullobbligatorioMomento in cui il controllo è terminato (
readyorejected).consumed_atstring (date-time) | nullobbligatorioMomento in cui il caricamento è stato usato (da una scheda, un archivio o un’importazione).
401Non sono state inviate credenziali (né un cookie di sessione né una chiave API), oppure la chiave non è stata trovata.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
403L’azione non è consentita: il ruolo non è sufficiente, manca l’accesso alla raccolta o alla scheda, la richiesta viene eseguita in modalità “View as”, oppure l’organizzazione è sospesa o eliminata (`detail` è un oggetto con `code: org_suspended | org_deleted`).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
404L’oggetto non esiste o non è disponibile per te. L’API non conferma l’esistenza di un oggetto con accesso limitato.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
409Lo stato dell’oggetto non consente l’azione, ad esempio un duplicato, un’indicizzazione in corso o un job già elaborato.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
410L’oggetto esisteva ma non è più disponibile: il link è stato usato o è scaduto, oppure il file è stato eliminato al termine del suo periodo di conservazione.
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
422Errore di validazione: il corpo o i parametri non corrispondono allo schema (`detail` è un elenco di errori di validazione), oppure il valore di un parametro è fuori dall’intervallo ammesso (`detail` è un messaggio).
Intestazioni della risposta
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
429Troppe richieste (`api.rate_limited`), la quota dell’organizzazione per il minuto, il giorno o il mese è esaurita (`api.quota_exceeded`; `error.details` contiene `quota`, `limit` e `reset_at`), è stato raggiunto il limite dell’organizzazione, oppure il servizio delle risposte è occupato (`answers.engine_busy`). Attendi il tempo indicato nell’intestazione `Retry-After`.
Intestazioni della risposta
Retry-AfterNumero di secondi da attendere prima di ripetere la richiesta.
RateLimit-PolicyLimiti in vigore, nel formato della bozza IETF
draft-ietf-httpapi-ratelimit-headers: elementi separati da virgole"<name>";q=<quota>;w=<window in seconds>.keyè la frequenza delle richieste della chiave API (la quota è il burst, la finestra è il tempo necessario a ricaricarla completamente; per una sessione èuser, senza credenzialiip);minute,dayemonthsono le quote dell’organizzazione per il minuto, il giorno e il mese di calendario in UTC.RateLimitQuanto resta di ciascun limite di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite della voce più restrittiva di
RateLimit-Policy(quella con meno richieste rimanenti).X-RateLimit-RemainingRichieste rimanenti nel limite più restrittivo.
X-RateLimit-ResetSecondi che mancano all’azzeramento del limite più restrittivo.
application/json
Codici di errore
Codici che questo endpoint può restituire in error.code, oltre ai codici generali di ogni richiesta.
Nuovi tentativi sicuri
Invia un’intestazione Idempotency-Key (per esempio un UUID) con ogni POST e PATCH. Un nuovo tentativo con la stessa chiave entro 24 ore restituisce la risposta salvata invece di eseguire di nuovo la richiesta.
Limiti di frequenza
Le risposte contengono le intestazioni RateLimit e RateLimit-Policy e le precedenti X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Una risposta 429 contiene Retry-After in secondi: attendi e riprova.