The single source of truth for the landing page UI. One request returns the user's identity, all loans, journey states, eligibility per asset class, and any in-progress top-up references.
Render your landing page UI from the API responseDo not attempt to re-build/derive complex logic like loan lifecycles on your backend. The Combined Credit Snapshot API does the heavy-lifting for you. Your primary responsibility is to integrate.
What is the Combined Credit Snapshot API?
This API is a wrapper over 4 independent APIs - and was build for you to simplify building landing pages/ credit widgets and re-usage credit sections on your UI.
The API wraps over 4 commonly used Unity APIs (so you only have to integrate once) and enables these common user states and use cases.
Scenario 1 - Credit limit simulation
If you have the user's holdings (mutual funds/stocks), you can use the API to fetch the user's potential credit limit. If multiple lenders are available, the API evaluates the credit limit offered by each lender and returns the offer with the maximum loan amount.
If you provide a user identifier (PAN/Unity user ID) - it takes into account the user context and returns the credit limit offered by the lender selected by the user.
Scenario 2 - Loan application states
If a user ID is provided, the API returns the loan application states for all in progress/disbursed loans of the user. You can use this information to nudge the user to either resume the loan application, or view the active loan dashboard.
The API response also helps you with context if a user has multiple active loan applications/loans.
Response structure
The response stitches together the outputs of the four APIs this endpoint wraps — each linked value below points to that API's reference.
Expected output:
{
user: response from get Unity user,
creditLimit: [
{
lender: "bajaj_finserv",
product: "lamf", // only if MF holdings input is provided
data: response from Credit simulation for MFs
},
{
lender: "bajaj_finserv",
product: "lamf", // only if stock holdings are provided
data: response from Credit simulation for STOCKs
}
],
loanDetails: [ // only if there are one or more lids in the get user response
{
lid: <lid from user.data.loans list>,
journeyStatus: response from application status API,
loanSummary: response from loan summary API // call the right API based on lender + product
}
]
}
One request returns the complete landing-page state for a user.
| Top-level field | What it carries |
|---|---|
user | Unity user identity, lender, all loans (LAMF + LAS), flags, top-up nudges. null if no unityUserId is provided. |
creditLimit[] | Eligibility per asset class. One entry per (product, assetType) — MUTUALFUND, STOCKS. |
loanDetails[] | One entry per loan in user.loans. Each carries journeyStatus plus a loanSummary (servicing dashboard payload) once the loan is past disbursement. Child LIDs surface only inside the parent's loanSummary.topUpLoans[]. |
Use it for:
- Pre-onboarding pure eligibility (omit
unityUserId). - Connected-user LP UI render — what loans the user has, their journey state, and what they can top up.
Request fields
| Field | Type | When to send |
|---|---|---|
unityUserId | string | Optional. Omit for pre-onboarding pure eligibility (you'll get user: null). Include once Create User has returned an ID — required to fetch user state + loans. |
stockHoldings | array | Optional. Pass to compute STOCKS eligibility. Each entry must include dpId. |
mfHoldings | array | Optional. Pass to compute MUTUALFUND eligibility. |
brokerHoldings | array | Optional. Broker raw holdings (currently kite) for cross-validation against stockHoldings. |
aggregateFunds | boolean | Optional. When true, MF distribution response is aggregated by ISIN. No effect on STOCKS. |
referrer | string | Optional. Defaults to your partner name. |
pan | string | Optional. |
age | number | Optional. Validated against the lender's allowed age range when provided. Helps with lender eligibility checks. |
isNri | boolean | Optional. Use isNri — isNRI is deprecated. NRI users are rejected with not_eligible_wrt_nri_status (4407). |
name | string | Optional. |
Holding entry shapes
stockHoldings[]:
{
"assetType": "STOCKS",
"isin": "INE467B01029",
"quantity": 50,
"isDemat": true,
"dpId": "1208160075231086",
"iscid": "",
"lockInQuantity": 0
}| Sub-field | Required | Description |
|---|---|---|
assetType | yes | Constant STOCKS. |
isin | yes | The same ISIN can appear multiple times if the stock is a constituent in multiple smallcases. |
quantity | yes | Total quantity held. |
isDemat | yes | Always true for STOCKS. |
dpId | yes | The DP ID for the demat account. |
iscid | no | Empty for externally held; populated when the holding is part of a smallcase. |
lockInQuantity | no | Deducted from quantity for eligibility math. |
mfHoldings[]:
{
"assetType": "MUTUALFUND",
"isin": "INF209K01VA3",
"quantity": 1375.823,
"isDemat": false,
"lockInQuantity": 0
}Loan relationships (response.data.user.loans) for your landing page
response.data.user.loans) for your landing page
Read this firstBefore working with
user.loans[]andloanDetails[], go through Loan lifecycle & loan relationships. This page assumes that model.
LID lifecycle
A loan moves through a single journey, surfaced as loanStatus:
{
"lid": "67f0aa11ce42e3a9b7c40012",
"status": "ACTIVE",
"productType": "lamf",
"assetType": "MUTUALFUND",
"lender": "bajaj_finserv",
"flowId": "67f0aa11ce42e3a9b7c40010",
"createdAt": "2026-04-28T14:00:00.000Z",
"purpose": "LOAN_APPLICATION",
"isDefault": true,
"loanStatus": "PRE_SUBMITTED"
}(no LID yet)
│ user starts journey
▼
PRE_SUBMITTED
│ user submits to lender
▼
SUBMITTED
│ lender approves & disburses
▼
DISBURSED ◀── servicing dashboard active
│ user closes loan
▼
CLOSED
WhereloanStatusandstatusdiffer:✅
loanStatusis the journey status (PRE_SUBMITTED/SUBMITTED/DISBURSED/CLOSED) — this is what you use to render the landing page state/nudges.
- PRE_SUBMITTED - display the "resume loan application" messaging.
- SUBMITTED - show the "please wait, application under processing/review" state
- DISBURSED - show the servicing dashboard/state
- CLOSED - do not show/use for user's archival reference
❌statusis an internal book-keeping flag (ACTIVE/INACTIVE/CLOSED/ARCHIVED) — you can mostly ignore it!
Sibling vs parent-child
There are two distinct patterns. Both are server-managed; the snapshot reflects whichever applies right now.
Same-asset top-up (e.g. LAMF over LAMF). The parent-child link is established at top-up creation, before submission. The child appears in the parent's loanSummary.topUpLoans[] immediately with topUpStatus: IN_PROGRESS. When the child gets DISBURSED, it becomes the new servicing dashboard owner; the old parent flips to status: INACTIVE and topUpStatus: APPLIED.
Cross-asset (LAMF + LAS, same lender). When a user has a LAMF and starts a LAS application (or vice versa), the two loans are siblings while both are PRE_SUBMITTED — not parent-child. When one of the two is SUBMITTED, the server flips the relationship to parent-child, and the child shows up in the parent's loanSummary.topUpLoans[] once the parent is DISBURSED.
How to detect each pattern from the snapshot:
| Pattern | Detection rule |
|---|---|
| Sibling | Two loans, same lender, both loanStatus: PRE_SUBMITTED, different assetType, both purpose: LOAN_APPLICATION. |
| Parent-child | Parent is in topUpLoans[] of the other loan's loanSummary, OR the child has purpose: LOAN_APPLICATION:TOP_UP while a same-lender DISBURSED loan exists. |
EIMPL loans are lender-selection onlyAny loan with lender
eimplexists only for the lender-selection journey. It will never reach theSUBMITTEDstate, and so it will never carry aloanSummaryobject.
Scenario matrix
What to expect in each end-state, and what to render.
| Scenario | user.loans | loanDetails[].loanSummary.topUpLoans[] | Partner UI |
|---|---|---|---|
| LAMF only (DISBURSED) | 1 entry: ACTIVE, MUTUALFUND, DISBURSED, isDefault: true | On the LAMF: STOCKS + MUTUALFUND placeholders, both NOT_INITIATED | LAMF servicing card. Optionally surface "Add LAS" if nudges.topup includes "las". |
| LAMF over LAMF | 2 entries: parent ACTIVE/DISBURSED + child ACTIVE/PRE_SUBMITTED, child has purpose: LOAN_APPLICATION:TOP_UP | On parent: MUTUALFUND child with topUpStatus: IN_PROGRESS, STOCKS placeholder | LAMF servicing card with a "Top-up in progress" badge. |
| LAS only (DISBURSED) | 1 entry: ACTIVE, STOCKS, DISBURSED, isDefault: true | On the LAS: STOCKS + MUTUALFUND placeholders | LAS servicing card. Surface "Add LAMF" if the nudge says so. |
| LAS over LAMF (cross-asset child) | 2 entries: LAMF DISBURSED parent + LAS PRE_SUBMITTED/SUBMITTED child | After LAS submission: LAS appears in LAMF's topUpLoans with topUpStatus: APPLIED. While LAS is still PRE_SUBMITTED they are siblings. | LAMF servicing + a "LAS application in progress" card linked from topUpLoans. |
| LAMF over LAS (cross-asset child) | Mirror of LAS over LAMF | After LAMF submission: LAMF appears in LAS's topUpLoans | LAS servicing + LAMF in-progress card. |
| LAS over LAS | Coming soon. Not yet supported. | — | Not yet applicable. |
| LAS + LAMF in parallel (siblings) | 2 entries: both PRE_SUBMITTED, different assetType, same lender, both purpose: LOAN_APPLICATION | Both loanDetails entries have only journeyStatus (no loanSummary, since neither is disbursed) | Two in-progress application cards. Detect via the rule in Loan relationships. |
Known limitations
- The child loan does not carry a back-pointer (
parentLid) to its parent. Derive the relationship from the parent'stopUpLoans[]or from the child'spurpose: LOAN_APPLICATION:TOP_UPmarker. - Sibling loans are not annotated with
siblingLidin the response. Detect them from shape (see Loan relationships). - For EIMPL loans,
loanDetails[].loanSummarywill benullbecause EIMPL has no servicing dashboard endpoint exposed today.