Thành viên
thanh vienThà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). thanh vien, vai tro, loi moi va quyen truy cap cheo giua hang ke toan va khach hang (access grants).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).
Endpoint
Phần tiêu đề “Endpoint”| Method | Path | Tóm tắt | Quyền | Nhóm tốc độ | Tương tác |
|---|---|---|---|---|---|
GET | /v1/invitations | Danh sách lời mời | member.read | read | Scalar |
POST | /v1/invitations | Mời một người qua email | member.invite | write | Scalar |
GET | /v1/invitations/preview | Xem trước lời mời bằng mã thông báo | Công khai, không cần khoá | read | Scalar |
POST | /v1/invitations/{id}:resend | Gửi lại lời mời đang chờ | member.invite | write | Scalar |
POST | /v1/invitations/{id}:revoke | Thu hồi lời mời đang chờ | member.invite | write | Scalar |
POST | /v1/invitations:accept | Nhận lời mời bằng mã thông báo | Mọi khoá hợp lệ | write | Scalar |
GET | /v1/members | Danh sách thành viên | member.read | read | Scalar |
GET | /v1/members/{id} | Chi tiết thành viên | member.read | read | Scalar |
PATCH | /v1/members/{id} | Đổi vai trò, phạm vi hoặc yêu cầu 2FA của thành viên | member.role_change | write | Scalar |
DELETE | /v1/members/{id} | Gỡ thành viên | member.remove | write | Scalar |
GET | /v1/roles | Vai trò hệ thống và quyền của từng vai trò | member.read | read | Scalar |
Chi tiết endpoint
Phần tiêu đề “Chi tiết endpoint”GET /v1/invitations
Phần tiêu đề “GET /v1/invitations”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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
limit | query | Không | integer | Số phần tử mỗi trang (1–100, mặc định 20). |
cursor | query | Không | Cursor | Con trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa. |
state | query | Không | string | — |
curl -sS -X GET "https://api.dongtien.pro/v1/invitations" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/invitations");import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import list_invitations
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_invitations.sync(client=dt.client)POST /v1/invitations
Phần tiêu đề “POST /v1/invitations”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.
- 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}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/invitations", { body: { "email": "ketoan@congty.example", "role": "accountant", "scope": "all", "require_2fa": false, "expires_in_days": 7 },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import create_invitationfrom dongtien_api.models import CreateInvitation
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = create_invitation.sync( client=dt.client, body=CreateInvitation.from_dict({ "email": "ketoan@congty.example", "role": "accountant", "scope": "all", "require_2fa": False, "expires_in_days": 7, }), )GET /v1/invitations/preview
Phần tiêu đề “GET /v1/invitations/preview”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.
- 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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
token | query | Có | string | Mã thông báo trong liên kết mời. |
curl -sS -X GET "https://api.dongtien.pro/v1/invitations/preview?token=$TOKEN"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/invitations/preview", { params: { query: { "token": "<token>" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import preview_invitation
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = preview_invitation.sync(client=dt.client, token="<token>")POST /v1/invitations/{id}:resend
Phần tiêu đề “POST /v1/invitations/{id}:resend”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.
- 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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | InvitationId | Mã 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}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/invitations/{id}:resend", { params: { path: { "id": "ivt_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, }, body: { "expires_in_days": 7 },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import resend_invitationfrom dongtien_api.models import ResendInvitation
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = resend_invitation.sync( id="ivt_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client, body=ResendInvitation.from_dict({ "expires_in_days": 7, }), )POST /v1/invitations/{id}:revoke
Phần tiêu đề “POST /v1/invitations/{id}:revoke”Thu hồi lời mời đang chờ
Lời mời không ở trạng thái pending → 409 conflict.
- 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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | InvitationId | Mã lời mời (ivt_…). |
curl -sS -X POST "https://api.dongtien.pro/v1/invitations/$ID:revoke" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/invitations/{id}:revoke", { params: { path: { "id": "ivt_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import revoke_invitation
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = revoke_invitation.sync(id="ivt_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)POST /v1/invitations:accept
Phần tiêu đề “POST /v1/invitations:accept”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.
- 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"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/invitations:accept", { body: { "token": "ivt_tok_3f9c2a7e5b1d4c68a0e2f7b9d1c35a46" },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import accept_invitationfrom dongtien_api.models import AcceptInvitation
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = accept_invitation.sync( client=dt.client, body=AcceptInvitation.from_dict({ "token": "ivt_tok_3f9c2a7e5b1d4c68a0e2f7b9d1c35a46", }), )GET /v1/members
Phần tiêu đề “GET /v1/members”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.
- 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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
limit | query | Không | integer | Số phần tử mỗi trang (1–100, mặc định 20). |
cursor | query | Không | Cursor | Con trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa. |
company_id | query | Không | OrgId | Mã công ty / tổ chức (org_…). |
status | query | Không | string | — |
without_2fa | query | Không | string | true: 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"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/members");import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import list_members
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_members.sync(client=dt.client)GET /v1/members/{id}
Phần tiêu đề “GET /v1/members/{id}”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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | MemberId | Mã 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"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/members/{id}", { params: { path: { "id": "mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import get_member
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_member.sync(id="mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)PATCH /v1/members/{id}
Phần tiêu đề “PATCH /v1/members/{id}”Đổ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.
- 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
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | MemberId | Mã 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" ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PATCH("/v1/members/{id}", { params: { path: { "id": "mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, }, body: { "role": "owner", "scope": "all", "company_ids": [ "org_0f5k2m9q4h7t3n8r6v1w0x5yz0" ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import update_memberfrom dongtien_api.models import UpdateMember
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = update_member.sync( id="mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client, body=UpdateMember.from_dict({ "role": "owner", "scope": "all", "company_ids": [ "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", ], }), )DELETE /v1/members/{id}
Phần tiêu đề “DELETE /v1/members/{id}”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.
- Nhóm tốc độ:
write - Phản hồi thành công
204: Đã gỡ. — không có nội dung - Mã lỗi riêng của endpoint:
step_up_required,resource_not_found,conflict
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | MemberId | Mã 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"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.DELETE("/v1/members/{id}", { params: { path: { "id": "mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import remove_member
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = remove_member.sync(id="mbr_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)GET /v1/roles
Phần tiêu đề “GET /v1/roles”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"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/roles");import os
from dongtien import DongTienfrom dongtien_api.api.thanh_vien import list_roles
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_roles.sync(client=dt.client)Đối tượng
Phần tiêu đề “Đối tượng”InvitationList
Phần tiêu đề “InvitationList”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data | Invitation[] | Có | — |
data[].accepted_at | Timestamp | null | Có | — |
data[].company_ids | OrgId[] | Có | — |
data[].created_at | Timestamp | Có | — |
data[].email | string | Có | — |
data[].expires_at | Timestamp | Có | — |
data[].id | InvitationId | Có | — |
data[].invited_by | UserId | Có | — |
data[].org_id | string | Có | Nút sẽ giữ vai trò: nút gốc hoặc một công ty. |
data[].require_2fa | boolean | Có | — |
data[].resend_count | integer | Có | — |
data[].revoked_at | Timestamp | null | Có | — |
data[].role | string | Có | Khoá vai trò được mời (xem GET /v1/roles). |
data[].scope | string | Có | 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_at | Timestamp | Có | — |
data[].state | string | Có | Giá trị: pending, accepted, revoked, expired. |
has_more | boolean | Có | — |
next_cursor | string | null | Có | Con trỏ trang kế; null khi hết dữ liệu. |
object | string | Có | Giá trị: list. |
CreateInvitation
Phần tiêu đề “CreateInvitation”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
company_ids | OrgId[] | Không | Các công ty của phạm vi list (chỉ lời mời ở nút gốc). |
email | string (email) | Có | — |
expires_in_days | number | number | number | Không | Hiệu lực của liên kết: 3, 7 hoặc 14 ngày. |
org_id | string | Không | Công ty sẽ giữ vai trò; bỏ trống = nút gốc. |
require_2fa | boolean | Không | — |
role | string | Có | Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor. |
scope | string | Không | 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. |
InvitationCreated
Phần tiêu đề “InvitationCreated”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
accepted_at | Timestamp | null | Có | — |
company_ids | OrgId[] | Có | — |
created_at | Timestamp | Có | — |
email | string | Có | — |
email_delivery | string | Có | 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_at | Timestamp | Có | — |
id | InvitationId | Có | — |
invited_by | UserId | Có | — |
org_id | string | Có | Nút sẽ giữ vai trò: nút gốc hoặc một công ty. |
require_2fa | boolean | Có | — |
resend_count | integer | Có | — |
revoked_at | Timestamp | null | Có | — |
role | string | Có | Khoá vai trò được mời (xem GET /v1/roles). |
scope | string | Có | 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_at | Timestamp | Có | — |
state | string | Có | Giá trị: pending, accepted, revoked, expired. |
InvitationPreview
Phần tiêu đề “InvitationPreview”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
expires_at | string | Có | Thời điểm liên kết hết hiệu lực. |
org_display_name | string | Có | Tên tổ chức (hoặc công ty) đã mời bạn. |
role_key | string | Có | Khoá vai trò được mời. |
ResendInvitation
Phần tiêu đề “ResendInvitation”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
expires_in_days | number | number | number | Không | — |
Invitation
Phần tiêu đề “Invitation”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
accepted_at | Timestamp | null | Có | — |
company_ids | OrgId[] | Có | — |
created_at | Timestamp | Có | — |
email | string | Có | — |
expires_at | Timestamp | Có | — |
id | InvitationId | Có | — |
invited_by | UserId | Có | — |
org_id | string | Có | Nút sẽ giữ vai trò: nút gốc hoặc một công ty. |
require_2fa | boolean | Có | — |
resend_count | integer | Có | — |
revoked_at | Timestamp | null | Có | — |
role | string | Có | Khoá vai trò được mời (xem GET /v1/roles). |
scope | string | Có | 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_at | Timestamp | Có | — |
state | string | Có | Giá trị: pending, accepted, revoked, expired. |
AcceptInvitation
Phần tiêu đề “AcceptInvitation”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
token | string | Có | — |
AcceptedInvitation
Phần tiêu đề “AcceptedInvitation”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
membership_id | MemberId | Có | — |
org_id | OrgId | Có | — |
role | string | Có | — |
root_id | OrgId | Có | — |
MemberList
Phần tiêu đề “MemberList”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data | Member[] | Có | — |
data[].company_ids | OrgId[] | Có | Các công ty của phạm vi list; rỗng với phạm vi all. |
data[].created_at | Timestamp | Có | — |
data[].email | string | Có | — |
data[].first_login_at | Timestamp | null | Có | — |
data[].id | MemberId | Có | — |
data[].last_active_at | Timestamp | null | Có | — |
data[].name | string | Có | — |
data[].org_id | string | Có | Nút giữ vai trò: nút gốc (toàn tổ chức) hoặc một công ty. |
data[].require_2fa | boolean | Có | — |
data[].role | string | Có | Vai trò hệ thống: owner, admin, accountant_chief, … Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor. |
data[].scope | string | Có | 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[].status | string | Có | Giá trị: active, invited. |
data[].two_factor_enabled | boolean | Có | — |
data[].user_id | UserId | Có | — |
has_more | boolean | Có | — |
next_cursor | string | null | Có | Con trỏ trang kế; null khi hết dữ liệu. |
object | string | Có | Giá trị: list. |
Member
Phần tiêu đề “Member”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
company_ids | OrgId[] | Có | Các công ty của phạm vi list; rỗng với phạm vi all. |
created_at | Timestamp | Có | — |
email | string | Có | — |
first_login_at | Timestamp | null | Có | — |
id | MemberId | Có | — |
last_active_at | Timestamp | null | Có | — |
name | string | Có | — |
org_id | string | Có | Nút giữ vai trò: nút gốc (toàn tổ chức) hoặc một công ty. |
require_2fa | boolean | Có | — |
role | string | Có | Vai trò hệ thống: owner, admin, accountant_chief, … Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor. |
scope | string | Có | 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. |
status | string | Có | Giá trị: active, invited. |
two_factor_enabled | boolean | Có | — |
user_id | UserId | Có | — |
UpdateMember
Phần tiêu đề “UpdateMember”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
company_ids | OrgId[] | Không | Các công ty của phạm vi list (chỉ với vai trò ở nút gốc). |
require_2fa | boolean | Không | — |
role | string | Không | Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor. |
scope | string | Không | Giá trị: all, list. |
RoleList
Phần tiêu đề “RoleList”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data | Role[] | Có | — |
data[].key | string | Có | Giá trị: owner, admin, accountant_chief, accountant, developer, viewer, auditor. |
data[].name | string | Có | Tên tiếng Việt của vai trò. |
data[].permissions | map<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_more | boolean | Có | Giá trị: false. |
next_cursor | any | null | Có | — |
object | string | Có | Giá trị: list. |
step_up_permissions | string[] | Có | Các quyền luôn cần xác thực lại gần đây, bất kể vai trò. |