Bỏ qua để đến nội dung

Thành viên

~17 phút đọc

Thành viên, vai trò, lời mời và quyền truy cập chéo giữa hãng kế toán và khách hàng (access grants).

MethodPathTóm tắtQuyềnNhóm tốc độTương tác
GET/v1/invitationsDanh sách lời mờimember.readreadScalar
POST/v1/invitationsMời một người qua emailmember.invitewriteScalar
GET/v1/invitations/previewXem trước lời mời bằng mã thông báoCông khai, không cần khoáreadScalar
POST/v1/invitations/{id}:resendGửi lại lời mời đang chờmember.invitewriteScalar
POST/v1/invitations/{id}:revokeThu hồi lời mời đang chờmember.invitewriteScalar
POST/v1/invitations:acceptNhận lời mời bằng mã thông báoMọi khoá hợp lệwriteScalar
GET/v1/membersDanh sách thành viênmember.readreadScalar
GET/v1/members/{id}Chi tiết thành viênmember.readreadScalar
PATCH/v1/members/{id}Đổi vai trò, phạm vi hoặc yêu cầu 2FA của thành viênmember.role_changewriteScalar
DELETE/v1/members/{id}Gỡ thành viênmember.removewriteScalar
GET/v1/rolesVai trò hệ thống và quyền của từng vai tròmember.readreadScalar

Danh sách lời mời

Lời mời của các nút tổ chức mà người gọi truy cập được, phân trang theo con trỏ.

Quyền: member.read
  • Nhóm tốc độ: read
  • Phản hồi thành công 200: Danh sách lời mời. — InvitationList, application/json
  • Mã lỗi riêng của endpoint: invalid_cursor
TênVị tríBắt buộcKiểuMô tả
limitqueryKhôngintegerSố phần tử mỗi trang (1–100, mặc định 20).
cursorqueryKhôngCursorCon trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa.
statequeryKhôngstring—
curl -sS -X GET "https://api.dongtien.pro/v1/invitations" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

Mời một người qua email

Chỉ mời được vai trò mà người mời nắm đủ quyền; chỉ chủ sở hữu mới mời chủ sở hữu. Phạm vi list chỉ áp dụng cho lời mời ở nút gốc. Liên kết chứa mã thông báo chỉ được gửi qua email.

Quyền: member.invite
  • Nhóm tốc độ: write
  • Nội dung yêu cầu: CreateInvitation (application/json, bắt buộc)
  • Phản hồi thành công 201: Đã tạo lời mời. — InvitationCreated, application/json
  • Mã lỗi riêng của endpoint: conflict
curl -sS -X POST "https://api.dongtien.pro/v1/invitations" \
-H "Authorization: Bearer $DT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "ketoan@congty.example",
"role": "accountant",
"scope": "all",
"require_2fa": false,
"expires_in_days": 7
}'

Mở trong tài liệu tương tác

Xem trước lời mời bằng mã thông báo

Không cần đăng nhập: mã thông báo trong liên kết là bằng chứng. Chỉ trả tên tổ chức, vai trò và hạn dùng, không bao giờ trả email, mã định danh hay người mời. Mã không tồn tại, đã hết hạn, đã thu hồi hoặc đã dùng đều trả cùng một 404 resource_not_found. Phản hồi có Cache-Control: no-store.

Quyền: Công khai, không cần khoá
  • Nhóm tốc độ: read
  • Phản hồi thành công 200: Thông tin lời mời. — InvitationPreview, application/json
  • Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
TênVị tríBắt buộcKiểuMô tả
tokenqueryCóstringMã thông báo trong liên kết mời.
curl -sS -X GET "https://api.dongtien.pro/v1/invitations/preview?token=$TOKEN"

Mở trong tài liệu tương tác

Gửi lại lời mời đang chờ

Tạo liên kết mới và cửa sổ hiệu lực mới (liên kết cũ không còn dùng được). Lời mời không ở trạng thái pending → 409 conflict.

