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
- On a successful payment, once the payment is recognised as LRS — its purpose code decides this.
- 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.
- 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. - 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 raisesVERIFICATION_STATUSinstead.
- 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
- Root Level Fields
- Data Object Fields
- Entries
string
required
Always
"LRS_VERIFICATION_NEEDED" for this webhook eventstring
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 themessage 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.
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: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 asVERIFICATION_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:
messagecarries the reviewer’s comment verbatim, in place of the fixed sentence the other two triggers use.
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
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.Conditionals can appear later
An item like the relationship self-declaration only shows up once its condition holds. Declaringremitter_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.Related
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.