One Time Mandate
Overview
The One-Time Mandate (OTM) allows merchants to block funds from a customer's account for a specific period. Merchants can then either:
Capture those funds later (debit the money).
Release the blocked funds back to the customer.
This is required because there are scenarios where a delay is required(e.g., for processing or underwriting). “Juspay supports OTMs through the UPI payment method.”
How to Use the API for OTM
Merchants already integrated with mandates must update their integration to support OTM, based on their integration method:
Direct API Merchants: Add the required parameters in the Order/Session API request.
PP/SDK Merchants: Include these parameters in the SDK process payload.
SDK Integration Resources
Payment Page SDK (Hyper Checkout): Integration Guide
Headless SDK (UPI Transaction Mandate): Payload Details
Signature-Based Integrations: Ensure these parameters are part of the order details payload before signing.
Regardless of the integration method, the following parameters must be sent in API requests to initiate the OTM flow:
|
Parameter
|
Type
|
Description
|
|---|---|---|
mandate.block_funds
| Boolean
| Set to true to initiate the fund blocking process.
|
mandate.revokable_by_customer
| Boolean
| Set to false. The customer should not be able to revoke the mandate.
|
mandate.frequency
| String
| Set to ONETIME to indicate this is a one-time mandate for premiums/ subscription or any other use case.
|
mandate.start_date
| Integer
| The starting date of the mandate in Unix timestamp format (seconds). Use the current date.
|
mandate.end_date
| Integer
| The ending date of the mandate.
|
Session Response Parameters
|
Parameter
|
Type
|
Description
|
|---|---|---|
status
| String
| Status of the order. Can be NEW, PENDING, CHARGED, FAILED, etc.
|
id
| String
| Unique order ID generated by Juspay.
|
order_id
| String
| Your order ID.
|
payment_links.web
| String
| URL to the Juspay payment page.
|
sdk_payload
| Object
| Payload required for SDK integration (if applicable).
|
sdk_payload.requestId
| String
| Unique request ID for the SDK.
|
sdk_payload.payload
| Object
| Contains parameters for the payment page, including mandate details.
|
sdk_payload.payload.mandate.frequency
| String
| Indicates the frequency of the mandate, which is ONETIME.
|
sdk_payload.payload.firstName
| String
| The first name of the customer.
|
sdk_payload.payload.mandate.startDate
| Integer
| The start date of the mandate in Unix timestamp format (seconds).
|
sdk_payload.payload.clientId
| String
| The ID of the client merchant.
|
sdk_payload.payload.customerId
| String
| The ID of the customer.
|
sdk_payload.payload.orderId
| String
| The ID of the order.
|
sdk_payload.payload.returnUrl
| String
| The URL to redirect to after payment.
|
sdk_payload.payload.currency
| String
| The currency of the payment.
|
sdk_payload.payload.customerEmail
| String
| The email address of the customer.
|
sdk_payload.payload.customerPhone
| String
| The phone number of the customer.
|
sdk_payload.payload.service
| String
| Indicates the payment service used.
|
sdk_payload.payload.metadata.webhookUrl
| String
| The URL to send webhook notifications to.
|
sdk_payload.payload.description
| String
| A description of the payment.
|
sdk_payload.payload.options.createMandate
| String
| Indicates whether the creation of a mandate is optional or required.
|
sdk_payload.payload.mandate.blockFunds
| Boolean
| Indicates whether funds should be blocked.
|
sdk_payload.payload.mandate.revokableByCustomer
| Boolean
| Indicates whether the customer can revoke the mandate.
|
sdk_payload.payload.mandate.maxAmount
| String
| The maximum amount allowed for the mandate.
|
sdk_payload.payload.environment
| String
| The environment in which the payment is processed.
|
sdk_payload.payload.lastName
| String
| The last name of the customer.
|
sdk_payload.payload.timestamp
| String
| The timestamp of the payment request.
|
sdk_payload.payload.merchantId
| String
| The ID of the merchant.
|
sdk_payload.payload.amount
| String
| The amount of the payment.
|
sdk_payload.payload.clientAuthTokenExpiry
| String
| The expiration date and time of the client authentication token.
|
sdk_payload.payload.clientAuthToken
| String
| The client authentication token.
|
sdk_payload.payload.action
| String
| The action to be performed.
|
sdk_payload.payload.mandate.endDate
| Integer
| The end date of the mandate.
|
Batch Mandates
Merchants can process One-Time Mandates (OTM) in bulk using the Batch Mandate feature. This allows multiple mandates to be initiated in a single request, streamlining operations and reducing API calls.
For detailed guidelines Refer to Batch Mandates Documentation
This feature, like all mandates, is only available for registered customers and does not support guest checkouts.
Webhooks and Order Status
When an OTM is created, the following additional fields must be included in the mandate block within webhook notifications and order status updates:
|
Parameter
|
Value
|
|---|---|
block_fund
| TRUE
|
revokable_by_customer
| FALSE
|
frequency
| ONETIME
|
Merchants must validate the presence and values of these fields in order status updates for accurate OTM processing.
Mandate Block/ Order Amount Response
Also, note these amount-related fields:
maximum_eligible_refund_amount,amount, andeffective_amountwill be equal tomandate.max_amount.amount_debitedwill be the amount actually captured (which might be less thanmandate.max_amountif you only capture part of the blocked amount).
Post-Registration Flows
Mandate Execution
Use the Mandate Execution API to debit the blocked funds after successful mandate registration. This ensures that the payment is processed as per the predefined mandate conditions.
This action can be performed via API or directly from the Juspay dashboard.
NoteNotifications are not required for one-time mandates (OTM) on UPI. Therefore, notification-related parameters should not be included in the Mandate Execution API request.
Mandate Revoke
The Mandate Revoke API allows merchants to revoke an existing mandate before it is executed. This may be necessary if the user withdraws consent or if the service is no longer required.
Merchants can revoke a mandate through the API or via the Juspay dashboard.
Once revoked, the blocked funds will be released back to the user’s account.
Refer to API Specs
Mandate Update
Mandates can be updated under certain conditions.
Changes can be made to update the mandate; however, explicit customer consent is required before modifying the mandate amount.
Updates are subject to the availability of this feature at the Payment Gateway (PG) level.
Refer to API Specs
Auto-Release
If the mandate isn’t executed before mandate.end_date, funds auto-release to the user.
A mandate revoke webhook will trigger upon expiry.
The timeframe for auto-revocation may vary based on industry regulations and use case requirements.
For example, in the insurance sector, mandates are typically auto-revoked after 14 days if not utilized.
Dashboard Configuration
Supported Gateways:
|
Gateway
|
Current Stage
|
|---|---|
AXIS_BIZ
| Live
|
YES_BIZ
| Live
|
RBL_BIZ
| Live
|
PayU
| Live
|
BILLDESK
| Integration Phase
|
ICICI_UPI
| Integration Phase
|
Cashfree
| Integration Phase
|
CAMSpay
| Integration Phase
|
Supported PSP Handles
At present we support the below listed PSP’s
|
PSP Handle
|
PSP Handle
|
PSP Handle
|
PSP Handle
|
|---|---|---|---|
@ybl
| @paytm
| @upi
| @ibl
|
@axl
| @boi
| @cnrb
| @okhdfcbank
|
@okaxis
| @axisbank
| @postbank
| @ikwik
|
@barodampay
| @apl
| @indus
| @dbs
|
@icici
| @okicici
| @dlb
| @sliceaxis
|
@pz
| @jio
| @sbi
| @axb
|
@yesg
| @yapl
| @pnb
| @oksbi
|
@jupiteraxis
| @shriramhdfcbank
| @abfspay
| @niyoicici
|
@waicici
| @centralbank
| @equitas
| @naviaxis
|
@ypay
| @axispay
| @razorpay
| @tapicici
|
@Goaxb
| @mahb
| @fincarebank
| @iob
|
@indie
| @pingpay
| @yespay
| @gocash
|
@kotak
| @kotak811
| @paytmwallet
| @axisb
|
@freecharge
| @hdfcbank
| @abcdicici
| @sbipa
|
@fifederal
| @Payu
| @timecosmos
| @sib
|
@ptyes
| @ptaxis
| @ptsbi
| @pthdfc
|
@oneyes
| @seyes
| @superyes
| @ttyes
|
@yescurie
| @yesfam
| @yestp
| @gwaxis
|
@rmrbl
| @easebuzz
|
FAQ’s
Is partial capture of the blocked amount possible?
What happens to the remaining blocked amount?
For assistance, contact Juspay @ support@juspay.in

