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.
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/money-accounts | church:accounts:view | Accounts with balance, opening balance and this month's money in and out (q). |
| GET/v1/money-accounts/{uuid} | church:accounts:view | One account. |
| GET/v1/money-accounts/{uuid}/ledger | church:accounts:view | Ledger 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.
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/transfers | church:accounts:transfer or church:accounts:view | Transfers (account, page, page_size; current month by default). |
| POST/v1/transfers | church:accounts:transfer | Move money: from_account_uuid, to_account_uuid, amount, description. |
| GET/v1/withdrawals | church:accounts:withdraw, church:accounts:edit or church:accounts:view | Withdrawals and their approval state (status, account, page, page_size). |
| POST/v1/withdrawals | church:accounts:withdraw | Request a withdrawal: account_uuid, amount, transaction_cost, reason. 402 when the balance cannot cover amount plus cost. |
| POST/v1/withdrawals/{uuid}/approve | church:accounts:withdraw or church:accounts:edit | Approve; the ledger moves now (optional note). |
| POST/v1/withdrawals/{uuid}/reject | church:accounts:withdraw or church:accounts:edit | Reject (optional note). |
| POST/v1/withdrawals/{uuid}/cancel | church:accounts:withdraw or church:accounts:edit | Cancel 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"
}'{
"success": false,
"error": "Main paybill account holds 12000.00, not enough for this withdrawal and its cost"
}Expenses
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/expenses | church:expenses:view | Expenses (from, to, account, vote_head, mode, q, page, page_size). |
| GET/v1/expenses/totals | church:expenses:view | Totals for the same filters. |
| GET/v1/expenses/export.csv | church:expenses:view | The same filters as a CSV download. |
| POST/v1/expenses | church:expenses:create | Record an expense; the account is debited. |
| GET/v1/expenses/{uuid} | church:expenses:view | One expense. |
| PUT/v1/expenses/{uuid} | church:expenses:edit | Correct an expense (PATCH accepted); the ledger is adjusted. |
| DELETE/v1/expenses/{uuid} | church:expenses:delete | Remove an expense; the debit is reversed. |
| POST/v1/expenses/{uuid}/file | church:expenses:create or church:expenses:edit | Attach a receipt (multipart). |
| GET/v1/expenses/{uuid}/file | church:expenses:view | Download 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
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/vote-heads | church:vote_heads:view | Expense categories (vote heads). |
| POST/v1/vote-heads | church:vote_heads:create | Add a vote head. |
| PUT/v1/vote-heads/{uuid} | church:vote_heads:edit | Rename (PATCH accepted). |
| DELETE/v1/vote-heads/{uuid} | church:vote_heads:delete | Remove. |
| GET/v1/financial-years | church:finance:view | Financial years. |
| POST/v1/financial-years | church:vote_heads:create | Add a financial year. |
| PUT/v1/financial-years/{uuid} | church:vote_heads:edit | Change its dates (PATCH accepted). |
| POST/v1/financial-years/{uuid}/current | church:vote_heads:edit | Make it the current year. |
| DELETE/v1/financial-years/{uuid} | church:vote_heads:delete | Remove. |
| GET/v1/currencies | church:finance:view | Currencies. |
| POST/v1/currencies | system:settings:manage | Add a currency (staff only). |
| PUT/v1/currencies/{uuid} | system:settings:manage | Change a currency (staff only). |
| DELETE/v1/currencies/{uuid} | system:settings:manage | Remove a currency (staff only). |
| GET/v1/exchange-rates | church:finance:view | The church's exchange rates. |
| POST/v1/exchange-rates | church:vote_heads:create | Add a rate. |
| PUT/v1/exchange-rates/{uuid} | church:vote_heads:edit | Change a rate (PATCH accepted). |
| DELETE/v1/exchange-rates/{uuid} | church:vote_heads:delete | Remove 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
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.
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/budgets | church:budgets:view | Budgets. |
| POST/v1/budgets | church:budgets:create | Draft a budget: name, financial_year_uuid, department_uuid, from_date, to_date, total_amount. |
| GET/v1/budgets/{uuid} | church:budgets:view | One budget with its lines and spending against them. |
| PUT/v1/budgets/{uuid} | church:budgets:edit | Update a draft (PATCH accepted). |
| DELETE/v1/budgets/{uuid} | church:budgets:edit | Remove a draft. |
| POST/v1/budgets/{uuid}/approve | church:budgets:approve | Approve; lines are locked. |
| POST/v1/budgets/{uuid}/reopen | church:budgets:approve | Reopen for changes. |
| POST/v1/budgets/{uuid}/lines | church:budgets:create or church:budgets:edit | Add a line. |
| PUT/v1/budget-lines/{uuid} | church:budgets:create or church:budgets:edit | Change a line (PATCH accepted). |
| DELETE/v1/budget-lines/{uuid} | church:budgets:create or church:budgets:edit | Remove 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.
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/requisitions | any requisitions permission | Requisitions and their state. |
| POST/v1/requisitions | church:requisitions:create | Draft a requisition. |
| GET/v1/requisitions/{uuid} | any requisitions permission | One requisition with items. |
| PUT/v1/requisitions/{uuid} | church:requisitions:create or church:requisitions:edit | Update a draft (PATCH accepted). |
| DELETE/v1/requisitions/{uuid} | church:requisitions:edit | Remove a draft. |
| POST/v1/requisitions/{uuid}/items | church:requisitions:create or church:requisitions:edit | Add an item. |
| PUT/v1/requisition-items/{uuid} | church:requisitions:create or church:requisitions:edit | Change an item (PATCH accepted). |
| DELETE/v1/requisition-items/{uuid} | church:requisitions:create or church:requisitions:edit | Remove an item. |
| POST/v1/requisitions/{uuid}/submit | church:requisitions:create | Submit for approval. |
| POST/v1/requisitions/{uuid}/approve | church:requisitions:approve | Approve (optional note). |
| POST/v1/requisitions/{uuid}/reject | church:requisitions:approve | Reject (optional note). |
| POST/v1/requisitions/{uuid}/pay | church:requisitions:pay | Pay from a money account (account_uuid, payment_mode); the account is debited. |
| GET/v1/requisitions/approval-settings | any requisitions permission | How many approvals a requisition needs (one, some or all eligible approvers) and who must always approve. |
| PUT/v1/requisitions/approval-settings | church:requisitions:approve | Change them: mode, value, must_approve_uuids. |
Reports over all of this (income statement, expenses by vote head, money account statements) are in Reports.