Skip to content

Part 10 — System Blueprint

Co-lending Partner Module

The co-lending and partner module serves three different business patterns that must not be collapsed into one table:

  1. Co-lending arrangement (CLA): two regulated entities jointly fund the same borrower under co_lending_arrangement, partner_share, escrow_movement and partner_ledger.
  2. LSP or anchor origination: a non-lender partner sources or supplies data but does not book a loan share. This still uses source_partner_id, partner_api_client, consent controls and payout ledger.
  3. DLG-backed sourcing: an LSP or another RE acting as LSP provides default loss guarantee through dlg_set under RBI Digital Lending Directions.

The 2025 RBI co-lending framework requires each RE to keep at least 10 percent of each individual loan, reflect both shares in books without delay and no later than 15 calendar days from disbursement, route borrower/RE transactions through bank escrow, report each RE’s share to credit information companies, and share SMA/NPA classification on a near-real-time basis and no later than the next working day (RBI Co-Lending Arrangements Directions, 2025). Digital journeys and DLG remain subject to the RBI Digital Lending Directions, 2025.

The dual-decisioning policy computation and blended-rate output contract are specified in BRE functional specification; runtime idempotency, replay and partner callback handling are specified in BRE runtime architecture.

FieldTypeConstraintsNullableReferences
partner_profile_iduuidPrimary keyNoNone
party_iduuidPartner must be a party with party_type channel_partner or regulated_entityNoparty.party_id
partner_typeenumdsa, connector, lsp, anchor, co_lender, marketplace, payment_partner, technology_service_provider, dlg_providerNoNone
regulated_entity_flagbooleanTrue for bank/NBFC/HFC/AIFI partner RENoNone
rbi_registration_numbertextRequired when regulated_entity_flag=trueYesNone
cinvarchar(21)Required for company partners where applicableYesbusiness_entity.cin
panvarchar(10)RequiredNoparty.primary_pan
gstinvarchar(15)Required where registeredYesparty.primary_gstin
onboarding_statusenumdraft, due_diligence, approved, agreement_signed, active, suspended, terminated, blacklistedNoNone
risk_ratingenumlow, medium, high, prohibitedNoNone
customer_interface_flagbooleanTrue if partner-facing DLA/portal or staff interact with borrowerNoNone
grievance_officer_nametextRequired for borrower-facing LSP/DLAYesNone
grievance_officer_emailtextRequired for borrower-facing LSP/DLAYesNone
data_residency_attested_flagbooleanMust be true before active digital lendingNoNone
approved_byuuidRequired when approvedYesuser.user_id
approval_request_iduuidRequired for onboarding approvalYesapproval_request.approval_request_id
FieldTypeConstraintsNullableReferences
partner_program_iduuidPrimary keyNoNone
partner_profile_iduuidParent partnerNopartner_profile.partner_profile_id
program_codetextUnique with partnerNoNone
program_typeenumlead_referral, lsp_origination, anchor_finance, co_lending, dlg_backed, servicing, collectionsNoNone
product_code_settext[]Allowed productsNoproduct.product_code
geography_settext[]Branch/state/pincode scopeNoNone
min_ticket_sizenumeric(18,2)Non-negativeNoNone
max_ticket_sizenumeric(18,2)Greater than minNoNone
customer_interface_party_iduuidSingle point of interface for CLA where applicableYesparty.party_id
payout_basisenumnone, per_login, per_disbursement, percentage_of_disbursal, servicing_fee, collection_fee, anchor_subventionNoNone
payout_ratenumeric(9,6)Required when payout basis is rate basedYesNone
effective_fromdateRequiredNoNone
effective_todateMust be after effective_fromYesNone
statusenumdraft, active, paused, closedNoNone

The partner gateway uses the existing module-map entity api_client. The minimum fields are:

