Loan Products Configuration
  • 03 May 2023
  • 9 Minutes To Read
  • Dark
    Light
  • PDF

Loan Products Configuration

  • Dark
    Light
  • PDF

Article Summary

A loan product allows you to set up, in advance, the parameters for a type of loan that you wish to offer. Loan products are flexible and highly customizable templates for creating individual loans. For more information, see Setting Up New Loan Products.

With Configuration as Code (CasC), you may batch configure your loan products configuration via Mambu API v2 using YAML. For general information on CasC, see Configuration as Code Overview.

API operations

CasC for loan products supports two operations.

ActionEndpointDescription
GET/configuration/loanproducts.yamlGet current loan products configuration.
PUT/configuration/loanproducts.yamlWrite a new loan products configuration to Mambu.
Please Note

If you write a PUT configuration to Mambu, any loan products not included in the new YAML configuration will be deleted - if possible.

If the loan products cannot be deleted, you will receive warnings.

Requests

For general information on CasC requests such as authentication and required headers, see Configuration as Code Overview.

The following section shows sample requests using curl and basic authentication. For all examples, replace TENANT_NAME with your actual tenant name. {auth} is the base64 encoded value of username:password. For more information, see Authentication in our API reference.

Additional headers

You may send synchronous or asynchronous PUT requests.

Please be Aware

If you have more than 60 loan products, we recommend you make your request asynchronous.

To use the endpoint asynchronously, you must provide two additional headers:

  • X-Mambu-Async with a value of true.
  • X-Mambu-Callback with the callback URL.

The expected status code in case of a successful asynchronous request is 202 Accepted. When the update configuration operation is completed, a message will be posted to the provided URL with information about whether the updated request completed successfully or not.

GET configuration

Get loan products for all product types

curl -X GET 'https://TENANT_NAME.mambu.com/api/configuration/loanproducts.yaml' \
-H 'Accept: application/vnd.mambu.v2+yaml' \
-H 'Authorization: Basic {auth}' 

Get loan products for specific product types

To retrieve loan products for specific product types, you may use the type query parameter. You may specify more than one product type.

The following example returns all loan products for the revolving credit and dynamic term loan product types.

curl -X GET 'https://TENANT_NAME.mambu.com/api/configuration/loanproducts.yaml?type=REVOLVING_CREDIT&type=DYNAMIC_TERM_LOAN' \
-H 'Accept: application/vnd.mambu.v2+yaml' \
-H 'Authorization: Basic {auth}' 

PUT configuration

curl -X PUT 'https://TENANT_NAME.mambu.com/api/configuration/loanproducts.yaml' \
-H 'Accept: application/vnd.mambu.v2+yaml' \
-H 'Content-Type: application/yaml' \
-H 'Authorization: Basic {auth}'  \
--data-binary @loanproducts.yaml

@loanproducts.yaml represents the absolute path of the file on your device. Use the --data-raw flag if you want to specify the YAML body inline.

Configuration body example

---
id: "6354"
name: "house_mortgage"
notes: "loan product secured by a property that the loan applicant already owns"
type: "DYNAMIC_TERM_LOAN"
category: "COMMERCIAL"
state: "INACTIVE"
loanAmountSettings:
  loanAmount:
    minValue: 1
    maxValue: 100
    defaultValue: 10
  trancheSettings:
    maxNumberOfTranches: 1
scheduleSettings:
  repaymentScheduleMethod: "FIXED"
  scheduleDueDatesMethod: "FIXED_DAYS_OF_MONTH"
  defaultRepaymentPeriodCount: 4
  repaymentPeriodUnit: "MONTHS"
  fixedDaysOfMonth:
  - 2
  - 4
  shortMonthHandlingMethod: "LAST_DAY_IN_MONTH"
  roundingSettings:
    roundingRepaymentScheduleMethod: "NO_ROUNDING"
    repaymentCurrencyRounding: "ROUND_TO_NEAREST_WHOLE_UNIT"
    repaymentElementsRoundingMethod: "ROUND_ALL"
  numInstallments:
    defaultValue: 77
    maxValue: 7
  firstRepaymentDueDateOffset:
    defaultValue: 77
    maxValue: 7
  repaymentScheduleEditOptions:
  - "ADJUST_NUMBER_OF_INSTALLMENTS"
  - "ADJUST_FEE_PAYMENT_SCHEDULE"
  repaymentReschedulingMethod: "NEXT_WORKING_DAY"
  billingCycles:
    enabled: true
    startDays:
    - 9
    - 5
    - 7
  previewSchedule:
    previewScheduleEnabled: true
    numberOfPreviewedInstalments: 3
