Skip to main content
For merchants with Third-Party Validation (TPV) enabled on UPI or NetBanking, Cashfree shares the customer’s bank account details with the issuing bank, which checks that the payment is sent from the expected account. For bank transfers (Challans), Cashfree validates the incoming IMPS, NEFT, or RTGS transfer against the order and the account details you pass when TPV is enabled. TPV applies across these payment methods: the values you pass in customer_bank_account_number and customer_bank_ifsc (and customer_bank_code for NetBanking TPV) must match how the customer actually pays.
Fill this Support Form or contact your account manager to enable TPV for your account.
To process a TPV payment through Cashfree, include specific customer details in the Create Order API request. During checkout (UPI or NetBanking) or when the bank transfer is received (Challan), Cashfree checks these details against the payer or remitter information for that payment. The required fields are customer_bank_account_number and customer_bank_ifsc, where the IFSC is an alphanumeric code (for example, SBIN000001) that uniquely identifies a bank branch in India.

Implement a TPV-enabled order

To process a payment with bank account verification (TPV), pass the customer account number (customer_bank_account_number) and IFSC (customer_bank_ifsc) with every Create Order request. If you want the customer to pay through NetBanking, also pass customer_bank_code. For bank transfers (Challans), the customer pays to a Virtual Bank Account; Cashfree validates the remitter account and IFSC against the same TPV fields when the transfer is received.
curl --request POST \
  --url https://sandbox.cashfree.com/pg/orders \
  --header 'Content-Type: application/json' \
  --header 'x-api-version: 2022-09-01' \
  --header 'x-client-id: xxxx' \
  --header 'x-client-secret: xxxx' \
  --data '{
    "customer_details": {
        "customer_email": "test@cashfree.com",
        "customer_id": "LD09755CSCON10092021",
        "customer_name": "Rohit",
        "customer_phone": "9999911111",
        "customer_bank_ifsc": "CITI0000001",
        "customer_bank_account_number": "1518121112",
        "customer_bank_code": "3044"
    },
    "order_amount": 1,
    "order_currency": "INR"
  }'

Pre-built UI

To process a TPV payment using the pre-built UI, open checkout using the payment_session_id from the Create Order API response. The customer can then complete payment only through their linked account using an enabled method such as UPI, NetBanking, or a bank transfer (Challan). If the customer attempts to pay from a different account, the payment fails and the order remains in an ACTIVE state.

Custom UI

To process TPV payments using your own UI, integrate either the JavaScript Elements SDK or use the /orders/sessions API. There is no change to the API request. You can read about the API contract for the payments pay endpoint. Offer UPI, NetBanking, and bank transfers (Challans) according to the payment methods enabled on your account. You can process TPV payments using Payment Links through the Payment Link API, a bulk CSV file upload, or the Cashfree Dashboard. Pass customer_bank_account_number and customer_bank_ifsc for every TPV link; include customer_bank_code when you expect the customer to pay with NetBanking. Field usage for bank transfers (Challans) differs from NetBanking; see the “Implement a TPV-enabled order” and “Multi-bank TPV” sections on this page. Which payment methods appear on the link depends on what you enable for that link.

Bulk upload

When using a CSV file to bulk-create payment links, pass the customer bank details using the Notes columns. Use the following column mapping:
  • Note 1: customer_bank_code
  • Note 2: customer_bank_account_number
  • Note 3: customer_bank_ifsc
The following sample file illustrates the expected format. In this example, Note 1 Title is set to customer_bank_code and the corresponding value appears in Note 1 Description.
Link Id,Expiry Time,Currency,Amount,Min Amount,Description,Customer Name,Customer Phone,Customer Email,Note 1 Title,Note 1 Description,Note 2 Title,Note 2 Description,Note 3 Title,Note 3 Description,Webhook URL

Order-12zzsa,2023-02-11,INR,22.5,10,Payment for order,John Doe,9999999999,John.doe@cashfree.com,customer_bank_code,3044,customer_bank_account_number,37866911583,customer_bank_ifsc,SBIN0001882,https://cashfree.com/callback-webhook
Order-12zsdca,2023-02-11,INR,22.5,10,Payment for order,John Doe,9999999999,John.doe@cashfree.com,customer_bank_code,3026,customer_bank_account_number,6633835901,customer_bank_ifsc,IDIB000V018,https://cashfree.com/callback-webhook
To use TPV with the Payment Link API, pass the customer bank details in the customer_details object. See the request and response below for reference.
curl --request POST \
  --url https://api.cashfree.com/pg/links \
  --header 'Content-Type: application/json' \
  --header 'x-api-version: 2025-01-01' \
  --header 'x-client-id: xxxx' \
  --header 'x-client-secret: xxxx' \
  --data '{
     "customer_details": {
          "customer_phone": "9908734803",
          "customer_email": "rohit@cashfree.com",
          "customer_name": "Rohit",
          "customer_bank_account_number": "78123123",
          "customer_bank_ifsc": "SBIN0000001",
          "customer_bank_code": "3044"
     },
     "link_notify": {
          "send_sms": true
     },
     "link_id": "testlink12354",
     "link_amount": 4,
     "link_currency": "INR",
     "link_purpose": "Test for TPV"
  }'

