POST/v1/uploads/{upload_id}/complete
Concluir um upload
complete_upload
Quando todas as partes foram recebidas, o Sursa monta o arquivo, compara o SHA-256 do arquivo inteiro com o sha256 do corpo e executa as mesmas conferências do upload em uma única requisição: o formato pela assinatura do conteúdo e a varredura antivírus. O resultado é ready, ou rejected com reject_reason (checksum_mismatch, type_mismatch, unsupported_format, infected, scan_unavailable, unsafe_content). Cada rejeição pela conferência de formato ou pelo antivírus é gravada no registro de auditoria como file.rejected.
Uma resposta 200 significa que o resultado está pronto; 202 significa que o arquivo ainda está sendo conferido (processing), e o resultado vem de GET /v1/uploads/{upload_id}. Se o status voltar para pending (o reinício de uma instância da API interrompeu a conferência), envie complete de novo. Repetir complete depois do resultado retorna o mesmo resultado. Partes faltando retornam 409 uploads.incomplete (details.missing). Um sha256 diferente do declarado na criação, ou um parts[].etag diferente de uma parte recebida, retorna 422 uploads.checksum_mismatch. Um upload pronto que não é usado fica disponível por 24 horas. Adicionado na versão 1.62.0.
Autenticação
Envie uma chave de API no cabeçalho Authorization: Authorization: Bearer <chave>.
Parâmetros de caminho
upload_idstringobrigatórioO ID do upload (
upl_seguido de 32 caracteres hexadecimais).length ≤ 64
Parâmetros de cabeçalho
Idempotency-KeystringChave para uma nova tentativa segura de uma gravação: de 1 a 255 caracteres ASCII imprimíveis; recomenda-se um UUID v4 por operação lógica. Uma nova tentativa com a mesma chave dentro de 24 horas não executa a operação de novo: retorna a resposta salva (status, cabeçalhos e corpo) com o cabeçalho
Idempotency-Replayed: true. A mesma chave com outro método, caminho,Content-Typeou corpo retorna409 api.idempotency_mismatch; enquanto a primeira requisição ainda está em execução,409 api.idempotency_in_progresscomRetry-After: 1. Depois de uma resposta 5xx ou 429, a chave é liberada, e uma nova tentativa executa a operação de novo. A chave vale para a organização e para quem faz a chamada (chave de API, usuário ou chave de fonte personalizada).length ≥ 1, length ≤ 255
Corpo da requisição
application/json
sha256stringobrigatórioO SHA-256 do arquivo inteiro.
partsarray of UploadPartRefConferência opcional das partes: o ETag de cada parte, como retornado por
PUT …/parts/{n}.items ≤ 1000
Respostas
200O resultado está pronto: `ready` ou `rejected`.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
Idempotency-Replayedtruesignifica que a resposta foi reproduzida a partir da resposta salva para estaIdempotency-Key: a operação não foi executada de novo.
application/json
idstringobrigatórioO ID do upload (
upl_seguido de 32 caracteres hexadecimais).filenamestringobrigatórioO nome do arquivo (sem pastas).
content_typestringobrigatórioO tipo de conteúdo declarado; vazio se não foi declarado.
sizeinteger (int64)obrigatórioO tamanho do arquivo em bytes.
sha256string | nullobrigatórioO SHA-256 do arquivo, declarado na criação ou em
complete;nullse ainda não for conhecido.part_sizeinteger (int64)obrigatórioO tamanho de cada parte, exceto a última (de 5 a 100 MiB).
part_countintegerobrigatórioO número de partes.
≥ 1, ≤ 1000
parts_receivedintegerobrigatórioO número de partes recebidas.
≥ 0
As partes recebidas, por número (vazio na resposta de
POST /v1/uploads).reject_reasonstring | nullobrigatórioO motivo da rejeição (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. A enumeração pode crescer;nullse não houve rejeição.reject_detailsobject | nullobrigatórioDetalhes da rejeição (a extensão, o formato declarado e o detectado, as somas de verificação);
nullse não houve rejeição.created_atstring (date-time)obrigatórioQuando o upload foi criado.
expires_atstring (date-time)obrigatórioO prazo para concluir o upload e, depois que ele estiver pronto, para usá-lo.
completed_atstring (date-time) | nullobrigatórioQuando a conferência terminou (
readyourejected).consumed_atstring (date-time) | nullobrigatórioQuando o upload foi usado (por um cartão, um arquivo compactado ou uma importação).
202O arquivo ainda está sendo conferido (`processing`).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
Idempotency-Replayedtruesignifica que a resposta foi reproduzida a partir da resposta salva para estaIdempotency-Key: a operação não foi executada de novo.
application/json
idstringobrigatórioO ID do upload (
upl_seguido de 32 caracteres hexadecimais).filenamestringobrigatórioO nome do arquivo (sem pastas).
content_typestringobrigatórioO tipo de conteúdo declarado; vazio se não foi declarado.
sizeinteger (int64)obrigatórioO tamanho do arquivo em bytes.
sha256string | nullobrigatórioO SHA-256 do arquivo, declarado na criação ou em
complete;nullse ainda não for conhecido.part_sizeinteger (int64)obrigatórioO tamanho de cada parte, exceto a última (de 5 a 100 MiB).
part_countintegerobrigatórioO número de partes.
≥ 1, ≤ 1000
parts_receivedintegerobrigatórioO número de partes recebidas.
≥ 0
As partes recebidas, por número (vazio na resposta de
POST /v1/uploads).reject_reasonstring | nullobrigatórioO motivo da rejeição (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. A enumeração pode crescer;nullse não houve rejeição.reject_detailsobject | nullobrigatórioDetalhes da rejeição (a extensão, o formato declarado e o detectado, as somas de verificação);
nullse não houve rejeição.created_atstring (date-time)obrigatórioQuando o upload foi criado.
expires_atstring (date-time)obrigatórioO prazo para concluir o upload e, depois que ele estiver pronto, para usá-lo.
completed_atstring (date-time) | nullobrigatórioQuando a conferência terminou (
readyourejected).consumed_atstring (date-time) | nullobrigatórioQuando o upload foi usado (por um cartão, um arquivo compactado ou uma importação).
401Nenhuma credencial foi enviada (nem cookie de sessão nem chave de API), ou a chave não foi encontrada.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
403A ação não é permitida: a função é insuficiente, não há acesso à coleção ou ao cartão, a requisição é executada no modo “View as” ou a organização está suspensa ou excluída (`detail` é um objeto com `code: org_suspended | org_deleted`).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
404O objeto não existe ou não está disponível para você. A API não confirma que um objeto restrito existe.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
409O estado do objeto não permite a ação, por exemplo, uma duplicata, uma indexação em andamento ou um job já processado.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
410O objeto existiu, mas não está mais disponível: o link foi usado ou expirou, ou o arquivo foi excluído no fim do período de retenção.
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
422Erro de validação: o corpo ou os parâmetros não correspondem ao esquema (`detail` é uma lista de erros de validação), ou o valor de um parâmetro está fora do intervalo (`detail` é uma mensagem).
Cabeçalhos da resposta
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
429Requisições demais (`api.rate_limited`), a cota da organização para o minuto, o dia ou o mês se esgotou (`api.quota_exceeded`; `error.details` contém `quota`, `limit` e `reset_at`), o limite da organização foi atingido ou o serviço de respostas está ocupado (`answers.engine_busy`). Aguarde o tempo indicado no cabeçalho `Retry-After`.
Cabeçalhos da resposta
Retry-AfterNúmero de segundos a esperar antes de tentar a requisição novamente.
RateLimit-PolicyLimites em vigor, no formato do rascunho da IETF
draft-ietf-httpapi-ratelimit-headers: itens separados por vírgula"<name>";q=<quota>;w=<window in seconds>.keyé a taxa de requisições da chave de API (a cota é a rajada, a janela é o tempo para reabastecê-la por completo; para uma sessão éuser, sem credenciais éip);minute,dayemonthsão as cotas da organização para o minuto, o dia e o mês do calendário em UTC.RateLimitO que resta de cada limite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLimite da entrada mais restritiva de
RateLimit-Policy(a que tem menos requisições restantes).X-RateLimit-RemainingRequisições restantes no limite mais restritivo.
X-RateLimit-ResetSegundos até o limite mais restritivo ser reiniciado.
application/json
Códigos de erro
Códigos que este endpoint pode retornar em error.code, além dos códigos gerais de qualquer requisição.
Novas tentativas seguras
Envie um cabeçalho Idempotency-Key (por exemplo, um UUID) em cada POST e PATCH. Uma nova tentativa com a mesma chave em até 24 horas retorna a resposta salva, em vez de executar a requisição de novo.
Limites de taxa
As respostas trazem os cabeçalhos RateLimit e RateLimit-Policy e os anteriores X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Uma resposta 429 traz Retry-After em segundos: aguarde e tente de novo.