# Xác nhận hoàn tất tải lên

Xác nhận một tệp cloud storage đã được tải lên.
- **Điều kiện tiên quyết**: bản ghi tệp phải thuộc nhóm của bạn và đối tượng phải đã nằm trong bộ lưu trữ — dịch vụ đọc ETag và độ dài của nó để kiểm chứng. Kích thước phải lớn hơn 0 và nhỏ hơn 2 GB.
- **Tác động**: trừ hạn mức lưu trữ của nhóm một cách nguyên tử, rồi đánh dấu bản ghi là đã tải lên và lưu kích thước thật. Cho đến khi việc này thành công, tệp **không xuất hiện trong `/cloudstorage/file/page`** và vẫn chiếm một trong 100 suất chờ xác nhận.
- **Khi thất bại, đối tượng đã tải lên sẽ bị xóa.** Gọi quá sớm, vượt giới hạn kích thước, hay không còn dung lượng đều khiến dữ liệu bị xóa khỏi bộ lưu trữ và bản ghi ở lại trạng thái chưa xác nhận. Cách khắc phục là `/cloudstorage/upload/init` mới rồi tải lên lại, không phải thử lại lệnh gọi này.
- **Hoàn tất**: đồng bộ và idempotent sau khi đã thành công — lần gọi thứ hai trả về cùng tệp mà không trừ hạn mức thêm lần nữa.
- **Lưu ý**: bản ghi không bao giờ được xác nhận sẽ tự động được dọn sau 24 giờ.

Các mã lỗi nghiệp vụ đã ghi nhận: `39001`, `39011`, `39014`, `39041`, `39046`, `39047`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.

Endpoint: POST /api/cloudstorage/upload/complete
Version: 2026-09-05

## Request fields (application/json):

  - `id` (string, required)
    ID tệp cloud storage do API URL tải lên đã ký trước trả về.
    Example: 1800000000000001

## Response 200 fields (application/json):

  - `code` (integer, required)
    Mã kết quả. `0` nghĩa là thành công; các mã khác cho biết có ngoại lệ.
    Example: 0

  - `msg` (string | null, required)
    Thông báo lỗi.
    Example: null

  - `requestId` (string)
    ID yêu cầu của tác vụ. Trường này có thể xuất hiện khi yêu cầu đi qua API gateway.
    Example: 1d4f3ea968664593860b94b35d4ebf5e

  - `data` (object, required)

  - `data.id` (string)
    ID tệp trên lưu trữ đám mây.
    Example: 1800000000001001

  - `data.fileName` (string)
    Tên tệp (không kèm phần mở rộng).
    Example: example

  - `data.fileExt` (string)
    Phần mở rộng của tệp.
    Example: jpg

  - `data.fileSize` (string)
    Kích thước tệp theo byte.
    Example: 204800

  - `data.fileType` (integer)
    Loại tệp: 0 = hình ảnh, 1 = video, 2 = ứng dụng, 3 = âm thanh, 4 = tài liệu, 5 = khác.
    Example: 0

  - `data.tagInfo` (array)
    Chi tiết các thẻ đang gắn với tệp.

  - `data.tagInfo.id` (string)
    ID thẻ.
    Example: 1800000000000101

  - `data.tagInfo.tagSource` (string)
    Nguồn của thẻ, ví dụ ENV, PROXY.
    Example: ENV

  - `data.tagInfo.tagName` (string)
    Tên thẻ.
    Example: Invoice

  - `data.tagInfo.tagType` (string)
    Kiểu thẻ: TAG hoặc GROUP.
    Example: TAG

  - `data.tagInfo.tagIcon` (string)
    Biểu tượng của thẻ.

  - `data.createDate` (string)
    Thời điểm tải lên.

  - `data.updateDate` (string)
    Thời điểm cập nhật.

