UPI One-Time Mandate (OTM) is a secure, RBI-compliant payment workflow that allows you to block a specific amount from a customer’s UPI-linked bank account upfront and debit it only after the order or service has been fulfilled. This two-step block-then-capture model gives you confidence in fund availability before debiting, and gives customers a transparent authorisation trail in their UPI app.Documentation Index
Fetch the complete documentation index at: https://www.cashfree.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Key benefits
UPI OTM offers the following benefits:- Guaranteed fund availability: You block funds at order time and capture only after fulfilment.
- Customer trust and transparency: Your customers approve the mandate in their UPI app and see the block in real time.
- Flexible capture: You can capture any amount up to the authorised order value.
- Auto-release on void: If the order is cancelled, funds are unblocked through a simple void request to the Preauthorisation API.
- UPI channel support: You can use UPI Collect, UPI Intent, or UPI QR based on your checkout experience.
Use cases
Use UPI OTM when you need to confirm payment availability before finalising an order. Common scenarios include:- IPO applications: Reserve funds for ASBA requests and debit only if the allotment succeeds.
- Insurance approvals: Block the premium amount until underwriting is completed.
- Variable utility or charging services: Hold funds when the final amount is not known at the time of booking.
- Healthcare and hospital services: Reserve a provisional amount while insurance coverage or treatment costs are confirmed.
- Rental deposits: Hold a refundable deposit and charge only for actual damages.
- Travel and hospitality reservations: Reserve funds for bookings while preserving flexibility for cancellations.
- Limited-stock product launches: Reserve funds for high-demand orders and collect payment only once the order is confirmed.
UPI OTM lifecycle
The UPI OTM lifecycle consists of four stages. Each stage maps to a Cashfree API call.- Create an order and payment session: Create an order with the Create Order API, then initiate a UPI mandate payment session with the Order Pay API using
authorize_only: trueto block funds without immediately debiting the customer’s account. - Get customer approval to block funds: Your customer approves the mandate in their UPI app. You receive a
SUCCESSwebhook, and the funds are blocked without immediate debit. - Capture the mandate on fulfilment: After you fulfil the order, call the Preauthorisation API with
action: CAPTUREto debit the blocked amount. - Void the mandate or process a refund: If the order is cancelled before capture, call the Preauthorisation API with
action: VOIDto release the block. If the order is already captured, create a refund with the Create Refund API instead.
Supported UPI channels
UPI OTM works across the following channels:channel value | Channel name | When to use |
|---|---|---|
collect | UPI Collect | Cashfree sends a collect request to the customer’s UPI app. |
link | UPI Intent | A deep link opens the customer’s UPI app directly on mobile. |
qrcode | UPI QR | A QR code is generated for the customer to scan and approve the mandate. |
Integrate the UPI OTM flow
Use the following steps to create orders, start a UPI mandate session so customers can approve a block, capture or void the authorisation, and issue refunds after capture.Create an order and payment session
Create an order with Cashfree using the Create Order API and your order and customer details.Use the following cURL example as a template when you call the API from your application.
Sample create order request
Sample create order request
Request sample
Create UPI mandate session to block funds
Create the OTM transaction with Cashfree using the Order Pay API.The sample below uses UPI Collect; you can adapt the payload for your channel.
For UPI Intent or UPI QR, use the following
Sample UPI Collect mandate request
Sample UPI Collect mandate request
UPI Collect
channel values:linkfor UPI Intentqrcodefor UPI QR
SUCCESS response and a webhook notification. The amount is blocked in the customer’s account, but no amount is debited at this stage.The mandate blocks funds but does not debit them immediately. Capture the amount only when you are ready to complete the transaction.
Capture the mandate
To capture the mandate, call the Preauthorisation API with the Use the following cURL example when you send a capture action for the order.
Cashfree calls the acquiring bank to capture the mandate. If the capture succeeds, the payment amount is settled to you according to the settlement cycle.In most cases, capture succeeds immediately. For a small percentage of requests, you receive a failure response and the final outcome is confirmed later. For details on handling these cases, see Capture error codes and handling.
CAPTURE action.The captured amount must be less than or equal to the order amount.
Sample capture request
Sample capture request
Capture mandate
Void the mandate or process a refund
Choose one path: void releases a block only before capture; refund applies only after capture. You do not run both for the same order.To void the mandate before capture, call the Preauthorisation API with the
Cashfree calls the acquiring bank to void the mandate. If the void succeeds, the blocked amount is released from the customer’s account.To refund after capture, use the Create Refund API instead of void. A refund can be initiated only after the transaction is captured. Use the following steps to process a refund:
VOID action.Use the following cURL example when you void an authorisation.Sample void request
Sample void request
Void mandate
If the bank returns a failure response, Cashfree automatically retries the void up to three times. If the void does not succeed, the blocked funds are released automatically at mandate expiry (
end_time).- Call the Create Refund API to initiate the refund.
- Cashfree submits the refund to the acquiring bank for processing.
- If processing succeeds, the amount is refunded to the customer.
- If the refund fails, Cashfree retries every six hours for up to five attempts.
Sample create refund request
Sample create refund request
Create refund
If the refund remains unsuccessful after all retry attempts, Cashfree coordinates directly with the bank to process the refund offline.
Capture error codes and handling
For a small percentage of captures from the Preauthorisation API that do not return an immediate success, Cashfree returns one of the following error codes. Each code has a defined resolution path.| Error code | Meaning | What to expect |
|---|---|---|
59 | Processing delay at bank | Cashfree escalates to NPCI. Delayed success can be delivered on T+5 business days. |
K1 | Bank timeout or hold | Cashfree escalates to NPCI. Delayed success can be delivered on T+5 business days. |
VH | Bank hold or verification hold | Cashfree escalates to NPCI. Delayed success can be delivered on T+5 business days. |
VO | Void override (not settable) | The transaction is not settled. No further action is available through Cashfree for this capture attempt. |
Error codes
59, K1, and VH are recoverable. Cashfree escalates these to NPCI and the settlement may arrive within T+5 business days. Error code VO is non-recoverable and has a very low occurrence rate.Integration checklist
Use the following checklist to validate a complete UPI OTM integration:- Obtain
x-client-idandx-client-secretfrom the Merchant Dashboard. - Create an order using the Create Order API and store the
payment_session_id. - Initiate the UPI OTM session with the Order Pay API using
authorize_only: trueand the requiredchannel. - Call the Preauthorisation API with
action: CAPTUREafter fulfilment. - Call the Preauthorisation API with
action: VOIDfor cancellations before capture. - Create a refund using the Create Refund API only for orders already captured.
- Handle error codes
59,K1, andVHby waiting up to T+5 business days for delayed settlement confirmation from NPCI.