FieldTypeConstraintsNullableReferences
api_client_iduuidPrimary keyNoNone
partner_profile_iduuidParent partnerNopartner_profile.partner_profile_id
client_nametextUnique per partnerNoNone
auth_typeenummtls, oauth2_client_credentials, signed_jwt, api_key_hmacNoNone
scope_settext[]Allowed endpoint scopesNoNone
ip_allowlistinet[]Required for server-to-server accessYesNone
webhook_urltextHTTPS onlyYesNone
statusenumactive, suspended, rotating_secret, revokedNoNone
last_key_rotation_attimestamptzRequired for active clientsYesNone

Marketplace seller-finance programs add an anchor data feed and a settlement-linked servicing layer to the partner module. These entities do not replace the RBI digital-lending fund-flow controls: borrower repayment must reach the RE bank account, a permitted co-lending escrow, or another legally documented route such as receivable assignment. The marketplace/LSP account must not become an unapproved repayment pool.

FieldTypeConstraintsNullableReferences
anchor_data_feed_iduuidPrimary keyNoNone
partner_profile_iduuidMust reference active partner_type anchor, marketplace or lspNopartner_profile.partner_profile_id
feed_typeenumseller_profile, order_daily, settlement_daily, return_rto, rating_quality, seller_status, inventory_advertisingNoNone
schema_versiontextRequired; immutable after activationNoNone
delivery_modeenumapi_pull, api_push, sftp, webhook, manual_uploadNoNone
frequencyenumreal_time, hourly, daily, weekly, on_eventNoNone
expected_cutoff_timetimeRequired for batch feedsYesNone
consent_scope_codetextMust map to active borrower/seller consentNoconsent.scope_code
last_received_attimestamptzUpdated on every accepted batch/eventYesNone
feed_statusenumdraft, testing, active, delayed, failed, retiredNoNone
FieldTypeConstraintsNullableReferences
anchor_seller_snapshot_iduuidPrimary keyNoNone
partner_profile_iduuidAnchor/marketplace partnerNopartner_profile.partner_profile_id
loan_account_iduuidRequired once loan is bookedYesloan_account.loan_account_id
seller_platform_idtextUnique with partner and marketplace tenantNoNone
seller_statusenumactive, restricted, suspended, delisted, closed, unknownNoNone
snapshot_datedateRequiredNoNone
gmv_30dnumeric(18,2)Gross platform sales before returnsNoNone
net_settlement_30dnumeric(18,2)After refunds/returns/platform deductionsNoNone
return_rate_30dnumeric(9,6)Between 0 and 1NoNone
rto_rate_30dnumeric(9,6)Between 0 and 1NoNone
rating_scorenumeric(5,2)Marketplace scale stored with rating_scale in payloadYesNone
settlement_cycle_daysintPositiveYesNone
source_batch_iduuidFeed batch/event referenceNopartner_status_event.partner_status_event_id
FieldTypeConstraintsNullableReferences
settlement_deduction_instruction_iduuidPrimary keyNoNone
loan_account_iduuidBooked seller loanNoloan_account.loan_account_id
partner_profile_iduuidMarketplace/settlement partnerNopartner_profile.partner_profile_id
seller_platform_idtextMust match latest anchor_seller_snapshotNoNone
instruction_typeenumfixed_amount, percent_of_settlement, minimum_due_sweep, full_overdue_sweep, receivable_assignmentNoNone
deduction_percentnumeric(9,6)Required for percentage instructionYesNone
fixed_amountnumeric(18,2)Required for fixed instructionYesNone
cap_per_cyclenumeric(18,2)Optional seller-protection capYesNone
beneficiary_bank_account_iduuidMust be RE bank account, CLA escrow or documented assignee accountNobank_account.bank_account_id
borrower_authorization_iduuidSeller authorization artefactNoconsent.consent_id
effective_fromdateRequiredNoNone
effective_todateMust be after effective_fromYesNone
instruction_statusenumdraft, active, paused, cancelled, expired, breach_holdNoNone
FieldTypeConstraintsNullableReferences
settlement_reconciliation_iduuidPrimary keyNoNone
settlement_deduction_instruction_iduuidParent instructionNosettlement_deduction_instruction.settlement_deduction_instruction_id
loan_account_iduuidRequiredNoloan_account.loan_account_id
settlement_cycle_idtextMarketplace settlement batch/cycle idNoNone
gross_settlement_amountnumeric(18,2)From anchor settlement feedNoNone
marketplace_deductionsnumeric(18,2)Fees, refunds, logistics, penaltiesNoNone
expected_repayment_amountnumeric(18,2)Computed from active instructionNoNone
actual_repayment_amountnumeric(18,2)Bank/escrow amount receivedNoNone
utrtextRequired when actual amount is postedYesNone
value_datedateRequired for posted moneyYesNone
reconciliation_statusenumpending, matched, short_paid, excess_paid, delayed, reversed, failedNoNone
break_reason_codeenumnone, anchor_not_settled, seller_suspended, insufficient_settlement, utr_missing, amount_mismatch, beneficiary_mismatch, refund_reversalNoNone
FieldTypeConstraintsNullableReferences
repayment_split_event_iduuidPrimary keyNoNone
loan_transaction_iduuidReceipt or reversal transactionNoloan_transaction.loan_transaction_id
settlement_reconciliation_iduuidRequired for settlement-linked receiptYessettlement_reconciliation.settlement_reconciliation_id
loan_account_iduuidRequiredNoloan_account.loan_account_id
split_basisenumpartner_share, cla_waterfall, receivable_assignment, single_reNoNone
principal_componentnumeric(18,2)Non-negativeNoNone
interest_componentnumeric(18,2)Non-negativeNoNone
charge_componentnumeric(18,2)Non-negativeNoNone
originating_re_amountnumeric(18,2)Required for CLAYesNone
partner_re_amountnumeric(18,2)Required for CLAYesNone
posted_to_partner_ledger_flagbooleanTrue only after partner_ledger rows are postedNoNone
event_statusenumcomputed, posted, reversed, held_for_breakNoNone
FieldTypeConstraintsNullableReferences
seller_churn_trigger_iduuidPrimary keyNoNone
loan_account_iduuidRequiredNoloan_account.loan_account_id
partner_profile_iduuidMarketplace partnerNopartner_profile.partner_profile_id
trigger_typeenumgmv_drop, net_settlement_drop, seller_suspended, seller_delisted, high_rto, high_return_rate, settlement_feed_missing, marketplace_exit_noticeNoNone
threshold_valuenumeric(18,6)Policy thresholdYesNone
observed_valuenumeric(18,6)Trigger observationYesNone
detected_attimestamptzRequiredNoNone
severityenumlow, medium, high, criticalNoNone
action_requiredenummonitor, reduce_limit, pause_drawdown, activate_fallback_mandate, collections_review, manual_credit_reviewNoNone
resolution_statusenumopen, acknowledged, actioned, waived, closedNoNone

