Create a draft loan product
/lokta-lms/api/v2/loanproductsCreates a Loan Product through the V2 contract.
Functionally equivalent to the V1 create operation, same parameters, validation, defaults, persistence and response, with one deliberate difference: loanScheduleType (CUMULATIVE, PROGRESSIVE or CONTRACTUAL) is mandatory and must be supplied explicitly.
Supports both Cumulative and Progressive loan products; the API version does not determine the schedule type.
Temporary integration tolerance: unknown JSON request-body fields are ignored; they are not validated, persisted, returned or audited, and must not be relied upon. Known fields remain strictly validated. A future release may restore unsupported-parameter rejection.
Request body application/json
loanScheduleTypestring · requiredaccountMovesOutOfNPAOnlyOnArrearsCompletionboolean · optionalaccountingRuleinteger · int32 · optionalallowApprovedDisbursedAmountsOverAppliedboolean · optionalallowAttributeOverridesAllowAttributeOverrides · optionalallowCompoundingOnEodboolean · optionalallowFullTermForTrancheboolean · optionalAllow full term length for each tranche disbursement. Only available for PROGRESSIVE schedule type with multi-disbursement enabled.
allowPartialPeriodInterestCalculationboolean · optionalallowVariableInstallmentsboolean · optionalamortizationTypeinteger · int32 · optionalbuyDownExpenseAccountIdinteger · int64 · optionalbuyDownFeeCalculationTypestring · optionalFLATbuyDownFeeIncomeTypestring · optionalFEE, INTERESTbuyDownFeeStrategystring · optionalEQUAL_AMORTIZATIONbuydownfeeClassificationToIncomeAccountMappingsarray of PostClassificationToIncomeAccountMappings · optionalcanDefineInstallmentAmountboolean · optionalcanUseForTopupboolean · optionalcapitalizedIncomeCalculationTypestring · optionalFLATcapitalizedIncomeClassificationToIncomeAccountMappingsarray of PostClassificationToIncomeAccountMappings · optionalcapitalizedIncomeStrategystring · optionalEQUAL_AMORTIZATIONcapitalizedIncomeTypestring · optionalFEE, INTERESTchargeOffBehaviourstring · optionalchargeOffExpenseAccountIdinteger · int64 · optionalchargeOffFraudExpenseAccountIdinteger · int64 · optionalchargeOffReasonToExpenseAccountMappingsarray of PostChargeOffReasonToExpenseAccountMappings · optionalchargesarray of LoanProductV2ChargeEntry · optionalCharge entries; existing charge ids plus optional per-association flags.
closeDatestring · optionalcreditAllocationarray of CreditAllocationData · optionalcurrencyCodestring · optionaldateFormatstring · optionaldaysInMonthTypeinteger · int32 · optionaldaysInYearCustomStrategystring · optionaldaysInYearTypeinteger · int32 · optionaldeferredFeeIncomeAccountIdinteger · int64 · optionaldeferredIncomeLiabilityAccountIdinteger · int64 · optionaldelinquencyBucketIdinteger · int64 · optionaldescriptionstring · optionaldigitsAfterDecimalinteger · int32 · optionaldisallowExpectedDisbursementsboolean · optionaldisallowInterestCalculationOnPastDueboolean · optionaldisbursedAmountPercentageForDownPaymentnumber · optionaldueDaysForRepaymentEventinteger · int32 · optionalenableAccrualActivityPostingboolean · optionalenableAutoRepaymentForDownPaymentboolean · optionalenableBuyDownFeeboolean · optionalenableDownPaymentboolean · optionalenableIncomeCapitalizationboolean · optionalenableInstallmentLevelDelinquencyboolean · optionalexternalIdstring · optionalfeeToIncomeAccountMappingsarray of LoanProductChargeToGLAccountMapper · optionalfixedLengthinteger · int32 · optionalfixedPrincipalPercentagePerInstallmentnumber · optionalfundIdinteger · int64 · optionalfundSourceAccountIdinteger · int64 · optionalgoodwillCreditAccountIdinteger · int64 · optionalgraceOnArrearsAgeinginteger · int32 · optionalgraceOnInterestPaymentinteger · int32 · optionalgraceOnPrincipalPaymentinteger · int32 · optionalholdGuaranteeFundsboolean · optionalinArrearsToleranceinteger · int32 · optionalinMultiplesOfinteger · int32 · optionalincludeInBorrowerCycleboolean · optionalincomeFromBuyDownAccountIdinteger · int64 · optionalincomeFromCapitalizationAccountIdinteger · int64 · optionalincomeFromChargeOffFeesAccountIdinteger · int64 · optionalincomeFromChargeOffInterestAccountIdinteger · int64 · optionalincomeFromChargeOffPenaltyAccountIdinteger · int64 · optionalincomeFromFeeAccountIdinteger · int64 · optionalincomeFromGoodwillCreditFeesAccountIdinteger · int64 · optionalincomeFromGoodwillCreditInterestAccountIdinteger · int64 · optionalincomeFromGoodwillCreditPenaltyAccountIdinteger · int64 · optionalincomeFromPenaltyAccountIdinteger · int64 · optionalincomeFromRecoveryAccountIdinteger · int64 · optionalinstallmentAmountInMultiplesOfinteger · int32 · optionalinterestCalculationPeriodTypeinteger · int32 · optionalinterestOnLoanAccountIdinteger · int64 · optionalinterestRateFrequencyTypeinteger · int32 · optionalinterestRatePerPeriodnumber · double · optionalinterestRateVariationsForBorrowerCyclearray · optionalinterestRecalculationCompoundingMethodinteger · int32 · optionalinterestRecognitionOnDisbursementDateboolean · optionalinterestTypeinteger · int32 · optionalisArrearsBasedOnOriginalScheduleboolean · optionalisCompoundingToBePostedAsTransactionboolean · optionalisEqualAmortizationboolean · optionalisInterestRecalculationEnabledboolean · optionalisLinkedToFloatingInterestRatesboolean · optionalloanPortfolioAccountIdinteger · int64 · optionalloanScheduleProcessingTypestring · optionallocalestring · optionalmaxInterestRatePerPeriodnumber · double · optionalmaxNumberOfRepaymentsinteger · int32 · optionalmaxPrincipalnumber · double · optionalmaxTrancheCountinteger · int32 · optionalmerchantBuyDownFeeboolean · optionalminInterestRatePerPeriodnumber · double · optionalminNumberOfRepaymentsinteger · int32 · optionalminPrincipalnumber · double · optionalminimumDaysBetweenDisbursalAndFirstRepaymentinteger · int32 · optionalmultiDisburseLoanboolean · optionalnamestring · optionalnumberOfRepaymentVariationsForBorrowerCyclearray · optionalnumberOfRepaymentsinteger · int32 · optionaloutstandingLoanBalancenumber · double · optionaloverAppliedCalculationTypestring · optionaloverAppliedNumberinteger · int32 · optionaloverDueDaysForRepaymentEventinteger · int32 · optionaloverdueDaysForNPAinteger · int32 · optionaloverpaymentLiabilityAccountIdinteger · int64 · optionalpaymentAllocationarray of AdvancedPaymentData · optionalpaymentChannelToFundSourceMappingsarray of GetLoanPaymentChannelToFundSourceMappings · optionalpenaltyToIncomeAccountMappingsarray of LoanProductChargeToGLAccountMapper · optionalpreClosureInterestCalculationStrategyinteger · int32 · optionalprincipalnumber · double · optionalprincipalThresholdForLastInstallmentinteger · int32 · optionalprincipalVariationsForBorrowerCyclearray · optionalratesarray of RateData · optionalrecalculationCompoundingFrequencyIntervalinteger · int32 · optionalrecalculationCompoundingFrequencyOnDayTypeinteger · int32 · optionalrecalculationCompoundingFrequencyTypeinteger · int32 · optionalrecalculationRestFrequencyIntervalinteger · int32 · optionalrecalculationRestFrequencyTypeinteger · int32 · optionalreceivableFeeAccountIdinteger · int64 · optionalreceivableInterestAccountIdinteger · int64 · optionalreceivablePenaltyAccountIdinteger · int64 · optionalrepaymentEveryinteger · int32 · optionalrepaymentFrequencyTypeinteger · int64 · optionalrepaymentStartDateTypeinteger · int32 · optionalrescheduleStrategyMethodinteger · int32 · optionalshortNamestring · optionalstartDatestring · optionalsupportedInterestRefundTypesarray · optionaltransactionProcessingStrategyCodestring · optionaltransfersInSuspenseAccountIdinteger · int64 · optionaluseBorrowerCycleboolean · optionalwriteOffAccountIdinteger · int64 · optionalwriteOffReasonsToExpenseMappingsarray of PostWriteOffReasonToExpenseAccountMappings · optionaladjustedInstallmentRoundingstring · optionalHow the final instalment is rounded when it differs from the others. Absent means the currency's own precision.
beneficiaryTypestring · optionalSystem-defined disbursement payee category. Optional; product-type applicability is a client-side concern until the parameter-metadata framework serves it.
BORROWER, MERCHANT, DEALER, BUILDER, PRIOR_LENDERbpiMethodstring · optionalhow the stub between disbursement and the first instalment is billed. Priced by the CONTRACTUAL schedule type; refused for the others.
EMI_PLUS_BPI, PRE_EMI_INTEREST, BPI_WITHIN_EMI, CAPITALIZE_BPIbrokenPeriodDayCountstring · optionalday-count convention for broken (stub) periods; same choices as dayCountConvention (parity). Null = regular-period behaviour. Declarative product configuration: stored as sent; the broken-period interest engine consumes it in a later phase.
ACT_365, ACT_360, D30_360_US, D30E_360, ACT_ACTcoLendingEligibleboolean · optionalWhether the product may participate in a co-lending arrangement. Optional; defaults to false.
collectBpiAtDisbursementboolean · optionalwhether broken-period interest is collected at disbursement. Refused for a schedule type that prices no broken period. Not yet consumed: no transaction or journal entry nets it from the proceeds (mock-up term preEmi). Defaults to false; explicit null is rejected. Declarative: stored as sent; the BPI engine consumes it in a later phase.
computeAprForKfsboolean · optionalwhether APR should be computed for KFS disclosures. Optional; defaults to false. Declarative: stored as sent; the APR/KFS engine consumes it in a later phase.
createAsDraftboolean · optionalCreate the product as a DRAFT: it cannot originate loans whatever its start and close dates say, and appears in no product selection list, until POST /v2/loanproducts/{productId}/activate releases it. Optional; defaults to false, in which case the product has no activation lifecycle at all and behaves exactly as it does today. TRANSITIONAL; this exists so the activation flow can be exercised before clients integrate the activate call; drafting becomes the V2 default once they do.
dayCountConventionstring · optionalstable day-count convention name; the V2-only ALTERNATIVE way to fulfil the mandatory daysInMonthType/daysInYearType axes (the backend derives and persists both). Supplying the raw axes alone remains valid (convention stays null); supplying both requires consistency with the derivation (ACT_365→1/365, ACT_360→1/360, ACT_ACT→1/1, D30_360_US and D30E_360→30/360; stored distinctly; the engine-level US-vs-30E distinction is deferred).
ACT_365, ACT_360, D30_360_US, D30E_360, ACT_ACTdefaultRoundingModestring · optionalproduct-level java.math.RoundingMode NAME (never an ordinal or any internal identifier). Null inherits tenant rounding. Declarative: persisted via the shared rounding profile; engine wiring consumes it in a later phase.
UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVENinterestRateStepnumber · optionalfixed nominal rate increment in percentage points per annum. Fixed-rate products only; must be null/omitted for floating products. Null = continuous.
maximumDaysBetweenDisbursalAndFirstRepaymentinteger · int32 · optionalmaximum calendar days between disbursement and the first repayment; the ceiling sibling of minimumDaysBetweenDisbursalAndFirstRepayment (must be >= the floor). ACTIVELY enforced at loan origination for both schedule types. Null/omitted = no ceiling.
pmtTypestring · optionalpayment-formula variant. Optional; defaults to STANDARD_PMT (current engine behaviour). PRECISE_PMT is stored as declarative configuration; the precise-PMT engine consumes it in a later phase. Explicit null is rejected; send STANDARD_PMT to reset.
STANDARD_PMT, PRECISE_PMTprincipalStepnumber · optionalprincipal increment anchored at minimumPrincipal. Null/omitted = continuous band. Requires the complete principal band when supplied; the default principal must sit on the grid.
productCategoryTagsarray · optionalStable category-tag codes from code group LoanProductCategory. Optional; duplicates rejected.
productTypestring · optionalStable product-type code from code group LoanProductType (see productTypeOptions in the template). Optional.
repayOnDayarray · optionalpinned monthly repayment day(s), 1-31, unique; CONTRACTUAL, monthly-frequency products only. The ONLY external recurrence representation (the internal rule string is never exposed). Derived first repayment dates snap forward to the earliest named day and supplied dates must fall on one of them (days 29-31 follow the existing short-month clamping). Several days collect several instalments a month, so at most one may be 28 or later (they would share February's last date) and they require a repayment interval of 1. Null clears; returned sorted ascending.
repayOnWeekdaystring · optionalThe weekday a contractual product collects on (MO..SU). Mutually exclusive with repayOnDay. On a monthly product it needs repayOnWeekdayOccurrence alongside it; on a weekly product every occurrence of the weekday is a collection.
repayOnWeekdayOccurrenceinteger · int32 · optionalWhich occurrence of repayOnWeekday in the month a monthly product collects on: 1 to 4 counting from the start of the month, or -1 for the last. Refused on a weekly product.
residualEnabledboolean · optionalresidual (balloon) schedule eligibility flag. Declarative: stored as sent; the residual schedule engine consumes it in a later phase.
scheduleSolverstring · optionaldeclarative input-mode selection for a configurator/LOS (D-27). Optional and NULLABLE; omitted or null means "not configured"; there is no server default. All five values are storable and none changes backend behaviour. The backend never derives Loan terms from scheduleSolver: Loan Product and Loan APIs always receive fully determined Principal, tenor and interest-rate values regardless of the configured solver.
SOLVE_EMI, TARGET_EMI, MERCHANT_DISCOUNT, FLAT_RATE, TOTAL_INTEREST_PCTtenorStepinteger · int32 · optionalincrement in NUMBER OF INSTALLMENTS over the repayment-count band (never a calendar duration). Null/omitted = continuous.
Responses
200OKResponse fields
resourceIdinteger · int64 · optionalEvery request authenticates with HTTP Basic and carries a Tenant-Identifier header. See the conventions for dates, commands, pagination and errors.
Open this operation in the interactive explorer, or read it as Markdown.
This is the API reference for Lokta, the agentic loan servicing platform. Go to lokta.ai