paymentSettings:
  paymentMethod: "VERTICAL"
  amortizationMethod: "OPTIMIZED_PAYMENTS"
  prepaymentSettings:
    prepaymentRecalculationMethod: "RECALCULATE_SCHEDULE_KEEP_SAME_NUMBER_OF_TERMS"
    elementsRecalculationMethod: "PRINCIPAL_EXPECTED_FIXED"
    prepaymentAcceptance: "ACCEPT_PREPAYMENTS"
    futurePaymentsAcceptance: "ACCEPT_FUTURE_PAYMENTS"
    applyInterestOnPrepaymentMethod: "AUTOMATIC"
    principalPaidInstallmentStatus: "PARTIALLY_PAID"
  latePaymentsRecalculationMethod: "LAST_INSTALLMENT_INCREASE"
  repaymentAllocationOrder:
  - "FEE"
  - "PRINCIPAL"
  principalPaymentSettings:
    amount:
      minValue: 1
      maxValue: 100
      defaultValue: 10
    percentage:
      minValue: 1
      maxValue: 100
      defaultValue: 10
    principalPaymentMethod: "OUTSTANDING_PRINCIPAL_PERCENTAGE"
    totalDuePayment: "OUTSTANDING_PRINCIPAL_PERCENTAGE"
    defaultPrincipalRepaymentInterval: 6
    principalCeilingValue: 5
    principalFloorValue: 3
    totalDueAmountFloor: 2
    includeFeesInFloorAmount: true
gracePeriodSettings:
  gracePeriod:
    defaultValue: 77
    maxValue: 7
  gracePeriodType: "NONE"
newAccountSettings:
  idGeneratorType: "RANDOM_PATTERN"
  idPattern: "@@@###"
  accountInitialState: "PENDING_APPROVAL"
interestSettings:
  interestApplicationMethod: "REPAYMENT_DUE_DATE"
  interestBalanceCalculationMethod: "PRINCIPAL_AND_INTEREST"
  interestCalculationMethod: "DECLINING_BALANCE"
  daysInYear: "ACTUAL_ACTUAL_ISDA"
  scheduleInterestDaysCountMethod: "REPAYMENT_PERIODICITY"
  interestType: "SIMPLE_INTEREST"
  indexRateSettings:
    indexSourceId: "index source id"
    interestRate:
      minValue: 1
      maxValue: 100
      defaultValue: 10
    interestRateSource: "FIXED_INTEREST_RATE"
    interestRateTerms: "TIERED"
    interestChargeFrequency: "EVERY_DAY"
    interestRateReviewUnit: "MONTHS"
    interestRateReviewCount: 6
    interestChargeFrequencyCount: 9
    accrueInterestAfterMaturity: true
    interestRateCeilingValue: 34
    interestRateFloorValue: 12
    allowNegativeInterestRate: true
    interestRateTiers:
    - endingBalance: 17
      interestRate: 45
    - endingBalance: 17
      interestRate: 45
  accrueLateInterest: true
  compoundingFrequency: "DAILY"
  interestRateSettings:
  - interestRateSource: "INDEX_INTEREST_RATE"
    indexSourceId: "index rate source id"
    interestRate:
      minValue: 1
      maxValue: 100
      defaultValue: 10
    interestRateCeilingValue: 45
    interestRateFloorValue: 87
    interestRateReviewCount: 7
    interestRateReviewUnit: "DAYS"
  - interestRateSource: "INDEX_INTEREST_RATE"
    indexSourceId: "index rate source id"
    interestRate:
      minValue: 1
      maxValue: 100
      defaultValue: 10
    interestRateCeilingValue: 45
    interestRateFloorValue: 87
    interestRateReviewCount: 7
    interestRateReviewUnit: "DAYS"
penaltySettings:
  penaltyRate:
    minValue: 1
    maxValue: 100
    defaultValue: 10
  loanPenaltyCalculationMethod: "OUTSTANDING_PRINCIPAL"
  loanPenaltyGracePeriod: 4