Use the exact extension names from domain model lending.

EntityFieldsValidation
co_lending_arrangementcla_id, originating_re_party_id, partner_re_party_id, product_scope, originator_share_percent, partner_share_percent, effective_date, escrow_bank_account_id, customer_interface_party_id, statusoriginator_share_percent + partner_share_percent = 100; each share must be at least 10; both parties must have party_type=regulated_entity; active agreement required before application.co_lending_flag=true.
partner_sharepartner_share_id, loan_account_id, cla_id, re_party_id, share_percent, principal_share, interest_rate, booked_at, statusOne row per RE share; total principal_share equals loan_account.principal_disbursed; partner share must be booked within 15 calendar days from disbursement.
escrow_movementmovement_id, loan_account_id, escrow_account_id, movement_type, amount, value_date, originating_re_amount, partner_re_amount, reconciliation_statusEvery CLA disbursement and repayment movement must split through escrow; originating_re_amount + partner_re_amount = amount.
partner_ledgerpartner_ledger_id, loan_account_id, partner_share_id, ledger_event_type, component, debit_amount, credit_amount, value_date, source_event_id, posting_statusUse double-entry style rows for partner economics; every row ties back to loan_transaction, escrow_movement or accounting_event.
dlg_setdlg_set_id, provider_party_id, beneficiary_re_party_id, portfolio_identifier, upfront_portfolio_amount, cap_amount, form, valid_from, valid_to, statuscap_amount <= 5% of disbursed fixed DLG loan portfolio; form must be cash deposit, FD lien, or bank guarantee under Digital Lending Directions.
partner_status_eventpartner_status_event_id, loan_account_id, partner_profile_id, event_type, event_payload_hash, sent_at, ack_at, statusRequired for sanction, disbursement, repayment, DPD, SMA/NPA, closure, cancellation, settlement, restructure and collateral release events.

