recurring-deposits-guide.md, savings-guide.md.| Word | What it means | Where you see it |
|---|---|---|
| Main account | The customer's ordinary savings account. The principal comes from it, and money from the deposit goes back to it. | nuban in every call |
| Fixed deposit (FD) | The customer locks one amount for a set period and earns interest on it. | /core/fixed-deposits |
| Deposit product | A template made by the bank: allowed amounts and periods, interest rates, early closure penalty. | productId |
| Principal | The amount put in. | depositAmount, principal |
| Maturity | The end of the period; the deposit has earned its full interest. | maturityDate, maturityAmount |
| Maturity instruction | What happens at maturity: pay out, pay to the main account, or reinvest. | maturityInstruction |
| Early closure | Closing before maturity; the bank may reduce the interest (a penalty). Preview first. | early-closure |
| Withholding tax | Tax taken from interest, shown separately. | withholdingTaxDeducted |
{tpGatewayHostUrl}./core routes. Your merchant account must be set up for deposits; if it is not you401 with Access Denied or No Access To Core Banking. Contact the bank's support.nuban (in the body on POST and PUT, in the query on GET and DELETE).404 Deposit Account Not Found,accountNoaccountNo), the same number you see on the customer's statement. Use theaccountNo returned when you open the deposit. Other ids in responses are for the bank's own use and are never accepted as input.yyyy-MM-dd; a date that is not a real date (for example 2026-02-31) is refused with 400. A date you leave out0.01.depositPeriodFrequencyId: 0 days, 1 weeks, 2 months, 3 years.| Status | Message | Meaning |
|---|---|---|
| 400 | The Following Parameters Contain Errors | A field is missing or wrong; parameters names it, for example "nuban is required". |
| 401 | Access Denied / No Access To Core Banking | Your merchant is not set up for this call. |
| 404 | Deposit Account Not Found | The accountNo is not a deposit of this customer. |
| 404 | Savings account with external identifier ... does not exist | The nuban matches no account. |
| 4xx | (the bank's own message) | A business rule: wrong status, amount outside the product limits, not enough balance, and so on. |
Open -> Active -> either Matured (at the end of the period) or Closed (early closure, or after maturity).GET /core/fixed-deposits/products lists them; GET /core/fixed-deposits/products/{productId} shows one (interest slabs, allowedproductId.POST /core/fixed-deposits{
"nuban": "1234567890",
"productId": 4,
"depositAmount": 100000,
"depositPeriod": 12,
"depositPeriodFrequencyId": 2,
"maturityInstruction": "TRANSFER_TO_MAIN_ACCOUNT",
"transferInterestToMainAccount": false
}| Field | Meaning |
|---|---|
nuban | Main account. The principal is taken from it. |
maturityInstruction | WITHDRAW_DEPOSIT (pay out), TRANSFER_TO_MAIN_ACCOUNT, REINVEST_PRINCIPAL_AND_INTEREST or REINVEST_PRINCIPAL_ONLY. |
transferInterestToMainAccount | Optional. true credits interest to the main account as it is posted. |
{
"id": 9,
"accountNo": "000000009",
"status": { "id": 300, "code": "savingsAccountStatusType.active", "value": "Active" },
"depositAmount": 100000,
"depositPeriod": 12,
"nominalAnnualInterestRate": 10,
"maturityDate": [2027, 11, 10],
"maturityAmount": 110000,
"currency": { "code": "NGN" }
}accountNo.GET /core/fixed-deposits/000000009?nuban=1234567890{
"accountNo": "000000009",
"status": { "id": 300, "code": "savingsAccountStatusType.active", "value": "Active" },
"productName": "12 Month Fixed Deposit",
"principal": 100000,
"interestRate": 10,
"depositPeriod": 12,
"maturityDate": "2027-11-10",
"maturityAmount": 110000,
"interestSoFar": 2740.0,
"interestPosted": 0,
"withholdingTaxDeducted": 0,
"accountBalance": 100000,
"maturityInstruction": { "id": 200, "value": "Transfer to savings" },
"currency": { "code": "NGN" }
}POST /core/fixed-deposits/000000009/early-closure/preview with{ "nuban": "1234567890", "closedOnDate": "2026-11-10" }{ "preClosurePenalApplicable": true, "preClosurePenalInterest": 1.0, "interestAccrued": 2200.5, "payoutAmount": 102200.5 }POST /core/fixed-deposits/000000009/early-closure with the same body closes the deposit and pays the full amount to the main{ "savingsId": 9, "resourceId": 9, "changes": { "status": { "value": "Premature Closed" } } }.FD_PREMATURE_CLOSED (Part 4).PUT /core/fixed-deposits/000000009/maturity-instruction with { "nuban": "1234567890", "maturityInstruction": "WITHDRAW_DEPOSIT" }.not.in.submittedandpendingapproval); choose the instruction when you open the deposit.FD_MATURED. If the instruction wasmaturityInstructionApplied is true); otherwise the deposit staysFD_CLOSED).eventType. Rules for all of them:nuban, and the deduplication id is eventId.eventId is unique per event. Store it and ignore a message you have seen.currency; dates are yyyy-MM-dd; timestamp is when the bank raised the event.nuban is the customer's main account. depositAccountNo is the deposit's accountNo. amounts, dates and details contain only| Field | Meaning |
|---|---|
eventId, eventType, depositType | The event, and FIXED_DEPOSIT or RECURRING_DEPOSIT. |
depositAccountNo, nuban, clientId, currency | The deposit, its main account, the customer, the currency. |
amounts, dates | Money and dates of the event. |
details | accountId, linkedSavingsAccountId, linkedSavingsAccountNo, plus event specific fields. onAccountClosureId is 100 pay out, 200 transfer to savings, 300 reinvest principal and interest, 400 reinvest principal only. |
FD_MATURED: a fixed deposit reached its maturity datematurityInstructionApplied is true when a transfer or reinvest instruction was carried out in theFD_CLOSED.{
"eventId": "3f1f0c9e-6a8f-4b6e-9a53-0f7c2d9a1b11",
"eventType": "FD_MATURED",
"depositType": "FIXED_DEPOSIT",
"depositAccountNo": "000000009",
"nuban": "1234567890",
"clientId": 2048,
"currency": "NGN",
"amounts": { "depositAmount": 100000.0, "maturityAmount": 110000.0, "nominalAnnualInterestRate": 10.0, "accountBalance": 110000.0 },
"dates": { "activationDate": "2026-01-01", "maturityDate": "2027-01-01" },
"details": { "accountId": 9, "linkedSavingsAccountId": 5120, "linkedSavingsAccountNo": "000005120", "onAccountClosureId": 100, "maturityInstructionApplied": false },
"timestamp": "2026-11-09T00:30:12Z"
}FD_PREMATURE_CLOSED: a fixed deposit was closed before maturitypayoutAmount is what was paid out or transferred, interest and penalty included.{
"eventId": "3f1f0c9e-6a8f-4b6e-9a53-0f7c2d9a1b11",
"eventType": "FD_PREMATURE_CLOSED",
"depositType": "FIXED_DEPOSIT",
"depositAccountNo": "000000009",
"nuban": "1234567890",
"clientId": 2048,
"currency": "NGN",
"amounts": { "depositAmount": 100000.0, "maturityAmount": 110000.0, "nominalAnnualInterestRate": 10.0, "payoutAmount": 102500.5 },
"dates": { "activationDate": "2026-01-01", "maturityDate": "2027-01-01", "closedOnDate": "2026-11-09" },
"details": { "accountId": 9, "linkedSavingsAccountId": 5120, "linkedSavingsAccountNo": "000005120", "onAccountClosureId": 200, "toSavingsAccountId": 5120 },
"timestamp": "2026-11-09T14:02:51Z"
}FD_CLOSED: a fixed deposit was closed (after maturity)"eventType": "FD_CLOSED", payoutAmount equal to the final balance and closedOnDate the closing date.{
"eventId": "9a3d5c10-2b7e-4e0a-8c64-51d9b0e7a2f3",
"eventType": "FD_CLOSED",
"depositType": "FIXED_DEPOSIT",
"depositAccountNo": "000000009",
"nuban": "1234567890",
"clientId": 2048,
"currency": "NGN",
"amounts": { "depositAmount": 100000.0, "maturityAmount": 110000.0, "nominalAnnualInterestRate": 10.0, "payoutAmount": 110000.0 },
"dates": { "activationDate": "2026-01-01", "maturityDate": "2027-01-01", "closedOnDate": "2027-01-02" },
"details": { "accountId": 9, "linkedSavingsAccountId": 5120, "linkedSavingsAccountNo": "000005120", "onAccountClosureId": 100 },
"timestamp": "2027-01-02T09:15:40Z"
}nuban: in the body on POST and PUT, in the query on GET. {no} is the deposit's accountNo.| Route | What it does | Key fields |
|---|---|---|
GET /core/fixed-deposits/products[/{productId}] | List or read products | |
POST /core/fixed-deposits | Open (create, approve, activate) | nuban, productId, depositAmount, depositPeriod, depositPeriodFrequencyId, maturityInstruction, transferInterestToMainAccount |
GET /core/fixed-deposits/{no} | Read | nuban |
POST /core/fixed-deposits/{no}/early-closure/preview | Payout if closed now | nuban, closedOnDate |
POST /core/fixed-deposits/{no}/early-closure | Close early, pay the main account | nuban, closedOnDate |
PUT /core/fixed-deposits/{no}/maturity-instruction | Change the maturity instruction (pending deposits only) | nuban, maturityInstruction |
| You see | Why | What to do |
|---|---|---|
401 Access Denied or No Access To Core Banking | Your merchant is not set up for this call | Ask the bank to enable deposits for your merchant |
404 Deposit Account Not Found | Wrong accountNo, or it belongs to another customer | Check the accountNo and nuban pair |
400 "nuban is required" | Missing customer | Send the main account nuban |
403 User has no authority to: <PERMISSION> | The bank user behind your merchant may not do this | Ask the bank to grant the named permission |
Bank's own 4xx on opening | Amount or period outside the product limits, or not enough balance | Read the product, and check the main account balance |