--- title: "UPI Autopay for API only" description: "Offer recurring payments to your shoppers with our UPI Autopay integration." url: "https://docs.adyen.com/payment-methods/upi/upi-autopay/api-only" source_url: "https://docs.adyen.com/payment-methods/upi/upi-autopay/api-only.md" canonical: "https://docs.adyen.com/payment-methods/upi/upi-autopay/api-only" last_modified: "2026-05-11T16:04:23+02:00" language: "en" --- # UPI Autopay for API only Offer recurring payments to your shoppers with our UPI Autopay integration. With UPI Autopay, shoppers can link their bank account to a mobile app, allowing them to set up recurring payments via instant bank transfer. Shoppers can use one of a number of apps built by participating banks or third party app partners that support UPI Autopay. Refer to this [comprehensive list](https://www.npci.org.in/what-we-do/autopay/list-of-banks-and-apps-live-on-autopay). ## Requirements | Requirement | Description | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | Make sure that you have an existing [API-only integration](/online-payments/build-your-integration/advanced-flow/?platform=Web\&integration=API%20only). | | **Setup steps** | To design your front-end, follow the [recommended design guidelines](/payment-methods/upi/upi-autopay#frontend-design-considerations) to provide an optimal checkout experience to your shoppers on UPI Autopay. | **Special characters are not allowed by the acquirer.** All merchant-defined values, such as for `merchantReference`, `shopperReference`, and `remarks`, that you send to the various applicable API requests (like [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) and [/payments/{paymentPspReference}/refunds](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments/\(paymentPspReference\)/refunds) must be alphanumeric. ## Set up a billing plan To initiate a billing plan for a shopper, you need to get shopper approval to create an Autopay mandate in their UPI app and store their payment details when the mandate is approved successfully . The UPI payment service provider and the issuing bank use this mandate to track the shopper's billing plan. This setup also enables the shopper to cancel the mandate directly from their UPI app. | Field | Required | Description | | ------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `paymentMethod.type` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Type of UPI flow. Possible values: **upi\_collect**, **upi\_intent**, and **upi\_qr**. | | `paymentMethod.virtualPaymentAddress` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required for **upi\_collect**. Virtual Payment Address. A unique identifier used to let UPI connect to the shopper's bank account. | | `paymentMethod.appId` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required for **upi\_intent**. The ID of the Third Party Application that is used in intent flow. If omitted or set to **null**, response returns a generic Android app drawer link (not supported on iOS). Possible values: - **gpay**: Google Pay - **phonepe**: PhonePe - **bhim**: BHIM (Bharat Interface for Money) - **paytm**: Paytm - **amazonpay**: Amazon Pay - **cred**: Cred - **wapay**: WhatsApp Pay - **jupiter**: Jupiter - **navi**: navi - **supermoney**: Super.money - **payzapp**: PayZapp - **mobikwik**: MobiKwik - **freecharge**: Freecharge - **phonepe**: PhonePe | | `storePaymentMethod` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **true** to store shopper's payment details. | | `shopperInteraction` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **Ecommerce**. | | `recurringProcessingModel` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **Subscription** or **UnscheduledCardOnFile**. | | `shopperReference` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The shopper reference associated with the billing plan (minimum length three characters). | | `reference` | | Optional, must be alphanumeric when included. No space and special characters allowed. | | `amount.value` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The first authorisation amount to charge the shopper in minor units. Note that this amount should be less than or equal to the `mandate.amount` and the first authorisation on this amount happens automatically within 5 minutes of successful mandate registration. If there is no amount to be charged during the signup (in case of free trails, tokenising shopper payment details etc.,) refer to [handling free trials](/payment-methods/upi/upi-autopay#handling-free-trials-in-autopay) section | | `amount.currency` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **INR**. | | `mandate.amount` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The maximum amount the shopper will be charged per recurring debit in minor units. Must be more than or equal to `amount.value`. The recurring charge does not need to go through authentication if the amount is less than or equal to INR 15,000. | | `mandate.amountRule` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Possible values: **max** and **exact**.- **max** - The shopper can be charged any amount between INR 1 to the amount in the `amount.value` field. - **exact** - The shopper can only be charged the amount in the `amount.value` field. | | `mandate.frequency` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The frequency at which the shopper will be charged. Possible values: **monthly**, **weekly** and **adhoc**. Use **adhoc** if free trial or billing cycles differ. | | `mandate.startsAt` | | Current transaction date in **YYYY-MM-DD** format. Defaulted to the current date if not sent explicitly in the request. | | `mandate.endsAt` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | End date of the billing plan, in **YYYY-MM-DD** format. | | `mandate.remarks` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Limited to 20 characters, spaces allowed, but no special characters. Displayed in the shopper's UPI app (on supported apps), under the **Autopay** section. | | `mandate.billingAttemptsRule` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required for monthly and weekly frequencies. Possible values: **before**, **after**, and **on**.- **before** - You can initiate the charge and retries anytime from the 1st day of the billing cycle to the `mandate.billingDay`. - **after** - You can initiate the charge and retries any time from the `mandate.billingDay` to the end of billing cycle (for example end of the month for monthly frequency). - **on** - You can initiate the charge and retries only on the `mandate.billingDay`. This field does not apply to adhoc frequencies. | | `mandate.billingDay` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required for monthly and weekly frequencies. The day of the billing cycle when the shopper will be charged. For monthly frequency: If `mandate.billingDay` is 26, the shopper is charged on the 26th of every month. Valid values: 1–31. For weekly frequency: If `mandate.billingDay` is 5, the shopper is charged every Friday. (1 = Monday, 2 = Tuesday, ..., 7 = Sunday). Valid values: 1–7. This field does not apply to adhoc frequencies. | ### Tab: UPI Intent 1. UPI Intent should be implemented only for mobile app and mobile web integrations. It is not supported on desktop web. 2. From your server, make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request containing the [required parameters](#billing-plan). Note that `paymentMethod.appId` is a mandatory field for iOS devices. 3. Use the `action.url` in the response to launch the selected UPI app. 4. The shopper will complete the approval on their UPI app. 5. On Android devices, the UPI app automatically closes after the shopper approves the payment, returning the shopper to your checkout page. On iOS devices, the shopper must manually close the UPI app to return to your checkout page. 6. Display a waiting screen to the shopper, telling them you are awaiting the payment status. 7. Check your [webhooks](https://docs.adyen.com/development-resources/webhooks/) to see the payment result and display the result to the shopper. We send a webhook to you with the final status of the payment. **Example /payments request for UPI Intent** ```json curl https://checkout-test.adyen.com/checkout/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d ' { "amount": { "currency": "INR", "value": 12000 }, "countryCode": "IN", "merchantAccount": "ADYEN_MERCHANT_ACCOUNT", "reference": "YOUR_ORDER_NUMBER", "paymentMethod": { "type": "upi_intent", "appId": "gpay" }, "mandate": { "amount": "100000", "amountRule": "max", "frequency": "monthly", "startsAt": "2025-07-21", "endsAt": "2030-07-21", "remarks": "MandateRemark", "billingAttemptsRule": "before", "billingDay": "25" }, "returnUrl": "https://your-company.com/checkout?shopperOrder=12xy..", "storePaymentMethod": true, "shopperInteraction": "Ecommerce", "recurringProcessingModel": "Subscription", "shopperReference": "YOUR_SHOPPER_REFERENCE" }' ``` **Example /payments response for UPI Intent** ```json { "pspReference": "KSCZHX7J867Q8CX2", "resultCode": "Pending", "action": { "paymentData": "Ab02b4c0!BQABAgBim.." "paymentMethodType": "upi_intent", "url": "upi://mandate?...", "type": "await" }, "paymentData": "Ab02b4c0!BQABAgBim.." } ``` ### Tab: UPI QR 1. From your server, make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request containing the [required parameters](#billing-plan). 2. Use the `action.qrCode` in the response to display the QR code to the shopper. 3. The shopper will scan the QR code to complete the approval on their UPI app. 4. Check your [webhooks](https://docs.adyen.com/development-resources/webhooks/) to see the payment result and display the result to the shopper. We send a webhook to you with the final status of the payment. **Example /payments request for UPI QR** ```json curl https://checkout-test.adyen.com/checkout/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d ' { "amount": { "currency": "INR", "value": 12000 }, "countryCode": "IN", "merchantAccount": "ADYEN_MERCHANT_ACCOUNT", "reference": "YOUR_ORDER_NUMBER", "paymentMethod": { "type": "upi_qr" }, "mandate": { "amount": "100000", "amountRule": "max", "frequency": "monthly", "startsAt": "2025-07-21", "endsAt": "2030-07-21", "remarks": "MandateRemark", "billingAttemptsRule": "before", "billingDay": "25" }, "returnUrl": "https://your-company.com/checkout?shopperOrder=12xy..", "storePaymentMethod": true, "shopperInteraction": "Ecommerce", "recurringProcessingModel": "Subscription", "shopperReference": "YOUR_SHOPPER_REFERENCE" }' ``` **Example /payments response for UPI QR** ```json { "resultCode": "Pending", "action": { "paymentData": "Ab02b4c0!BQABAgBim.." "paymentMethodType": "upi_qr", "url": "upi://mandate?pa...", "type": "qrCode" } } ``` ### Tab: UPI Collect * In November 2025, the National Payments Corporation of India (NPCI) has informed ecosystem partners of its plan to **deprecate UPI Collect**, shifting its focus toward UPI Intent and UPI QR as the primary UPI payment methods going forward. This decision has been driven by lower authorization rates and a higher likelihood of fraudulent transactions associated with UPI Collect. * Therefore, we will no longer offer UPI Collect for *new* merchant integrations, and *we have updated our drop-in and components ([V6.30.0](https://github.com/Adyen/adyen-web/releases/tag/v6.30.0))* to reflect this change. * **If you use UPI Collect via a custom Checkout API and UI**: We strongly recommend that you begin offering **UPI Intent** and/or **UPI QR** (if not already enabled) and start your migration as soon as possible. * Adyen is keeping merchants informed about this initiative with specific system messages. 1. From your server, make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request containing the [required parameters](#billing-plan). 2. Display a waiting screen to the shopper, informing them that you're waiting for payment approval in their UPI app. Include a **5-minute countdown timer** to indicate the time remaining to complete the approval. 3. Check your [webhooks](https://docs.adyen.com/development-resources/webhooks/) to see the payment result. We send a webhook to you with the final status of the payment. **Example /payments request for UPI QR** ```json curl https://checkout-test.adyen.com/checkout/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d ' { "amount": { "currency": "INR", "value": 12000 }, "countryCode": "IN", "merchantAccount": "ADYEN_MERCHANT_ACCOUNT", "reference": "YOUR_ORDER_NUMBER", "paymentMethod": { "type": "upi_collect", "virtualPaymentAddress": "9999999999@upi" }, "mandate": { "amount": "100000", "amountRule": "max", "frequency": "monthly", "startsAt": "2025-07-21", "endsAt": "2030-07-21", "remarks": "MandateRemark", "billingAttemptsRule": "before", "billingDay": "25" }, "returnUrl": "https://your-company.com/checkout?shopperOrder=12xy..", "storePaymentMethod": true, "shopperInteraction": "Ecommerce", "recurringProcessingModel": "Subscription", "shopperReference": "YOUR_SHOPPER_REFERENCE" }' ``` **Example /payments response for UPI QR** ```json { "resultCode": "Pending", "action": { "paymentData": "Ab02b4c0!BQABAgBim.." "paymentMethodType": "upi_collect", "type": "await" }, "paymentData": "Ab02b4c0!BQABAg..." } ``` ### Webhooks for payment result You can receive the mandate details as part of your standard webhooks. To do this: 1. In your [Customer Area](https://ca-test.adyen.com/), go to **Developers** > **Webhooks**. 2. Next to **Standard webhook**, select the **edit webhook** icon. 3. Under **Additional Settings**, select **Include Mandate Details**. 4. If you would like to receive additional UPI metadata like VPA, issuer handle and bank code, **Under Additional Settings**, select **Include UPI Metadata** (VPA, handle and issuer bank code). 5. Select **Save Configuration**. Specific fields for UPI Autopay in the authorization webhook: | Field | Description | | ------------------- | ------------------------------------------------------------------------------------------------------ | | `mandate.mandateId` | Unique Mandate Number for the mandate created by NPCI (also called UMN). Store this id for future use. | | `mandate.status` | Current status of the mandate (for example active, or cancelled). | | `mandate.txVariant` | Transaction variant used (**upi\_collect** or **upi\_qr**) | | `upi.vpa` | Shopper's Virtual Payment Address. | | `upi.handle` | Third-party UPI app handle (for example **okhdfc**, or **okicici**). | | `upi.issuerBank` | First four characters of the shopper's issuing bank IFSC code. | Webhook for payment result: | eventCode | success | Description | Action to take | | ------------- | ------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | AUTHORISATION | false | The transaction failed. | Cancel the order and inform the shopper that the payment failed. Any amount debited will be refunded in 2–3 days. | | AUTHORISATION | true | The shopper successfully completed the payment and a mandate was created. | Inform the shopper that the payment was successful and proceed with the order. | **Example webhook** ```json { "live" : "false", "notificationItems" : [ { "NotificationRequestItem" : { "additionalData" : { "refusalReasonRaw" : "MD000: Request successful", "recurring.recurringDetailReference" : "9915989424854370", "recurring.shopperReference" : "YOUR_SHOPPER_REFERENCE", "mandate.amount" : "1000.00", "mandate.amountRule" : "max", "mandate.currency" : "INR", "mandate.frequency" : "monthly", "mandate.startsAt" : "2020-09-21 00:00:00", "mandate.endsAt" : "2021-06-28 00:00:00", "mandate.billingAttemptsRule" : "after", "mandate.billingDay" : "1", "mandate.mandateId" : "UNIQUE_MANDATE_NUMBER", "mandate.providerId" : "UNIQUE_MANDATE_NUMBER", "mandate.status" : "active", "mandate.txVariant" : "upi_collect", "upi.vpa": "username@handle", "upi.issuerBank": "ICIC", "upi.handle": "okicici", }, "amount" : { "currency" : "INR", "value" : 12000 }, "eventCode" : "AUTHORISATION", "eventDate" : "2020-09-21T10:57:26+02:00", "merchantAccountCode" : "ADYEN_MERCHANT_ACCOUNT", "merchantReference" : "YOUR_ORDER_NUMBER", "paymentMethod" : "upi_collect", "pspReference" : "8826006786035918", "reason" : "null", "success" : "true" } } ] } ``` ## Make recurring payments For every subsequent payment in a billing plan, you need to: 1. Send a pre-debit notification. 2. Make the recurring payment. As per the latest NPCI guidelines, you are required to perform any non-customer initiated transactions, such as Autopay pre-debit notifications and recurring transactions, during non-peak hours only, as outlined below for Indian Standard Time: * Before 10:00 AM * Between 1:00 PM and 5:00 PM * After 9:30 PM ### Send a pre-debit notification A pre-debit notification is an email, SMS or a push notification alert sent to a shopper, informing them of an upcoming recurring charge by the issuer. * To trigger this notification, you must notify Adyen using the [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) endpoint. * Adyen then forwards the request to the UPI network, which will subsequently inform the relevant Issuer(s) to send the alert to the shopper. * Upon receiving this notification, shoppers have the option to cancel their mandate. As per UPI regulations, the pre-debit notification **must be sent at least 24 hours before** each recurring payment. To send a pre-debit notification to your shopper, send a [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request and include the following: | Field | Required | Description | | ----------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `storedPaymentMethodId` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The token for your shopper's stored payment details. | | `merchantAccount` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your merchant account associated with the shopper's stored payment details. | | `shopperReference` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The shopper reference associated with the billing plan. | | `amount` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The amount you are going to charge the shopper. If `mandate.amountRule` = **max**: You can charge any amount between INR1 and the value of mandate.amount. If `mandate.amountRule` = **exact**: You must charge exactly mandate.amount. | | `billingDate` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The date on which the shopper will be charged. Must be at least 24 hours from the notification date. Example: If the notification date is 2025-08-13, the billing date should be 2025-08-14 or later. | | `billingSequenceNumber` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required when mandate.frequency = adhoc. Maximum length is 3. Use a unique number for each [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request. If using a single-digit number, use any value other than 1, ensuring it is unique for each subsequent recurring cycle. | | `reference` | | The reference for the pre-debit notification. | **Example /notifyShopper request** ```json curl https://pal-test.adyen.com/pal/servlet/Recurring/v67/notifyShopper \ -u "ws@Company.YourCompany":"YourWSPassword" \ -H 'content-type: application/json' \ -d '{ "merchantAccount": "ADYEN_MERCHANT_ACCOUNT", "storedPaymentMethodId": "8415995487234100", "shopperReference": "YOUR_SHOPPER_REFERENCE", "amount": { "currency": "INR", "value": 20000 }, "billingDate": "2020-10-02", "reference": "Example reference", "billingSequenceNumber": 2 }' ``` The [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) response contains: `message`: Information about the status of the pre-debit notification.\ `shopperNotificationReference`: Unique reference to the pre-debit notification. Store this value to make the subsequent payment. **Example /notifyShopper response** ```json { "message": "Request Processed Successfully", "resultCode": "Success", "shopperNotificationReference": "3456789098765432", "storedPaymentMethodId": "8415995487234100", "pspReference": "3456789098765432", "reference": "Example reference" } ``` ### Make the recurring payment Once the pre-debit notification is successful, you can carry out a recurring payment on your billing date. 1. From your server, make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request containing fields listed in the below section. 2. Check your webhooks to see the payment result. Refer to the webhook section below to understand how to handle failed recurring payments. Include the following in your [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request: | Field | Required | Description | | -------------------------------------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `paymentMethod.type` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Type of UPI flow. Possible values: **upi\_collect**, **upi\_intent**, and **upi\_qr**. | | `paymentMethod.storedPaymentMethodId` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The token value for the shopper's stored payment information. | | `paymentMethod.shopperNotificationReference` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Unique reference to the pre-debit notification, taken from the [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) response. | | `paymentMethod.billingSequenceNumber` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Required when `mandate.frequency` = **adhoc**. The value must match the value used in the corresponding [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request. In case of retries, the same sequenceNumber from the [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request can be used until the no of allowed retries are exceeded and new [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request is raised. | | `amount` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The recurring charge. Include both currency and value. | | `merchantAccount` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your Adyen merchant account. | | `shopperReference` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Unique reference identifying the shopper associated with the billing plan. | | `reference` | | Optional, must be alphanumeric when included. No space and special characters allowed. | | `shopperInteraction` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **ContAuth**. | | `recurringProcessingModel` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **Subscription** or **UnscheduledCardOnFile**. | **Example /payments request for a recurring payment** ```json curl https://checkout-test.adyen.com/checkout/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "amount": { "currency": "INR", "value": 20000 }, "paymentMethod": { "type": "upi_collect", "storedPaymentMethodId": "XHS58FLSNBF87FW2", "shopperNotificationReference": "991600060053751D", "billingSequenceNumber" : 2 }, "mandate": { "remarks": "Remark on mandate" }, "reference": "YOUR_ORDER_NUMBER", "shopperInteraction": "ContAuth", "recurringProcessingModel": "Subscription", "merchantAccount": "ADYEN_MERCHANT_ACCOUNT", "shopperReference": "YOUR_SHOPPER_REFERENCE" }' ``` **Example /payments response for a recurring payment** ```json { "additionalData": { "refusalReasonRaw": "MD200:Mandate Execution request is initiated to NPCI", "recurring.contractTypes": "ONECLICK,RECURRING", "recurring.recurringDetailReference": "XHS58FLSNBF87FW2", "recurringProcessingModel": "Subscription", "paymentMethodVariant": "upi_collect", "paymentMethod": "upi_collect", "recurring.shopperReference": "YOUR_SHOPPER_REFERENCE, }, "pspReference": "SP8XTT68FBZX4VW2", "resultCode": "Received", "merchantReference": "YOUR_MERCHANT_REFERENCE" } ``` Webhook for payment result: | eventCode | success | Description | Action to take | | ------------- | ------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | AUTHORISATION | false | The transaction failed. | Cancel the order. You can retry the authorization request up to 3 times, with a minimum 1-hour interval between each attempt. If all retries fail, inform the shopper and initiate a new [/notifyShopper](https://docs.adyen.com/api-explorer/Recurring/latest/post/notifyShopper) request. | | AUTHORISATION | true | The shopper successfully completed the payment and a mandate was created. | Inform the shopper that the payment was successful and proceed with the order. | ## Cancel a billing plan If your shopper decides to end their billing plan, you must cancel the corresponding UPI Autopay mandate linked to their stored payment details. **Merchant-initiated cancellation:** * Send a [delete request](/online-payments/tokenization/managing-tokens#delete-stored-details) using `/storedPaymentMethods/{storedPaymentMethodId}` to remove the shopper’s stored token and cancel the mandate. * You will receive a [recurring.token.disabled](/online-payments/tokenization/managing-tokens/#webhooks) webhook to confirm the cancellation status. **Shopper-initiated cancellation (via UPI App):** * If the shopper cancels their billing plan on their UPI app, you will receive a [recurring.token.disabled](/online-payments/tokenization/managing-tokens/#webhooks) webhook. ## Test and go live Contact your Implementation Manager to set up your test environment for UPI Autopay. You can use the following magic amounts to test various transaction outcomes. | Scenario | Description | Magic amount (`amount.value`) | | -------------------------------- | ----------------------------------- | ----------------------------- | | Signup – Success | Shopper signup successful | 7005 | | Signup – Failure | Shopper signup unsuccessful | 7006 | | Pre debit notification - Success | Pre debit notification successful | 7005 | | Pre debit notification - Failure | Pre debit notification unsuccessful | 1401 | | Recurring Charge – Success | Successful recurring charge | 7005 | | Recurring Charge – Failure | Failed recurring charge | 7008 | | Mandate Revoke – Success | Successful mandate revoke | 7008 | | Mandate Revoke – Failure | Failed mandate revoke | 7010 | | Refund – Success | Successful refund | 2010 | | Refund – Failure | Failed refund | 2011 | Before you can accept live UPI Autopay payments, contact your Account Manager to begin the onboarding process. ## See also * [API only integration](/online-payments/build-your-integration/advanced-flow?platform=Web\&integration=API%20only) * [Webhooks](/development-resources/webhooks) * [API Explorer](https://docs.adyen.com/api-explorer/#/CheckoutService/latest/overview)