| Word | What it means | In the API |
|---|---|---|
| Customer | The person or business that borrows. The bank calls this a client. | clientId (a number the bank gave the customer) |
| Savings account | The customer's ordinary bank account, which holds their money. | identified by its NUBAN, the 10-digit account number: nuban |
| Loan product | A template made by the bank that fixes the rules of a kind of loan: allowed amounts, interest, how often to repay, and so on. Every loan is created from one product. | productId (ask the bank which ids you may use) |
| Loan account | One actual loan given to one customer. A customer can have many loan accounts. | identified by its loan account number: loanAccountNo, for example 000000059 |
| Principal | The amount borrowed. | principal |
| Interest | The price of the loan, charged on the amount still owed. | interestRatePerPeriod |
| Term | How long the loan lasts. | loanTermFrequency and loanTermFrequencyType |
| Installment | One repayment in the plan, for example "8,926.29 on 4 December". | one row of the schedule |
| Repayment schedule | The full plan: every installment, its due date, and how much of it is principal and how much is interest. | periods in a schedule |
| Booking (applying) | Recording that a customer is asking for a loan. Nothing is paid out yet. | POST /core/loans |
| Approval | The bank agreeing to lend. | approve |
| Disbursement | The money actually leaving the bank and reaching the customer. | disburse, disburse-to-savings |
| Repayment | The customer paying money back. | transactions/repayment |
| Arrears | Installments that are due but not paid. The loan is then "in arrears" or "overdue". | inArrears |
| Overpayment | The customer paid more than they owe. | status "overpaid" |
| Waiver | The bank choosing not to charge some interest. | waive-interest |
| Write-off | The bank giving up on collecting the rest and treating it as a loss. | write-off |
| Foreclosure | Closing a loan early by settling everything that is owed. | foreclosure |
| Reschedule | Replacing the remaining plan with a new one (more time, different rate). | loan-reschedules |
| Guarantor | Someone who promised to pay if the borrower cannot. | recover-guarantees |
| Loan officer | The bank staff member who looks after the loan. | toLoanOfficerId |
nuban) belongs to a savings account. It is never the number of a loan.loanAccountNo) belongs to a loan. It is the only number you use to point at a loan.{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Authorization: Bearer <access_token>, with Content-Type: application/json for bodies.401.clientId: the customer's client id, ornuban: the NUBAN of one of the customer's savings accounts (the customer is the holder of that account).| Kind of call | Where clientId / nuban goes |
|---|---|
POST and PUT (they have a body) | inside the JSON body |
GET and DELETE (no body) | in the query string, for example ?nuban=0000000206 |
403. This protects customers400.loanAccountNo/core/loans/000000059/approve. You get the number backid, loanId or resourceId. They are the bank's internal numbers. You never sendloanAccountNo identifies a loan to you. (The one exception is the transaction id, which namesyyyy-MM-dd, for example 2026-11-04. A date in any other format is a 400.[year, month, day], for example [2026, 11, 4].8926.29.yyyy-MM-dd and the language en unless youdateFormat and locale yourself.aprovedOnDate, is silently dropped and the default (today) is used. Check your spelling.{
"error": "Loan Account Does Not Belong To This Customer",
"detailedMessage": "Transaction Point Exception: Loan Account Does Not Belong To This Customer",
"httpStatusCode": 403,
"errors": []
}error is the message to show or log.parameters (on 400 validation errors) lists every field that failed, one message each.errors lists each failed field when the bank's loan system rejected several things at once.GET /core/loans?nuban=...) or read the loanGET /core/loans/{loanAccountNo}?associations=transactions&nuban=...).403 with User has no authority to: <PERMISSION>, naming the missing permission. Your merchant account must also have401 with Access Denied or No Access To Core Banking. In both cases contactstatus in a response looks like { "id": 300, "code": "loanStatusType.active", "value": "Active" }.status.id | status.value | Meaning |
|---|---|---|
| 100 | Submitted and pending approval | Booked, waiting for the bank to decide. Nothing paid out. |
| 200 | Approved | The bank agreed. Not paid out yet. |
| 300 | Active | The money has been paid out and the customer is repaying. |
| 400 | Withdrawn by client | The customer withdrew the application. Final. |
| 500 | Rejected | The bank refused. Final. |
| 600 | Closed (obligations met) | Fully repaid. |
| 601 | Closed (written off) | Written off by the bank. |
| 602 | Closed (rescheduled) | Replaced by a rescheduled loan. |
| 700 | Overpaid | The customer paid more than they owed. |
| Call | The loan must be | It moves the loan to |
|---|---|---|
| Update, delete loan application | Pending approval (100), not yet approved | (stays, or is removed) |
| Approve | Pending approval (100) | Approved (200) |
| Reject | Pending approval (100) | Rejected (500) |
| Withdraw | Pending approval (100) | Withdrawn by client (400) |
| Undo approval | Approved (200) | Pending approval (100) |
| Disburse, disburse to savings | Approved (200) | Active (300) |
| Undo disbursal | Active (300) | Approved (200) |
| Repayment, waive interest | Active (300) | stays Active, or Closed (600) when nothing is left, or Overpaid (700) |
| Write-off | Active (300) | Closed, written off (601) |
| Undo write-off | Written off (601) | Active (300) |
| Recovery payment | Written off (601) | stays written off |
| Refund by cash | Active (300), and a payment must already have been made | stays Active |
| Foreclosure | Active (300) | Closed (600) |
| Loan reschedule request | Active (300) | stays Active, with a new plan after approval |
| Term variations | Pending approval (100) | (stays) |
400 and a message such as "Validation errors exist."errors. Nothing is changed.0000000206, and the bank knows her as client 42.clientId or as the nuban of one of their savings accounts, and that account must be active;productId). There is no call that lists loan products, so ask the bank which product to use. In this1;GET /core/paymenttypes for the list.{tpGatewayHostUrl} for the address of the API.{
"id": 12,
"clientId": 42,
"firstname": "Ada",
"lastname": "Obi",
"nuban": "0000000206",
"currentBalance": 12500.00,
"availableBalance": 12500.00,
"accountName": "Ada Obi",
"productName": "Savings Account",
"productCurrency": "NGN",
"postNoDebit": false,
"blockStatus": false
}42, and holds 12,500. Make a note of the balance: after the{
"nuban": "0000000206",
"productId": 1,
"principal": 50000,
"loanTermFrequency": 6,
"loanTermFrequencyType": 2,
"numberOfRepayments": 6,
"repaymentEvery": 1,
"repaymentFrequencyType": 2,
"interestRatePerPeriod": 2,
"amortizationType": 1,
"interestType": 0,
"interestCalculationPeriodType": 1,
"expectedDisbursementDate": "2026-11-04"
}| Field | Meaning | Story value |
|---|---|---|
nuban (or clientId) | Who the loan is for (the customer rule, section 2.2). | Ada's account |
productId | The loan product. | 1 |
principal | Amount to borrow. | 50,000 |
loanTermFrequency, loanTermFrequencyType | How long the loan lasts, and in which unit: 0 days, 1 weeks, 2 months, 3 years. | 6 months |
numberOfRepayments | How many installments. | 6 |
repaymentEvery, repaymentFrequencyType | The gap between installments, and its unit: 0 days, 1 weeks, 2 months. | every 1 month |
interestRatePerPeriod | Interest rate for one period. The product decides what a period is; here it is a month. | 2 |
amortizationType | How installments are worked out: 0 equal principal payments (installments shrink), 1 equal installments (the same amount every time). | 1 |
interestType | How interest is worked out: 0 on the balance still owed (declining balance), 1 on the full amount (flat). | 0 |
interestCalculationPeriodType | 0 interest counted daily, 1 counted per repayment period. | 1 |
expectedDisbursementDate | The date the money is expected to be paid out. | 2026-11-04 |
transactionProcessingStrategyCode (how a payment is shared between principal, interest and charges;submittedOnDate, externalId (your own reference) and loanType. Other fields the productcharges, are passed through.{
"currency": { "code": "NGN", "decimalPlaces": 2 },
"loanTermInDays": 181,
"totalPrincipalDisbursed": 50000,
"totalPrincipalExpected": 50000.00,
"totalInterestCharged": 3557.75,
"totalFeeChargesCharged": 0,
"totalPenaltyChargesCharged": 0,
"totalRepaymentExpected": 53557.75,
"totalOutstanding": 53557.75,
"periods": [
{ "dueDate": [2026, 11, 4], "principalDisbursed": 50000, "feeChargesDue": 0 },
{ "period": 1, "fromDate": [2026, 11, 4], "dueDate": [2026, 12, 4], "principalDue": 7926.29, "principalLoanBalanceOutstanding": 42073.71, "interestDue": 1000.00, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.29 },
{ "period": 2, "fromDate": [2026, 12, 4], "dueDate": [2027, 1, 4], "principalDue": 8084.82, "principalLoanBalanceOutstanding": 33988.89, "interestDue": 841.47, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.29 },
{ "period": 3, "fromDate": [2027, 1, 4], "dueDate": [2027, 2, 4], "principalDue": 8246.51, "principalLoanBalanceOutstanding": 25742.38, "interestDue": 679.78, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.29 },
{ "period": 4, "fromDate": [2027, 2, 4], "dueDate": [2027, 3, 4], "principalDue": 8411.44, "principalLoanBalanceOutstanding": 17330.94, "interestDue": 514.85, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.29 },
{ "period": 5, "fromDate": [2027, 3, 4], "dueDate": [2027, 4, 4], "principalDue": 8579.67, "principalLoanBalanceOutstanding": 8751.27, "interestDue": 346.62, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.29 },
{ "period": 6, "fromDate": [2027, 4, 4], "dueDate": [2027, 5, 4], "principalDue": 8751.27, "principalLoanBalanceOutstanding": 0.00, "interestDue": 175.03, "feeChargesDue": 0, "penaltyChargesDue": 0, "totalDueForPeriod": 8926.30 }
]
}period number) is the payout: 50,000 leaves the bank on 4 November.dueDate is when it is due. totalDueForPeriod is what the customer pays.principalDue (paying back the borrowed amount) and interestDue (the price). feeChargesDue andpenaltyChargesDue are charges, zero here.principalLoanBalanceOutstanding is how much of the borrowed amount is still owed after that installment.| Installment | Due | Principal | Interest | Total | Principal still owed after |
|---|---|---|---|---|---|
| 1 | 2026-12-04 | 7,926.29 | 1,000.00 | 8,926.29 | 42,073.71 |
| 2 | 2027-01-04 | 8,084.82 | 841.47 | 8,926.29 | 33,988.89 |
| 3 | 2027-02-04 | 8,246.51 | 679.78 | 8,926.29 | 25,742.38 |
| 4 | 2027-03-04 | 8,411.44 | 514.85 | 8,926.29 | 17,330.94 |
| 5 | 2027-04-04 | 8,579.67 | 346.62 | 8,926.29 | 8,751.27 |
| 6 | 2027-05-04 | 8,751.27 | 175.03 | 8,926.30 | 0.00 |
{
"nuban": "0000000206",
"productId": 1,
"principal": 50000,
"loanTermFrequency": 6,
"loanTermFrequencyType": 2,
"numberOfRepayments": 6,
"repaymentEvery": 1,
"repaymentFrequencyType": 2,
"interestRatePerPeriod": 2,
"amortizationType": 1,
"interestType": 0,
"interestCalculationPeriodType": 1,
"expectedDisbursementDate": "2026-11-04",
"submittedOnDate": "2026-11-02",
"externalId": "LN-2026-0001"
}submittedOnDate (the day Ada applies; defaults to today) and, if you wish, your ownexternalId. Because the customer is given as nuban, the gateway uses Ada's savings account both as the borrower and as the{
"officeId": 1,
"clientId": 42,
"loanId": 7,
"loanAccountNo": "000000059",
"resourceId": 7
}000000059. Keep that number: it is how you refer to the loan fromloanAccountNo (this is rare and means the bank could not read the new loan straight?nuban= or ?clientId=:{
"id": 7,
"loanAccountNo": "000000059",
"externalId": "LN-2026-0001",
"status": { "id": 100, "code": "loanStatusType.submitted.and.pending.approval", "value": "Submitted and pending approval" },
"clientId": 42,
"clientName": "Ada Obi",
"clientAccountNo": "000000042",
"loanProductId": 1,
"loanProductName": "Micro Loan",
"principal": 50000,
"linkedAccount": { "id": 12, "nuban": "0000000206", "clientId": 42, "clientName": "Ada Obi", "productName": "Savings Account" }
}loanAccountNo is the loan's number; status is where it is in its life.clientAccountNo is the customer's own number at the bank. It is not a loan number and not a NUBAN.linkedAccount is the savings account the loan can be paid into, shown by its nuban.associations. For example ?nuban=0000000206&associations=repaymentSchedule,transactions adds theexclude leaves data out and fields limits which fields come back.[
{
"id": 7,
"loanAccountNo": "000000059",
"externalId": "LN-2026-0001",
"productId": 1,
"productName": "Micro Loan",
"status": { "id": 100, "code": "loanStatusType.submitted.and.pending.approval", "value": "Submitted and pending approval" },
"inArrears": false,
"originalLoan": 50000,
"loanBalance": 50000
}
]clientId or nuban you used. The list is not paginated and is empty when the| What | Call | Notes |
|---|---|---|
| Change the application | PUT /core/loans/{loanAccountNo} | Send the customer and only the fields to change, for example { "nuban": "0000000206", "principal": 60000 }. |
| Remove it completely | DELETE /core/loans/{loanAccountNo}?nuban=... | The application disappears. |
| The bank refuses | POST /core/loans/{loanAccountNo}/reject | Body { "nuban": "...", "rejectedOnDate": "2026-11-03", "note": "Insufficient income" }. Final: status 500. |
| Ada withdraws | POST /core/loans/{loanAccountNo}/withdraw | Body { "nuban": "...", "withdrawnOnDate": "2026-11-03", "note": "Applicant withdrew" }. Final: status 400. |
{
"nuban": "0000000206",
"approvedOnDate": "2026-11-03",
"approvedLoanAmount": 50000,
"note": "Approved after credit review"
}approvedOnDate may not be before the day the loan was submitted, nor in the future. It defaults to today.approvedLoanAmount may be less than the amount asked for, never more. Leave it out to approve the full amount.expectedDisbursementDate (optional) lets you move the payout date; it may not be before the approval date.{
"officeId": 1,
"clientId": 42,
"loanId": 7,
"loanAccountNo": "000000059",
"resourceId": 7,
"changes": {
"status": { "id": 200, "code": "loanStatusType.approved", "value": "Approved" },
"approvedOnDate": "03 November 2026"
}
}POST /core/loans/{loanAccountNo}/undo-approval with { "nuban": "...", "note": "..." }. Returns the loan toPOST /core/loans/{loanAccountNo}/assign-loan-officer with { "nuban": "...", "toLoanOfficerId": 2 }.fromLoanOfficerId and assignmentDate are optional. Loan officer ids come from the bank; there is no call that lists them.POST /core/loans/{loanAccountNo}/unassign-loan-officer.{
"nuban": "0000000206",
"actualDisbursementDate": "2026-11-04",
"transactionAmount": 50000
}{
"officeId": 1,
"clientId": 42,
"loanId": 7,
"loanAccountNo": "000000059",
"resourceId": 30,
"savingsId": 12,
"changes": {
"status": { "id": 300, "code": "loanStatusType.active", "value": "Active" }
}
}currentBalance is 62,500, which is the 12,500 she had plus the 50,000 loan. The loannuban (or with aclientId and a linkedNuban, see Part 5). Without a link the call is refused.POST /core/loans/{loanAccountNo}/disburse). This records that the loan was paid out in some other way, forpaymentTypeId to say how: get the ids fromGET /core/paymenttypes.{
"nuban": "0000000206",
"actualDisbursementDate": "2026-11-04",
"transactionAmount": 50000,
"paymentTypeId": 5,
"note": "Paid out in cash"
}actualDisbursementDate (defaults to today; not before the approval date and not in thetransactionAmount (defaults to the approved amount; it may not exceed it) and the payment details paymentTypeId,accountNumber, checkNumber, routingCode, receiptNumber, bankNumber and note.POST /core/loans/{loanAccountNo}/undo-disbursal (with { "nuban": "...", "note": "..." }) reverses the payout{
"nuban": "0000000206",
"transactionDate": "2026-12-04",
"transactionAmount": 8926.29,
"paymentTypeId": 1,
"receiptNumber": "R-1001",
"note": "Installment 1"
}{
"officeId": 1,
"clientId": 42,
"loanId": 7,
"loanAccountNo": "000000059",
"resourceId": 31,
"changes": {
"transactionDate": "04 December 2026",
"transactionAmount": "8926.29"
}
}transactionAmount is required and must be 0.01 or greater. transactionDate defaults to today. It may not be before the loanresourceId (31) is the transaction id.{
"id": 31,
"loanAccountNo": "000000059",
"type": { "id": 2, "code": "loanTransactionType.repayment", "value": "Repayment" },
"date": [2026, 12, 4],
"amount": 8926.29,
"principalPortion": 7926.29,
"interestPortion": 1000.00,
"feeChargesPortion": 0,
"penaltyChargesPortion": 0,
"outstandingLoanBalance": 42073.71
}outstandingLoanBalance is the principalassociations=transactions.32. Reverse it and enter the right amount in one call:{
"nuban": "0000000206",
"transactionDate": "2027-01-04",
"transactionAmount": 8926.29,
"note": "Corrected amount"
}transactionAmount is booked. Send transactionAmount: 0 to reverse thetransactionAmount is required for this call.| What | Call | When to use it |
|---|---|---|
| Waive interest | POST /core/loans/{loanAccountNo}/transactions/waive-interest with transactionAmount | The bank decides not to charge some interest (for example as goodwill). The amount cannot exceed the interest still owed. |
| Refund by cash | POST /core/loans/{loanAccountNo}/transactions/refund-by-cash with transactionAmount | Money paid in advance is given back to the customer in cash. Only after a payment has been made. |
transactionDate here is in the format named by dateFormat (this one call differs from the usual yyyy-MM-dd), and locale is thetransactionDate out.{
"type": { "id": 2, "code": "loanTransactionType.repayment", "value": "Repayment" },
"date": [2027, 2, 4],
"amount": 34668.67,
"principalPortion": 33988.89,
"interestPortion": 679.78,
"feeChargesPortion": 0,
"penaltyChargesPortion": 0
}{
"nuban": "0000000206",
"transactionDate": "2027-02-04",
"transactionAmount": 34668.67,
"paymentTypeId": 1,
"note": "Early payoff"
}POST /core/loans/{loanAccountNo}/transactions/foreclosure with{ "nuban": "...", "transactionDate": "2027-02-04", "note": "Early settlement" } settles everything that is owed on that date andGET /core/loans/000000059?nuban=0000000206: look at status. Customer (clientId 42)
|
|-- Savings account (nuban 0000000206) <------------------- loan is paid out into this account
| ^
| | linked
|-- Loan account (loanAccountNo 000000059)nuban.loanAccountNo.| You send | What happens |
|---|---|
nuban | The customer is the holder of that savings account, and the loan is linked to it. This is the simplest way. |
clientId and linkedNuban | The customer is the client you name, and the loan is linked to the savings account linkedNuban. That account must belong to the same customer, otherwise the request is refused with 403. |
clientId only | The customer is the client, and the loan has no link. You can still disburse it with disburse, but not with disburse-to-savings. |
linkedAccount with its nuban.transactions/repayment.inArrears is true in the loan list, and the loan'sPOST /core/loans/{loanAccountNo}/recover-guarantees with { "nuban": "...", "note": "..." }{
"nuban": "0000000206",
"transactionDate": "2027-06-04",
"note": "Uncollectable"
}POST /core/loans/{loanAccountNo}/transactions/undo-write-off with { "nuban": "...", "note": "..." }POST /core/loans/{loanAccountNo}/transactions/recovery-payment and a transactionAmount. It is only accepted on a written-off| Term variations | Reschedule request | |
|---|---|---|
| For | Small changes before the loan starts, such as moving one due date | A new plan for a loan that is already running |
| The loan must be | Pending approval (100) | Active (300) |
| Needs approval | No: they are saved straight away | Yes: a request is created, then approved or rejected |
{
"nuban": "0000000206",
"dateFormat": "yyyy-MM-dd",
"locale": "en",
"exceptions": {
"modifiedinstallments": [
{ "dueDate": "2026-12-04", "modifiedDueDate": "2026-12-14" }
]
}
}POST /core/loans/{loanAccountNo}/schedule/variations. The loan now carries the change.DELETE /core/loans/{loanAccountNo}/schedule/variations?nuban=.... The original scheduleexceptions can hold three lists. Each item names the installment by its current due date:| List | Meaning | Fields of each item |
|---|---|---|
modifiedinstallments | Change an installment. | dueDate, and at least one of modifiedDueDate, principal, installmentAmount |
newinstallments | Add an installment. | dueDate, principal, installmentAmount |
deletedinstallments | Remove an installment. | dueDate |
installmentAmount is only allowed for loans with a declining balance and equal installments; principal is not allowed for them.loanAccountNo in the body:{
"nuban": "0000000206",
"loanAccountNo": "000000059",
"rescheduleFromDate": "2027-03-04",
"submittedOnDate": "2027-02-20",
"rescheduleReasonId": 1,
"extraTerms": 3
}{
"officeId": 1,
"clientId": 42,
"loanId": 7,
"loanAccountNo": "000000059",
"resourceId": 5
}resourceId (5) is the reschedule request id. You use it in the next calls instead of the loan number.| Field | Meaning |
|---|---|
loanAccountNo | The loan to reschedule (required). |
rescheduleFromDate | The due date of the first installment to be replaced (required). It must be the due date of an installment that is not fully paid. |
submittedOnDate | The day of the request (required). Not before the loan was paid out. |
rescheduleReasonId | Why (required). Reason ids come from the bank; there is no call that lists them. |
rescheduleReasonComment | A comment on the reason (up to 500 characters). |
extraTerms | Number of installments to add. |
newInterestRate | A new interest rate. |
graceOnPrincipal, graceOnInterest | Number of installments in which no principal or no interest is due. |
adjustedDueDate | A new due date for the installment that starts the change; not before rescheduleFromDate. |
{ "nuban": "0000000206", "approvedOnDate": "2027-02-21" }POST /core/loan-reschedules/5/reject with { "nuban": "...", "rejectedOnDate": "2027-02-21" }. Both dates default to today, mayrescheduleFromDate onward. You can read a request at any time with GET /core/loan-reschedules/{requestId}?nuban=....{tpGatewayHostUrl}. "Customer" means one of clientId or nuban (section 2.2): in the body on POST and PUT,GET and DELETE. {no} is the loanAccountNo.| Route | What it does | Loan must be | Key fields |
|---|---|---|---|
POST /core/loans/schedule/calculate | Quote: works out a schedule, saves nothing | (no loan yet) | customer, productId, principal, term and repayment fields, expectedDisbursementDate |
POST /core/loans | Book a loan application | (no loan yet) | as above; optional linkedNuban, submittedOnDate, externalId |
GET /core/loans | List a customer's loans | clientId or nuban | |
GET /core/loans/{no} | Read one loan | any | customer; associations, exclude, fields |
PUT /core/loans/{no} | Change an application | pending | customer, fields to change |
DELETE /core/loans/{no} | Delete an application | pending | customer |
POST /core/loans/{no}/approve | Approve | pending | customer, approvedOnDate, approvedLoanAmount, expectedDisbursementDate, note |
POST /core/loans/{no}/undo-approval | Undo approval | approved | customer, note |
POST /core/loans/{no}/assign-loan-officer | Assign a loan officer | customer, toLoanOfficerId, fromLoanOfficerId, assignmentDate | |
POST /core/loans/{no}/unassign-loan-officer | Remove the loan officer | customer, unassignedDate | |
POST /core/loans/{no}/reject | Reject | pending | customer, rejectedOnDate, note |
POST /core/loans/{no}/withdraw | Record that the applicant withdrew | pending | customer, withdrawnOnDate, note |
POST /core/loans/{no}/disburse | Pay out, without crediting savings | approved | customer, actualDisbursementDate, transactionAmount, payment details |
POST /core/loans/{no}/disburse-to-savings | Pay out into the linked savings account | approved and linked | customer, actualDisbursementDate, transactionAmount |
POST /core/loans/{no}/undo-disbursal | Reverse a payout | active | customer, note |
POST /core/loans/{no}/recover-guarantees | Recover overdue amounts from guarantors | active, overdue | customer, note |
POST /core/loans/{no}/transactions/repayment | Enter a repayment | active | customer, transactionAmount, transactionDate, payment details |
POST /core/loans/{no}/transactions/waive-interest | Waive interest | active | customer, transactionAmount, transactionDate |
POST /core/loans/{no}/transactions/write-off | Write the loan off | active | customer, transactionDate, note |
POST /core/loans/{no}/transactions/undo-write-off | Undo a write-off | written off | customer, note |
GET /core/loans/{no}/transactions/prepay-template | How much closes the loan on a date | active | customer; transactionDate, dateFormat, locale |
POST /core/loans/{no}/transactions/recovery-payment | Payment received after a write-off | written off | customer, transactionAmount |
POST /core/loans/{no}/transactions/refund-by-cash | Refund money in cash | active, a payment made | customer, transactionAmount |
POST /core/loans/{no}/transactions/foreclosure | Close early by settling everything | active | customer, transactionDate, note |
GET /core/loans/{no}/transactions/{transactionId} | Read one transaction | any | customer |
POST /core/loans/{no}/transactions/{transactionId}/adjust | Reverse a transaction and book a replacement | customer, transactionAmount (0 reverses only), transactionDate | |
POST /core/loans/{no}/schedule/calculate | Schedule with variations, saves nothing | pending | customer, exceptions |
POST /core/loans/{no}/schedule/variations | Save term variations | pending | customer, exceptions |
DELETE /core/loans/{no}/schedule/variations | Remove all variations | pending | customer |
POST /core/loan-reschedules | Ask for a reschedule | active | customer, loanAccountNo, rescheduleFromDate, submittedOnDate, rescheduleReasonId, change fields |
GET /core/loan-reschedules/{requestId} | Read a request | customer | |
GET /core/loan-reschedules/{requestId}/preview | Preview the new plan | request pending | customer |
POST /core/loan-reschedules/{requestId}/approve | Approve a request | request pending | customer, approvedOnDate |
POST /core/loan-reschedules/{requestId}/reject | Reject a request | request pending | customer, rejectedOnDate |
| Route | What it does |
|---|---|
POST /security/authenticate | Get an access token. |
GET /core/account/{nuban} | Read a savings account (balance, owner). |
GET /core/paymenttypes | List payment type ids for paymentTypeId. |
| Status | error | Why | What to do |
|---|---|---|---|
| 400 | The Following Parameters Contain Errors | A field failed validation. Every failing message is in parameters, such as "Exactly one of clientId or nuban is required" or "transactionAmount is required". | Fix the fields named. |
| 400 | Exactly one of clientId or nuban is required | On a GET or DELETE, both or neither of clientId and nuban was in the query. | Send exactly one. |
| 400 | <field> must be in the format yyyy-MM-dd | A date is in another format. | Use yyyy-MM-dd. |
| 400 | Validation errors exist. | The bank's loan system rejected the request. Each reason is in errors: wrong status, a date out of range, an amount too large, and so on. | Read errors, then compare with the status table in section 3.2. |
| 401 | Unauthorized | The token is missing, wrong or expired. | Get a new token (section 2.1). |
| 401 | Request Source Not Authorized | Your IP address is not allowed. | Ask the bank to add it. |
| 401 | Access Denied or No Access To Core Banking | Your merchant account is not set up for this operation, or for loans at all. | Contact support. |
| 403 | Loan Account Does Not Belong To This Customer | The loanAccountNo and the clientId or nuban you sent do not match. When booking, it also means linkedNuban is not an account of the customer. | Check both numbers. Nothing was changed. |
| 403 | User has no authority to: <PERMISSION> | Your API user is not allowed to do this operation. | Ask the bank to grant the named permission. |
| 404 | Loan Account Not Found | No loan has that loanAccountNo. | Check the number; list the customer's loans. |
| 404 | Savings account with external identifier <nuban> does not exist | The nuban matches no account. | Check the NUBAN. |
| 404 | Client with identifier <clientId> does not exist | No customer has that clientId (customer list). | Check the id. |
| 500 | An unexpected error occurred | The request could not be completed. | Try again; if it keeps failing, contact support with the time of the call. |
loanAccountNo: list the customer's loans and look for the new one before booking again.commandId instead of the change: the request was accepted and is waiting for approval, and the loan has not changedproductId), loan officer ids (toLoanOfficerId), reschedule reason ids (rescheduleReasonId)transactionProcessingStrategyCode. Payment type ids come from GET /core/paymenttypes.GET /core/loans returns all of a customer's loans in one answer.POST /core/loans/schedule/calculate and the pre-closure and preview calls change nothing, sodocs/api/gateway-openapi.json), the Apidog project (docs/api/core-banking-services.apidog.json) and the standalone Coredocs/api/core-banking-services.openapi.json). Each operation lists its fields and every error it can return,