All endpoints require api_client authentication, idempotency key, request timestamp, request signature, partner correlation id and schema version. Partner can never write internal credit approval, KYC approval, DPD, asset classification or GL postings directly.

EndpointDirectionScopeRequest fieldsResponse fieldsIdempotency keyNotes
POST /v1/applicationsPartner to lenderapplication:createPartner ref, product, requested amount/tenor, borrower identifiers, channel_type, source_partner_id, consent references, anchor data summaryapplication_id, application_number, application_state=lead_created or prescreen_pending, validation errorsPartner ref plus borrower PAN/GSTIN plus productCreates partner_application_ref; duplicate returns same application.
GET /v1/applications/{application_id}/statusPartner to lenderapplication:read_statusApplication id or partner refCurrent application_state, coarse reason codes, next required action, no CAM/bureau/RCU detailsRead-onlyStatus vocabulary must map to state-machine names or a documented coarse external mapping.
POST /v1/applications/{application_id}/documentsPartner to lenderdocument:uploaddocument_type, owner party role, file hash, MIME type, document number, storage upload tokendocument_id, verification_status=uploaded, deficiency if rejectedFile hash plus document type plus applicationCreates document_instance; partner cannot mark verified.
POST /v1/consentsPartner to lenderconsent:createParty, consent type, purpose, scope, text version, capture channel partner_apiconsent_id, status, expiry, evidence URIParty plus consent type plus purpose plus captured timestampLender must preserve consent artefact; broad catch-all consent is invalid.
POST /v1/offers/{application_id}/selectPartner to lenderoffer:selectOffer id, borrower acceptance intent, selected amount/tenorSelected offer status; KFS URL if generatedOffer id plus applicationMust not bypass KFS and borrower acceptance.
GET /v1/kfs/{kfs_version_id}Partner to lenderkfs:readKFS version idKFS fields, APR, repayment schedule, charges, cooling-off, grievance detailsRead-onlyPartner may display KFS but cannot alter APR.
POST /v1/partner-decisionsPartner/co-lender to lenderpartner_decision:createApplication id, partner decision, approved amount, partner rate, decline reason, policy versionDecision receipt, dual-decision stateApplication id plus partner policy versionUsed in dual-decisioning before sanction.
POST /v1/webhooks/ackPartner to lenderwebhook:ackEvent id, status, received timestamp, error codeAck accepted/rejectedEvent idFailed webhook retries: 5 minutes, 30 minutes, 2 hours, next business day.
GET /v1/loans/{loan_account_id}/partner-sharePartner to lenderloan:read_partner_shareLoan id or partner refpartner_share, DPD, asset_classification, outstanding split, next dueRead-onlyShare and classification must match partner books.
POST /v1/repayment-eventsPartner to lenderrepayment:notifyPartner receipt/refund/reversal event when partner services borrower under allowed setupAccepted/rejected; LMS reconciliation statusPartner transaction idBorrower repayment must still flow to RE account or permitted escrow.
POST /v1/dlg/invocationsLender to DLG provider or provider to lenderdlg:invokedlg_set_id, loan list, overdue days, invocation amount, supporting default dataInvocation status, available cap after invocationDLG set plus invocation batch idInvoke within maximum overdue period of 120 days unless borrower cures under Digital Lending Directions.
StepOwnerSystem actionRequired dataExit condition
1. Intakepartner_api_client, sales_opsCreate application with channel_type=co_lending, source_partner_id, co_lending_flag=true.Partner ref, borrower party data, consent, product and requested terms.lead_submitted_for_prescreen accepted.
2. Lender pre-screenBRE and credit_analystRun lender rules, bureau, KYC, document and data pack.bre_result, kyc_profile, document_instance, bureau/AA/GST data.pre_screen_passed or hard_reject_triggered.
3. Partner policy checkPartner REPartner evaluates under ex-ante agreement.Lender-approved data pack or minimal agreed variables, KFS-relevant terms, risk grade.Partner sends partner_decision=approve, approve_with_conditions, reject, or refer.
4. Conflict resolutioncredit_manager and partner opsResolve mismatched limit, tenor, rate, DPD/KYC hold, product ineligibility or partner concentration cap.Both policy decisions, deviations, partner conditions.Both REs approve or application moves rejected/returned_for_rework.
5. Sanction and KFSLOS/KFS serviceGenerate single borrower-facing sanction and KFS with blended rate and role segregation.sanction, kfs_version, co_lending_arrangement, partner share percentages and fees.sanction_letter_generated; borrower accepts through borrower_acceptance_recorded.
6. BookingDisbursement/LMS/co-lending ledgerBook loan_account, create partner_share, post escrow_movement, send partner_share_booked.Disbursement amount, escrow account, payment reference, both RE rates.loan_booked; partner share reflected within 15 calendar days.
7. Ongoing syncLMS/co-lending moduleSend repayments, DPD, SMA/NPA, settlement, restructure, closure and collateral events.loan_transaction, asset_classification, collection_case, security_charge.Partner acknowledgements within SLA; breaks routed to reconciliation.

