Webhooks

Using webhook, you may listen to real-time (or almost real time) updates on a user's loan status. Our system will hit the registered webhook for each of the events with relevant data points.

You can register a single webhook URL for all events, or a different URL per event — both are supported. Share your webhook URL(s) with your business POC to register them.

Events

We trigger webhooks for the events below. The matrix shows which lenders each event is available for, along with its trigger condition.

✅ available · ❌ not available · 🟡 work in progress

Event typeBajaj FinservDSPSIBTrigger condition
user.created✅✅✅A Unity user is created (e.g. guest flow, on PAN + mobile submission).
loan.lid.created✅✅✅A new lid is created — a fresh application, a top-up, or a renewal. Fires once per lid, at the moment it comes into existence; why it was created is in data.purpose.
application.created✅✅✅Loan agreement generated; the user signs it via OTP verification.
application.submitted✅✅✅User accepts the agreement (by verifying OTP).
application.status_update✅✅✅Loan application or active loan status changes. Mirrors the loan status API response.
application.resume✅✅✅User resumes the flow (connected or guest).
application.feedback✅✅✅User must perform an additional action after submitting (e.g. a lender remark).
lender.updated✅✅✅Active lender changes via lender selection.
application.approved✅❌✅Application approved by the lender.
application.archived✅❌❌A parent loan is archived during a parallel LAMF/LAS submission.
disbursement.requested✅✅✅When a disbursement request is successfully raised in the lender LMS.
disbursement.ready✅❌❌Disbursement approved by the lender.
disbursement.approved✅❌✅Disbursement request approved by the lender.
disbursement.success✅✅✅Lender has initiated funds disbursement (funds may take time to reach the user's bank).
loan.topup.initiated✅❌🟡A new top-up loan is initiated. Supported on Bajaj Finserv; coming soon for South Indian Bank.
payment.auto_debit.failed✅❌❌Interest auto-debit failed; re-sent daily until the bounced interest is repaid.
loan.ltv_breach.triggered✅❌✅LTV breach (margin shortfall) detected.
loan.closure_requested✅❌✅Loan closure request shared with the lender.
loan.closed✅❌✅Loan successfully closed by the lender (reflected in SOA).

disbursement.success is also sent for controlled disbursement with an additional isMocked: true field — see the payloads below.

Webhook payloads

You can expect to receive the following payloads for the above mentioned event types.

Every payload carries opaqueId — the identifier you passed when the Unity user was created, so you can map the event back to a user in your own system. It's "" for users created without one. See Passing your own identifier.

User related

{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "user.created",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "userId": "507f1f77bcf86cd799439011",
    "interactionId": "INT64822ebcb406ec46428efac0"
  }
}

Loan application tracking

A new loan application ID — loan.lid.created

loan.lid.created fires the moment a new lid comes into existence — at the very start of the journey, before the user has completed KYC and long before the application is filed with the lender. Every journey type raises it, so a single subscription covers fresh applications, top-ups and renewals; branch on data.purpose instead of subscribing to a separate event per journey.

The top-level lid is the servicing loan the new journey belongs to, and the newly created lid is in data.lid:

  • Fresh application — there is no existing loan to hang off, so both are the same lid.
  • Top-up or renewal — the top-level lid is the parent loan already being serviced, and data.lid is the new child. This matches loan.topup.initiated, so every event for one facility keys off the same top-level lid.
data fieldDescription
lidThe newly created loan application ID.
purposeWhy the lid was created: REGULAR (a fresh application), TOP_UP, or RENEWAL.
productTypelamf | las
assetTypeMUTUALFUND | STOCKS
lenderbajaj_finserv | sib | dsp
isDefaulttrue for the user's primary loan; false for a child journey opened alongside an existing loan (top-ups and renewals).
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012", // the servicing (parent) loan; same as data.lid for a fresh application
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "loan.lid.created",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "lid": "507f1f77bcf86cd799439013", // the newly created LID
    "purpose": "TOP_UP", // REGULAR | TOP_UP | RENEWAL
    "productType": "lamf",
    "assetType": "MUTUALFUND",
    "lender": "bajaj_finserv",
    "isDefault": false
  }
}
📘

purpose here is not the purpose in the Credit Snapshot API

This webhook reports REGULAR / TOP_UP / RENEWAL. The Combined Credit Snapshot API reports the same idea as LOAN_APPLICATION / LOAN_APPLICATION:TOP_UP / LOAN_APPLICATION:RENEWAL. Map between the two rather than comparing the strings directly.

