Event Overview
Event Type:VERIFICATION_NEEDED
Category: Payment Verification
Description: A payment needs verification details before it can settle
This webhook names what a payment still owes before it can be filed. It is the general verification ask — every rail raises it, and it carries one body wherever it comes from.
One event, one body.
VERIFICATION_NEEDED used to mean two different payloads depending on which rail the money arrived through: one shape from the card and collect flows, another from Virtual Bank Account credits that also carried the credit’s amount and account details. A partner needed two handlers for one event type. Every producer now builds the same seven keys, and the credit’s own facts ride PAYMENT_SUCCESSFUL, which is the event that exists to describe the money.Not sent for LRS payments. A payment settling under an LRS purpose code receives
LRS_VERIFICATION_NEEDED instead, which names documents as well as fields. It never receives both.A payment whose purpose code is not yet known still receives this one; the LRS event takes over once the code is declared.When the webhook is sent
- A Virtual Bank Account credit became a payment that is missing verification details. The event follows
PAYMENT_SUCCESSFULand names what is outstanding. - The verification gateway reported a change — the payment moved to
ACTION_REQUIRED,IN_REVIEWorEXPIRED. - A verification submit was refused on a payment with no LRS checklist. The event names what to fix — the single item that failed, not everything the payment still owes. On a B2B services payment this covers the finalizing call’s own checks: the purpose code, the invoice amount, the declaration, and the documents cited for the invoice.
- Ops sent a B2B services verification back for changes. The payment returns to
ACTION_REQUIREDand staging reopens.messagecarries the Ops comment rather than the standard sentence, andaction_required_fieldsnames what the checklist still owes. - A B2B services submit passed. The set was filed — through Submit Verification Details or by the merchant in the dashboard — and the payment moved to Under Review to wait for an Ops decision.
verification_statusis"IN_REVIEW"and the list is empty. It fires again on each resubmit after a send-back.
VERIFIED means nothing is outstanding, so there is nothing to act on. Do not wait on it to confirm verification.
Ops approving or rejecting a B2B services verification raises nothing. Only the send-back does. Read those two from Get Verification Requirements — an approval leaves
settlement_status at UNDER_REVIEW, a rejection moves it to NOT_APPLICABLE and raises a full refund.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
message reads “Payment verification action required” on every one of these, including IN_REVIEW — it is not a description of the state. It is not fixed either: the sandbox ON_HOLD event says “Payment settlement is on hold”. Branch on verification_status, never on message.Field Specifications
- Root Level Fields
- Data Object Fields
string
required
Always
"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-02-13T10: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
Seven keys, always the same seven:
payment_id, order_id, link_id, verification_status, message, action_required_fields, payment_verification_expiryReading action_required_fields
The codes come from whichever check raised the event, and there are two vocabularies. Both are answered through an API, and the codes tell you which one.
Order fields
Raised by the verification gateway’s own report, and by the plain order-field check on a credit that has not been classified:
Supply these with Submit Payment Verification Details — with two exceptions.
invoice_file is a file on the order, uploaded with POST /pg/orders/{order_id}/documents/ and document_type: INVOICE. country_of_origin is not settable through the API today; raise it with support if the gateway asks for it.
Classification
Two facts decide which checklist a payment answers to, and either one that has not been declared appears in the same list:Checklist codes
Once a payment is classified and its checklist is not an LRS one, the list holds that checklist’s outstanding codes —buyer_city, buyer_state, buyer_email, iec, buyer_pan, invoice, and so on. Send these back through Submit Verification Details, under the same codes.
Declaring the classification does not raise a fresh event on a non-LRS payment. The follow-up ask is only re-sent when the new checklist is an LRS one, where it arrives as
LRS_VERIFICATION_NEEDED. Otherwise, read the new checklist’s codes from Get Verification Requirements after you classify.Do not hardcode the list. Get Verification Requirements returns the whole set for a payment, each item carrying its own
satisfied flag, and it is revised as the underlying regulatory matrix is. Read it rather than reproducing it.What to Do When You Receive This Webhook
- Respond with HTTP 2xx (e.g.
200 OK) as soon as you have accepted the payload, so the delivery is not retried. - Verify the signature against the raw request body — prefer
X-Webhook-Signature-V2. - Use
payment_idandorder_idto reconcile with your system. - Handle based on
verification_status:ACTION_REQUIRED— readaction_required_fields, collect what it names, and send it back. If you are unsure which endpoint takes a given code,GETthe payment’s verification requirements: anything it lists is answered on that same path.IN_REVIEW— nothing to do. Record that the payment is under review.EXPIRED— the verification window closed and the amount is refunded to the buyer.action_required_fieldsrecords what lapsed, but nothing you send reopens it. Close the payment out on your side.
- Watch
payment_verification_expirywhile the status isACTION_REQUIREDand it is notnull. It is the deadline the payment is working to, and it can move between events.
The event is not the only way to read this. Get Verification Requirements is authoritative and idempotent — call it any time an event was missed, arrived out of order, or you simply want to reconcile. It also reports
settlement_status, which tells you whether sending anything is still possible.Related
Get Verification Requirements
The whole set, on demand, with
settlement_status.Submit Payment Verification Details
Where the order fields go.
LRS_VERIFICATION_NEEDED
The LRS payment’s version of this event.
PAYMENT_UNDER_REVIEW
Same body, empty list — nothing is owed any more.