Credit SDK by Aarthik Labs

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:

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

FieldTypeRequiredAccepted values / Notes
borrowerProviderIDstringYesNon-empty borrower reference from your system (must be unique within your client/tenant) (read: Borrower Identity Mapping (Important))
profileobjectYes (with at least required fields)Borrower profile prefill
profile.contactNumberstringYesIndian mobile number (10 digits, optional +91)
profile.panstringNoValid PAN (normalized to uppercase)
profile.panNamestringNoPAN name
profile.dobstringNoDate string (recommended: YYYY-MM-DD)
profile.genderstringNoCase-insensitive: male, female, transgender (read: Canonical Normalization)
profile.personalemailstringNoValid email (normalized to lowercase)
workProfileobjectNoEmployment prefill
workProfile.officialemailstringNoValid email
workProfile.employmentTypestringNoCase-insensitive canonical values: salaried, selfEmployed; aliases accepted: self-employed, self employed (read: Canonical Normalization)
workProfile.incomestring | numberNoDigits only, at least 4 digits, > 0
workProfile.companyNamestringNoCompany name
workProfile.udyamNumberstring | nullNoAllowed only when employment type is self-employed
addressobjectNoAddress prefill
address.addressL1stringNoAddress line 1
address.addressL2stringNoAddress line 2
address.citystringNoCity
address.statestringNoState
address.pincodestringNoPIN 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 numberborrowerProviderID

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

  • gender is normalized to: male, female, transgender
  • employmentType is normalized to: salaried, selfEmployed

Example accepted employmentType inputs:

  • Salaried -> salaried
  • SELFEMPLOYED -> selfEmployed
  • self-employed -> selfEmployed
  • self 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

  • borrowerProviderID is mandatory.
  • profile.contactNumber is mandatory.
  • workProfile.employmentType must be salaried or selfEmployed.
  • workProfile.udyamNumber is only valid for selfEmployed.

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:

  1. STARTED
  2. PROFILED
  3. OFFERED or NOT_OFFERED
  4. OFFER_SELECTED (only if the borrower was offered at least one offer)
  5. OFFER_ACCEPTED
  6. LENDER_REDIRECTED
  7. REJECTED or DISBURSED

Important behavior:

  • NOT_OFFERED is terminal for the journey lifecycle.
  • REJECTED may happen at any time and is terminal.
  • OFFER_SELECTED and OFFER_ACCEPTED carry the same payload shape. The only intentional difference is borrower.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.journey contains only the current journey. The old borrower.journeys array is no longer sent.
  • borrower.profile.personal, borrower.profile.work, and borrower.profile.address are always present structurally. Fields may be null when data is unavailable.
  • borrower.profile.gold_loan is omitted for non-Gold Loan journeys.
  • borrower.journey.lenders contains every lender that has received the borrower form for this journey, even if no offer was returned.
  • borrower.journey.offers remains [] until offers exist. It must be [] for NOT_OFFERED.
  • offer.installments remains [] until the journey becomes DISBURSED.
  • REJECTED can happen from any earlier stage. The REJECTED example 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.journey contains only the current journey. The old borrower.journeys array is no longer sent.
  • borrower.profile.personal, borrower.profile.work, and borrower.profile.address are always present structurally. Fields may be null when data is unavailable.
  • borrower.profile.gold_loan is omitted for non-Gold Loan journeys.
  • borrower.journey.lenders contains every lender that has received the borrower form for this journey, even if no offer was returned.
  • borrower.journey.offers remains [] until offers exist. It must be [] for NOT_OFFERED.
  • offer.installments remains [] until the journey becomes DISBURSED.
  • REJECTED can happen from any earlier stage. The REJECTED example 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.

On this page