Quyền: member.invite
  • Nhóm tốc độ: write
  • Nội dung yêu cầu: ResendInvitation (application/json)
  • Phản hồi thành công 200: Đã gửi lại. — InvitationCreated, application/json
  • Mã lỗi riêng của endpoint: resource_not_found, conflict
TênVị tríBắt buộcKiểuMô tả
idpathCóInvitationIdMã lời mời (ivt_…).
curl -sS -X POST "https://api.dongtien.pro/v1/invitations/$ID:resend" \
-H "Authorization: Bearer $DT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"expires_in_days": 7
}'

Mở trong tài liệu tương tác

Thu hồi lời mời đang chờ

Lời mời không ở trạng thái pending → 409 conflict.

Quyền: member.invite
  • Nhóm tốc độ: write
  • Phản hồi thành công 200: Lời mời đã thu hồi. — Invitation, application/json
  • Mã lỗi riêng của endpoint: resource_not_found, conflict
TênVị tríBắt buộcKiểuMô tả
idpathCóInvitationIdMã lời mời (ivt_…).
curl -sS -X POST "https://api.dongtien.pro/v1/invitations/$ID:revoke" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

Nhận lời mời bằng mã thông báo

Chỉ người dùng đã đăng nhập (không dùng khoá API hay OAuth) bằng đúng email được mời và đã xác minh email. Lời mời không còn hiệu lực → 409 conflict; email không khớp → 403 permission_denied; mã không tồn tại → 404 resource_not_found.

Quyền: Mọi khoá hợp lệ
  • Nhóm tốc độ: write
  • Nội dung yêu cầu: AcceptInvitation (application/json, bắt buộc)
  • Phản hồi thành công 200: Đã tham gia. — AcceptedInvitation, application/json
  • Mã lỗi riêng của endpoint: conflict
curl -sS -X POST "https://api.dongtien.pro/v1/invitations:accept" \
-H "Authorization: Bearer $DT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"token": "ivt_tok_3f9c2a7e5b1d4c68a0e2f7b9d1c35a46"
}'

Mở trong tài liệu tương tác

Danh sách thành viên

Thành viên của các nút tổ chức mà người gọi truy cập được, phân trang theo con trỏ. company_id giới hạn một công ty.

Quyền: member.read
  • Nhóm tốc độ: read
  • Phản hồi thành công 200: Danh sách thành viên. — MemberList, application/json
  • Mã lỗi riêng của endpoint: invalid_cursor
TênVị tríBắt buộcKiểuMô tả
limitqueryKhôngintegerSố phần tử mỗi trang (1–100, mặc định 20).
cursorqueryKhôngCursorCon trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa.
company_idqueryKhôngOrgIdMã công ty / tổ chức (org_…).
statusqueryKhôngstring—
without_2faqueryKhôngstringtrue: chỉ thành viên chưa bật xác thực hai lớp.
curl -sS -X GET "https://api.dongtien.pro/v1/members" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

Chi tiết thành viên

Quyền: member.read
  • Nhóm tốc độ: read
  • Phản hồi thành công 200: Thành viên. — Member, application/json
  • Mã lỗi riêng của endpoint: resource_not_found
TênVị tríBắt buộcKiểuMô tả
idpathCóMemberIdMã thành viên (mbr_…): một vai trò tại một nút tổ chức.
curl -sS -X GET "https://api.dongtien.pro/v1/members/$ID" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

Đổi vai trò, phạm vi hoặc yêu cầu 2FA của thành viên

Cần xác thực lại gần đây (passkey/TOTP ≤ 15 phút). Một vai trò không thể cấp nhiều quyền hơn chính nó đang giữ; chỉ chủ sở hữu mới bổ nhiệm hoặc đổi chủ sở hữu khác; nút luôn còn ít nhất một chủ sở hữu đang hoạt động (vi phạm → 409 conflict). Có hiệu lực từ yêu cầu kế tiếp của thành viên; được ghi nhật ký kiểm toán member.role_change.