arrearsSettings:
  toleranceCalculationMethod: "ARREARS_TOLERANCE_PERIOD"
  dateCalculationMethod: "ACCOUNT_FIRST_WENT_TO_ARREARS"
  nonWorkingDaysMethod: "EXCLUDED"
  toleranceFloorAmount: 45
  tolerancePeriod:
    defaultValue: 77
    maxValue: 7
  tolerancePercentageOfOutstandingPrincipal:
    minValue: 1
    maxValue: 100
    defaultValue: 10
  monthlyToleranceDay: 4
feesSettings:
  allowArbitraryFees: true
  fees:
  - name: "fee_name"
    id: "fee_id"
    amount: 10
    amountCalculationMethod: "LOAN_AMOUNT_PERCENTAGE"
    trigger: "ARBITRARY"
    feeApplication: "OPTIONAL"
    state: "INACTIVE"
    applyDateMethod: "FIRST_OF_EVERY_MONTH"
    accountingRules:
    - glAccountId: "gl_account_code"
      financialResource: "FUND_SOURCE"
      transactionChannelId: "transaction_channel_id"
    - glAccountId: "gl_account_code"
      financialResource: "FUND_SOURCE"
      transactionChannelId: "transaction_channel_id"
    percentageAmount: 4.5
    amortizationSettings:
      frequency: "CUSTOM_INTERVAL"
      periodUnit: "DAYS"
      periodCount: 5
      intervalType: "PREDEFINED_INTERVALS"
      intervalCount: 7
      amortizationProfile: "EFFECTIVE_INTEREST_RATE"
      feeAmortizationUponRescheduleRefinanceOption: "END_AMORTIZATION_ON_THE_ORIGINAL_ACCOUNT"
    taxSettings:
      taxableCalculationMethod: "CUSTOM_TAX"
  - name: "fee_name"
    id: "fee_id"
    amount: 10
    amountCalculationMethod: "LOAN_AMOUNT_PERCENTAGE"
    trigger: "ARBITRARY"
    feeApplication: "OPTIONAL"
    state: "INACTIVE"
    applyDateMethod: "FIRST_OF_EVERY_MONTH"
    accountingRules:
    - glAccountId: "gl_account_code"
      financialResource: "FUND_SOURCE"
      transactionChannelId: "transaction_channel_id"
    - glAccountId: "gl_account_code"
      financialResource: "FUND_SOURCE"
      transactionChannelId: "transaction_channel_id"
    percentageAmount: 4.5
    amortizationSettings:
      frequency: "CUSTOM_INTERVAL"
      periodUnit: "DAYS"
      periodCount: 5
      intervalType: "PREDEFINED_INTERVALS"
      intervalCount: 7
      amortizationProfile: "EFFECTIVE_INTEREST_RATE"
      feeAmortizationUponRescheduleRefinanceOption: "END_AMORTIZATION_ON_THE_ORIGINAL_ACCOUNT"
    taxSettings:
      taxableCalculationMethod: "CUSTOM_TAX"
accountingSettings:
  accountingMethod: "ACCRUAL"
  interestAccruedAccountingMethod: "DAILY"
  interestAccrualCalculation: "NONE"
  accountingRules:
  - glAccountId: "gl_account_code"
    financialResource: "FUND_SOURCE"
    transactionChannelId: "transaction_channel_id"
  - glAccountId: "gl_account_code"
    financialResource: "FUND_SOURCE"
    transactionChannelId: "transaction_channel_id"
accountLinkSettings:
  enabled: true
  linkableDepositProductId: "deposit id"
  linkedAccountOptions:
  - "AUTO_CREATE_LINKED_ACCOUNTS"
  - "AUTO_LINK_ACCOUNTS"
  settlementMethod: "FULL_DUE_AMOUNTS"
taxSettings:
  taxesOnInterestEnabled: true
  taxesOnFeesEnabled: true
  taxesOnPenaltyEnabled: true
  taxSourceId: "here_should_be_an_id"
  taxCalculationMethod: "EXCLUSIVE"
