Skip to content

Payment Session Webhooks

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-Signature header is computed over those bytes. See Webhook Authentication & Security.

Event TypeDescription
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.

Payload

FieldTypeDescription
event_idstringUnique 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_atstringISO 8601 timestamp, in UTC, of the change that produced the event.
entity_typestringAlways payment_session.
event_typestringOne of the event types above.
dataobjectThe 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.

Statuses

data.status is one of these statuses. The event type follows from it.

StatusEvent typeMeaning
createdcreatedThe session exists; the investor has not started KYC.
kyc_in_progressupdatedThe investor is going through KYC. Sent once data.entities.kyc is present.
kyc_doneupdatedKYC is complete; no money has moved yet.
payment_pendingupdatedA payment has started but has not succeeded. Sent once data.entities.order is present.
remittance_claimedupdatedThe investor's bank is not supported for LRS on Glomo, so they paid the fund directly and gave the transfer reference (UTR).
paidupdatedA payment on the session's order succeeded. Sent once data.entities.order and data.entities.payments are present.
completedcompletedThe investor finished every step. For session types with a folio transaction, sent once data.entities.folio_transaction is present.
failedfailedThe session ended without finishing.
expiredexpiredThe session passed expires_at before any money moved.

Ordering and delivery

  • 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, including completed, failed and expired. Update your record from data; 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 created straight to kyc_done, and kyc_in_progress can be skipped when KYC starts and finishes quickly. Read data rather than expecting a fixed order of statuses.
  • payment_pending can repeat. If a payment fails and the investor retries, each payment change sends a new updated event while the status stays payment_pending. data.entities.payments shows each attempt.
  • expired is sent when Glomo marks the session expired, which happens once a day. Retrieve a payment session can read expired earlier, as soon as expires_at has passed. Once money has started moving, the session never reads expired.
  • 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_at gives the order of the changes; when the order matters to you, call Retrieve a payment session for the current status.

Sample Payload — Updated (paid)

{
  "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
    }
  }
}

Sample Payload — Created

{
  "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
    }
  }
}

Sample Payload — Failed

{
  "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.code is one of kyc_failed, kyc_expired, kyc_rejected, bank_not_supported, payment_failed, sanction_hit, ineligible_country, prospect_folio_creation_failed, inbound_checkout_failed and shareable_link_unavailable. failure.message is safe to show to the investor.