Notify Redemption
Once the subscription is set up, the next step is to collect the redemption amount based on the selected subscription cycle.
Redemption involves two steps:
- Notify: Inform the user about the upcoming payment.
- Execute: Debit the redemption amount from the user.
⚠️ Validate Subscription State Before Notify!
Always verify that the subscription is in the ACTIVE state using the Subscription Status API before calling the Notify API, to prevent avoidable failures.
⚠️ Validate Subscription State Before Notify!
- When
paymentFlow.redemptionRetryStrategyis set to CUSTOM:- Merchants must retry until a terminal status (
COMPLETEDorFAILED) is reached. - You are limited to one initial attempt and three retries over a maximum of 48 hours.
- Retries must be executed only during the non peak periods – 9:31 PM to 9:59 AM and 1:01 PM to 4:59 PM
- Merchants must retry until a terminal status (
- When
paymentFlow.redemptionRetryStrategyis set to STANDARD:- PhonePe will automatically handle all internal redemption retries for you.
- Retries are managed internally by PhonePe, with a maximum time window of 48 hours to achieve a terminal status.
- Retries must be executed only during the non peak periods – 9:31 PM to 9:59 AM and 1:01 PM to 4:59 PM
- No action or changes are required from the merchant.
- Default Value: STANDARD.
Environment
| Environment | HTTP Method | API |
| Sandbox | POST | https://api-preprod.phonepe.com/apis/pg-sandbox/subscriptions/v2/notify |
| Production | POST | https://api.phonepe.com/apis/pg/subscriptions/v2/notify |
Request
Request Headers
| Header Name | Header Value |
Content-Type | application/json |
Authorization | O-Bearer <merchant-auth-token> |
Request Parameters
| Parameter Name | Data Type | Description | Mandatory (Yes/No) | Constraints |
| String | Unique order ID generated by the Merchant. | Yes | • Maximum length is 63 characters. • Only underscore (_) and hyphen (-) are allowed as special characters. |
| Long | Order amount specified in paisa. | Yes | The maximum debit or redemption amount allowed for the mandate, specified in paisa. Note: • For variable recurring debits, this acts as the maximum cap amount. • For PENNY_DROP flow, the amount must be ≥ 200 paisa. • For TRANSACTION flow, the amount must be ≥ 100 paisa. |
| DateTime | The expireAt value is the epoch timestamp (in milliseconds) after which the order will automatically fail or be skipped if it hasn’t reached a terminal state. | No | Default Value: 48hrs |
paymentFlow.type | String | Type of payment flow. | Yes | Possible Values: SUBSCRIPTION_REDEMPTION |
paymentFlow.merchantSubscriptionId | String | The merchant reference subscription ID provided during the setup of the subscription. | Yes | |
paymentFlow.redemptionRetryStrategy | redemptionRetryStrategy specifies the approach to be followed if redemption attempts fail. It determines whether and how the system should retry the transaction. | No | Possible Values: • STANDARD – Automatic retries will be handled internally by the system. • CUSTOM – The merchant is responsible for retrying the redemption. Default Value – STANDARD | |
paymentFlow.autoDebit | For CUSTOM redemptionRetryStrategy, auto-debit redemption cannot occur 24 hours after a successful notification. | No | Possible Values: • true • false Default Value: false | |
metaInfo | No | Default Value: null |
Sample Request
{
"merchantOrderId": "MO1709025691805",
"amount": 1000,
"expireAt": 1620891733101,
"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>
}
"paymentFlow": {
"type": "SUBSCRIPTION_REDEMPTION",
"merchantSubscriptionId": "MS121312",
"redemptionRetryStrategy": "CUSTOM",
"autoDebit": true
}
}Sample Request in CURL
curl --location 'https://api-preprod.phonepe.com/apis/pg-sandbox/subscriptions/v2/notify' \
--header 'Accept: application/json' \
--header 'Authorization: O-Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHBpcmVzT24iOjE3MTIyNTM2MjU2NDQsIm1lcmNoYW50SWQiOiJWMlNVQlVBVCJ9.7aVzYI_f_77-bBicEcRNuYx093b2wCsgl_WFNkKqAPY' \
--header 'Content-Type: application/json' \
--data '{
"merchantOrderId": "MO1709025691805",
"amount": 1000,
"expireAt": 1620891733101,
"paymentFlow": {
"type": "SUBSCRIPTION_REDEMPTION",
"merchantSubscriptionId": "MS121312",
"redemptionRetryStrategy": "CUSTOM",
"autoDebit": true
}
}Response
Sample Response
{
"orderId" : "OMO12344",
"state" : "NOTIFICATION_IN_PROGRESS",
"expireAt": 1707116484762
}Response Parameters
| Parameter Name | Description |
| Payment Gateway generated internal order ID |
| Order state |
expireAt | Expiry in Epoch Timestamp(in milliseconds) |
Try it yourself!
headers
body params
What’s Next?
Now that you’ve learned how to collect the redemption amount based on the selected subscription cycle, let’s move on to how the amount is executed and debited from the user’s bank account.