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
Lifecycle updates via postMessage
The hosted journey posts lifecycle updates to the parent window using postMessage.
Webhooks, callbacks, and postMessage updates now use the same payload shape. Tenants should infer the event from borrower.journey.status. There is no separate event name field.
"use client";
import { useEffect } from "react";
const PLATFORM_ORIGIN = "https://your-platform-domain.com";
export function useJourneyLifecycleUpdates() {
useEffect(() => {
const handleMessage = (event: MessageEvent) => {
if (event.origin !== PLATFORM_ORIGIN) return;
const lifecycleUpdate = event.data as
| { borrower?: { journey?: { status?: string } } }
| null;
if (!lifecycleUpdate?.borrower?.journey?.status) return;
void fetch("/api/journey-updates", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(lifecycleUpdate),
});
};
window.addEventListener("message", handleMessage);
return () => window.removeEventListener("message", handleMessage);
}, []);
}Validate origin and protect PII
Always validate event.origin to match your platform domain. These lifecycle updates contain sensitive borrower data and should be stored and processed securely.
Lifecycle event sequence
The canonical lifecycle sequence for Personal Loan journeys is:
STARTEDPROFILEDOFFEREDorNOT_OFFEREDOFFER_SELECTED(only if the borrower was offered at least one offer)OFFER_ACCEPTEDLENDER_REDIRECTEDREJECTEDorDISBURSED
Important behavior:
NOT_OFFEREDis terminal for the journey lifecycle.REJECTEDmay happen at any time and is terminal.OFFER_SELECTEDandOFFER_ACCEPTEDcarry the same payload shape. The only intentional difference isborrower.journey.status.- At most 7 lifecycle webhook events are created per journey.
- Retries for delivery failures do not create additional logical lifecycle events.
Stage-by-stage lifecycle samples
The payload shape stays the same for every lifecycle update. The examples below use the same complete field set for every stage so integrators can treat the payload as a stable contract.
Consistent contract across all stages
Every Personal Loan example below shows the same top-level fields, borrower profile fields, and journey fields. Only the values change from stage to stage.
STARTED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": null,
"dob": null,
"gender": null,
"personalemail": null,
"contactNumber": "+919876543210"
},
"work": {
"employmentType": null,
"officialemail": null,
"income": null,
"companyName": null,
"udyamNumber": null
},
"address": {
"addressL1": null,
"addressL2": null,
"city": null,
"state": null,
"pincode": null
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": null,
"bureauConsent": false,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T12:45:00Z",
"type": "PERSONAL_LOAN",
"status": "STARTED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": null,
"kyc_status": null,
"kyc_attempts": null,
"emandate_status": null,
"emandate_attempts": null,
"esign_status": null,
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": null,
"borrower_preferred_tenure": null,
"lenders": [],
"offers": []
}
}
}PROFILED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:20:12Z",
"type": "PERSONAL_LOAN",
"status": "PROFILED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": null,
"kyc_status": "PENDING",
"kyc_attempts": null,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": null,
"borrower_preferred_tenure": null,
"lenders": [],
"offers": []
}
}
}OFFERED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:27:00Z",
"type": "PERSONAL_LOAN",
"status": "OFFERED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": null,
"kyc_status": "PENDING",
"kyc_attempts": null,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": null,
"borrower_preferred_tenure": null,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": false,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": []
}
]
}
}
}NOT_OFFERED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:27:00Z",
"type": "PERSONAL_LOAN",
"status": "NOT_OFFERED",
"activity_status": "INACTIVE",
"decision_status": "NOT_APPROVED",
"lender_mode": null,
"kyc_status": "PENDING",
"kyc_attempts": null,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": null,
"borrower_preferred_tenure": null,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": []
}
}
}OFFER_SELECTED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:30:00Z",
"type": "PERSONAL_LOAN",
"status": "OFFER_SELECTED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": "ONLINE",
"kyc_status": "PENDING",
"kyc_attempts": null,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": 150000,
"borrower_preferred_tenure": 24,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": false,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": []
}
]
}
}
}OFFER_ACCEPTED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:31:00Z",
"type": "PERSONAL_LOAN",
"status": "OFFER_ACCEPTED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": "ONLINE",
"kyc_status": "PENDING",
"kyc_attempts": null,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": 150000,
"borrower_preferred_tenure": 24,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": true,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": []
}
]
}
}
}LENDER_REDIRECTED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:40:00Z",
"type": "PERSONAL_LOAN",
"status": "LENDER_REDIRECTED",
"activity_status": "ACTIVE",
"decision_status": null,
"lender_mode": "ONLINE",
"kyc_status": "PENDING",
"kyc_attempts": 1,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": 150000,
"borrower_preferred_tenure": 24,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": true,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": []
}
]
}
}
}REJECTED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T13:44:00Z",
"type": "PERSONAL_LOAN",
"status": "REJECTED",
"activity_status": "INACTIVE",
"decision_status": "NOT_APPROVED",
"lender_mode": "ONLINE",
"kyc_status": "FAILURE",
"kyc_attempts": 1,
"emandate_status": "PENDING",
"emandate_attempts": null,
"esign_status": "PENDING",
"esign_attempts": null,
"change_in_offer": false,
"borrower_preferred_amount": 150000,
"borrower_preferred_tenure": 24,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": true,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": []
}
]
}
}
}DISBURSED
{
"tenant_id": "TENANT_ID",
"application_id": "APPLICATION_ID",
"borrower": {
"id": "AL_BORROWER_ID",
"provider_id": "BORROWER-123",
"profile": {
"personal": {
"panName": "Rahul Sharma",
"dob": "1995-06-20",
"gender": "male",
"personalemail": "rahul@example.com",
"contactNumber": "+919876543210"
},
"work": {
"employmentType": "salaried",
"officialemail": "rahul@company.com",
"income": 75000,
"companyName": "Acme Pvt Ltd",
"udyamNumber": null
},
"address": {
"addressL1": "Flat 301, Sunrise Heights",
"addressL2": "MG Road",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001"
}
},
"journey": {
"id": "jrn_1b2c3d4e-55aa-4b21-9c11-7dd2e1b8a0ab",
"endUse": "travel",
"bureauConsent": true,
"ondc_transaction_id": "c0a8012e-7b2f-4f2a-9e31-2f1e0c3a1a22",
"created": "2026-01-05T12:45:00Z",
"updated": "2026-01-05T14:05:00Z",
"type": "PERSONAL_LOAN",
"status": "DISBURSED",
"activity_status": "ACTIVE",
"decision_status": "APPROVED",
"lender_mode": "ONLINE",
"kyc_status": "SUCCESS",
"kyc_attempts": 1,
"emandate_status": "SUCCESS",
"emandate_attempts": 1,
"esign_status": "SUCCESS",
"esign_attempts": 1,
"change_in_offer": false,
"borrower_preferred_amount": 150000,
"borrower_preferred_tenure": 24,
"lenders": [
{
"id": "lndr_hdfc_01",
"lender_name": "HDFC Bank",
"lender_gro_name": "Nodal Officer",
"lender_gro_email": "gro@hdfcbank.com",
"lender_gro_contact_number": "+918000000001",
"lender_gro_designation": "Grievance Officer",
"lender_gro_address": "Mumbai, Maharashtra",
"lender_customer_support_link": "https://www.hdfcbank.com/personal/help",
"lender_customer_support_contact_number": "+918000000002",
"lender_customer_support_email": "support@hdfcbank.com"
}
],
"offers": [
{
"id": "ofr_001",
"accepted": true,
"expired": false,
"amount_principal": "150000",
"amount_total_interest_payable": "18000",
"amount_net_disbursed_amount": "147500",
"offer_term": "24 months",
"interest_rate": "14.5",
"interest_type": "Reducing",
"annual_percentage_rate": "15.2",
"number_of_installments": 24,
"cool_off_period": "3 days",
"terms_and_conditions_link": "https://example.com/tc/ofr_001",
"key_facts_statement_link": "https://example.com/kfs/ofr_001",
"application_fees": "0",
"foreclosure_fees": "2000",
"interest_rate_conversion_charges": null,
"delay_penalty_fees": "500",
"other_penalty_fees": null,
"processing_fees": "2500",
"other_upfront_charges": null,
"insurance_charges": null,
"other_charges": null,
"installments": [
{
"serial_number": 1,
"type": "INSTALLMENT",
"amount": "7000",
"status": "NOT-DUE",
"installment_due_date": "2026-02-05T00:00:00.000Z"
},
{
"serial_number": 2,
"type": "INSTALLMENT",
"amount": "7000",
"status": "NOT-DUE",
"installment_due_date": "2026-03-05T00:00:00.000Z"
}
]
}
]
}
}
}Payload rules
borrower.journeycontains only the current journey. The oldborrower.journeysarray is no longer sent.borrower.profile.personal,borrower.profile.work, andborrower.profile.addressare always present structurally. Fields may benullwhen data is unavailable.borrower.profile.gold_loanis omitted for non-Gold Loan journeys.borrower.journey.lenderscontains every lender that has received the borrower form for this journey, even if no offer was returned.borrower.journey.offersremains[]until offers exist. It must be[]forNOT_OFFERED.offer.installmentsremains[]until the journey becomesDISBURSED.REJECTEDcan happen from any earlier stage. TheREJECTEDexample above shows one common path after redirection, but rejection may also arrive earlier.- Only curated business-facing fields are returned. Internal raw
data,metadata, protocol traces, and implementation details are not included.
Payload rules
borrower.journeycontains only the current journey. The oldborrower.journeysarray is no longer sent.borrower.profile.personal,borrower.profile.work, andborrower.profile.addressare always present structurally. Fields may benullwhen data is unavailable.borrower.profile.gold_loanis omitted for non-Gold Loan journeys.borrower.journey.lenderscontains every lender that has received the borrower form for this journey, even if no offer was returned.borrower.journey.offersremains[]until offers exist. It must be[]forNOT_OFFERED.offer.installmentsremains[]until the journey becomesDISBURSED.REJECTEDcan happen from any earlier stage. TheREJECTEDexample above shows one common path after redirection, but rejection may also arrive earlier.- Only curated business-facing fields are returned. Internal raw
data,metadata, protocol traces, and implementation details are not included.