Skip to main content
Trang này gồm 5 endpoint theo đúng vòng đời một hồ sơ ký. Cần danh sách hồ sơ cần ký / đã ký của một người dùng? Xem API Công việc ký.

Trạng thái hồ sơ


1. Tạo hồ sơ ký số

Request

Trường cấp gốc

Trường của files[]attachments[]

Quy tắc ecmClassCode cho từng file: nếu quy trình chỉ ký một loại tài liệu, file tự kế thừa phân loại cấu hình trong quy trình. Nếu quy trình ký từ hai loại trở lên, bắt buộc gửi ecmClassCode cho từng file, thiếu sẽ báo lỗi MISSING_ECM_CLASS_CODE.attachments[] không kế thừa ecmClassCode từ cấp gốc — phải tự gửi.
Kiểm tra fileUrl: server tự tải file từ URL bạn cung cấp. Yêu cầu: HTTPS, dưới 50MB, phản hồi trong 30 giây, URL đọc được công khai (không cần header xác thực), không qua redirect, và không trỏ vào dải IP nội bộ.Hệ thống nhận diện PDF bằng chữ ký nhị phân đầu file, không dựa vào header Content-Type. Xem mã lỗi 413/415/502.

Trường của signers[]

identityNumbertaxCode dùng để phân loại người ký: cá nhân dùng identityNumber, tổ chức dùng taxCode. Chỉ gửi một trong hai. Khi gửi taxCode, tài khoản người ký được tạo với username chính là mã số thuế.

Giới hạn độ dài và định dạng

username bị bỏ qua (kèm cảnh báo trong log) nếu bước tương ứng là bước khách mời (guest / phone_guest) — những bước này định danh người ký qua email/số điện thoại.

Nhiều người ký cùng một bước

Nhiều signer trỏ vào cùng stepCode sẽ tạo nhiều lượt ký tại bước đó, diễn ra lần lượt theo order (hoặc thứ tự trong mảng). Hỗ trợ cả khách mời (mỗi người một email/định danh) lẫn nhân sự nội bộ (mỗi người một username):
Trong response tra cứu và webhook, mỗi lượt ký được nhận diện qua định danh (email / identityNumber / taxCode / username), không qua stepCode.

Response

Response của endpoint tạo hồ sơ không chứa ecmClassCode, size, mimeType — các trường này chỉ có ở mục tra cứu hồ sơ và liệt kê file bên dưới.Với disableStart: true, status trả về là PENDING thay vì PENDING_SIGN.
Endpoint trả về HTTP 201, nhưng statusCode trong body luôn ghi 200. Dựa vào HTTP status thật, không dựa vào trường trong body.

Xử lý phía server

Toàn bộ quá trình là atomic — bất kỳ bước nào lỗi thì rollback hoàn toàn, không để lại hồ sơ dở dang:
  1. Xác thực API Key → xác định tổ chức
  2. Kiểm tra idempotency theo documentId → trùng thì 409
  3. Tra cứu processDefCode → lấy quy trình và các bước
  4. Xử lý file: source=template thì render từ mẫu; source=url thì tải PDF qua bộ lọc SSRF rồi lưu trữ
  5. Kiểm tra và gán người ký theo stepCode
  6. Tạo hồ sơ, lưu metadata
  7. Khởi chạy quy trình, gửi thông báo cho người ký

Ví dụ cURL


2. Kích hoạt quy trình

Chỉ dùng khi hồ sơ được tạo với disableStart: true. Endpoint chuyển hồ sơ từ PENDING sang PENDING_SIGN và sinh công việc đầu tiên. Khi nào cần:
  • Bạn muốn tạo hồ sơ trước để đội vận hành rà soát nội bộ, sau đó mới phát hành cho ký
  • Cần hẹn giờ phát hành (vd chỉ bắt đầu ngoài giờ làm việc)
Lỗi: 404 nếu documentId không tồn tại; 400 nếu hồ sơ không ở trạng thái PENDING (đã chạy rồi, hoặc đã kết thúc). Gọi lần hai khi quy trình đang chạy sẽ trả 400.

3. Tra cứu trạng thái hồ sơ

Dùng khi bỏ lỡ webhook hoặc cần kiểm tra trạng thái trước khi thao tác tiếp.
requiredCount là tổng số bước ký, signedCount là số bước đã ký. Hồ sơ chuyển COMPLETED khi hai giá trị bằng nhau.

Định danh người ký

Mỗi item trong signers[] chỉ chứa các trường ứng với loại bước ký của nó:
API không trả ID số nội bộ (userId, roleId) — nhất quán với nguyên tắc codes-first. Định danh ổn định là username (người dùng) và roleCode (vai trò).

4. Liệt kê file của hồ sơ

Trả về toàn bộ file con (MAIN + ATTACHMENT) kèm fileUuid. Dùng khi chỉ cần danh sách file mà không cần toàn bộ trạng thái hồ sơ.
Mỗi file có hai cách lấy nội dung: url (presigned, trỏ tới phiên bản mới nhất, có thể hết hạn) và downloadUrl (proxy qua API Key, không hết hạn). Nếu hệ thống của bạn xử lý file trễ hơn vài phút, dùng downloadUrl.

5. Tải file

Server stream trực tiếp nội dung file về — không redirect, không qua presigned URL trung gian. Lấy fileUuid từ response tạo hồ sơ, liệt kê file, tra cứu hồ sơ, hoặc từ webhook (files[].ecmNodeUuid). Đặc điểm:
  • Gọi được ở bất kỳ trạng thái nào của hồ sơ, mỗi lần lấy phiên bản mới nhất
  • File thuộc tổ chức khác trả 404 FILE_NOT_FOUND (không lộ sự tồn tại)
Response headers:

Bước tiếp theo

Webhook

Nhận thông báo khi hồ sơ hoàn tất hoặc bị từ chối

Mã lỗi

Danh sách đầy đủ mã lỗi và cách xử lý