Giải phápKhách hàng
Tài liệu

5/8/2026

blog.summarize

blog.share_blog

API quản lý API Key

API này dùng để xem danh sách, tạo, cập nhật và xoá API Key trong một workspace.

API Key dùng để xác thực các ứng dụng tự động khi gọi public API. Mỗi key hoạt động dưới danh nghĩa người dùng được chọn tại accountId và bị giới hạn bởi quyền hiện tại của người dùng đó.

Bảo vệ secret: Credential đầy đủ chỉ được trả về một lần sau khi tạo tại data.secretToken. Hãy lưu an toàn ngay lúc đó. API danh sách không cho phép lấy lại secret.

Xác thực và phân quyền

Mọi request cần có:

Authorization: Bearer {tokenId}-{secretToken}
Content-Type: application/json

Người dùng gắn với credential đang gọi phải có quyền quản lý API Key tương ứng:

Thao tác Quyền cần có
Xem danh sách Xem API Key
Tạo hoặc cập nhật Tạo và chỉnh sửa API Key
Xoá Xoá API Key

Workspace được xác định từ credential đang gọi. Không gửi workspace ID trong body.


Danh sách endpoint

Thao tác Method Endpoint
Xem danh sách API Key POST /bapi/v1/api-keys/list
Tạo API Key POST /bapi/v1/api-keys
Tạo API Key (alias) POST /bapi/v1/api-keys/create
Cập nhật API Key PUT /bapi/v1/api-keys/{apiKeyId}
Xoá API Key POST /bapi/v1/api-keys/delete

Endpoint danh sách dùng POST nhưng chỉ đọc dữ liệu.

Quy ước HTTP status:

Kết quả HTTP status
Tạo thành công với r = 0 201
Danh sách, cập nhật hoặc xoá thành công với r = 0 200
Lỗi kiểm tra dữ liệu, phân quyền hoặc lỗi nghiệp vụ khác với r != 0 400
Credential gọi API không hợp lệ hoặc đã hết hạn 401
Vượt giới hạn tần suất 429
Lỗi máy chủ 500

Thao tác chỉ thành công khi r = 0.


Các trường của API Key

Trường Kiểu Mô tả
id String ID của API Key do hệ thống sinh
name String Tên dễ nhận biết; bắt buộc và không được trùng trong workspace
description String Mô tả không bắt buộc
isActive Boolean true cho phép sử dụng key; false vô hiệu hoá key ngay lập tức
expiresOn Long Thời điểm hết hạn theo Unix milliseconds; 0 nghĩa là không hết hạn
accountId String Tài khoản có quyền được sử dụng khi key gọi API
created Long Thời điểm tạo theo Unix milliseconds
createdBy String ID người tạo API Key
createdByInfo Object/null Thông tin tóm tắt người tạo nếu có
accountIdInfo Object/null Thông tin tóm tắt người dùng được chọn tại accountId nếu có

secretToken không thuộc tài nguyên được trả về từ API danh sách. Trường này chỉ xuất hiện trong response tạo thành công.


1. Xem danh sách API Key

Endpoint: POST /bapi/v1/api-keys/list

Request body

Tất cả các trường đều không bắt buộc. Gửi {} để dùng giá trị mặc định.

{
  "page": 1,
  "limit": 50,
  "name": "integration",
  "isActive": true,
  "accountId": "AC8M3Q7D2K1P",
  "order": "created",
  "sort": "desc"
}
Trường Kiểu Mô tả
page Integer Số trang, bắt đầu từ 1. Mặc định: 1
limit Integer Số lượng mỗi trang. Mặc định: 50
id String Lọc chính xác theo API Key ID
name String Tìm kiếm một phần theo tên
description String Tìm kiếm một phần theo mô tả
isActive Boolean Lọc theo trạng thái đang hoạt động hoặc đã vô hiệu hoá
accountId String Lọc chính xác theo tài khoản thực thi
expiresOn String Khoảng thời gian hết hạn theo milliseconds, định dạng {from}-{to}
created String Khoảng thời gian tạo theo milliseconds, định dạng {from}-{to}
order String Trường tài nguyên dùng để sắp xếp. Mặc định: created
sort String asc hoặc desc. Mặc định: desc

