Manage recurring plans
Managing a recurring plan allows you to control the details of the goods or services you offer, the amount to be charged, and the frequency at which the consumer is charged (billing cycle).
Before you begin
Refer to recurring plans to learn about the Recurring Billing API features and how to customize plans for your business.
Create a recurring plan
Create a recurring plan by sending a POST request to the /plans endpoint using the following required fields.
| Field name | Description |
|---|---|
billingFrequencyCount |
The number of times the plan is billed during the selected billing frequency. |
billingFrequencyUnit |
Selection of a billing frequency option. The valid values are:
Create a quarterly recurring plan with Create a biweekly recurring plan with |
currencyCode |
Represents a unique identifier for currencies, as assigned by the ISO 4217 specification. It must also be supported by your configured presentment currencies. |
planAmount |
Monetary value charged during each billing cycle of a recurring payment. |
planName |
Uniquely identifies a plan that you manage for a recurring payment, including plan pricing and plan billing frequency. |
planType |
Identifies the recurring billing model associated with the plan. Determines trial, renewal, and enrollment behavior. The following plan types are supported:
|
HTTP method: POST
Endpoint: /plans
Scenario: Create a monthly subscription with a trial
Request:
{
"merchantPlanId": "PDP-PLAN-1789063578",
"planName": "PDP Monthly Premium",
"planStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"planAmount": 2999,
"currencyCode": "USD",
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"billingDayOfMonth": 1,
"autoRenew": true,
"totalBillingCycleCount": 12,
"setupFeeAmount": 0,
"trialConfiguration": {
"trialDays": 14,
"requiresPaymentMethod": true,
"maxTrialsPerCustomer": 1,
"offerStartDate": "2026-07-01",
"offerEndDate": "2026-12-31",
"reminderDaysBefore": 3,
"subscriptionActivateInd": true
}
}Response:
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T18:06:18.891022Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789063578",
"planAmount": 2999,
"planId": "d1ae9795-1dfa-44c8-93c0-b0914b12c0f6",
"planName": "PDP Monthly Premium",
"planResponseStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T18:06:18.890842Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T18:06:18.930083Z"
}Update a recurring plan
You can update an existing plan by sending a PATCH request to the /plans endpoint.
HTTP method: PATCH
Endpoint: /plans/{planId}
Scenario: Update a draft plan with the planAmount
Request:
{
"planName": "PDP Monthly Premium - Updated",
"planAmount": 3599,
"currencyCode": "USD",
"autoRenew": true,
"totalBillingCycleCount": 12
}Response:
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T14:11:16.984805Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789049476",
"planAmount": 3599,
"planId": "f6365310-4152-47f3-8a2c-4d05e24e1d3b",
"planName": "PDP Monthly Premium - Updated",
"planResponseStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T18:27:48.173239Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T18:27:48.206240Z"
}Retrieve a list of plans
Retrieve the details of recurring plans by sending a GET request to the /plans endpoint.
Use the following filters to customize your search:
| Filter | Description |
|---|---|
currencyCode |
Exact ISO 4217 currency code. |
merchantPlanId |
Filter by merchant-provided plan ID. |
pageNumber |
Zero-based page index. Default 0. |
pageSize |
Records per page. Default 20; valid range 1-100 |
planAmount |
Exact plan amount in minor currency units. |
status |
Filter by planResponseStatus field. Allowed values — DRAFT, ACTIVE, ARCHIVED. |
sortOrder |
Defines the direction in which the result set is displayed. Default is createdAt, DESC. |
HTTP method: GET
Endpoint: /plans
Scenario: Retrieve a list of plans by filtering the status field to DRAFT. The response includes all plans with planResponseStatus set to DRAFT.
Response:
{
"pageNumber": 0,
"pageSize": 20,
"recurringPlanList": [
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T18:06:18.891022Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789063578",
"planAmount": 2999,
"planId": "d1ae9795-1dfa-44c8-93c0-b0914b12c0f6",
"planName": "PDP Monthly Premium",
"planResponseStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T18:06:18.890842Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T18:06:18.930083Z"
},
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T13:42:28.313548Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789047748",
"planAmount": 2999,
"planId": "189416a7-768b-4291-a99a-cddb4dfba680",
"planName": "PDP Monthly Premium",
"planResponseStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T13:42:28.313350Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T13:42:28.366193Z"
}
]
}Retrieve a specific plan
You can retrieve the details of recurring plans by sending a GET request to the /plans endpoint.
HTTP method: GET
Endpoint: /plans/{planId}
Scenario: Retrieve a specific plan
Response:
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T14:11:16.984805Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789049476",
"planAmount": 3599,
"planId": "f6365310-4152-47f3-8a2c-4d05e24e1d3b",
"planName": "PDP Monthly Premium - Updated",
"planResponseStatus": "ACTIVE",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T18:23:15.652294Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T18:23:15.674810Z"
}Perform a lifecycle action on a plan
Recurring billing supports the following lifecycle actions on a plan.
| Lifecycle actions | Description | Allowed current status | Resulting status | Additional restrictions |
|---|---|---|---|---|
| ACTIVATE | Makes a draft plan available for recurring-payment enrollment. |
|
ACTIVE |
Fails if already ACTIVE. An ARCHIVED plan cannot be activated. |
| DEACTIVATE | Removes an active plan from use and returns it to DRAFT. | ACTIVE |
DRAFT |
All associated recurring payments must be terminal. |
| ARCHIVE | Permanently retires a plan. | DRAFT or ACTIVE |
ARCHIVED |
All associated recurring payments must be terminal. Already archived plans fail. ARCHIVED is terminal and cannot be activated or deactivated. |
HTTP method: POST
Endpoint: /plans/{planId}/actions?recurringPlanStatusCode=DEACTIVATE
Scenario: Deactivate a plan so it moves from ACTIVE to DRAFT
Response:
{
"autoRenew": true,
"billingDayOfMonth": 1,
"billingFrequencyCount": 1,
"billingFrequencyUnit": "MONTH",
"createdAt": "2026-09-10T13:22:39.759045Z",
"currencyCode": "USD",
"merchantPlanId": "PDP-PLAN-1789046559",
"planAmount": 3499,
"planId": "cae24ef6-3a75-47b8-80bd-4dbb73dd2c38",
"planName": "PDP Monthly Premium - Updated",
"planResponseStatus": "DRAFT",
"planType": "SUBSCRIPTION",
"setupFeeAmount": 0,
"statusLastUpdatedAt": "2026-09-10T13:23:24.345840Z",
"totalBillingCycleCount": 12,
"trialConfiguration": {
"maxTrialsPerCustomer": 1,
"offerEndDate": "2026-12-31",
"offerStartDate": "2026-07-01",
"reminderDaysBefore": 3,
"requiresPaymentMethod": true,
"subscriptionActivateInd": true,
"trialDays": 14
},
"updatedAt": "2026-09-10T13:23:24.358920Z"
}