Skip to main content
POST
Submit verification details

Overview

Sends verification details for a payment, keyed by the same codes that Get Verification Requirements and the LRS_VERIFICATION_NEEDED webhook use. There is nothing to map between them: The response is two keys — the payment, and where it now stands.

The loop

1

An event arrives

LRS_VERIFICATION_NEEDED lists what the payment owes — each entry a code, a sentence saying why, and whether it can be waived.
2

You send what you have

Fields as a map, documents as refs from Upload Document. Partial is fine.
3

You read where the payment stands

ACTION_REQUIRED — still waiting on you. IN_REVIEW — with us, nothing further to send.
4

You read what is left, if anything is

From GET on the same path, or from the next event. Both name it in the codes you just sent.

The body depends on the purpose code

There is one endpoint and one envelope — fields, documents, finalize — but what belongs inside them is decided by the payment’s purpose code, not by you. Sending a key the code does not ask for is a 400. You never have to work out which set applies: GET the same path and it tells you, or read the codes off the LRS_VERIFICATION_NEEDED event. Complete bodies for every LRS purpose code, generated from the live requirement sets:
The three travel codes take an identical body. They differ in what the remittance is for — other travel, medical treatment, pilgrimage — not in what you must collect.S0305 shows student_visa; university_id_card would do just as well. They are alternatives, and the requirement set says so — the webhook merges them into one entry, and sending either clears both. Do not send both.Every example declares remitter_relation as PARENT, which is what makes relationship_declaration required. Declare SELF and it drops out.

What differs, and what does not

relationship_declaration is asked for on every code, but only once remitter_relation is something other than SELF.
Do not branch on the purpose code in your own integration. Read the requirement set instead. The codes above are what the matrix asks for today; it is configuration, and a revision reaches you through the API without a release on your side — but only if you are reading it rather than reproducing it.

Partial sends are merged

Send three fields today and two tomorrow and you have sent five. Nothing you sent earlier is wiped by a later call, and a document sent twice supersedes the first without discarding it. This is deliberate: nobody collects a passport scan, a visa and a letter of admission in the same instant. GET the same path whenever you want to know where that has left the payment.

Values

Field values are strings, numbers or booleans.
buyer_declaration is a single affirmation covering every claim. Its label is the exact text the payer must be shown; send true once they have affirmed it. TCS is not collected — EximPe computes it, so there is no figure to declare.
An unknown key is a 400, not a silent drop. A misspelled remitter_pan that we quietly ignored would leave the payment waiting forever for a field you believe you sent. Every key is checked before any is written, so one typo cannot half-apply a call.
Omit a key rather than sending null or an empty string. A boolean requirement — the LRS declarations — is only satisfied by true; false reads as not yet answered.

The response

Two keys, whatever you sent:
ACTION_REQUIRED never means your details were discarded. Everything that reached us is held against the payment, whether the call ended in a refusal, a vendor outage or a half-finished set. You re-send the one thing that failed, not the whole set.

Finding out what is still owed

This response does not say. Two places already do, and a third copy is one more thing that can drift out of step with them:

GET the same path

The whole requirement set, each entry carrying satisfied. Authoritative, idempotent, and safe to poll.

LRS_VERIFICATION_NEEDED

Fires on a refusal too, naming the same codes with a sentence per item — plus outstanding and reason, which no requirement list can carry.
A refusal is where the two differ, and it is worth knowing which to read. Everything the requirement list named can be supplied and the payment still not proceed, because supplying a PAN is not the same as it verifying — and the requirement list has nothing to say about that. The event does: it is where a shortfall’s rupee figure (outstanding), a headline conclusion (reason: PAN_NOT_VERIFIED, SENDER_NAME_MISMATCH, PURPOSE_CODE_NOT_ALLOWED, PURPOSE_CODE_NOT_IN_REGISTRY) and the per-item sentences you can show a payer all live.

Completion

finalize defaults to true and applies only to a complete set. It never forces an incomplete one through. Pass finalize: false to stage details without triggering verification — useful when you know more is coming, and the response is ACTION_REQUIRED because, deliberately, it still is. When a complete set is submitted it runs through the verification gateway — PAN verification, the sender-to-account-holder match, the TCS recomputation and the exactly-once LRS counter posting. IN_REVIEW means all of that passed.
Travel purpose codes cannot complete yet. A complete set on S0306, S0304 or S0303 comes back ACTION_REQUIRED with reason: "PURPOSE_CODE_NOT_IN_REGISTRY" on the event, however much you send. Collecting and submitting works — the details are held against the payment — but the payment will not advance until the travel rules are in place. Education (S0305, S1107) is unaffected.

When the handoff itself does not happen

A complete set can fail to reach a verdict at all:
ACTION_REQUIRED with a complete requirement set and no event means the handoff did not land. Repeat the same request — the set is still complete, so it is retried rather than re-sent, and an outage costs you one call. A refusal the gateway actually reached always arrives as an event, so silence is what tells the two apart.
Details are stored before verification is attempted and are never discarded by it.

Where each value goes

Most fields flow into the verification and settlement record. Three are collected but held rather than forwarded, and it is worth knowing which: Everything else reaches the verification gateway. TCS is not collected at all — EximPe computes it.

Get Verification Requirements

What this payment needs, and what it already has.

LRS_VERIFICATION_NEEDED

The event that tells you a payment owes details.

Upload Document

Pre-upload a file and reference it by ref.

Quote LRS Amount

TCS and the all-in total, before the buyer transfers.

Authorizations

X-Client-ID
string
header
required

Client Application ID - Your unique application identifier used to authenticate API requests. You can find your Client ID in the Developer Settings section of the merchant dashboard.

X-Client-Secret
string
header
required

Client Secret Key - Your secret key used alongside the Client ID for secure authentication. Keep this confidential and never expose it in client-side code. Available in the Developer Settings section of the merchant dashboard.

X-Merchant-ID
string
header
required

Merchant Identifier - The unique ID for the merchant account. This is required for PSP (Payment Service Provider) merchants who manage multiple merchant accounts. You can find merchant IDs in the Merchant Management section of the dashboard.

X-API-Version
string
header
required

API Version - Specifies which version of the API to use (e.g., '1.X.X', '2.X.X', or '3.X.X'). This header allows you to control which API version your integration uses. Default version information is available in the Developer Settings.

Path Parameters

payment_id
string
required

UID of the payment the details are for.

Body

application/json
fields
object

Answers keyed by requirement code, e.g. {"remitter_pan": "ABCDE1234F", "payment_term": "Advance"}. Values are strings, numbers or booleans. An unknown key is a 400 rather than a silent drop — a typo you never hear about would leave the payment waiting forever for a field you believe you sent. Omit a key rather than sending null or an empty string.

Example:
documents
object[]

Documents by reference, or waivers.

finalize
boolean
default:true

Whether to run a complete set through the verification gateway. Never forces an incomplete one through.

Response

Details received. The body says where the payment now stands, and nothing else.

success
boolean
Example:

true

message
string
Example:

"Verification details received"

data
object