Create Mandate

Create Mandate API

Purpose : This API can be used to initiate a new mandate registration. Using this API, the merchant's server posts mandate configuration details (like frequency, amount, and validity) to Zaakpay’s server. The mandate can be created using UPI Collect, Intent, or QR modes.

Possible values for paymentMode : upiCollectMandate, upiIntentMandate, upiQrMandate

  • Request Type : POST
  • Endpoint : /transactU?v=12

Request Attributes

These are the Request Attributes of Create Mandate API

Fields DataType Mandatory Description
merchantIdentifierStringYesZaakpay’s unique alphanumeric merchant identifier. You can get it from Zaakpay dashboard.
encryptionKeyId String Yes Id of Merchant’s Public key as signed by Zaakpay. You can generate it from Zaakpay dashboard.
merchantIpAddress String Yes The IP address of the merchant's server.
showMobile String No false: We show the full-fledged version Unconditionally. DETECT: We do detection of the user Agent of the browser from which the request is sent & route accordingly. true: We show the mobile page unconditionally. If it is missing/not sent: Same as DETECT (i.e. We do detection at our end ).
mode String No 1 digit only, Numeric. For e.g. 1 = Domain check, 0=Domain Check Skip.
returnUrl String No The URL where the transaction response will be posted by Zaakpay.
orderDetail.orderId String Yes It must be unique transaction identifier, Max limit is 20 alphanumeric characters.
orderDetail.amount String Yes Value in paisa. Default Transaction amount min limit is 100 paisa and max is 200000 paisa. Increase or decrease the transaction limit from Zaakpay dashboard. Developers tab > "Customize your Integration" >"Transaction limits".
orderDetail.currency String Yes The currency code. Default value: INR.
orderDetail.purpose String Yes Purpose of the transaction. Default value: 1.
orderDetail.email String Yes The email address of the customer.
orderDetail.txnDate String Yes The current date of the transaction.
orderDetail.phone String Yes The phone number of the customer.
orderDetail.productDescription String Yes A brief description of the product or service.
orderDetail.firstName String Yes The first name of the customer.
orderDetail.lastName String Yes The last name of the customer.
paymentInstrument.paymentMode String Yes Specifies the flow type. Values: upiCollectMandate, upiIntentMandate, or upiQrMandate.
paymentInstrument.upiMandate.action String Yes Action to be performed. Value must be create.
paymentInstrument.upiMandate.payerVpa String Yes The Encrypted VPA of the payer (Required for UPI Collect).
paymentInstrument.upiMandate.mandateConfig.firstDebit Boolean Yes Set to true if an immediate debit is required upon registration.
paymentInstrument.upiMandate.mandateConfig.firstDebitAmount Number Yes The amount to be debited immediately (if firstDebit is true).
paymentInstrument.upiMandate.mandateConfig.frequency String Yes Frequency of the mandate (e.g., Adhoc, Daily, Monthly, Yearly).
paymentInstrument.upiMandate.mandateConfig.startDate String Yes The start date of the mandate in yyyy-MM-dd format.
paymentInstrument.upiMandate.mandateConfig.endDate String Yes The expiry date of the mandate in yyyy-MM-dd format.
billingAddress.city String Yes The city of the customer's billing address.
shippingAddress.city String No The city of the customer's shipping address.
checksum String Yes To be calculated on above parameters using HMAC SHA 256.

Response Attributes

These are the Response Attributes of the Create Mandate API.

Response Attributes
Fields Description
orderIdUnique transaction identifier for the order.
amountTransaction amount.
currencyCurrency of the transaction.
productDescriptionDescription of the product being paid for.
emailEmail associated with the transaction.
txnDateDate of the transaction.
purposePurpose code of the transaction.
responseCodeZaakpay's response code for the transaction.
responseDescriptionDescription of the response code.
doRedirectIndicates if a redirect is required.
paymentModeMode of payment used.
paymentInstrument.paymentModeSpecific payment instrument mode.
paymentInstrument.sendOtpIndicates if OTP is to be sent for the transaction.
paymentInstrument.upiMandate.actionAction type for UPI mandate.
paymentInstrument.upiMandate.payerVpaVirtual Payment Address of the payer.
paymentInstrument.upiMandate.mandateConfig.firstDebitIndicates if the first debit is allowed.
paymentInstrument.upiMandate.mandateConfig.firstDebitAmountAmount for the first debit.
paymentInstrument.upiMandate.mandateConfig.frequencyFrequency of the mandate.
paymentInstrument.upiMandate.mandateConfig.startDateStart date of the mandate Should be today.
paymentInstrument.upiMandate.mandateConfig.endDateEnd date of the mandate.
bankPostData.txnidZaakpay Transaction ID.

