MyChurchDocs

Finance, budgets and expenses

Where money goes and where it sits: money accounts and their ledger, transfers and withdrawals, expenses by vote head, and the premium budgets and requisitions.

Every read route also accepts head_office:churches:view and system:churches:view with an X-Church header. Balances move only inside the same database transaction as the ledger line that explains them, so a money account's balance always equals the sum of its ledger.

Money accounts

The church's money accounts: bank accounts, cash and any other place it keeps money. They are created and configured as bank accounts under Giving, and each paybill settles into one of them. Collections credit them; expenses, transfers, withdrawals and paid requisitions debit them.

RoutePermissionPurpose
GET/v1/money-accountschurch:accounts:viewAccounts with balance, opening balance and this month's money in and out (q).
GET/v1/money-accounts/{uuid}church:accounts:viewOne account.
GET/v1/money-accounts/{uuid}/ledgerchurch:accounts:viewLedger lines (from, to; default the current month; source; page, page_size) with totals.

Viewing accounts is also allowed to anyone who can transfer, withdraw, record expenses, pay requisitions or build budgets, since each of those needs to pick an account.

Transfers and withdrawals

A transfer moves money between two of the church's accounts at once. A withdrawal takes money out (to the bank, to petty cash) and waits for approval; the ledger moves only when it is approved. Someone other than the requester must approve it, unless the requester is the church admin.

RoutePermissionPurpose
GET/v1/transferschurch:accounts:transfer or church:accounts:viewTransfers (account, page, page_size; current month by default).
POST/v1/transferschurch:accounts:transferMove money: from_account_uuid, to_account_uuid, amount, description.
GET/v1/withdrawalschurch:accounts:withdraw, church:accounts:edit or church:accounts:viewWithdrawals and their approval state (status, account, page, page_size).
POST/v1/withdrawalschurch:accounts:withdrawRequest a withdrawal: account_uuid, amount, transaction_cost, reason. 402 when the balance cannot cover amount plus cost.
POST/v1/withdrawals/{uuid}/approvechurch:accounts:withdraw or church:accounts:editApprove; the ledger moves now (optional note).
POST/v1/withdrawals/{uuid}/rejectchurch:accounts:withdraw or church:accounts:editReject (optional note).
POST/v1/withdrawals/{uuid}/cancelchurch:accounts:withdraw or church:accounts:editCancel a pending request: the requester or an approver (optional note).
# Paste your token once (it starts with mc_):
export MYCHURCH_TOKEN="mc_your_token_here"

curl -X POST https://uat-api.mychurch.co.ke/v1/transfers \
  -H "Authorization: Bearer $MYCHURCH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from_account_uuid": "1f0e7d6c-0000-4000-8000-00000000f001",
    "to_account_uuid": "1f0e7d6c-0000-4000-8000-00000000f002",
    "amount": 50000,
    "description": "Paybill to building fund bank account"
  }'
402 when a withdrawal cannot be covered
{
  "success": false,
  "error": "Main paybill account holds 12000.00, not enough for this withdrawal and its cost"
}

Expenses

RoutePermissionPurpose
GET/v1/expenseschurch:expenses:viewExpenses (from, to, account, vote_head, mode, q, page, page_size).
GET/v1/expenses/totalschurch:expenses:viewTotals for the same filters.
GET/v1/expenses/export.csvchurch:expenses:viewThe same filters as a CSV download.
POST/v1/expenseschurch:expenses:createRecord an expense; the account is debited.
GET/v1/expenses/{uuid}church:expenses:viewOne expense.
PUT/v1/expenses/{uuid}church:expenses:editCorrect an expense (PATCH accepted); the ledger is adjusted.
DELETE/v1/expenses/{uuid}church:expenses:deleteRemove an expense; the debit is reversed.
POST/v1/expenses/{uuid}/filechurch:expenses:create or church:expenses:editAttach a receipt (multipart).
GET/v1/expenses/{uuid}/filechurch:expenses:viewDownload the attached receipt.
# Paste your token once (it starts with mc_):
export MYCHURCH_TOKEN="mc_your_token_here"

curl -X POST https://uat-api.mychurch.co.ke/v1/expenses \
  -H "Authorization: Bearer $MYCHURCH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sound system repair",
    "amount": 18500,
    "transaction_date": "2026-10-28",
    "reference": "INV-2210",
    "payment_mode": "mpesa",
    "account_uuid": "1f0e7d6c-0000-4000-8000-00000000f001",
    "vote_head_uuid": "2a7c5e90-0000-4000-8000-00000000e001"
  }'

payment_mode is cash, mpesa, bank, cheque or other; the date cannot be in the future. Receipts are PDF, PNG or JPEG under 10 MB.