Multi-bank TPV

Multi-bank TPV allows you to pass up to four customer bank accounts in a single payment request. Customers can select their preferred account at checkout, which increases the likelihood of a successful payment. Multi-bank TPV is supported on the following payment methods:
For bank transfers (Challans), the customer_bank_account_number and customer_bank_ifsc fields are used to validate the remitter when the transfer reaches the Virtual Bank Account.
To pass multiple accounts, use pipe-separated values (|) in the customer_bank_account_number and customer_bank_ifsc fields within the customer_details object. The mapping between accounts and IFSC codes is index-based, so the order of values in both fields must match. The following example shows a Create Order request with three bank accounts:
"customer_details": {
  "customer_id": "customer_1",
  "customer_email": "customer@email.com",
  "customer_phone": "+919999999999",
  "customer_bank_account_number": "1234567891|1234567892|1234567893",
  "customer_bank_ifsc": "SBIN000000001|ICIC000000002|HDFC000000003"
}

Key rules

Follow these rules when passing multiple bank accounts for multi-bank UPI or NetBanking TPV. They do not describe multi-account selection for bank transfers (Challans); use a single expected remitter account and IFSC for Challan TPV unless Cashfree confirms otherwise for your account.
  • You can pass a maximum of four bank accounts per request.
  • The customer_bank_account_number and customer_bank_ifsc fields must contain the same number of pipe-separated values. Account 1 maps to IFSC 1, account 2 maps to IFSC 2, and so on.

UPI

Multi-bank TPV for UPI is supported on select UPI rails. Contact the Cashfree team to get the required rails enabled for your account.

NetBanking

When using multi-bank TPV with NetBanking, do not pass a value in customer_details.customer_bank_code. Cashfree automatically populates the bank list on the checkout page based on the IFSC codes you provide. The checkout page displays both retail and corporate banking options, depending on the modes enabled for your account. If you pass multiple accounts from the same bank, only the first account is used for TPV.

Bank transfers

For bank transfers (Challans), pass the remitter account number and IFSC you expect the customer to use in customer_bank_account_number and customer_bank_ifsc. Do not rely on customer_bank_code; that field applies to NetBanking TPV. When the customer sends IMPS, NEFT, or RTGS to the order Virtual Bank Account, Cashfree validates the transfer against those TPV fields.
Fill this Support Form or contact your account manager to enable multi-bank TPV for your account.

Supported banks

The following tables list the banks that support TPV through NetBanking and UPI. Bank transfers (Challans) do not use the NetBanking bank code list; TPV for those payments relies on the account number and IFSC you pass at order creation and on the remitter details returned with the incoming transfer.
SrBank codeBank name
13003Axis Bank
23005Bank of Baroda - Retail Banking
33006Bank of India
43007Bank of Maharashtra
53009Canara Bank
63010CSB Bank Limited
73011Central Bank of India
83012City Union Bank
93016Deutsche Bank
103019Dhanlakshmi Bank
113020Federal Bank
123021HDFC Bank
133022ICICI Bank
143023IDBI Bank
153024IDFC FIRST Bank
163026Indian Bank
173027Indian Overseas Bank
183028IndusInd Bank
193029Jammu and Kashmir Bank
203030Karnataka Bank Ltd
213031Karur Vysya Bank
223032Kotak Mahindra Bank
233037Punjab & Sind Bank
243038Punjab National Bank Retail Banking
253039RBL Bank
263040Saraswat Bank
273042South Indian Bank
283043Standard Chartered Bank
293044State Bank Of India
303052Tamilnad Mercantile Bank Ltd
313054UCO Bank
323055Union Bank of India
333058Yes Bank Ltd
343060Bank of Baroda - Corporate
353086Shivalik Small Finance Bank
363087AU Small Finance Bank
373088Bandhan Bank - Retail Banking
383089Utkarsh Small Finance Bank
393090The Surat Peoples Co-operative Bank Limited
403091Gujarat State Co-operative Bank Limited
413092HSBC Retail NetBanking
423097Cosmos Bank
433098Capital Small Finance Bank
443102Jana Small Finance Bank
453115SBM Bank India
463117The Sutex Co-op Bank Ltd
473126Ujjivan Small Finance Bank
483123Airtel Payments Bank
All UPI apps support bank account validation.