Assume a ₹10,00,000 loan under 80:20 CLA, borrower blended annual rate is weighted from originator and partner internal rates, and ₹10,00,000 is disbursed through escrow.

EventSource recordLedger debitLedger creditpartner_ledger rowsReconciliation rule
Originator funds its shareescrow_movement movement_type=disbursement_fundingEscrow bank ₹8,00,000Originator funding bank ₹8,00,000Originator share debit principal ₹8,00,000Bank statement equals escrow movement.
Partner funds its shareescrow_movementEscrow bank ₹2,00,000Partner funding bank ₹2,00,000Partner share debit principal ₹2,00,000Partner ack required.
Borrower/supplier disbursementdisbursementLoan receivable ₹10,00,000 split by shareEscrow bank ₹10,00,000Two principal postings: originator ₹8,00,000, partner ₹2,00,000principal_disbursed equals sum of partner_share.principal_share.
EMI receiptloan_transaction transaction_type=receiptEscrow/bank receiptBorrower receivable componentsPrincipal, interest, charge and tax split by contractual appropriationReceipt must reconcile to bank and LMS due clearance.
Bounce chargeloan_transaction transaction_type=chargeBorrower charge receivableCharge income payable to entitled RE(s)Charge split per agreementPenal charges must match KFS and penal-charge policy.
Waiver/settlementloan_transaction transaction_type=waiverWaiver expense/write-offBorrower receivablePartner share waiver and originator share waiverRequires partner consent if economics change.
DLG invocationdlg_invocationDLG cash/FD/BG receivableCredit loss recovery/suspense per accounting policyDLG receipt linked to affected partner/shareBorrower liability remains unchanged; no set-off against loan dues.
FieldTypeConstraints
dlg_portfolio_loan_iduuidPrimary key
dlg_set_iduuidReferences dlg_set.dlg_set_id
loan_account_iduuidReferences loan_account.loan_account_id
sanction_iduuidReferences sanction.sanction_id
included_amountnumeric(18,2)Loan amount in fixed DLG set
disbursed_amountnumeric(18,2)Amount on which cap activates
inclusion_datedateCannot be after default event
statusenumincluded, disbursed, matured_without_default, defaulted, invoked, written_off, closed
FieldTypeConstraints
dlg_invocation_iduuidPrimary key
dlg_set_iduuidParent DLG set
loan_account_iduuidAffected loan
overdue_days_at_invocationintMust be less than or equal to 120 unless policy/legal exception prevents invocation
borrower_due_amountnumeric(18,2)Total due remains borrower liability
eligible_loss_amountnumeric(18,2)Loss amount eligible under DLG contract
invocation_amountnumeric(18,2)Cannot exceed remaining cap_amount
invocation_datedateRequired
formenumcash_deposit, fd_lien, bank_guarantee
statusenumdraft, submitted, realized, rejected, reversed

