Setup Subscription
This API is used to check the current status of a subscription after it has been set up. It helps determine whether the subscription is Active (successfully set up and ongoing), Cancelled (manually cancelled by the user), or Revoked(withdrawn by the user).
Environment
| Environment | HTTP Method | API |
| Sandbox | POST | https://api-preprod.phonepe.com/apis/pg-sandbox/subscriptions/v2/setup |
| Production | POST | https://api.phonepe.com/apis/pg/subscriptions/v2/setup |
Request
| Header Name | Header Value | Description |
| Content-Type | application/json | |
| Authorization | O-Bearer <access_token> | Pass access_token received in Authorization call |
⚠️ For Partner Integrations!
It is mandatory to include the X-MERCHANT-ID header with the MerchantID of the end merchant.
Request for UPI Intent
Sample Request
{
"merchantOrderId": "M27",
"amount": 100,
"expireAt": 1807681114000,
"paymentFlow": {
"type": "SUBSCRIPTION_SETUP",
"merchantSubscriptionId": "MS27",
"authWorkflowType": "TRANSACTION",
"amountType": "FIXED",
"maxAmount": 100,
"frequency": "ON_DEMAND",
"expireAt": 1807681114000,
"paymentMode": {
"type": "UPI_INTENT",
"targetApp": "com.phonepe.app"
}
},
"deviceContext": {
"deviceOS": "ANDROID"
},
"metaInfo": {
"udf1": "some meta info of max length 256",
"udf2": "some meta info of max length 256",
"udf3": "some meta info of max length 256",
"udf4": "some meta info of max length 256",
"udf5": "some meta info of max length 256",
"udf6": "some meta info of max length 256",
"udf7": "some meta info of max length 256",
"udf8": "some meta info of max length 256",
"udf10": "some meta info of max length 256",
"udf11": "some meta info of max length 50",
"udf12": "some meta info of max length 50",
"udf13": "some meta info of max length 50",
"udf14": "some meta info of max length 50",
"udf15": "some meta info of max length 50"
}
}Sample Request in CURL
curl --location 'https://api-preprod.phonepe.com/apis/pg-sandbox/subscriptions/v2/setup' \
--header 'Accept: application/json' \
--header 'Authorization: O-Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVzT24iOjE3MTIyNTM2MjU2NDQsIm1lcmNoYW50SWQiOiJWMlNVQlVBVCJ9.7aVzYI_f_77-bBicEcRNuYx093b2wCsgl_WFNkKqAPY' \
--header 'Content-Type: application/json' \
--data '{
"merchantOrderId": "MO1443709025658932",
"amount": 200,
"expireAt": 170905854,
"paymentFlow": {
"type": "SUBSCRIPTION_SETUP",
"merchantSubscriptionId": "MS1709025658932",
"authWorkflowType": "TRANSACTION",
"amountType": "FIXED",
"maxAmount": 200,
"frequency": "ON_DEMAND",
"expireAt": 1737278524000,
"paymentMode": {
"type": "UPI_INTENT",
"targetApp": "com.phonepe.app"
}
},
"deviceContext" : {
"deviceOS" : "ANDROID"
}
}'Request Parameters
| Parameter Name | Data Type | Description | Mandatory | Constraints |
merchantOrderId | String | Unique merchant order id generated by merchant. | Yes | • Max Length = 63 characters. • No Special characters allowed except underscore “_” and hyphen “-“ |
amount | Long | Order amount in paisa to setup a mandate based on the authWorkflowType. | Yes | • For PENNY_DROP flow, the amount should be equal to 200 (In Paise) • For TRANSACTION flow, the amount should be greater than or equal to 100 or the first debit amount(In Paise) |
expireAt | DateTime | Order expiry in seconds. | No | max limit is 15 min for intent expiry. |
metaInfo | Object | Merchant defined meta info to store additional information. Same data will be returned in status and callback response. | No | • For udf1 to udf10, there is no constraint. Maximum length = 256 characters • For udf11 to udf15, alphanumeric values with _-+@. are allowed. Maximum length = 50 characters Note: It is mandatory to keep the parameter names udf1, udf2, etc., exactly as they are in the metainfo block. Renaming these key values will result in a production error. |
paymentFlow | Object | Additional details required by this flow | Yes | |
deviceContext.deviceOS | String | The type of device OS. | Yes | Allowed values: • Android • iOS |
The paymentFlow object contains additional parameters, which are explained in the table below.
| Parameter Name | Data Type | Description | Mandatory | Constraints |
paymentFlow.type | String | Type of payment flow. | Yes | Allowed values = [SUBSCRIPTION_SETUP] |
paymentFlow.merchantSubscriptionId | String | Unique merchant reference subscription ID – used for subscription status. | Yes | |
paymentFlow.authWorkflowType | String | Defines the type of workflow verification whether it is TRANSACTION or PENNY DROP | Yes | Allowed values = “TRANSACTION” or “PENNY DROP” |
paymentFlow.amountType | String | Nature of redemption amount. | Yes | Possible Values : • FIXED • VARIABLE |
paymentFlow.maxAmount | Long | Max amount upto which redemptions will be allowed. | Yes | The MAXIMUM debit/redemption amount for the mandate. The amount is in Paise. Note: • For VARIABLE recurring debit, this amount would be considered as Max Cap Amount |
paymentFlow.frequency | String | Defines the Redemption Frequency. | Yes | Allowed values = • DAILY • WEEKLY • MONTHLY • FORTNIGHTLY • BIMONTHLY • QUARTERLY • HALFYEARLY • YEARLY • ONDEMAND |
paymentFlow.expireAt | DateTime | Defines Subscription cycle expiry. No operation allowed after subscription expires. (in milliseconds) | No | Default Value= 30 years |
paymentFlow.paymentMode | Object | Defines payment mode details for setup. | Yes | Allowed Value = { “type”: “UPI_INTENT” } |
paymentFlow.paymentMode.targetApp | String | Defines target app for intent payment mode. | Yes | • Android: Package Name of the UPI app. { “targetApp”: “com.phonepe.app” } • iOS: Static Values like [PHONEPE, GPAY, PAYTM, CRED, SUPERMONEY, BHIM, AMAZON] |
Response for UPI Intent
Sample Response
{
"orderId": "OMO2604141111125363306797V",
"state": "PENDING",
"intentUrl": "upi://mandate?mn=Autopay&ver=01&rev=Y&purpose=14&validityend=14042027&QRts=2026-04-14T11:11:12.582158634+05:30&QRexpire=2026-04-14T11:26:11.582158634+05:30&txnType=CREATE&am=1.00&validitystart=14042026&orgId=180001&mode=04&pa=PRODTEST1@ybl&cu=INR&amrule=MAX&fam=1.00&mc=5262&qrMedium=00&recur=ASPRESENTED&mg=ONLINE&share=Y&block=N&tr=OM2604141111125613306810V&pn=Infinity%20Prod%20Test%201",
"nativeOtpEnabled": false
}Response Parameters
| Field Name | Data Type | Description |
orderId | String | Internal order ID generated by PhonePe Payment Gateway. |
state | String | State of the order created, expected value is PENDING. |
intentUrl | String | Intent url to invoke the payment app that initiates the mandate and completes the payment. |
What’s Next?
In the next section, you will learn how to you check whether the subscription has been successfully created, is still pending user action, has failed, or is complete.