Event Overview
Event Type:VERIFICATION_STATUS
Category: Payment Verification
Description: The verdict on a filed LRS verification — approved or rejected
A filed verification is reviewed by us. This webhook carries the conclusion of that review: the verdict, the reviewer’s comment, and the state of every document slot on the verification at that moment.
It is the event that closes the loop LRS_VERIFICATION_NEEDED opened. That event says what a payment owes; this one says what came of sending it.
Two verdicts, one event.
VERIFICATION_STATUS fires on an approval and on a rejection, in the same shape. verification_status is the only key that tells them apart.When the webhook is sent
- A review approves the verification.
verification_statusisAPPROVEDandmessageis an empty string — an approval has nothing to say beyond itself. - A review rejects the verification.
verification_statusisREJECTEDandmessagecarries the reviewer’s comment verbatim.
There is no sandbox trigger for this event. It is raised by a review of a verification you filed, and a review is not something a simulator performs. Integrate the handler against the payloads on this page; you will see your first real delivery when a filed verification is reviewed.
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, the verdict, the reviewer’s comment, and every document slot on the verification.data holds exactly five keys on both verdicts. These are complete, unedited payloads — nothing is trimmed.
An approval’s
message is an empty string, not a sentence and not null. The key is always present; on an approval there is nothing for a reviewer to say that the verdict does not already say.Field Specifications
- Root Level Fields
- Data Object Fields
- Document Entries
string
required
Always
"VERIFICATION_STATUS" for this webhook eventstring
required
ISO 8601 datetime when the webhook event was created, in UTC and without an offset suffix.Example:
"2026-09-09T11:42:06.318204"string
required
Envelope version (e.g. “3.0.0”)
string
required
Unique identifier for this webhook event (UUID), useful for idempotency.It is an identifier, not a sequence. The value is random and carries no order — see Ordering two verdicts.
object
required
The payment, the verdict, and the documents it was reached on
documents is the whole slate
documents lists every active document slot on the verification, not only the ones that failed.
- On a rejection, it shows what failed alongside what passed — so a payer is asked to replace one file, not all of them.
- On an approval, it is the record of what was accepted and the state each document ended in.
- Superseded documents. Re-uploading a document gives you a new
refand the newer row supersedes the older; only the current row for each slot is listed. - The files themselves. No document file, URL or download link is ever included in a webhook payload.
refidentifies the upload; it is not a link to it.
A slot listed here is a slot on this verification. For the whole checklist — including fields, optional items, and what is still outstanding — call Get Verification Requirements, which reports the same three document keys alongside
satisfied and provided.Ordering two verdicts
A payment can be reviewed more than once, so twoVERIFICATION_STATUS deliveries can name the same payment_id.
Order them by event_time on the envelope. It is the moment the event was created, and it is the only key on the payload that orders anything.
Deliveries can also arrive out of order after a retry. Keep the verdict with the latest event_time and discard an older one that lands after it, rather than letting whatever arrived last win.
What to do when you receive it
1
Respond 2xx, then verify the signature
Acknowledge as soon as you have accepted the payload, so the delivery is not retried, and verify the signature against the raw body before acting on it.
2
Route on verification_status
APPROVED and REJECTED are the only two values. Treat anything else as unknown and log it rather than guessing.3
On APPROVED, record it and stop chasing the payer
Nothing further is needed from either of you.
PAYMENT_SETTLED is the next event in this payment’s life.4
On REJECTED, show what failed
data.message is the verdict on the verification; each entry with doc_status: "REJECTED" carries the reason for that document in rejection_reason. Entries that read VERIFIED need nothing — asking a payer to re-send those is asking for work already done.5
Confirm where the payment stands
Get Verification Requirements reports
settlement_status, which says whether sending anything further is still possible.A rejection here is not the same as a send-back. A send-back keeps the payment in
ACTION_REQUIRED and re-raises LRS_VERIFICATION_NEEDED with the outstanding list — that is the event to act on when you are being asked for a replacement. Read settlement_status before you send anything after a REJECTED verdict.Related
LRS_VERIFICATION_NEEDED
What a payment owes — including after a send-back.
Get Verification Requirements
The whole set, on demand, with
settlement_status.Upload Document
Where a
ref comes from, and how to replace a file.PAYMENT_SETTLED
The next event after an approval.