Sample Request & Response

For reference, below are the sample CURL request and Response of API . It takes all required attributes to hit the Create Mandate API.

Sample Request

We have created a sample request of Create Mandate API with all required attributes and their values, in the order in which they’ll be sent to the API.

The resulting checksum calculated should be posted to the Zaakpay API along with other required attributes.

curl --location 'https://api.zaakpay.com/transactU?v=12' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0.6478.35 Mobile/15E148 Safari/604.1' \
--header 'Cookie: JSESSIONID=2D2391BACFC94FF27B5A67AF2D7AB21F.163.156' \
--data-urlencode 'data={"merchantIdentifier":"f9176XXXXXXXXb9041d164f0","encryptionKeyId":"PXXXXXXXXXXewv","merchantIpAddress":"127.12.0.0.1","showMobile":"true","mode":"0","orderDetail":{"orderId":"ZPXXXXXXX67","amount":"100","currency":"INR","productDescription":"Transaction","email":"[email protected]","txnDate":"2026-3-5","phone":"89XXXXX488","purpose":3},"paymentInstrument":{"paymentMode":"upiCollectMandate","upiMandate":{"action":"create","payerVpa":"dvbsb7K8C++I51tZ6C4XXXXXXE6MwOcn0dIDpPNPWBm589fHXXXXXXrjlrhAtUzFdvXll0aNhXXXXXLgjewTW0EGOe8bngbP/RIRhQoc3pXwr4fU4N3WXXXXXzLwQZjan609CZcpXXXXXBy+B1hgxOwxFrKWwKj9oaax/EWwaJ9k0y7QTPjt4I7fH0YjrAT5QCsU6mDV65aZPoODeB0lYCeXXXXXKphxFexYkLUQphheXXXXXXWyYMOdadEgbq5Wy7hTsO8kTU2Aai8sVHHmdS9Bg==","mandateConfig":{"firstDebit":true,"firstDebitAmount":100,"frequency":"Adhoc","startDate":"2026-03-05","endDate":"2026-04-10"}}}}' \
--data-urlencode 'checksum=d1a039bXXXX43d4bfb07f74236XXXXX91a8b135b8e44'

Sample Request

{
    "merchantIdentifier": "f9176XXXXXXXXb9041d164f0",
    "encryptionKeyId": "PXXXXXXXXXXewv",
    "merchantIpAddress": "127.12.0.0.1",
    "showMobile": "true",
    "mode": "0",
    "orderDetail": {
        "orderId": "ZPXXXXXXX67",
        "amount": "100",
        "currency": "INR",
        "productDescription": "Transaction",
        "email": "[email protected]",
        "txnDate": "2026-3-5",
        "phone": "89XXXXX488",
        "purpose": 3
    },
    "paymentInstrument": {
        "paymentMode": "upiCollectMandate",
        "upiMandate": {
            "action": "create",
            "payerVpa": "dvbsb7K8C++I51tZ6C4XXXXXXE6MwOcn0dIDpPNPWBm589fHXXXXXXrjlrhAtUzFdvXXXXXXXXXLgjewTW0EGOe8bngbP/RIRhQoc3pXwr4fU4N3WXXXXXzLwQZjan609CZcpXXXXXBy+B1hgxOwxFrKWwKj9oaax/EWwaJ9k0y7QTPjt4I7fH0YjrAT5QCsU6mDV65aZPoODeB0lYCeXXXXXKphxFexYkLUQphheXXXXXXWyYMOdadEgbq5Wy7hTsO8kTU2Aai8sVHHmdS9Bg==",
            "mandateConfig": {
                "firstDebit": true,
                "firstDebitAmount": 100,
                "frequency": "Adhoc",
                "startDate": "2026-03-05",
                "endDate": "2026-04-10"
            }
        }
    }
}

Sample Response

The Response will be in JSON Format

