Payment Session webhooks notify you each time a payment session moves to a new status. Every event carries the full session snapshot, so you can update your records from the webhook alone, without calling the API.
They are sent to the fund that owns the session and, when the session is credited to a distributor, to the distributor too. Both receive the same event, with the same event_id.
Note: The sample payloads on this page are pretty-printed. The body Glomo sends is the RFC 8785 canonical form of the same object, and the
X-Glomopay-Signatureheader is computed over those bytes. See Webhook Authentication & Security.
| Event Type | Description |
|---|---|
| created | The session was created. |
| updated | The session moved to kyc_in_progress, kyc_done, payment_pending, remittance_claimed or paid. |
| completed | The investor finished every step. Final. |
| failed | The session ended without finishing. data.failure says why. Final. |
| expired | The session passed expires_at before any money moved. Final. |
| Field | Type | Description |
|---|---|---|
event_id | string | Unique per event. The same on every delivery attempt of that event, so use it to drop a redelivery. A repeat of the same status is a separate event with its own event_id (see Ordering and delivery). |
occurred_at | string | ISO 8601 timestamp, in UTC, of the change that produced the event. |
entity_type | string | Always payment_session. |
event_type | string | One of the event types above. |
data | object | The session snapshot at the time of the change. Same fields as Retrieve a payment session, without failure_reason. data.status is the session's new status. |
data.status is one of these statuses. The event type follows from it.
| Status | Event type | Meaning |
|---|---|---|
created | created | The session exists; the investor has not started KYC. |
kyc_in_progress | updated | The investor is going through KYC. Sent once data.entities.kyc is present. |
kyc_done | updated | KYC is complete; no money has moved yet. |
payment_pending | updated | A payment has started but has not succeeded. Sent once data.entities.order is present. |
remittance_claimed | updated | The investor's bank is not supported for LRS on Glomo, so they paid the fund directly and gave the transfer reference (UTR). |
paid | updated | A payment on the session's order succeeded. Sent once data.entities.order and data.entities.payments are present. |
completed | completed | The investor finished every step. For session types with a folio transaction, sent once data.entities.folio_transaction is present. |
failed | failed | The session ended without finishing. |
expired | expired | The session passed expires_at before any money moved. |
- Treat each event as "the session's status is now
data.status". Glomo sends an event whenever the session, one of its steps, its order or one of its payments changes state, so the same status can arrive more than once, includingcompleted,failedandexpired. Update your record fromdata; an event with the status you already hold needs no action. - Not every status is sent for every session. A session moves at the investor's pace, so a step can be skipped. For example, a top-up that reuses a completed KYC goes from
createdstraight tokyc_done, andkyc_in_progresscan be skipped when KYC starts and finishes quickly. Readdatarather than expecting a fixed order of statuses. payment_pendingcan repeat. If a payment fails and the investor retries, each payment change sends a newupdatedevent while the status stayspayment_pending.data.entities.paymentsshows each attempt.expiredis sent when Glomo marks the session expired, which happens once a day. Retrieve a payment session can readexpiredearlier, as soon asexpires_athas passed. Once money has started moving, the session never readsexpired.- Events can arrive out of order. Deliveries are queued and retried independently (see retries), so a later event can arrive before an earlier one.
occurred_atgives the order of the changes; when the order matters to you, call Retrieve a payment session for the current status.
{
"event_id": "evt_psess_6819d8046mpKt_8c2f4a91d0b37e65a14c9f02",
"occurred_at": "2026-11-03T06:02:11Z",
"entity_type": "payment_session",
"event_type": "updated",
"data": {
"id": "psess_6819d8046mpKt",
"session_type": "kyc_lrs_folio",
"status": "paid",
"failure": null,
"created_at": "2026-11-03T05:12:40Z",
"expires_at": "2026-11-10T05:12:40Z",
"updated_at": "2026-11-03T06:02:11Z",
"customer_id": "cust_6819d7d0lrLvP",
"scheme": {
"scheme_code": "SCH001",
"name": "Example Global Equity Fund - Regular Plan",
"plan": "regular",
"distributor_arn": "ARN12345"
},
"amount": {
"value": 500000,
"currency": "USD"
},
"expected_entities": ["kyc", "folio", "order", "payments", "folio_transaction"],
"entities": {
"kyc": {
"id": "kyc_6819d8046mpKt",
"status": "completed",
"failure_reason": null,
"bank_enabled": true,
"updated_at": "2026-11-03T05:40:02Z"
},
"folio": null,
"order": {
"id": "order_678a4c88hpAjf",
"status": "paid",
"expires_at": "2026-11-04T05:45:00Z",
"updated_at": "2026-11-03T06:01:58Z"
},
"payments": [
{
"id": "payt_6819e5b1nTzXc",
"status": "success",
"amount": 500000,
"currency": "USD",
"method": "pay_via_bank",
"payer": {
"name": "Asha Verma",
"country": "IND",
"bank_name": "HDFC bank",
"account_number": "••••1234"
},
"paid_at": "2026-11-03T06:01:55Z",
"error_code": null,
"error_message": null,
"updated_at": "2026-11-03T06:01:58Z"
}
],
"folio_transaction": null
}
}
}{
"event_id": "evt_psess_6819d8046mpKt_3e7b19c05fa2d48b61e0c7a4",
"occurred_at": "2026-11-03T05:12:40Z",
"entity_type": "payment_session",
"event_type": "created",
"data": {
"id": "psess_6819d8046mpKt",
"session_type": "kyc_lrs_folio",
"status": "created",
"failure": null,
"created_at": "2026-11-03T05:12:40Z",
"expires_at": "2026-11-10T05:12:40Z",
"updated_at": "2026-11-03T05:12:40Z",
"customer_id": null,
"scheme": {
"scheme_code": "SCH001",
"name": "Example Global Equity Fund - Regular Plan",
"plan": "regular",
"distributor_arn": "ARN12345"
},
"amount": {
"value": 500000,
"currency": "USD"
},
"expected_entities": ["kyc", "folio", "order", "payments", "folio_transaction"],
"entities": {
"kyc": null,
"folio": null,
"order": null,
"payments": [],
"folio_transaction": null
}
}
}{
"event_id": "evt_psess_6819d9a1bXcVq_f4a0c62e9b18d735c2e9a06b",
"occurred_at": "2026-11-02T11:30:47Z",
"entity_type": "payment_session",
"event_type": "failed",
"data": {
"id": "psess_6819d9a1bXcVq",
"session_type": "kyc_lrs",
"status": "failed",
"failure": {
"code": "kyc_rejected",
"message": "KYC verification was rejected"
},
"created_at": "2026-11-02T10:04:12Z",
"expires_at": "2026-11-09T10:04:12Z",
"updated_at": "2026-11-02T11:30:47Z",
"customer_id": "cust_6819d9b0pRtYw",
"scheme": null,
"amount": null,
"expected_entities": ["kyc", "order", "payments"],
"entities": {
"kyc": {
"id": "kyc_6819d9c2mNbVc",
"status": "failed",
"failure_reason": "Rejected due to unmet compliance requirements",
"bank_enabled": true,
"updated_at": "2026-11-02T11:30:45Z"
},
"order": null,
"payments": []
}
}
}Note:
failure.codeis one ofkyc_failed,kyc_expired,kyc_rejected,bank_not_supported,payment_failed,sanction_hit,ineligible_country,prospect_folio_creation_failed,inbound_checkout_failedandshareable_link_unavailable.failure.messageis safe to show to the investor.