All routes tenant-scoped unless noted: each request acts on the one organization named in X-Tenant, which must be one of the caller's own registered organizations. Nothing here lists or reaches other tenants.

Tenant settings

Method & PathPermissionPurposeSide effects
GET tenant—Active tenant profile + effective permissions—
PATCH tenanttenant.manage (+tenant.security.manage for MFA-policy fields)Update org profile202 — opens an email-OTP change request, not applied immediately
GET tenant/numbering-settingstenant.viewEffective per-doc-type numbering prefix/padding—
PUT tenant/numbering-settingstenant.manageUpdate numbering prefixes/paddingRejects if the series already issued numbers; audit
GET tenant/collection-settingstenant.viewWHT recognition mode, receipt issuance, payment methods—
PUT tenant/collection-settingstenant.manageUpdate collection settingsLocks wht_recognition once the WHT control account has ledger activity; audit
POST tenant/logotenant.manageUpload org logoStores file, deletes prior, audit
GET tenant/tax-packtenant.managePreview effect of applying a country tax pack—
POST tenant/tax-pack/applytenant.manageApply country tax packCreates/updates tenant tax rates
GET tenant/tax-registrationstenant.viewTax registration profile per tax type—
PUT tenant/tax-registrationstenant.manageUpsert one tax type's registrationDrives which statutory forms apply; audit

Change requests (email-OTP confirmation)

Method & PathPermissionPurpose
POST change-requests/{changeRequest}/confirmmatches the underlying resource (tenant.manage/branch.manage/period.manage)Confirm a pending OTP-gated change with the emailed code

Branches

Method & PathPermissionPurposeSide effects
GET branchesbranch.viewList branches—
POST branchesbranch.manageCreate branchNo plan cap (branches are unlimited); 202 change request
PATCH branches/{branch}branch.manageUpdate branchNever plan-capped; 202 change request

Departments / Cost Centers / Projects (feature:dimensions)

Same CRUD shape (GET/POST/PATCH) for departments, cost-centers, projects — permission org.view/org.manage, each write audited.

Members & Access (RBAC)

Method & PathPermissionPurposeSide effects
GET membersmember.viewList tenant members—
POST membersmember.inviteInvite a member by email + role/permissionsSeat-capacity + privilege-ceiling checks; creates user if new; sends invite email; audit member.invited
POST members/{membership}/resend-invitemember.inviteResend invitationNew token, sends email, audit
PATCH members/{membership}/rolesmember.manageReassign rolesPrivilege-ceiling + self-lockout guards; clears overrides; audit
PATCH members/{membership}/permissionsmember.manage + feature:advanced_rbacSet per-member permission overridesPrivilege-ceiling + self-lockout guards; audit
POST members/{membership}/reactivatemember.manageReactivate a suspended memberRe-checks seat cap; audit
POST members/{membership}/transfer-ownershipowner-only + password confirmTransfer tenant ownershipOld owner keeps Administrator role; audit
DELETE members/{membership}member.manageRemove member access (suspend)Audit

Reference/meta data

Method & PathPermissionPurpose
GET meta/permissionsmember.viewPermission catalogue for admin UI
GET meta/tiersmember.viewModule access-tier matrix + role presets
GET meta/rolesmember.viewRoles in active tenant
GET meta/tax-rates—Active tax rates (form dropdowns)
GET meta/country-catalogs—Country-specific code catalogues
GET meta/account-subtypescoa.viewSuggested account subtypes