{
    "orderDetail": {
        "orderId": "ZaaXXXXXg1234",
        "amount": "100",
        "currency": "INR",
        "productDescription": "UPI Mandate",
        "email": "[email protected]",
        "txnDate": "2026-03-05",
        "purpose": "1",
        "amountBreakdown": {}
    },
    "responseCode": "1101",
    "responseDescription": "UPI Mandate authorization successful",
    "doRedirect": "true",
    "paymentInstrument": {
        "paymentMode": "UPI_MANDATE",
        "sendOtp": false,
        "upiMandate": {
            "action": "create",
            "payerVpa": "dvbsb7K8C++I51tZ6C4XXXXXXE6MwOcn0dIDpPNPWBm589fHXXXXXXrjlrhAtUzFdvXXXXXXXXXLgjewTW0EGOe8bngbP/RIRhQoc3pXwr4fU4N3WXXXXXzLwQZjan609CZcpXXXXXBy+B1hgxOwxFrKWwKj9oaax/EWwaJ9k0y7QTPjt4I7fH0YjrAT5QCsU6mDV65aZPoODeB0lYCeXXXXXKphxFexYkLUQphheXXXXXXWyYMOdadEgbq5Wy7hTsO8kTU2Aai8sVHHmdS9Bg==",
            "mandateConfig": {
                "firstDebit": true,
                "firstDebitAmount": 1,
                "frequency": "Adhoc",
                "startDate": "March 5, 2026, 12:00:00 AM",
                "endDate": "Apr 7, 2026, 12:00:00 AM"
            }
        }
    },
    "bankPostData": {
        "txnid": "ZPXXXXXXXXXd191"
    },
    "paymentMode": "UPI_MANDATE"
}

Checksum Calculation

Create a string(JSON) using the request attributes as given below. Checksum string will create based on the request attributes which are posted to Zaakpay as same as given in the string below.

Now, Calculate the checksum using the HMAC SHA-256 algorithm using the string as data and your generated secret key. The resulting checksum calculated should be posted to the Zaakpay API along with other data.

The Checksum string will be:

Secret Key used: 0678056d96914a8583fb518caf42828a

{"merchantIdentifier":"b19e8XXXXXXXXX476431b6b7973","encryptionKeyId":"xfXXXXXX76bfq","merchantIpAddress":"127.0.0.1","showMobile":"true","mode":"0","returnUrl":"https://webhook.site/04087ce3-beb0-4ade-991b-8a60c8651307","orderDetail":{"orderId":"dsfadsf","amount":"10000","currency":"INR","purpose":"1","productDescription":"Upi P2m Collect","email":"[email protected]","txnDate":"2026-02-07"},"billingAddress":{"first name":"Test_FirName","last name":"Test_LasName","address":"sector 56","city":"Gurugram","state":"Haryana","country":"India","pincode":"122003","Phone Number":"9999999999"},"shippingAddress":{"address":"sector 54","city":"Gurugram","state":"Haryana","country":"India","pincode":"122003"},"paymentInstrument":{"paymentMode":"upiCollectMandate","upiMandate":{"action":"create","payerVpa":"uhjY22/b3hp3vwkLz8x9d2p/tXdEmmPILyXXXXXXX9R7jvk0ohK4GuZCFdkoi7Qf/lihgEej9RcFljUAECjJaXXXXXXXCIbWgiaHvJXXXXXXXMORLKrCq4jDy+TcSK/LUCDEuGutQXXXXXXX866gmRS5+B9MB1WrIJZkinwRdYXXXXOJacwNWP/ZIfQ8eCdDtjeO1nOK4I0uBQ+V+bXXXoZkmpaT1hqaRGyv/KcrsRhFae4T2L/n5wnSO5z35+SdtWpOE3GTuxJDAvg/qwJsGVeyreL+ELUu1cYUM5nZQwIfdicI+IRC5b/vqw2gzLbA==","mandateConfig":{"firstDebit":true,"firstDebitAmount":10,"frequency":"Adhoc","startDate":"2026-02-07","endDate":"2026-09-07"}}},"debitorcredit":"upi"}
bdf7497270af42730b87581922c13d62ba6bee42ed1751a0e9d57a098e0fcd53

Encrypting a VPA with RSA

To encrypt a Virtual Payment Address (VPA), a merchant needs to perform a few straightforward steps. First, identify the VPA you want to encrypt. Next, obtain the recipient's RSA public key, which is essential for the encryption. Use this public key to encrypt the VPA, ensuring the data is secure. Finally, convert the encrypted data to a Base64 string for easy handling. This process ensures only the intended recipient can decrypt and access the original VPA, safeguarding sensitive information efficiently.