Với khoảng thời gian một phía, để trống phía còn lại. Ví dụ:

  • "1780000000000-": lớn hơn hoặc bằng thời điểm bắt đầu.
  • "-1790000000000": nhỏ hơn hoặc bằng thời điểm kết thúc.

Ví dụ cURL

curl --location 'https://{workspace-domain}/bapi/v1/api-keys/list' \
  --header 'Authorization: Bearer {tokenId}-{secretToken}' \
  --header 'Content-Type: application/json' \
  --data '{
    "page": 1,
    "limit": 50,
    "isActive": true,
    "order": "created",
    "sort": "desc"
  }'

Response thành công (200)

{
  "r": 0,
  "msg": "Success",
  "meta": {
    "total": 1,
    "currentPage": 1,
    "lastPage": 1,
    "perPage": 50
  },
  "data": [
    {
      "id": "AT8M3Q7D2K1P",
      "name": "Order integration",
      "description": "Key used by the order synchronization service",
      "isActive": true,
      "expiresOn": 1786185511152,
      "accountId": "AC8M3Q7D2K1P",
      "created": 1783507200000,
      "createdBy": "PE7M2Q9D4K6RX",
      "createdByInfo": null,
      "accountIdInfo": null
    }
  ]
}

Response không bao giờ chứa secretToken có thể sử dụng được.


2. Tạo API Key

Endpoint: POST /bapi/v1/api-keys

Alias tương đương: POST /bapi/v1/api-keys/create.

Request body

{
  "name": "Order integration",
  "description": "Key used by the order synchronization service",
  "isActive": true,
  "expiresOn": 1786185511152,
  "accountId": "AC8M3Q7D2K1P"
}
Trường Kiểu Bắt buộc Mô tả
name String Tên API Key không được trùng
description String Không Mục đích sử dụng hoặc đơn vị sở hữu integration
isActive Boolean Không Key có được phép sử dụng hay không. Mặc định: true
expiresOn Long Không Unix milliseconds trong tương lai; bỏ qua hoặc gửi 0 nếu không hết hạn
accountId String Tài khoản đang hoạt động trong workspace, có quyền sẽ được key sử dụng

Nên chọn tài khoản có quyền tối thiểu, chỉ đủ cho nghiệp vụ của integration.

Ví dụ cURL

curl --location 'https://{workspace-domain}/bapi/v1/api-keys' \
  --header 'Authorization: Bearer {tokenId}-{secretToken}' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Order integration",
    "description": "Key used by the order synchronization service",
    "isActive": true,
    "expiresOn": 1786185511152,
    "accountId": "AC8M3Q7D2K1P"
  }'

Response thành công (201)

{
  "r": 0,
  "msg": "Success",
  "data": {
    "id": "AT8M3Q7D2K1P",
    "secretToken": "AT8M3Q7D2K1P-<one-time-secret>"
  }
}

Hãy sao chép data.secretToken ngay khi nhận response. Không đưa secret vào source code, bộ nhớ trình duyệt, URL, ticket, tin nhắn hoặc log ứng dụng.


3. Cập nhật API Key

Endpoint: PUT /bapi/v1/api-keys/{apiKeyId}

ID trên URL là nguồn tin cậy. Nếu body có id, giá trị đó sẽ bị bỏ qua và thay bằng {apiKeyId}.

Request body

{
  "name": "Order integration",
  "description": "Temporarily disabled during maintenance",
  "isActive": false,
  "expiresOn": 1786185511152,
  "accountId": "AC8M3Q7D2K1P"
}

name, description, isActiveaccountId chỉ thay đổi khi được gửi.

Luôn gửi expiresOn khi cập nhật. Nếu bỏ qua, phiên bản dịch vụ hiện tại sẽ đặt trường này thành 0 (không hết hạn). Gửi rõ 0 khi đó là kết quả mong muốn.

Thay đổi hoặc xoá thời hạn không làm lộ hay thay thế secret hiện tại. Để xoay vòng secret, hãy tạo key mới, cập nhật ứng dụng sử dụng key, sau đó vô hiệu hoá hoặc xoá key cũ.

