added

Flow Advisory | Autopay Mandates | Version 1.1.5

Release Note : UPI Autopay - Intent + TPV and QR + TPV mandates are now supported; changes to payer_details in the Create Mandate API

Deployment Date - 4th November 2026

Going forward from 4th Nov'26, you can register UPI AutoPay mandates with Third Party Validation (TPV) through the Intent and QR flows, earlier the functionality was live for only mandates registered through collect requests.

With TPV, the mandate will be registered only if the user authorises it from a bank account that the merchant have whitelisted in the request.

To support this, the payer_details block of the Create Mandate API changes.

Account details now go in a new accounts[] array, which takes 1 to 5 bank accounts per mandate (passing at least one account number is mandatory for TPV flow). Your end user can authorise from any one of them.

If the merchant is sending only the account_noas an object independently similar to name or virtual_address in the payer details it will be rejected, they will have to send this field as an object in the accounts[] array inside the payer_details block.
account_ifsc is the new field which we are adding in the accounts[] array of the payer_details. This is an optional field which can be passed in each item along with account_no.

Nothing changes for non-TPV Intent and Collect mandates, and no other Create Mandate field changes.

What is changing in payer_details ?

Field Status Type Required Rules
payer_details.accountsAddedarrayMandatory when is_tpv = true1 to 5 items (at least 1 should be passed)
An empty array is rejected. Collect + TPV takes exactly 1 item.
payer_details.accounts[].account_noAddedstringMandatory in every item for TPV flowDigits only. Must be unique within accounts[].
payer_details.accounts[].account_ifscAddedstringOptional [(Intent + TPV) & (QR + TPV) only]Can be set per item. String, up to 11 characters (e.g. SBIN0000300). Not allowed for Collect + TPV. This field is an optional filed for TPV flow.
payer_details.account_noDeprecatedstring-It will be deprecated after 4th Nov 2026
payer_details.account_ifscAddedstring-This is a new field which we are adding

name and virtual_address are unchanged in the payer details block.

When is account_ifsc optional?

  1. For Intent + TPV and QR + TPV mandates, each account can carry an IFSC or not, independently. That means if a merchant is trying to register a mandate with TPV flow, passing the account_ifsc param is optional for them.
  2. An item with only account_ifsc and no account_no is rejected.

Note : A request carrying both the deprecated flat field (account_no) and new array accounts[] is rejected.

Which fields apply to which mandate type ?

Mandate typeFlagsnamevirtual_addressaccounts[].account_noaccounts[].account_ifsc
Intentis_tpv=false, is_collect_request=falseNot requiredNot requiredNot requiredNot required
Collectis_tpv=false, is_collect_request=trueMandatoryMandatoryNot requiredNot required
Intent + TPV (new)is_tpv=true, is_collect_request=false, is_qr_requested=falseNot requiredNot requiredMandatory, 1–5 itemsOptional
QR + TPV (new)is_tpv=true, is_collect_request=false, is_qr_requested=trueDo not sendDo not sendMandatory, 1–5 itemsOptional
Collect + TPVis_tpv=true, is_collect_request=trueMandatoryMandatoryMandatory, exactly 1 itemDo not send

Sample payer_details for Intent + TPV

  1. Example - 1 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
  "accounts": [
    { "account_no": "50100425803737", "account_ifsc": "HDFC0001234" },
    { "account_no": "23343442423" , "account_ifsc": "HDFC0001234" }
  ]
}
  1. Example - 2 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
  "accounts": [
    { "account_no": "50100425803737", "account_ifsc": "HDFC0001234" },
    { "account_no": "233434424234 }
  ]
}
  1. Example - 3 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
  "accounts": [
    { "account_no": "50100425803737"},
    { "account_no": "23343442423" }
  ]
}
  1. Example - 4 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
  "accounts": [
    { "account_no": "50100425803737"}
  ]
}
  1. Example - 5 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
  "accounts": [
    { "account_no": "50100425803737", "account_ifsc": "HDFC0001234" },
    { "account_no": "23343442423", "account_ifsc": "HDFC0001236" },
    { "account_no": "23343442424", "account_ifsc": "HDFC0001237" },
    { "account_no": "23343442425", "account_ifsc": "HDFC0001238" },
    { "account_no": "23343442426", "account_ifsc": "HDFC0001239" }
	]
}

All other Create Mandate fields stay as documented.

Validation errors :

Scenarioresponse_key
TPV mandate with no account detailserror_empty_payer_details
accounts sent as an empty arrayerror_empty_accounts
More than 5 items in accountserror_accounts_limit_exceeded (new)
The same account_no appears more than once in accountserror_duplicate_account_no_in_payer_details (new)
An item with account_no missing or empty (including IFSC-only items)error_empty_payer_details
account_no has non-digits, is over 50 characters, or is sent as a numbererror_invalid_account_no_format (new)
account_ifsc is not a string or is over 11 characterserror_invalid_account_ifsc_format (new)
Both deprecated flat fields and accounts[] senterror_incorrect_keys_in_payer_details

You need to make the required changes to consume the new response_key which are highlighted with (new) tag.

If the customer authorise from a different account: the mandate fails and you receive the existing failure callback with error_code B3.

No new callback fields are added.

Actions required from you :

  1. The merchants who wish to use the Intent+TPV flow -
    1. They need to make the changes in the payer details as stated above.
    2. Integrate with accounts[] directly.
    3. Pass the account_no(mandatory) and account_ifsc (optional) in the accounts[] array as objects inside the payer_details block.
  2. Using Collect + TPV today: move account_no into payer_details.accounts[] as soon as possible. Send exactly one account_noand drop the field of account_ifsc.
  3. Handle the four new response_key and the B3 failure in your mandate flow.
  4. Not using TPV: no action needed.

For any further queries, please reach out to us.