A few things to keep in mind while consuming it:

  • Once per lid. The event is raised only when the lid is first created, so you will not receive it twice for the same lid.
  • Creation only. Resuming a journey that was started earlier but never submitted does not raise it again — use loan.topup.initiated, which fires every time a top-up journey is started or restarted.
  • New loans only. A lid that already existed and is later reconciled into your account is not announced as new.
  • Don't rely on it arriving first. It is raised earlier in the journey than the other loan events, but webhooks are delivered independently and are not ordered. In particular user.created and user.created_withmeta also carry the same lid, and either can reach you before loan.lid.created does. Treat a lid you have not seen before as new whichever event surfaces it, and read Combined Credit Snapshot when you need the authoritative state.

Other application events

{
  "userId": "507f1f77bcf86cd799439011",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "lender": "bajaj_finserv",
  "assetType": "STOCKS",
  "type": "application.created",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "requestedLoanLimit": 12000,
    "offerApplied": { // conditional - present only when an offer is applied to the application
      "offerCode": "SCABC",
      "offerId": "213234jd",
      "expiryDate": "2025-10-09T14:30:00Z",
      "discountAmount": 3422,
      "applicableOn": "PROCESSING_FEE",
      "discountType": "ABSOLUTE",
      "status": "FROZEN",
      "autoApply": true,
      "recommended": true,
      "applicableAmountRangeMin": 2
    }
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "lender": "bajaj_finserv",
  "assetType": "MUTUALFUND",
  "type": "application.submitted",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "requestedLoanLimit": 12000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "lender": "bajaj_finserv",
  "assetType": "STOCKS",
  "type": "application.status_update",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "journeyStatus": "FETCH_CKYC",
    "journeyTracker": [
      {
        "status": "REGISTER_LEAD",
        "timestamp": "2025-10-01T08:09:26.485Z"
      },
      {
        "status": "CONFIRM_OFFER",
        "timestamp": "2025-10-01T08:09:30.884Z"
      },
      {
        "status": "FETCH_CKYC",
        "timestamp": "2025-10-01T08:09:41.347Z"
      }
    ],
    "selection": {
      "confirmedAmount": 450000,
      "maxAmount": 800000
    },
    "userId": "507f1f77bcf86cd799439011"
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "application.resume",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "lid": "507f1f77bcf86cd799439012"
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "STOCKS",
  "type": "application.feedback",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "userActionRequired": true,
    "userActionType": "OPS_DIGILOCKER",
    "opsFeedback": "There was a data mismatch in your name between previous agreement and submitted PAN card. We request you to proceed with the Digilocker flow."
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "lender.updated",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "activeLid": "507f1f77bcf86cd799439013",
    "activeLender": "dsp"
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "STOCKS",
  "type": "application.approved",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "loanAccountLimit": 12000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "application.archived",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "reason": "CHILD_DISBURSED", // CHILD_DISBURSED | CHILD_SUBMITTED
    "childLid": "507f1f77bcf86cd799439013"
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "loan.topup.initiated",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "lid": "507f1f77bcf86cd799439013", // the new top-up loan LID
    "productType": "lamf",
    "assetType": "MUTUALFUND"
  }
}

Disbursement related

{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "disbursement.requested",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "amount": 11000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "disbursement.ready",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "amount": 11000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "disbursement.approved",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "amount": 11000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "STOCKS",
  "type": "disbursement.success",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "disbursedAmount": 11000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "disbursement.success",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "loanAccountNumber": "133247",
    "disbursedAmount": 11000,
    "isMocked": true
  }
}

Loan management webhooks

{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "payment.auto_debit.failed",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "bouncedInterest": 1200,
    "bounceCharges": 200
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "STOCKS",
  "type": "loan.ltv_breach.triggered",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498",
    "shortfallAmount": 1000
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "MUTUALFUND",
  "type": "loan.closure_requested",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "lan": "123456",
    "customerName": "John Doe",
    "transactionNumber": "HS92321311243407",
    "toEmail": ["[email protected]"],
    "ccEmail": ["[email protected]"]
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "bajaj_finserv",
  "lid": "507f1f77bcf86cd799439012",
  "opaqueId": "partner-ref-12345",
  "assetType": "STOCKS",
  "type": "loan.closed",
  "requestId": "WH-64f1abc23ef4cd5678",
  "timestamp": "2025-10-01T08:09:26.485Z",
  "data": {
    "loanNo": "V402RLAS00058498"
  }
}

Webhook authentication

Each request sent to your webhook endpoint will include an Authorization header with a Bearer token.

Headers

  • Content-Type: application/json
  • Authorization: Bearer <token>

The token is a JWT with the following payload, signed with shared partner secret:

{
    "iss": "gateway",
    "iat": <current_unix_timestamp>,
    "exp": <expiration_unix_timestamp>
}
  • iss: Issuer of the token (fixed value: gateway).
  • iat: Issued at time, represented as a Unix timestamp.
  • exp: Expiration time, represented as a Unix timestamp (5 minutes from the issued time).

To authenticate the webhook requests, partner can retrieve the token from the Authorization header and decode the jwt with the shared partner secret

Post decoding, validate the claims:

  • Issuer: Check that the iss claim is "gateway".