Skip to main content

Event Overview

Event Type: LRS_VERIFICATION_NEEDED Category: Payment Verification Description: An LRS payment needs verification details before it can settle This webhook fires when a payment settling under an LRS purpose code is missing details its checklist calls for. Unlike the generic verification events, it names exactly which fields and documents are outstanding.
This event replaces the others for LRS payments. A payment that receives LRS_VERIFICATION_NEEDED will not also receive VERIFICATION_NEEDED. Two events carrying different lists for the same outstanding work would leave you chasing both.
Fires for all five LRS purpose codes — S0305 and S1107 (education), and S0303, S0304 and S0306 (travel). What it names differs per code; see Get Verification Requirements for the whole set.

When the webhook is sent

  1. On a successful payment, once the payment is recognised as LRS — its purpose code decides this.
  2. After you declare a purpose code, if it was not known earlier. A code is often chosen at submission time, so a payment can only be recognised as LRS then; until it is, the generic events apply.
  3. When a complete set does not pass verification. Supplying everything the list named is not the end of it: the PAN still has to verify, the sender still has to match the account holder, and the credit still has to cover the amount. A payment that fails one of those comes back in this same event, same shape, the problem folded into the relevant entry’s message — see After a submit that did not pass.
  4. When a filed verification is sent back for changes. A review can return a verification rather than decide it — a document is the wrong one, a field needs correcting. The payment owes something again, so it is this event that carries the ask, with the reviewer’s comment in the top-level message — see When a review sends it back. A review that decides the verification raises VERIFICATION_STATUS instead.
The webhook is created only if:
  • Your merchant account (or parent, for sub-merchants) has an active API credential with a non-empty webhook URL
  • The payment is actually owed something — a payment with everything already supplied gets no event at all. Silence is the “nothing owed” signal.

Delivery Details

Headers

Verifying. The body is serialised once and those exact bytes are both sent and signed, so hashing the raw request body as received is correct — do not re-serialise the parsed JSON first. Prefer V2: the timestamp is inside the signed material, so a captured delivery cannot be replayed with a fresh one. V1 stays alongside it so nobody has to migrate on our schedule.

Payload Schema

The payment, its state, and every item it still owes and why. These are complete, unedited payloads — nothing is trimmed.
The three travel codes carry identical checklists. They differ in what the remittance is for, not in what you must collect.The last tab is the same payment as the first, later in its life. Two things changed: the buyer, invoice and remitter fields dropped off, because declaring them satisfied them; and four PAYING_FOR_SOMEONE_ELSE items appeared, because declaring remitter_relation as PARENT is what makes them owed.

Field Specifications

string
required
Always "LRS_VERIFICATION_NEEDED" for this webhook event
string
required
ISO 8601 datetime when the webhook event was created, in UTC and without an offset suffix.Example: "2026-08-14T10:30:00.123456"
string
required
Envelope version (e.g. “3.0.0”)
string
required
Unique identifier for this webhook event (UUID), useful for idempotencyExample: "550e8400-e29b-41d4-a716-446655440000"
object
required
The payment, its state, and what it owes

This event lists only what is outstanding. Optional items and conditional items whose condition does not hold never appear, and neither does anything already supplied. For the whole set — including optionals you could still offer a payer — call Get Verification Requirements, which returns the same entries plus satisfied and provided.

After a submit that did not pass

Sending everything the list named is not the same as passing. Once a set is complete it goes to the verification gateway, which verifies the remitter’s PAN against the name and date of birth, matches the credit’s sender to the account holder, recomputes TCS and checks that the money received covers what is being settled. Any of those can refuse. A refusal arrives as this same event — same type, same envelope, the same eight keys. Nothing is added: an LRS payment should learn what it owes in one vocabulary and one shape, whether the answer came from the checklist or from the checks that run after it. Only the message and the entries differ.
The payment stays in Action Required and stays submittable. Nothing is lost: everything you sent is still held against the payment. Fix what is named and re-send only that — a partial send is merged with what is already there.
There is no separate outstanding or reason key to branch on. Whatever they used to say now lives inside the relevant entry’s message — the shortfall’s rupee figure inside the outstanding entry, a PAN mismatch inside remitter_pan, and so on. Read the two lists the same way you already do for the requirement event; a refusal names the same thing in the same place, never a second structure to learn.

The codes a refusal names

The gateway’s own vocabulary is translated into the codes you collected under, so a fix goes back through the same endpoint and the same key:
outstanding is a conclusion, not a code. It is the one entry with nothing to re-send under that name: the credit is short by the amount its message states. Either the buyer tops up — link the top-up with linked_payment_id — or a smaller amount_to_be_settled is declared.

When a review sends it back

A filed verification is reviewed by us, and a review has three outcomes. Two of them are verdicts and arrive as VERIFICATION_STATUS. The third is a send-back: the reviewer returns the verification for changes rather than deciding it, the payment owes something again, and that arrives here — same event, same shape. One thing is particular to this trigger:
  • message carries the reviewer’s comment verbatim, in place of the fixed sentence the other two triggers use.
Document entries carry ref, doc_status and rejection_reason wherever a row is already stored for an outstanding slot, so an entry names both the requirement and the fate of what you last sent against it. That is true here and on the requirement list alike — the re-ask after a document was rejected reads the same way. Only a refusal never carries the three.
A review sends the verification back
The requirement flags are unchanged and sit alongside the new keys — an entry that is both conditional and rejected carries both:
message on an entry is still the document’s label. The new rejection_reason is what went wrong with that file; message goes on describing what the item is. Show the label to say what you are asking for, and the rejection reason to say why you are asking again.
A send-back is sent on every send-back, including one that lists nothing. A reviewer can return a verification with the whole instruction in their comment and no item marked outstanding. Both lists then arrive as [] and message carries everything there is to act on:
Empty lists on this event do not mean nothing is owed — that signal is PAYMENT_UNDER_REVIEW, a different event_type. Route on event_type before you read the lists.

Conditionals can appear later

An item like the relationship self-declaration only shows up once its condition holds. Declaring remitter_relation as anything other than SELF brings in several items at once — the fields naming the person the money is for (student_* on the education codes, primary_person_* on the travel ones) and relationship_declaration — so they can arrive in an event after you thought you had the full list. Each carries condition, so the arrival is explicable rather than arbitrary. The reverse also happens: answering the remitter identity fields removes them from the next event. The list is what is outstanding, not what the checklist asks for in total.

Responding to the event

1

Collect what the entries name

Show the payer each message. Everything in action_required_documents needs a file — or, where waivable is true, a reason instead.
2

Upload the files

Upload Document returns a ref per file, under the same code the entry names.
3

Send the fields and the refs

Submit Verification Details takes fields and document refs in one call. Partial sends are merged, so you can send as things arrive.
4

Read what is left

The response carries outstanding — the codes still owed after that write. When it is empty and status is in_review, the payment is with us.
Respond 2xx as soon as you have accepted the payload, so the delivery is not retried, and verify the signature before acting on it.

Do not hardcode the codes

The checklist is configuration and is revised as the underlying regulatory matrix is — new purpose codes become supported, a document turns waivable, a field stops being needed. Drive your form from Get Verification Requirements, and a revision reaches your integration without a release on your side. Hardcode the codes and it will not.

Submit Verification Details

Send the answer back, under these same codes.

Get Verification Requirements

The whole set, on demand — for resuming or reconciling.

Upload Document

Turn a file into a ref.

PAYMENT_UNDER_REVIEW

The event that says nothing is owed any more.

VERIFICATION_STATUS

The verdict once a filed verification is reviewed.