internalControls:
  dormancyPeriodDays: 4
  lockSettings:
    lockPeriodDays: 4
    cappingMethod: "OUTSTANDING_PRINCIPAL_PERCENTAGE"
    cappingConstraintType: "HARD_CAP"
    cappingPercentage: 9
  fourEyesPrinciple:
    activeForLoanApproval: true
securitySettings:
  isGuarantorsEnabled: true
  isCollateralEnabled: true
creditArrangementSettings:
  creditArrangementRequirement: "NOT_REQUIRED"
fundingSettings:
  enabled: true
  requiredFunds: 10
  funderInterestCommissionAllocationType: "PERCENTAGE_OF_LOAN_FUNDING"
  organizationInterestCommission:
    minValue: 1
    maxValue: 100
    defaultValue: 10
  funderInterestCommission:
    minValue: 1
    maxValue: 100
    defaultValue: 10
  lockFundsAtApproval: true
availabilitySettings:
  branchSettings:
    forAllBranches: true
    availableProductBranches:
    - "branchid1"
    - "branchid2"
  availableFor:
  - "SOLIDARITY_GROUPS"
  - "INDIVIDUALS"
offsetSettings:
  allowOffset: true
redrawSettings:
  allowRedraw: true
allowCustomRepaymentAllocation: true
currency:
  code: "AED"

Input requirements

The input requirements are in addition to any existing validations or input requirements for loan products. The same loan product requirements apply whether a loan product is made via the Mambu UI, Mambu API v2, or through CasC.

Basic fields

NameValidationsRequired
idMust not be empty, must not exceed a length of 16 characters, and must not be duplicate.YES
nameMust not be blank, and must be between 1 and 255 characters.YES

Credit Arrangement Settings

NameValidationsRequired
creditArrangementSettings-NO
creditArrangementRequirementIf creditArrangementSettings are defined, must not be null.YES

Offset Settings

NameValidationsRequired
offsetSettings-NO
allowOffsetIf offsetSettings are defined, must not be null.YES

Redraw Settings

NameValidationsRequired
redrawSettings-NO
allowRedrawIf redrawSettings are defined, must not be null.YES

Currency

NameValidationsRequired
currency-NO
codeIf currency is defined, must not be null and must contain existing currencies.YES

Loan Amount Settings

NameValidationsRequired
loanAmountSettings-NO
trancheSettings.
maxNumberOfTranches
If loanAmountSettings are defined, must not be null.YES

Grace Period Settings

NameValidationsRequired
gracePeriodSettings-NO
gracePeriodTypeIf gracePeriodSettings are defined, must not be null.YES

New Account Settings

NameValidationsRequired
newAccountSettings-NO
idGeneratorTypeIf newAccountSettings are defined, must not be null.YES
idPatternIf newAccountSettings are defined, must not be null.YES
accountInitialStateIf newAccountSettings are defined, must not be null.YES

Interest Settings

NameValidationsRequired
interestSettings-YES
interestApplicationMethodMust not be null.YES
interestBalanceCalculationMethodMust not be null.YES
interestCalculationMethodMust not be null.YES
daysInYearMust not be null.YES
scheduleInterestDaysCountMethodMust not be null.YES
interestTypeMust not be null.YES
indexRateSettings-NO
indexRateSettings.
indexSourceId
If indexRateSettings is defined, must contain existing ID.YES
indexRateSettings.
interestRate
If indexRateSettings is defined, then it must respect the condition min<=def<=maxYES
indexRateSettings.
interestRateTerms
If indexRateSettings is defined, must not be null.YES
indexRateSettings.
interestRateSource
If indexRateSettings is defined, must not be null.YES
interestRateSettingsIf indexRateSettings is not null then interestRateSettings must be empty.YES
indexSourceIdMust not be duplicate, must contain existing ID.YES

Fees Settings

NameValidationsRequired
feesSettings-NO
fees-NO
fees.idIf fees is defined, must not be blank.YES
fees.triggerIf fees is defined, must not be null.YES
fees.feeApplicationIf fees is defined, must not be null.YES
fees.stateIf fees is defined, must not be null.YES
accountingRules.
glAccountId
If feesSettings is defined, must not be null, must contain existing ID.YES
accountingRules.
financialResource
If feesSettings is defined, must not be null.YES
accountingRules.
transactionChannelId
If feesSettings is defined, must contain existing ID.YES

