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
payer_details in the Create Mandate APIDeployment 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 ?
payer_details ?| Field | Status | Type | Required | Rules |
|---|---|---|---|---|
| payer_details.accounts | Added | array | Mandatory when is_tpv = true | 1 to 5 items (at least 1 should be passed) An empty array is rejected. Collect + TPV takes exactly 1 item. |
| payer_details.accounts[].account_no | Added | string | Mandatory in every item for TPV flow | Digits only. Must be unique within accounts[]. |
| payer_details.accounts[].account_ifsc | Added | string | Optional [(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_no | Deprecated | string | - | It will be deprecated after 4th Nov 2026 |
| payer_details.account_ifsc | Added | string | - | 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?
account_ifsc optional?- 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_ifscparam is optional for them. - An item with only
account_ifscand noaccount_nois 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 type | Flags | name | virtual_address | accounts[].account_no | accounts[].account_ifsc |
|---|---|---|---|---|---|
| Intent | is_tpv=false, is_collect_request=false | Not required | Not required | Not required | Not required |
| Collect | is_tpv=false, is_collect_request=true | Mandatory | Mandatory | Not required | Not required |
| Intent + TPV (new) | is_tpv=true, is_collect_request=false, is_qr_requested=false | Not required | Not required | Mandatory, 1–5 items | Optional |
| QR + TPV (new) | is_tpv=true, is_collect_request=false, is_qr_requested=true | Do not send | Do not send | Mandatory, 1–5 items | Optional |
| Collect + TPV | is_tpv=true, is_collect_request=true | Mandatory | Mandatory | Mandatory, exactly 1 item | Do not send |
Sample payer_details for Intent + TPV
payer_details for Intent + TPV- 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" }
]
}
- 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 }
]
}
- Example - 3 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
"accounts": [
{ "account_no": "50100425803737"},
{ "account_no": "23343442423" }
]
}
- Example - 4 :
"is_tpv": true,
"is_collect_request": false,
"is_qr_requested": false,
"payer_details": {
"accounts": [
{ "account_no": "50100425803737"}
]
}
- 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 :
| Scenario | response_key |
|---|---|
| TPV mandate with no account details | error_empty_payer_details |
| accounts sent as an empty array | error_empty_accounts |
| More than 5 items in accounts | error_accounts_limit_exceeded (new) |
| The same account_no appears more than once in accounts | error_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 number | error_invalid_account_no_format (new) |
| account_ifsc is not a string or is over 11 characters | error_invalid_account_ifsc_format (new) |
| Both deprecated flat fields and accounts[] sent | error_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 :
- The merchants who wish to use the Intent+TPV flow -
- They need to make the changes in the payer details as stated above.
- Integrate with accounts[] directly.
- Pass the
account_no(mandatory) andaccount_ifsc(optional) in theaccounts[] array as objects inside thepayer_detailsblock.
- Using Collect + TPV today: move
account_nointopayer_details.accounts[]as soon as possible. Send exactly oneaccount_noand drop the field ofaccount_ifsc. - Handle the four new response_key and the B3 failure in your mandate flow.
- Not using TPV: no action needed.
For any further queries, please reach out to us.
