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

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`,
              },
            ],
          },
        ],
      },
    ],
  },
};

On this page