Payment Settings

NameValidationsRequired
paymentSettings-NO
paymentMethodIf paymentSettings is defined, must not be null.YES
amortizationMethodIf paymentSettings is defined, must not be null.YES
prepaymentSettings-NO
prepaymentSettings.
prepaymentAcceptance
If prepaymentSettings is defined, must not be null.YES
prepaymentSettings.
futurePaymentsAcceptance
If prepaymentSettings is defined, must not be null.YES
latePaymentsRecalculationMethodIf paymentSettings is defined, must not be null.YES
repaymentAllocationOrderIf paymentSettings is defined, must not be null.YES
principalPaymentSettings-NO
principalPaymentSettings.
amount
If principalPaymentSettings is defined and it is not null, then it must respect the condition min<=def<=maxNO
principalPaymentSettings.
percentage
If principalPaymentSettings is defined and it is not null, then it must respect the condition min<=def<=maxNO
principalPaymentSettings.
principalPaymentMethod
If principalPaymentSettings is defined and if product type is revolving credit, you must define either principalPaymentMethod or totalDuePayment and the other must be null.YES
principalPaymentSettings.
totalDuePayment
If principalPaymentSettings is defined and if product type is revolving credit, you must define either principalPaymentMethod or totalDuePayment and the other must be null.YES
principalPaymentSettings.
principalFloorValue
If principalPaymentSettings is defined, must be null if totalDueAmountFloor is not null.YES
principalPaymentSettings.
totalDueAmountFloor
If principalPaymentSettings is defined, must be null if principalFloorValue is not null.YES

Internal Controls

NameValidationsRequired
internalControls-NO
internalControls.dormancyPeriodDaysValue must be between 0 and 2000000000.NO
internalControls.lockSettings-NO
lockSettings.lockPeriodDaysValue must be between 1 and 2000000000.NO
lockSettings.cappingPercentageValue must be between 0 and 1999999973982208NO

Tax Settings

NameValidationsRequired
taxSettings-NO
taxSourceIdIf defined, must contain existing ID.NO

Account Link Settings

NameValidationsRequired
accountLinkSettings-NO
accountLinkSettings.
linkableDepositProductId
If defined, must contain existing ID.NO
accountLinkSettings.
settlementMethod
If accountLinkSettings is defined, must not be null.YES

Accounting Settings

NameValidationsRequired
accountingSettings-NO
accountingSettings.accountingMethodIf accountingSettings is defined, must not be null.YES
accountingSettings.interestAccrualCalculationIf accountingSettings is defined, must not be null.YES
accountingRules.
glAccountId
If accountingSettings is defined, must not be null and must contain existing ID.YES
accountingRules.
financialResource
If accountingSettings is defined, must not be null.YES
accountingRules.
transactionChannelId
If accountingSettings is defined, must contain existing ID.YES

Penalty Settings

NameValidationsRequired
penaltySettings-NO
penaltySettings.
loanPenaltyCalculationMethod
If penaltySettings are defined, must not be null.YES

Availability Settings

NameValidationsRequired
availabilitySettings-NO
availabilitySettings.
branchSettings
-NO
branchSettings.
availableProductBranches
If defined, must contain existing ID.NO
branchSettings.
allBranches
If branchSettings is defined, must not be null.YES
branchSettings.
branches
If branchSettings is defined, must not be null.YES
availabilitySettings.
availableFor
If defined, must not be null.NO

Schedule Settings

NameValidationsRequired
scheduleSettingsNot mandatory, except for the revolving credit loan product type.NO
roundingSettings-NO
roundingSettings.
repaymentElementsRoundingMethod
If roundingSettings is defined, must not be null.YES
billingCycles-NO
billingCycles.
enabled
If billingCycles is defined, must not be null.YES
previewSchedule-NO
previewSchedule.
enabled
If previewSchedule is defined, must not be null.YES

Replies

If you do not receive a 200 OK status code then fix any validation errors and make another PUT request until you receive a 200 OK status code.

Please Note

If you PUT a valid YAML configuration to the API and you do not receive a 200 OK status code within 60 seconds, you may receive a 504 Gateway Timeout status code. We expect all responses to be below 60 seconds.

If you encounter this issue, please contact us through Mambu Support so we can investigate it.


Was this article helpful?