Vote heads, years and currencies

RoutePermissionPurpose
GET/v1/vote-headschurch:vote_heads:viewExpense categories (vote heads).
POST/v1/vote-headschurch:vote_heads:createAdd a vote head.
PUT/v1/vote-heads/{uuid}church:vote_heads:editRename (PATCH accepted).
DELETE/v1/vote-heads/{uuid}church:vote_heads:deleteRemove.
GET/v1/financial-yearschurch:finance:viewFinancial years.
POST/v1/financial-yearschurch:vote_heads:createAdd a financial year.
PUT/v1/financial-years/{uuid}church:vote_heads:editChange its dates (PATCH accepted).
POST/v1/financial-years/{uuid}/currentchurch:vote_heads:editMake it the current year.
DELETE/v1/financial-years/{uuid}church:vote_heads:deleteRemove.
GET/v1/currencieschurch:finance:viewCurrencies.
POST/v1/currenciessystem:settings:manageAdd a currency (staff only).
PUT/v1/currencies/{uuid}system:settings:manageChange a currency (staff only).
DELETE/v1/currencies/{uuid}system:settings:manageRemove a currency (staff only).
GET/v1/exchange-rateschurch:finance:viewThe church's exchange rates.
POST/v1/exchange-rateschurch:vote_heads:createAdd a rate.
PUT/v1/exchange-rates/{uuid}church:vote_heads:editChange a rate (PATCH accepted).
DELETE/v1/exchange-rates/{uuid}church:vote_heads:deleteRemove a rate.

Financial years, currencies and exchange rates can be read by anyone with church:finance:view, church:vote_heads:view, church:accounts:view or a budgets permission.

Budgets (premium)

Premium plan

Budgets and requisitions answer 402 this feature needs the premium plan for a church on the basic plan.

A budget plans income and spending per vote head for a financial year; it is drafted, approved and, if needed, reopened.

RoutePermissionPurpose
GET/v1/budgetschurch:budgets:viewBudgets.
POST/v1/budgetschurch:budgets:createDraft a budget: name, financial_year_uuid, department_uuid, from_date, to_date, total_amount.
GET/v1/budgets/{uuid}church:budgets:viewOne budget with its lines and spending against them.
PUT/v1/budgets/{uuid}church:budgets:editUpdate a draft (PATCH accepted).
DELETE/v1/budgets/{uuid}church:budgets:editRemove a draft.
POST/v1/budgets/{uuid}/approvechurch:budgets:approveApprove; lines are locked.
POST/v1/budgets/{uuid}/reopenchurch:budgets:approveReopen for changes.
POST/v1/budgets/{uuid}/lineschurch:budgets:create or church:budgets:editAdd a line.
PUT/v1/budget-lines/{uuid}church:budgets:create or church:budgets:editChange a line (PATCH accepted).
DELETE/v1/budget-lines/{uuid}church:budgets:create or church:budgets:editRemove a line.

Requisitions (premium)

A requisition asks for money against the budget: it is drafted with items, submitted, approved or rejected, then paid from a money account.

RoutePermissionPurpose
GET/v1/requisitionsany requisitions permissionRequisitions and their state.
POST/v1/requisitionschurch:requisitions:createDraft a requisition.
GET/v1/requisitions/{uuid}any requisitions permissionOne requisition with items.
PUT/v1/requisitions/{uuid}church:requisitions:create or church:requisitions:editUpdate a draft (PATCH accepted).
DELETE/v1/requisitions/{uuid}church:requisitions:editRemove a draft.
POST/v1/requisitions/{uuid}/itemschurch:requisitions:create or church:requisitions:editAdd an item.
PUT/v1/requisition-items/{uuid}church:requisitions:create or church:requisitions:editChange an item (PATCH accepted).
DELETE/v1/requisition-items/{uuid}church:requisitions:create or church:requisitions:editRemove an item.
POST/v1/requisitions/{uuid}/submitchurch:requisitions:createSubmit for approval.
POST/v1/requisitions/{uuid}/approvechurch:requisitions:approveApprove (optional note).
POST/v1/requisitions/{uuid}/rejectchurch:requisitions:approveReject (optional note).
POST/v1/requisitions/{uuid}/paychurch:requisitions:payPay from a money account (account_uuid, payment_mode); the account is debited.
GET/v1/requisitions/approval-settingsany requisitions permissionHow many approvals a requisition needs (one, some or all eligible approvers) and who must always approve.
PUT/v1/requisitions/approval-settingschurch:requisitions:approveChange them: mode, value, must_approve_uuids.

Reports over all of this (income statement, expenses by vote head, money account statements) are in Reports.