API Key lại có hai loại, cấp cho hai việc khác nhau — dùng nhầm sẽ bị từ chối:
Nhóm
/integration/directory/* (danh mục tổ chức, vai trò và đồng bộ người dùng) nhận cả hai loại, vì một hệ thống nhân sự có thể phục vụ nhiều tenant từ một ứng dụng. Phần còn lại của Integration API vẫn chỉ nhận key theo tổ chức.
API Key
Mọi request tới Integration API gửi kèm headerX-API-Key:
Lỗi liên quan tới API Key
Mọi lỗi đều trả401, phân biệt nguyên nhân qua trường code:
Các phiên bản trước gộp mọi lỗi
401 vào code: "UNAUTHORIZED" và chỉ phân biệt qua message. Nếu tích hợp của bạn đang đọc message, hãy chuyển sang đọc code. Chi tiết: Mã lỗi.Lấy Access Token — Partner Login
Khi bạn muốn nhúng giao diện econtractid (iframe trên web hoặc SDK mobile), người dùng cuối cần một access token. Backend của bạn dùng API Key để đổi lấy token cho một người dùng cụ thể:Request
Response
Trả về HTTP201 (mặc định của POST), body bọc trong envelope chuẩn:
userInfo ở trên là bản rút gọn. Response thật còn có address, avatar, memberOf, updatedAt, và các trường chữ ký (defaultSignature, imageSignatures, backgroundSignatures).status là số (1 = chờ kích hoạt, 2 = đang hoạt động). organizationId bằng -1 với người dùng bên ngoài — đây là giá trị bình thường, không phải lỗi.Lỗi
Giới hạn quan trọng
Dùng access token gọi API
Token gửi qua headerx-access-token, giá trị là JWT thuần:
X-API-Key (người dùng = tài khoản gắn với key) hoặc x-access-token (người dùng = chủ sở hữu token). Gửi kèm cả hai thì API Key được ưu tiên, token bị bỏ qua — nên chỉ gửi một.
401 khi token trông vẫn hợp lệ
Tầng xác thực chỉ kiểm tra chữ ký và hạn dùng của token, không kiểm tra quyền. Nhận
401 nghĩa là token/header sai — vấn đề về quyền hạn trả 403, còn dữ liệu không thuộc phạm vi người dùng trả 404.Vòng đời token
Vì hệ thống không có endpoint refresh, luồng xử lý khi token hết hạn là lấy token mới:
Áp dụng vào tích hợp
Nhúng web (iframe)
Truyền token qua query param
atSDK Flutter
Truyền token vào
openTaskList(), làm mới bằng updateAccessToken()
