Chart of Accounts

Method & PathPermissionPurposeSide effects
GET accountscoa.viewList accounts, annotated with a ledger-usage flag—
GET accounts/exportcoa.viewCSV exportStreams file
POST accountscoa.manageCreate accountAudit coa.account_created
POST accounts/importcoa.manageAll-or-nothing CSV importCreates accounts in dependency order; audit
PATCH accounts/{account}coa.manageUpdate accountBlocks type/postable/currency/control changes once the account is used, or for system/engine accounts; audit
DELETE accounts/{account}coa.manageDelete (or deactivate if used)Audit

Account::ENGINE_CODES (see Database — Accounting) are protected from renumbering once in use, regardless of coa.manage permission.

Accounting Periods

Method & PathPermissionPurposeSide effects
GET periodsperiod.viewList periods, optionally filtered by fiscal year—
POST periods/generateperiod.manageGenerate periods for a fiscal year202 change request
PATCH periods/{period}/statusperiod.manageChange status (open/soft-closed/hard-closed)202 change request
GET periods/year-end/previewperiod.managePreview the year-end closing entryResponse includes pending_entry ({id, status} of a closing entry awaiting sign-off or a rejected draft, else null)
POST periods/year-end/closeperiod.managePrepare the year-end closing entry (P&L → Retained Earnings) and submit it for reviewPosts nothing yet; response includes entry_id, status. Approval in the journal workflow (reviewer ≠ approver ≠ preparer) posts it into the 13th adjustment period and hard-closes the fiscal year; approval is refused if anything posted into that year after preparation (delete the draft and close again). Not editable; a draft can only be deleted

Exchange Rates / FX (feature:multi_currency)

Method & PathPermissionPurposeSide effects
GET exchange-ratesfx.viewList exchange rates—
POST exchange-ratesfx.manageUpsert rate for currency/dateAudit
DELETE exchange-rates/{exchangeRate}fx.manageDelete rateAudit
GET fx/revaluation/previewfx.managePreview unrealized FX revaluation—
POST fx/revaluationfx.managePrepare the period-end FX revaluation entry and submit it for reviewPosts nothing yet; response includes entry_id, status. Approval in the journal workflow posts it together with its next-day auto-reversal. If one is already pending (or posted) for the date, the existing entry is returned. A rejected one can't be edited — delete the draft and run again