> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Conclusão de Upload em Partes Blob

> Esta documentação fornece uma visão abrangente do endpoint PATCH /v1/objects/chunked da API Blob da SquareCloud.

<ParamField header="Authorization" type="string" placeholder="Chave da API" required>
  A chave da API para sua conta. Você pode encontrá-la nas [configurações da conta](https://squarecloud.app/pt-br/account/security).
</ParamField>

Conclusão do upload sela um upload aberto com [Início do upload](/pt-br/blob-reference/endpoint/chunked-init): as partes armazenadas são montadas no objeto final, que passa a ficar disponível na sua URL pública. Você **não envia ETags nem lista de partes**, apenas o token `upload`; a lista de partes é relida do armazenamento, que já é a autoridade sobre quais partes chegaram.

Dois modos de falha deixam deliberadamente o upload **aberto**, para você corrigir o problema e repetir o `PATCH` em vez de reenviar até 1 GiB: `STORAGE_QUOTA_EXCEEDED` (libere espaço e tente de novo) e `CHUNK_TOO_SMALL` (reenvie as partes problemáticas e tente de novo). `FILE_TOO_SMALL` e `FILE_TOO_LARGE` cancelam o upload.

O limite é de 5 conclusões a cada 10 segundos, então vários uploads paralelos podem terminar ao mesmo tempo.

<ParamField body="upload" type="string" placeholder="Upload token" required>
  O token `upload` opaco retornado pelo Início do upload.

  ```json theme={null}
  { "upload": "UPLOAD_TOKEN" }
  ```
</ParamField>

### Resposta

<ResponseField name="status" type="string">
  Indica se a chamada foi bem-sucedida. "success" se bem-sucedida, "error" caso contrário.
</ResponseField>

<ResponseField name="response" type="object">
  <Expandable title="Alternar objeto">
    <ResponseField name="id" type="string">
      O ID (chave) do objeto armazenado.
    </ResponseField>

    <ResponseField name="size" type="number">
      O tamanho total do objeto montado, em bytes.
    </ResponseField>

    <ResponseField name="parts" type="number">
      De quantas partes o objeto foi montado.
    </ResponseField>

    <ResponseField name="url" type="string">
      A URL pública da CDN do objeto.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request PATCH \
    --url 'https://blob.squarecloud.app/v1/objects/chunked' \
    --header 'Authorization: SUA_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{ "upload": "UPLOAD_TOKEN" }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://blob.squarecloud.app/v1/objects/chunked', {
    method: 'PATCH',
    headers: {
      Authorization: 'SUA_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ upload: uploadToken }),
  });
  ```

  ```python Python theme={null}
  import requests

  response = requests.patch(
      'https://blob.squarecloud.app/v1/objects/chunked',
      headers={'Authorization': 'SUA_API_KEY'},
      json={'upload': upload_token},
  )
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "status": "success",
    "response": {
      "id": "3155597145698959364/myfile-ex30.fastq.gz",
      "size": 734003200,
      "parts": 22,
      "url": "https://public-blob.squarecloud.dev/3155597145698959364/myfile-ex30.fastq.gz"
    }
  }
  ```
</ResponseExample>

### Solução de problemas

<Tabs>
  <Tab title="Código 400">
    ### Relacionado ao Upload

    <CodeGroup>
      ```json INVALID_UPLOAD_TOKEN theme={null}
      // O token de upload está ausente, malformado ou não pertence à sua conta.
      {
          "status": "error",
          "code": "INVALID_UPLOAD_TOKEN"
      }
      ```

      ```json NO_CHUNKS_UPLOADED theme={null}
      // O upload não tem chunks armazenados para montar.
      {
          "status": "error",
          "code": "NO_CHUNKS_UPLOADED"
      }
      ```

      ```json CHUNK_TOO_SMALL theme={null}
      // Um chunk que não é o último está abaixo de 5 MB. O upload permanece aberto:
      // reenvie as partes problemáticas e repita o PATCH.
      {
          "status": "error",
          "code": "CHUNK_TOO_SMALL"
      }
      ```

      ```json FILE_TOO_SMALL theme={null}
      // O objeto montado tem menos de 512 bytes. O upload é cancelado.
      {
          "status": "error",
          "code": "FILE_TOO_SMALL"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 401">
    ### Não autorizado

    <CodeGroup>
      ```json ACCESS_DENIED theme={null}
      // A chave de API está ausente ou é inválida. Defina uma chave válida no cabeçalho Authorization.
      {
          "status": "error",
          "code": "ACCESS_DENIED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 403">
    ### Cota de armazenamento excedida

    <CodeGroup>
      ```json STORAGE_QUOTA_EXCEEDED theme={null}
      // A conta encheu enquanto as partes eram enviadas. O upload PERMANECE
      // ABERTO: libere espaço (ou faça upgrade) e repita o PATCH, ou cancele
      // com DELETE /v1/objects/chunked.
      {
          "status": "error",
          "code": "STORAGE_QUOTA_EXCEEDED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 404">
    ### Não encontrado

    <CodeGroup>
      ```json UPLOAD_NOT_FOUND theme={null}
      // O upload já foi concluído, cancelado ou expirou.
      {
          "status": "error",
          "code": "UPLOAD_NOT_FOUND"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 413">
    ### Payload grande demais

    <CodeGroup>
      ```json FILE_TOO_LARGE theme={null}
      // O objeto montado excede 1 GiB. O upload é cancelado.
      {
          "status": "error",
          "code": "FILE_TOO_LARGE"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 429">
    ### Limite de requisições

    <CodeGroup>
      ```json RATE_LIMITED theme={null}
      // Limite de conclusões atingido (5 requisições por janela de 10s, bloqueio de 10s).
      {
          "status": "error",
          "code": "RATE_LIMITED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Código 500">
    ### Falha no upload

    <CodeGroup>
      ```json UPLOAD_FAILED theme={null}
      // Falha ao montar ou registrar o objeto. Se a mensagem disser para iniciar
      // um novo upload, o uploadId foi consumido: abra um novo upload e envie o
      // arquivo novamente. Caso contrário, repita o PATCH.
      {
          "status": "error",
          "code": "UPLOAD_FAILED"
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>