DLG rules:

RuleBuild control
Fixed setdlg_portfolio_loan membership freezes before DLG cover is used; no dynamic replacement.
5 percent capsum(invocation_amount where status in submitted, realized) <= dlg_set.cap_amount; cap_amount <= 0.05 * disbursed amount of DLG set.
No reinstatementRecovery after invocation may be shared contractually, but it cannot restore available DLG cap.
NPA responsibilityloan_account.asset_classification and provisioning remain with RE; DLG is not a cure event.
DLG ineligible productsReject DLG for digital revolving credit, credit cards, NBFC-P2P loans, and loans covered by CGTMSE/NCGTC trust-fund guarantees.
ProcessSourceCalculationApprovalPosting
DSA/LSP acquisition payoutapplication.source_partner_id, loan_booked, program payout basisDisbursed amount times payout_rate, or fixed login/disbursal fee, net of clawback holdssales_manager for source hold; treasury_finance for paymentpayout_ledger and gl_posting; no deduction from borrower proceeds.
Anchor subventionpartner_program, sanction termsInterest or fee subsidy by anchor by invoice/dealer programCredit and finance approvalPartner receivable; borrower KFS must show actual borrower economics.
CLA servicing feeco_lending_arrangement and partner agreementFee based on servicing activities, not credit enhancement unless DLG compliantFinance checkerpartner_ledger fee rows; GST tax split where applicable.
Escrow reconciliationBank statement plus escrow_movementMatch value date, amount, UTR, loan id and splittreasury_finance checkerreconciliation_status=matched; breaks create suspense_item.
Partner share reconciliationpartner_share, partner statement, LMSPrincipal outstanding, interest accrual, DPD, receipts, waivers, closurePartner ops and financepartner_status_event ack plus ledger correction if mismatch.
DLG cap reconciliationdlg_set, dlg_invocation, loan performanceCap used, cap remaining, overdue loans, invocation ageingRisk and financeMonthly DLG statement; monthly provider website disclosure where applicable under Digital Lending Directions.
Break codeDetectionResolution
share_not_booked_15dloan_booked plus no active partner_share within 15 calendar daysKeep full exposure on originator books; transfer later only under Transfer of Loan Exposures rules.
escrow_amount_mismatchBank amount differs from escrow_movement.amountInvestigate bank UTR; post correction or suspense before day-end close.
partner_dpd_mismatchPartner reports different DPD or asset classLMS source recomputation; if CLA exposure default exists, align borrower-level classification no later than next working day.
receipt_split_mismatchoriginating_re_amount + partner_re_amount != receipt amountBlock GL finalisation; recompute split from active partner_share.
waiver_without_partner_consentSettlement/restructure changes economics but no partner approvalHold settlement implementation; create approval_request for partner consent.
dlg_cap_breachInvocation would exceed dlg_set.cap_amountReject invocation; route to risk and finance.
TestExpected result
CLA configured 95:5Reject co_lending_arrangement because each RE must retain at least 10 percent.
loan_booked but partner share missing after 15 calendar daysCreate reconciliation break share_not_booked_15d; future transfer cannot use CLA booking path.
Partner API requests bureau raw reportReject with scope error; partner receives only contracted variables with consent and purpose.
Borrower repayment lands in LSP accountMark fund-flow breach; do not post as valid borrower receipt until funds reach RE account or permitted escrow.
One co-lender marks SMA-2Emit partner_status_event; other RE classification must align under borrower-level CLA rule.
DLG invocation at 130 DPDReject unless documented legal/process exception exists; risk head approval required.
Recovery after DLG invocationPost recovery as borrower recovery; do not reinstate DLG cap.