> ## 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.

# Blob チャンクアップロードの完了

> このドキュメントでは、SquareCloud Blob API の PATCH /v1/objects/chunked エンドポイントの概要を包括的に説明します。

<ParamField header="Authorization" type="string" placeholder="API Key" required>
  アカウントの API キーです。これは[アカウント設定](https://squarecloud.app/ja/account/security)で確認できます。
</ParamField>

チャンクの完了 (Chunked Complete) は、[チャンクの開始](/ja/blob-reference/endpoint/chunked-init)で開始したアップロードを確定します。保存済みのパートが最終的なオブジェクトへと組み立てられ、公開 URL で利用できるようになります。送信するのは `upload` トークンのみで、**ETag もパート一覧も送信しません**。パート一覧は、どのパートが到達したかについてすでに信頼できる情報源であるストレージから読み直されます。

2 つの失敗モードでは、最大 1 GiB を再アップロードする代わりに、問題を解決してから `PATCH` を再試行できるよう、アップロードは意図的に**オープンのまま**残されます: `STORAGE_QUOTA_EXCEEDED` (空き容量を確保してから再試行) と `CHUNK_TOO_SMALL` (問題のパートを再送してから再試行) です。一方、`FILE_TOO_SMALL` と `FILE_TOO_LARGE` はアップロードを中止します。

レート制限は 10 秒あたり 5 回の完了なので、複数の並列アップロードが同時に完了できます。

<ParamField body="upload" type="string" placeholder="Upload token" required>
  チャンクの開始が返した不透明な `upload` トークン。

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

### レスポンス

<ResponseField name="status" type="string">
  呼び出しが成功したかどうかを示します。成功した場合は "success"、失敗した場合は "error" です。
</ResponseField>

<ResponseField name="response" type="object">
  <Expandable title="オブジェクトを展開">
    <ResponseField name="id" type="string">
      保存されたオブジェクトの ID (キー)。
    </ResponseField>

    <ResponseField name="size" type="number">
      組み立てられたオブジェクトの合計サイズ (バイト単位)。
    </ResponseField>

    <ResponseField name="parts" type="number">
      オブジェクトの組み立てに使われたパート数。
    </ResponseField>

    <ResponseField name="url" type="string">
      オブジェクトの公開 CDN URL。
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request PATCH \
    --url 'https://blob.squarecloud.app/v1/objects/chunked' \
    --header 'Authorization: YOUR_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: 'YOUR_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': 'YOUR_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>

### トラブルシューティング

<Tabs>
  <Tab title="400 ステータスコード">
    ### アップロード関連

    <CodeGroup>
      ```json INVALID_UPLOAD_TOKEN theme={null}
      // The upload token is missing, malformed, or does not belong to your account.
      {
          "status": "error",
          "code": "INVALID_UPLOAD_TOKEN"
      }
      ```

      ```json NO_CHUNKS_UPLOADED theme={null}
      // The upload has no stored chunks to assemble.
      {
          "status": "error",
          "code": "NO_CHUNKS_UPLOADED"
      }
      ```

      ```json CHUNK_TOO_SMALL theme={null}
      // A chunk other than the last is below 5 MB. The upload stays open:
      // re-send the offending parts, then retry the PATCH.
      {
          "status": "error",
          "code": "CHUNK_TOO_SMALL"
      }
      ```

      ```json FILE_TOO_SMALL theme={null}
      // The assembled object is below 512 bytes. The upload is aborted.
      {
          "status": "error",
          "code": "FILE_TOO_SMALL"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="401 ステータスコード">
    ### 認証エラー

    <CodeGroup>
      ```json ACCESS_DENIED theme={null}
      // The API key is missing or invalid. Set a valid key in the Authorization header.
      {
          "status": "error",
          "code": "ACCESS_DENIED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="403 ステータスコード">
    ### ストレージのクォータ超過

    <CodeGroup>
      ```json STORAGE_QUOTA_EXCEEDED theme={null}
      // The account filled up while the parts were uploading. The upload is
      // LEFT OPEN: free space (or upgrade) and retry the PATCH, or abort it
      // with DELETE /v1/objects/chunked.
      {
          "status": "error",
          "code": "STORAGE_QUOTA_EXCEEDED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="404 ステータスコード">
    ### 見つかりません

    <CodeGroup>
      ```json UPLOAD_NOT_FOUND theme={null}
      // The upload was already completed, aborted, or expired.
      {
          "status": "error",
          "code": "UPLOAD_NOT_FOUND"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="413 ステータスコード">
    ### ペイロードが大きすぎます

    <CodeGroup>
      ```json FILE_TOO_LARGE theme={null}
      // The assembled object exceeds 1 GiB. The upload is aborted.
      {
          "status": "error",
          "code": "FILE_TOO_LARGE"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="429 ステータスコード">
    ### レート制限

    <CodeGroup>
      ```json RATE_LIMITED theme={null}
      // Complete rate limit reached (5 requests per 10s window, blocked for 10s).
      {
          "status": "error",
          "code": "RATE_LIMITED"
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="500 ステータスコード">
    ### アップロード失敗

    <CodeGroup>
      ```json UPLOAD_FAILED theme={null}
      // Failed to assemble or register the object. If the message says to start
      // a new upload, the uploadId was consumed: open a new upload and send the
      // file again. Otherwise, retry the PATCH.
      {
          "status": "error",
          "code": "UPLOAD_FAILED"
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>
