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, along with each event's trigger condition.

✅ available · 🟡 coming soon

Event typeAvailabilityTrigger condition
user.createdA Unity user is created (e.g. guest flow, on PAN + mobile submission).
loan.lid.createdA 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.createdLoan agreement generated; the user signs it via OTP verification.
application.submittedUser accepts the agreement (by verifying OTP).
application.status_updateLoan application or active loan status changes. Mirrors the loan status API response.
application.resumeUser resumes the flow (connected or guest).
application.feedbackUser must perform an additional action after submitting (e.g. a lender remark).
application.approvedApplication approved by the lender.
disbursement.requestedWhen a disbursement request is successfully raised in the lender LMS.
disbursement.approvedDisbursement request approved by the lender.
disbursement.successLender has initiated funds disbursement (funds may take time to reach the user's bank).
loan.topup.initiated🟡A new top-up loan is initiated. Top-ups for SIB are coming soon.
loan.ltv_breach.triggeredLTV breach (margin shortfall) detected.
loan.closure_requestedLoan closure request shared with the lender.
loan.closedLoan 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": "sib",
  "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
lendersib
isDefaulttrue for the user's primary loan; false for a child journey opened alongside an existing loan (top-ups and renewals).
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "sib",
  "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": "sib",
    "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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": "sib",
  "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"
  }
}
{
  "userId": "507f1f77bcf86cd799439011",
  "lender": "sib",
  "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".