Request-Response Model (Personal Loan)
We will be communicating data through webhooks, callbacks, and events in a specific request and response model format. The following is how requests and responses will show up while integrating the Aarthik Labs hosted experience:
Request
POST /api/lab/sessions request format
API_KEY will go in as a Authorization: Bearer ${API_KEY} header.
Use application/json with these top-level keys:
borrowerProviderID(required) (read: Borrower Identity Mapping (Important))profile(object)workProfile(object)address(object)
Use the following format for a basic initialization. Every other field not shown below is optional.
{
"borrowerProviderID": "BORROWER-123",
"profile": {
"contactNumber": "9876543210",
},
}Expected response for this basic initialization request:
{
"embedUrl": "https://your-platform-domain.com/lab/embed?tenant_id={TENANT_ID}&application_id={APPLICATION_ID}&borrower_provider_id={BORROWER_PROVIDER_ID}&journey_type=PERSONAL_LOAN#{SESSION_TOKEN}"
}If detailed borrower information is available and you wish to prefill these fields, the following extended request format is supported.
{
"borrowerProviderID": "BORROWER-123",
"profile": {
"contactNumber": "9876543210",
"pan": "ABCDE1234F",
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com"
},
"workProfile": {
"officialemail": "rahul@company.com",
"employmentType": "salaried",
"income": "75000",
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
}Request Schema
| Field | Type | Required | Accepted values / Notes |
|---|---|---|---|
borrowerProviderID | string | Yes | Non-empty borrower reference from your system (must be unique within your client/tenant) (read: Borrower Identity Mapping (Important)) |
profile | object | Yes (with at least required fields) | Borrower profile prefill |
profile.contactNumber | string | Yes | Indian mobile number (10 digits, optional +91) |
profile.pan | string | No | Valid PAN (normalized to uppercase) |
profile.panName | string | No | PAN name |
profile.dob | string | No | Date string (recommended: YYYY-MM-DD) |
profile.gender | string | No | Case-insensitive: male, female, transgender (read: Canonical Normalization) |
profile.personalemail | string | No | Valid email (normalized to lowercase) |
workProfile | object | No | Employment prefill |
workProfile.officialemail | string | No | Valid email |
workProfile.employmentType | string | No | Case-insensitive canonical values: salaried, selfEmployed; aliases accepted: self-employed, self employed (read: Canonical Normalization) |
workProfile.income | string | number | No | Digits only, at least 4 digits, > 0 |
workProfile.companyName | string | No | Company name |
workProfile.udyamNumber | string | null | No | Allowed only when employment type is self-employed |
address | object | No | Address prefill |
address.addressL1 | string | No | Address line 1 |
address.addressL2 | string | No | Address line 2 |
address.city | string | No | City |
address.state | string | No | State |
address.pincode | string | No | PIN code |
Borrower Identity Mapping (Important)
borrowerProviderID is the permanent borrower identity key on your side.
borrowerProviderID is client-scoped, so two different clients may send the same value. We generate and use internal borrowerID as the unique borrower identifier in our platform.
You must keep a 1:1, stable mapping between:
mobile number↔borrowerProviderID
Example
If mobile number 8000352223 is first initialized with:
borrowerProviderID = 1234
then every future session for that same mobile number must continue to send:
borrowerProviderID = 1234
What happens if this changes?
If you send a different ID for the same mobile number (for example 1235), the platform will treat this as a new borrower. As a result:
- previously created applications will not appear for resume
- post-disbursal journey/application tracking will break
- the borrower will need to start a fresh application flow
Integration rule
To preserve resume, tracking, and post-disbursal continuity, always send the same borrowerProviderID for the same mobile number across all sessions.
Canonical Normalization
genderis normalized to:male,female,transgenderemploymentTypeis normalized to:salaried,selfEmployed
Example accepted employmentType inputs:
Salaried->salariedSELFEMPLOYED->selfEmployedself-employed->selfEmployedself employed->selfEmployed
cURL example
curl --request POST "${PLATFORM_BASE_URL}/api/lab/sessions" \
--header "Authorization: Bearer ${PLATFORM_API_KEY}" \
--header "Content-Type: application/json" \
--data-raw '{
"borrowerProviderID": "BORROWER-123",
"profile": {
"contactNumber": "9876543210"
}
}'
curl --request POST "${PLATFORM_BASE_URL}/api/lab/sessions" \
--header "Authorization: Bearer ${PLATFORM_API_KEY}" \
--header "Content-Type: application/json" \
--data-raw '{
"borrowerProviderID": "BORROWER-123",
"profile": {
"contactNumber": "9876543210",
"pan": "ABCDE1234F"
},
"workProfile": {
"employmentType": "salaried",
"income": "75000",
"companyName": "Acme Pvt Ltd",
"officialemail": "rahul@company.com"
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
}'Notes
borrowerProviderIDis mandatory.profile.contactNumberis mandatory.workProfile.employmentTypemust besalariedorselfEmployed.workProfile.udyamNumberis only valid forselfEmployed.
Response
Journey snapshots via postMessage
The hosted journey posts snapshot updates to the parent window using postMessage. Each snapshot matches the response model shown below (tenant_id, application_id, borrower, journeys, etc.). You can listen for these messages, validate the origin, and forward them to your backend to store in a database or run analytics.
"use client";
import { useEffect } from "react";
const PLATFORM_ORIGIN = "https://your-platform-domain.com";
export function useJourneySnapshots() {
useEffect(() => {
const handleMessage = (event: MessageEvent) => {
if (event.origin !== PLATFORM_ORIGIN) return;
const snapshot = event.data as
| { borrower?: { journeys?: unknown[] } }
| null;
if (!snapshot?.borrower?.journeys) return;
void fetch("/api/journey-snapshots", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(snapshot),
});
};
window.addEventListener("message", handleMessage);
return () => window.removeEventListener("message", handleMessage);
}, []);
}Validate origin and protect PII
Always validate event.origin to match your platform domain. These snapshots may contain sensitive borrower data, so store and process them securely.
1. Journey Started
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: { // Whatever is shared in the Request, will be passed to the tenant back in the form of Response
Personal: {
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
},
journeys: [
{}, // This array will contain all the old journeys of the borrower
{}, // if the borrower is existing
{}, // else it will contain just the newly created journey
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: `STARTED`,
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: `PENDING`,
},
],
},
};2. Application Data Collected
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: { // Whatever is submitted by the Borrower, will be passed to the tenant back in the form of Response
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{}, // This array will contain all the old journeys of the borrower
{}, // if the borrower is existing
{}, // else it will contain just the newly created journey
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: `PROFILED`,
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: `PENDING`,
},
],
},
};3. Offered
In case, no offer is received, the array will be empty.
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "OFFERED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: false,
expired: true | false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
},
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: false,
expired: true | false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
},
],
},
],
},
};
// NO OFFER
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "NOT_OFFERED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [],
},
],
},
};4. Offer Selected
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "OFFER_SELECTED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
borrower_preferred_amount: // Borrower’s preferred loan amount. *Example:* `200000`,
borrower_preferred_tenure: // Borrower’s preferred tenure in months. *Example:* `12`,
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: false,
expired: false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
},
],
},
],
},
};5. Offer Accepted
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "OFFER_ACCEPTED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
borrower_preferred_amount: // Borrower’s preferred loan amount. *Example:* `200000`,
borrower_preferred_tenure: // Borrower’s preferred tenure in months. *Example:* `12`,
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [ // Offer array may be updated with the revised offer amount (borrower preferred).
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: true,
expired: false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
},
],
},
],
},
};6. Lender Redirected
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "LENDER_REDIRECTED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
lender_mode: "OFFLINE" | "ONLINE",
kyc_status: `PENDING` | `SUCCESS` | `FAILURE`,
kyc_attempts: 1,
emandate_status: `PENDING` | `SUCCESS` | `FAILURE`,
emandate_attempts: 0,
esign_status: `PENDING` | `SUCCESS` | `FAILURE`,
esign_attempts: 0,
change_in_offer: true | false,
borrower_preferred_amount: // Borrower’s preferred loan amount. *Example:* `200000`,
borrower_preferred_tenure: // Borrower’s preferred tenure in months. *Example:* `12`,
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [ // Offer array may be updated with the revised offer amount (borrower preferred).
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: true,
expired: false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
},
],
},
],
},
};7. Disbursed
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "DISBURSED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
lender_mode: "OFFLINE" | "ONLINE",
kyc_status: `SUCCESS`,
kyc_attempts: 1,
emandate_status: `SUCCESS`,
emandate_attempts: 1,
esign_status: `SUCCESS`,
esign_attempts: 1,
change_in_offer: true | false,
borrower_preferred_amount: // Borrower’s preferred loan amount. *Example:* `200000`,
borrower_preferred_tenure: // Borrower’s preferred tenure in months. *Example:* `12`,
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [ // Offer array may be updated with the revised offer amount (borrower preferred).
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: true,
expired: false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
installments: [
{
serial_number: 1 (can be 1 to X, where X = no. of installments),
type: `INSTALLMENT`,
amount: // *Example:* `18700`,
status: // *Example:* "PAID" | "OVERDUE" | "NOT-DUE",
installment_due_date: // Installment due date. *Example:* `2026-02-05T00:00:00Z`,
},
{
serial_number: 2 (can be 1 to X, where X = no. of installments),
type: `INSTALLMENT`,
amount: // *Example:* `18700`,
status: // *Example:* "PAID" | "OVERDUE" | "NOT-DUE",
installment_due_date: // Installment due date. *Example:* `2026-02-05T00:00:00Z`,
},
],
},
],
},
],
},
};8. Collections Update
This is a frequent status update (via web-hooks, call-backs, events) for disbursed loans.
{
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower: {
id: // AL generated borrower ID *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
provider_id: // Tenant-provided borrower identifier (unique per borrower, usually per mobile number). *Example:* `cust_9876543210`,
profile: {
Personal: {
panName: // (max 3 words accepted) The borrower’s full name exactly as it appears on their PAN record. *Example:* `Rahul Kumar Sharma`,
dob: // this needs to be a valid ISO 8601 date (Example: YYYY-MM-DDThh:mm:ss.000Z — 2026-01-01T11:59:00.018Z (timestamp is optional, a default value of 00:00:00.000 can be used.) *Example:* `1994-08-17T00:00:00.000Z`,
gender: // *Example:* `male`, `female` and `transgender`,
personalemail: // (should contain at least an "@") *Example:* `rahul.sharma@gmail.com`,
pan: // PAN-regex must be followed *Example:* `ABCDE1234F`,
contactNumber: // E.164 format accepted (+91 is the only accepted country code. Post that, 10 digits accepted. Final length should be a max of 13 characters. Authenticated number should only be passed.) *Example:* `+919876543210`,
},
Work: {
employmentType: // The borrower’s primary mode of employment or income generation. Used to determine eligibility logic, document requirements, and lender routing (e.g. salaried vs self-employed). *Example:* `salaried`,
officialemail: // (should contain at least an "@", should not be a common e-mail like @gmail.com, @hotmail.com, @yahoo.com, etc.). *Example:* `rahul.sharma@acmecorp.in`,
income: // (should be a valid positve integer, no commas, ) The borrower’s declared or computed income, expected as a monthly amount. *Example:* `75000`,
companyName: // Name of the employer or business entity the borrower is associated with. *Example:* `Acme Technologies Pvt Ltd`,
udyamNumber: // Adhere to Udyam Number RegEx. The borrower’s Udyam Registration Number, applicable only for self-employed or MSME borrowers. *Example:* `Udyam-KA-05-0123456`,
},
Address: {
addressL1: // *Example:* `Flat 302, Shanti Apartments`,
addressL2: // *Example:* `Near MG Road Metro Station`,
city: // *Example:* `Rajkot`,
state: // *Example:* `Gujarat`,
pincode: // *Example:* `360001`,
},
},
journeys: [
{
id: // Internal ID for this journey (one borrower can have multiple). *Example:* `jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab`,
ondc_transaction_id: // Unique ONDC transaction identifier for protocol-level correlation. *Example:* `c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22`,
created: // When journey was created. *Example:* `2026-01-05T12:45:00Z`,
updated: // Last update timestamp for journey state machine. *Example:* `2026-01-05T13:20:12Z`,
tenant_id: string; // Tenant ID shall be provided by AL
application_id: string; // Application ID shall be provided by AL
borrower_id: // Borrower foreign key for this journey. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
type: `PERSONAL_LOAN`,
status: "DISBURSED",
activity_status: "ACTIVE" | "IDLE" | "INACTIVE",
decision_status: "APPROVED" | "NOT-APPROVED",
lender_mode: "OFFLINE" | "ONLINE",
kyc_status: `SUCCESS`,
kyc_attempts: 1,
emandate_status: `SUCCESS`,
emandate_attempts: 1,
esign_status: `SUCCESS`,
esign_attempts: 1,
change_in_offer: true | false,
borrower_preferred_amount: // Borrower’s preferred loan amount. *Example:* `200000`,
borrower_preferred_tenure: // Borrower’s preferred tenure in months. *Example:* `12`,
lender_mode: "ONLINE" | "OFFLINE",
lenders: [
{
id: // *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Lender record created timestamp. *Example:* `2026-01-05T12:50:10Z`,
tenant_id: // Tenant partition key. *Example:* `tnt_2f6c1a9b7d`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
offer_id: // Offer FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // ONDC correlation ID for lender-level interaction. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
data: // *Example:* `[ { "on_search": { "...": "..." } } ]`,
lender_name: // Lender name. *Example:* `Lender XYZ NBFC`,
lender_gro_name: // Grievance Redressal Officer name (required). *Example:* `Priya Menon`,
lender_gro_email: // GRO email. *Example:* `gro@lenderxyz.com`,
lender_gro_contact_number: // GRO contact number. *Example:* `+91-80-40001234`,
lender_gro_designation: // GRO designation/title. *Example:* `Grievance Redressal Officer`,
lender_gro_address: // GRO address. *Example:* `4th Floor, Business Park, Bengaluru, KA 560001`,
lender_customer_support_link: // Support URL. *Example:* `https://lenderxyz.com/support`,
lender_customer_support_contact_number: // Support number. *Example:* `1800-123-456`,
lender_customer_support_email: // Support email. *Example:* `support@lenderxyz.com`,
},
],
offers: [ // Offer array may be updated with the revised offer amount (borrower preferred).
{
id: // Internal offer record ID. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
created: // Offer created timestamp. *Example:* `2026-01-05T12:55:00Z`,
updated: // Offer updated timestamp. *Example:* `2026-01-05T13:10:30Z`,
tenant_id: // Tenant partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
application_id: // Application partition key. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
borrower_id: // Borrower FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
journey_id: // Journey FK. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
lender_id: // Lender FK for this offer. *Example:* `8D8AC610-566D-4EF0-9C22-186B2A5ED793`,
ondc_transaction_id: // Offer-level ONDC correlation ID. *Example:* `0b2c3d4e-5f60-4a7b-8c9d-001122334455`,
accepted: true,
expired: false,
type: // *Example:* `PERSONAL_LOAN`,
amount_principal: // Principal amount. *Example:* `200000`,
amount_total_interest_payable: // Total interest payable over tenure. *Example:* `24000`,
amount_net_disbursed_amount: // *Example:* `196500`,
offer_term: // *Example:* `12 months`,
interest_rate: // *Example:* `12.50`,
interest_type: // *Example:* `Fixed` / `reducing`,
annual_percentage_rate: // *Example:* `14.75%`,
number_of_installments: // *Example:* `12`,
cool_off_period: // *Example:* `3 days`,
terms_and_conditions_link: // URL to T&C. *Example:* `https://lenderxyz.com/tnc/loan`,
key_facts_statement_link: // URL to KFS. *Example:* `https://lenderxyz.com/kfs/loan`,
application_fees: // *Example:* `₹0`,
foreclosure_fees: // *Example:* `2%`,
interest_rate_conversion_charges: // *Example:* `500 INR`,
delay_penalty_fees: // *Example:* `5%`,
other_penalty_fees: // *Example:* `1%`,
processing_fees: // *Example:* `1800`,
other_upfront_charges: // *Example:* `100`,
insurance_charges: // *Example:* `100`,
other_charges: // *Example:* `1000`,
last_installment_date: // *Example:* `2026-02-05T00:00:00Z`,
last_installment_status: // *Example:* "PAID" | "OVERDUE",
installments: [
{
serial_number: 1 (can be 1 to X, where X = no. of installments),
type: `INSTALLMENT`,
amount: // *Example:* `18700`,
status: // *Example:* "PAID" | "OVERDUE" | "NOT-DUE",
installment_due_date: // Installment due date. *Example:* `2026-02-05T00:00:00Z`,
},
{
serial_number: 2 (can be 1 to X, where X = no. of installments),
type: `INSTALLMENT`,
amount: // *Example:* `18700`,
status: // *Example:* "PAID" | "OVERDUE" | "NOT-DUE",
installment_due_date: // Installment due date. *Example:* `2026-02-05T00:00:00Z`,
},
],
},
],
},
],
},
};