Quyền: member.role_change Cần xác thực lại gần đây
  • Nhóm tốc độ: write
  • Nội dung yêu cầu: UpdateMember (application/json, bắt buộc)
  • Phản hồi thành công 200: Thành viên sau khi cập nhật. — Member, application/json
  • Mã lỗi riêng của endpoint: step_up_required, resource_not_found, conflict
TênVị tríBắt buộcKiểuMô tả
idpathCóMemberIdMã thành viên (mbr_…): một vai trò tại một nút tổ chức.
curl -sS -X PATCH "https://api.dongtien.pro/v1/members/$ID" \
-H "Authorization: Bearer $DT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "owner",
"scope": "all",
"company_ids": [
"org_0f5k2m9q4h7t3n8r6v1w0x5yz0"
]
}'

Mở trong tài liệu tương tác

Gỡ thành viên

Cần xác thực lại gần đây. Phiên của thành viên mất quyền từ yêu cầu kế tiếp. Không gỡ được chủ sở hữu cuối cùng của một nút (409 conflict); chỉ chủ sở hữu mới gỡ được chủ sở hữu khác.

Quyền: member.remove Cần xác thực lại gần đây
TênVị tríBắt buộcKiểuMô tả
idpathCóMemberIdMã thành viên (mbr_…): một vai trò tại một nút tổ chức.
curl -sS -X DELETE "https://api.dongtien.pro/v1/members/$ID" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

Vai trò hệ thống và quyền của từng vai trò

Sinh từ cùng bảng quyền mà máy chủ dùng để cho phép hoặc từ chối, nên không thể lệch với thực tế. Không phân trang.

Quyền: member.read
  • Nhóm tốc độ: read
  • Phản hồi thành công 200: Các vai trò. — RoleList, application/json
  • Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/roles" \
-H "Authorization: Bearer $DT_API_KEY"

Mở trong tài liệu tương tác

