Update loan terms, change statuses, reset variable rates, convert construction loans to permanent financing, and track every change in the audit trail.
A loan's status controls whether interest accrues, payments can be recorded, and how the loan appears in reports. Use PATCH /api/v1/loans/:id/status to change a loan's status.
| Status | Interest Accrues | Payments Allowed | Description |
|---|---|---|---|
PENDING | No | No | Loan has been created but not yet disbursed. Default status for new loans. |
ACTIVE | Yes | Yes | Loan is disbursed and performing. Interest accrues daily. Payments are accepted. |
PAID_OFF | No | No | Loan balance has been fully repaid. Terminal status. |
DEFAULT | No | Yes | Borrower has failed to meet obligations. Non-accrual. Payments are still accepted to recover balance. |
CHARGED_OFF | No | No | Loan has been written off as uncollectible. Balance removed from active portfolio. |
CLOSED | No | No | Loan has been administratively closed. Used for cancelled or refinanced loans. |
SUSPENDED | Configurable | No | Loan is temporarily frozen. Used for dispute resolution or compliance holds. |
Pro Tip: Status transitions are validated by the backend. You cannot move directly from PENDING to PAID_OFF, for example. The system enforces a logical progression through the loan lifecycle.
Use PUT /api/v1/loans/:id to update loan fields. The endpoint accepts over 60 allowlisted fields. Only the fields you include in the request body are updated; all others remain unchanged.
term_months -- Extend or shorten the termmaturity_date -- New maturity datepayment_frequency -- Change payment scheduleinterest_rate -- New fixed rateborrower_name -- Updated entity namecollateral_type -- Change collateral classificationcollateral_value -- Updated appraisalloan_officer -- Reassign loan officerlate_fee_rate -- Percentage ratelate_fee_grace_days -- Grace periodlate_fee_min / late_fee_maxrate_index -- SOFR, PRIME, TREASURYrate_margin -- Spread above indexrate_floor / rate_ceilingImportant: Any modification to a loan with a balance of $50,000 or more triggers the maker-checker approval workflow. The API returns HTTP 202 with an approval_id and the changes are held until a second authorized user approves them.
For loans with a variable interest rate, use POST /api/v1/loans/:id/rate-reset to apply a new rate based on the current index value plus the loan's margin.
new_rate = index_value + rate_margin, bounded by rate_floor and rate_ceiling.Example: A variable-rate loan with SOFR + 2.50%, floor 4.00%, ceiling 8.00%:
Construction loans in CEF Core can be converted to permanent financing once the building project is complete. Use POST /api/v1/loans/:id/convert to perform this conversion.
INTEREST_ONLY to FULLY_AMORTIZINGPro Tip: Schedule the conversion date to align with a payment date to avoid split-period interest calculations. The conversion endpoint accepts a conversion_date parameter for this purpose.
Every loan modification is automatically logged in the immutable audit trail. CEF Core records the following for each change:
| Audit Field | Description |
|---|---|
| Timestamp | Exact date and time of the modification (UTC) |
| User ID | The authenticated user who made the change |
| Action | Type of modification (e.g., LOAN_UPDATED, STATUS_CHANGED, RATE_RESET) |
| Previous Values | The field values before the change (JSON diff) |
| New Values | The field values after the change (JSON diff) |
| Approval ID | If the change required maker-checker approval, the linked approval record ID |
View the audit trail for any loan by opening the loan detail view and clicking the History tab. The audit log is stored in ops.audit_log and is append-only -- entries cannot be modified or deleted.
| Method | Endpoint | Description |
|---|---|---|
PUT | /api/v1/loans/:id | Update loan fields (60+ allowlisted fields) |
PATCH | /api/v1/loans/:id/status | Change loan status (validated transitions) |
POST | /api/v1/loans/:id/rate-reset | Apply new variable rate based on current index |
POST | /api/v1/loans/:id/convert | Convert construction loan to permanent financing |
All modification endpoints require JWT authentication. Changes to loans with balances of $50,000 or more return HTTP 202 and require maker-checker approval.
A borrower requests an additional 12 months. Update term_months and maturity_date via PUT. The amortization schedule recalculates with the extended term, reducing the monthly payment amount.
Board approves a rate reduction for a performing borrower. Update interest_rate via PUT. Future accrual uses the new rate. Past accrual is not retroactively adjusted.
A church switches from monthly to quarterly payments after a budget restructure. Update payment_frequency from MONTHLY to QUARTERLY. The schedule regenerates with fewer, larger payments.
A borrower disputes a charge. Change status to SUSPENDED via PATCH. Payments are blocked and accrual behavior is configurable. Resolve the dispute, then return to ACTIVE.
Now that you understand the complete loan lifecycle, learn how CEF Core manages the funding side with investor notes.
Creating Investor Notes