Ví dụ cURL

curl --location --request PUT \
  'https://{workspace-domain}/bapi/v1/api-keys/AT8M3Q7D2K1P' \
  --header 'Authorization: Bearer {tokenId}-{secretToken}' \
  --header 'Content-Type: application/json' \
  --data '{
    "description": "Temporarily disabled during maintenance",
    "isActive": false,
    "expiresOn": 1786185511152
  }'

Response thành công (200)

{
  "r": 0,
  "msg": "Success"
}

Dùng API danh sách với ID của key để xác minh trạng thái sau cập nhật.


4. Xoá API Key

Endpoint: POST /bapi/v1/api-keys/delete

Xoá sẽ thu hồi key vĩnh viễn và không thể hoàn tác. Nếu cần tạm dừng có thể khôi phục, hãy cập nhật isActive: false.

Request body

{
  "id": "AT8M3Q7D2K1P"
}

Ví dụ cURL

curl --location 'https://{workspace-domain}/bapi/v1/api-keys/delete' \
  --header 'Authorization: Bearer {tokenId}-{secretToken}' \
  --header 'Content-Type: application/json' \
  --data '{
    "id": "AT8M3Q7D2K1P"
  }'

Response thành công (200)

{
  "r": 0,
  "msg": "Success"
}

Nếu một key tự xoá chính nó, response xoá vẫn có thể thành công nhưng credential đó không thể xác thực các request tiếp theo.


Các lỗi thường gặp

HTTP r Mô tả
400 10 Người dùng gọi API không có quyền quản lý API Key tương ứng
400 405 Thiếu API Key ID hoặc không tìm thấy key
400 407 Thiếu tên hoặc tên đã tồn tại
400 420 Hướng sắp xếp phải là asc hoặc desc
400 700 Lỗi máy chủ
401 100001 Credential gọi API bị thiếu, sai, đã vô hiệu hoá hoặc hết hạn
429 42900 Vượt giới hạn tần suất gọi API

Ví dụ:

{
  "r": 407,
  "msg": "NAME_EXIST"
}

Khuyến nghị bảo mật

  • Dùng một key riêng cho mỗi integration và môi trường.
  • Chọn tài khoản thực thi chuyên dụng với quyền tối thiểu.
  • Đặt thời hạn và xoay vòng key định kỳ.
  • Vô hiệu hoá ngay key bị nghi ngờ trước khi điều tra hoặc thay thế.
  • Không để secret xuất hiện trong mã phía client hoặc log.
  • Sau khi xoay vòng, xác minh key mới hoạt động trước khi xoá key cũ.
avatar

blog.blogs_related

Giải pháp tùy biến và hợp nhất

Số hóa và tự động hóa hoàn toàn công tác vận hành và quản trị doanh nghiệp với Cogover!

Bắt đầu đổi mới phương thức vận hành và tự chủ hệ thống quản trị công việc của bạn

Dùng thử ngay
CogoverCogover

CÔNG TY CỔ PHẦN STRINGEE

GPKD số 0107938504, đăng ký ngày 27-07-2017, nơi cấp Sở Tài chính Thành phố Hà Nội
Địa chỉ: Tầng 19, Leadvisors Tower, số 643 Phạm Văn Đồng, Phường Nghĩa Đô, Thành phố Hà Nội, Việt Nam

Văn phòng

Hà Nội: Tầng 17, VP2, tòa Sun Square, 21 Lê Đức Thọ, phường Từ Liêm, TP Hà Nội
TP Hồ Chí Minh: Tầng 5, Lottery Tower, số 77 Trần Nhân Tôn, phường An Đông, TP Hồ Chí Minh
Mỹ: 838 Walker Road, Suite 21-2 Dover, Delaware 19904, United States
Ấn Độ: 804/805, Kosha Kommercial Komplex, Primal Nagar, Malad East, Mumbai - 400097
Dubai: CWS-1V-792740, Amber Gem Tower, Ajman, United Arab Emirates
Đã xác nhận
© 2026 Cogover LLC