TrườngKiểuBắt buộcMô tả
dataInvitation[]Có—
data[].accepted_atTimestamp | nullCó—
data[].company_idsOrgId[]Có—
data[].created_atTimestampCó—
data[].emailstringCó—
data[].expires_atTimestampCó—
data[].idInvitationIdCó—
data[].invited_byUserIdCó—
data[].org_idstringCóNút sẽ giữ vai trò: nút gốc hoặc một công ty.
data[].require_2fabooleanCó—
data[].resend_countintegerCó—
data[].revoked_atTimestamp | nullCó—
data[].rolestringCóKhoá vai trò được mời (xem GET /v1/roles).
data[].scopestringCóall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
data[].sent_atTimestampCó—
data[].statestringCóGiá trị: pending, accepted, revoked, expired.
has_morebooleanCó—
next_cursorstring | nullCóCon trỏ trang kế; null khi hết dữ liệu.
objectstringCóGiá trị: list.
TrườngKiểuBắt buộcMô tả
company_idsOrgId[]KhôngCác công ty của phạm vi list (chỉ lời mời ở nút gốc).
emailstring (email)Có—
expires_in_daysnumber | number | numberKhôngHiệu lực của liên kết: 3, 7 hoặc 14 ngày.
org_idstringKhôngCông ty sẽ giữ vai trò; bỏ trống = nút gốc.
require_2fabooleanKhông—
rolestringCóGiá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor.
scopestringKhôngall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
TrườngKiểuBắt buộcMô tả
accepted_atTimestamp | nullCó—
company_idsOrgId[]Có—
created_atTimestampCó—
emailstringCó—
email_deliverystringCóqueued: email đang được gửi; unavailable: chưa cấu hình dịch vụ email nên chưa ai nhận được liên kết. Giá trị: queued, unavailable.
expires_atTimestampCó—
idInvitationIdCó—
invited_byUserIdCó—
org_idstringCóNút sẽ giữ vai trò: nút gốc hoặc một công ty.
require_2fabooleanCó—
resend_countintegerCó—
revoked_atTimestamp | nullCó—
rolestringCóKhoá vai trò được mời (xem GET /v1/roles).
scopestringCóall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
sent_atTimestampCó—
statestringCóGiá trị: pending, accepted, revoked, expired.
TrườngKiểuBắt buộcMô tả
expires_atstringCóThời điểm liên kết hết hiệu lực.
org_display_namestringCóTên tổ chức (hoặc công ty) đã mời bạn.
role_keystringCóKhoá vai trò được mời.
TrườngKiểuBắt buộcMô tả
expires_in_daysnumber | number | numberKhông—
TrườngKiểuBắt buộcMô tả
accepted_atTimestamp | nullCó—
company_idsOrgId[]Có—
created_atTimestampCó—
emailstringCó—
expires_atTimestampCó—
idInvitationIdCó—
invited_byUserIdCó—
org_idstringCóNút sẽ giữ vai trò: nút gốc hoặc một công ty.
require_2fabooleanCó—
resend_countintegerCó—
revoked_atTimestamp | nullCó—
rolestringCóKhoá vai trò được mời (xem GET /v1/roles).
scopestringCóall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
sent_atTimestampCó—
statestringCóGiá trị: pending, accepted, revoked, expired.
TrườngKiểuBắt buộcMô tả
tokenstringCó—
TrườngKiểuBắt buộcMô tả
membership_idMemberIdCó—
org_idOrgIdCó—
rolestringCó—
root_idOrgIdCó—
TrườngKiểuBắt buộcMô tả
dataMember[]Có—
data[].company_idsOrgId[]CóCác công ty của phạm vi list; rỗng với phạm vi all.
data[].created_atTimestampCó—
data[].emailstringCó—
data[].first_login_atTimestamp | nullCó—
data[].idMemberIdCó—
data[].last_active_atTimestamp | nullCó—
data[].namestringCó—
data[].org_idstringCóNút giữ vai trò: nút gốc (toàn tổ chức) hoặc một công ty.
data[].require_2fabooleanCó—
data[].rolestringCóVai trò hệ thống: owner, admin, accountant_chief, … Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor.
data[].scopestringCóall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
data[].statusstringCóGiá trị: active, invited.
data[].two_factor_enabledbooleanCó—
data[].user_idUserIdCó—
has_morebooleanCó—
next_cursorstring | nullCóCon trỏ trang kế; null khi hết dữ liệu.
objectstringCóGiá trị: list.
TrườngKiểuBắt buộcMô tả
company_idsOrgId[]CóCác công ty của phạm vi list; rỗng với phạm vi all.
created_atTimestampCó—
emailstringCó—
first_login_atTimestamp | nullCó—
idMemberIdCó—
last_active_atTimestamp | nullCó—
namestringCó—
org_idstringCóNút giữ vai trò: nút gốc (toàn tổ chức) hoặc một công ty.
require_2fabooleanCó—
rolestringCóVai trò hệ thống: owner, admin, accountant_chief, … Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor.
scopestringCóall: mọi công ty của nút; list: chỉ các công ty trong company_ids (chỉ ở nút gốc). Giá trị: all, list.
statusstringCóGiá trị: active, invited.
two_factor_enabledbooleanCó—
user_idUserIdCó—
TrườngKiểuBắt buộcMô tả
company_idsOrgId[]KhôngCác công ty của phạm vi list (chỉ với vai trò ở nút gốc).
require_2fabooleanKhông—
rolestringKhôngGiá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor.
scopestringKhôngGiá trị: all, list.
TrườngKiểuBắt buộcMô tả
dataRole[]Có—
data[].keystringCóGiá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor.
data[].namestringCóTên tiếng Việt của vai trò.
data[].permissionsmap<string, string>CóQuyền → allow | self (chỉ bản ghi của chính mình) | stepup (cần xác thực lại gần đây).
has_morebooleanCóGiá trị: false.
next_cursorany | nullCó—
objectstringCóGiá trị: list.
step_up_permissionsstring[]CóCác quyền luôn cần xác thực lại gần đây, bất kể vai trò.