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 type | Availability | Trigger 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). |
| application.approved | ✅ | Application approved by the lender. |
| disbursement.requested | ✅ | When a disbursement request is successfully raised in the lender LMS. |
| 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. Top-ups for SIB are coming soon. |
| 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": "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.createdloan.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
lidis the parent loan already being serviced, anddata.lidis the new child. This matchesloan.topup.initiated, so every event for one facility keys off the same top-levellid.
data field | Description |
|---|---|
lid | The newly created loan application ID. |
purpose | Why the lid was created: REGULAR (a fresh application), TOP_UP, or RENEWAL. |
productType | lamf | las |
assetType | MUTUALFUND | STOCKS |
lender | sib |
isDefault | true 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
}
}
purposehere is not thepurposein the Credit Snapshot APIThis webhook reports
REGULAR/TOP_UP/RENEWAL. The Combined Credit Snapshot API reports the same idea asLOAN_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 thelidis first created, so you will not receive it twice for the samelid. - 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
lidthat 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.createdanduser.created_withmetaalso carry the samelid, and either can reach you beforeloan.lid.createddoes. Treat alidyou 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/jsonAuthorization: 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".