Manage billing cycles
A recurring billing cycle provides visibility into the individual billing events generated for a recurring payment. Use these endpoints to retrieve billing cycle details, monitor payment and retry activity, manage billing cycle status, manually collect past-due payments, and issue full or partial refunds when needed.
Retrieve a specific billing cycle
HTTP method: GET
Endpoint: /billing-cycles/{billingCycleId}
Scenario: Retrieving billing cycles by billingCycleId
Response:
{
"billingCycleId": "23723e8e-9e5f-4b16-9fe6-00b13a8fc44c",
"billingStatus": "SCHEDULED",
"createdAt": "2026-09-10T14:58:32.573177Z",
"currencyCode": "USD",
"cycleNumber": 1,
"periodEndDate": "2026-10-09",
"periodStartDate": "2026-09-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"retryCount": 0,
"scheduledAmount": 3499,
"scheduledDate": "2026-09-10",
"taxAmount": 0,
"totalRefundAmount": 0,
"updatedAt": "2026-09-10T14:58:32.655582Z"
}Retrieve a list of billing cycles
Use the following filters to customize your search:
| Filter | Description |
|---|---|
startDate |
Include cycles whose scheduledDate is on or after this date. |
endDate |
Include cycles whose scheduledDate is on or before this date |
pageNumber |
Zero-based page index. Default 0. |
pageSize |
Records per page. Default 20; valid range 1-100 |
status |
Filter by billingStatus field. Allowed values - SCHEDULED, PROCESSING, PAID, FAILED, PAST_DUE, SKIPPED, REFUNDED, PARTIALLY_REFUNDED, ROLLED_OVER, CANCELLED. |
sortOrder |
Defines the direction in which the result set is displayed. Default is scheduledDate, DESC. |
HTTP method: GET
Endpoint: /billing-cycles
Scenario: Retrieving list of billing cycles
Response:
{
"billingCycles": [
{
"billingCycleId": "ca3a84bf-9603-48bd-aee4-fe1785d8505f",
"billingStatus": "SCHEDULED",
"createdAt": "2026-09-10T15:10:30.946756Z",
"currencyCode": "USD",
"cycleNumber": 7,
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"retryCount": 0,
"scheduledAmount": 2999,
"scheduledDate": "2027-03-10",
"totalRefundAmount": 0,
"updatedAt": "2026-09-10T15:10:30.946756Z"
},
{
"billingCycleId": "342cec58-b814-4bea-b60d-b67b0dfa42b9",
"billingStatus": "SCHEDULED",
"createdAt": "2026-09-10T15:08:17.310923Z",
"currencyCode": "USD",
"cycleNumber": 6,
"periodEndDate": "2027-03-09",
"periodStartDate": "2027-02-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"retryCount": 0,
"scheduledAmount": 2999,
"scheduledDate": "2027-02-10",
"taxAmount": 0,
"totalRefundAmount": 0,
"updatedAt": "2026-09-10T15:08:17.310923Z"
},
{
"billingCycleId": "4a9e7e96-0954-4721-a876-1a2d567899ba",
"billingStatus": "SKIPPED",
"createdAt": "2026-09-10T14:58:32.722069Z",
"currencyCode": "USD",
"cycleNumber": 5,
"note": "Skipped per customer request",
"periodEndDate": "2027-02-09",
"periodStartDate": "2027-01-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"retryCount": 0,
"scheduledAmount": 2999,
"scheduledDate": "2027-01-10",
"statusLastUpdatedAt": "2026-09-10T15:10:30.956056Z",
"taxAmount": 0,
"totalRefundAmount": 0,
"updatedAt": "2026-09-10T15:10:30.956646Z"
}
],
"pageNumber": 0,
"pageSize": 20
}Refund a billing cycle
Preconditions
- Cycle status must be
PAIDorPARTIALLY_REFUNDED. - Cycle must contain the original transaction ID.
- The requested amount must not exceed:
- The cycle amount minus previous refunds, or
- The remaining prorated refund, when a proration limit exists.
The following fields are required for refunds:
| Field | Rules |
|---|---|
refundAmount |
Integer greater than zero. |
currencyCode |
Supported ISO currency enum such as USD, EUR, or GBP. |
- Full refund: Refund the entire remaining refundable amount. The cycle becomes
REFUNDED. - Partial refund: Refund less than the remaining amount. The cycle becomes
PARTIALLY_REFUNDED. - Additional partial refund: A
PARTIALLY_REFUNDEDcycle remains eligible for additional refunds while a refundable balance remains. - Prorated cancellation refund: If cancellation established a prorated cap, cumulative refunds cannot exceed that cap.
- Invoice update: When an invoice exists, the refund amount is applied to it.
- External payment processing: The service sends a refund request referencing the original payment transaction.
HTTP method: POST
Endpoint: /billing-cycles/{billingCycleId}/refunds
Scenario: Refund part of a successfully paid billing cycle.
Request:
{
"currencyCode": "USD",
"refundAmount": 2999
}Response:
{
"billingCycleId": "23723e8e-9e5f-4b16-9fe6-00b13a8fc44c",
"billingStatus": "PARTIALLY_REFUNDED",
"collectionMethod": "MANUAL",
"createdAt": "2026-09-10T14:58:32.573177Z",
"currencyCode": "USD",
"cycleNumber": 1,
"note": "Manual retry after payment method update",
"periodEndDate": "2026-10-09",
"periodStartDate": "2026-09-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"remainingRefundableAmount": 500,
"retryCount": 1,
"scheduledAmount": 3499,
"scheduledDate": "2026-09-10",
"statusLastUpdatedAt": "2026-09-10T15:08:16.788378Z",
"taxAmount": 0,
"totalPaidAmount": 3499,
"totalRefundAmount": 2999,
"transactionDate": "2026-09-10",
"transactionId": "38f1f374-147f-439c-82c1-f50cebb0ac7a",
"updatedAt": "2026-09-10T15:08:23.133870Z"
}Perform a lifecycle action on a billing cycle
You can perform the following lifecycle actions:
| Action | Description | Conditions |
|---|---|---|
| SKIP | Skips the billing cycle without processing a payment. |
|
| ROLLOVER | Moves the billing cycle to a future date. |
|
| RESUME | Resumes a previously skipped or modified cycle. |
|
| RESCHEDULE | Reschedules a scheduled cycle. |
|
HTTP method: POST
Endpoint: /billing-cycles/{billingCycleId}/actions
Scenario: Skip a billing cycle
Request:
{
"billingCycleAction": "SKIP",
"note": "Skipped per customer request"
}Response:
{
"billingCycleId": "4a9e7e96-0954-4721-a876-1a2d567899ba",
"billingStatus": "SKIPPED",
"createdAt": "2026-09-10T14:58:32.722069Z",
"currencyCode": "USD",
"cycleNumber": 5,
"note": "Skipped per customer request",
"periodEndDate": "2027-02-09",
"periodStartDate": "2027-01-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"retryCount": 0,
"scheduledAmount": 2999,
"scheduledDate": "2027-01-10",
"statusLastUpdatedAt": "2026-09-10T15:10:30.956056Z",
"taxAmount": 0,
"totalRefundAmount": 0,
"updatedAt": "2026-09-10T15:10:30.956646Z"
}Collect a past-due billing cycle
The following fields are required for collection.
| Fields | Description |
|---|---|
recurringPaymentId |
Recurring-payment unique identifier (UUID). |
billingCycleId |
Billing-cycle UUID. |
merchant-id |
Merchant that owns the billing cycle. |
paymentMethod |
Payment method for the recurring payment. |
paymentMethod.consumerProfile |
Consumer profile and payment method information used for the recurring payment. |
currencyCode |
Specifies the currency using the ISO 4217 code, such as USD, EUR, or GBP. |
pastDueAmount |
Total past-due amount owed for the billing cycle. The pastDueAmount value equals the sum of scheduledAmounts and taxAmount. |
HTTP method: POST
Endpoint: /billing-cycles/{billingCycleId}/collections
Scenario: Manually initiate collection for a past-due billing cycle.
Request:
{
"pastDueAmount": 3499,
"currencyCode": "USD",
"note": "Manual retry after payment method update",
"paymentMethod": {
"consumerProfile": {
"consumerProfileId": "{{consumerProfileId}}",
"paymentMethodId": "{{paymentMethodId}}"
}
}
}Response:
{
"billingCycleId": "23723e8e-9e5f-4b16-9fe6-00b13a8fc44c",
"billingStatus": "PAID",
"collectionMethod": "MANUAL",
"createdAt": "2026-09-10T14:58:32.573177Z",
"currencyCode": "USD",
"cycleNumber": 1,
"note": "Manual retry after payment method update",
"paymentStatus": "APPROVED",
"periodEndDate": "2026-10-09",
"periodStartDate": "2026-09-10",
"planId": "5dc33cfa-e970-42bd-9962-c231acbaf592",
"recurringPaymentId": "c8b06947-f299-41b9-92af-04973be05d17",
"remainingRefundableAmount": 3499,
"retryCount": 1,
"scheduledAmount": 3499,
"scheduledDate": "2026-09-10",
"statusLastUpdatedAt": "2026-09-10T15:08:16.788378Z",
"taxAmount": 0,
"totalPaidAmount": 3499,
"totalRefundAmount": 0,
"transactionDate": "2026-09-10",
"transactionId": "38f1f374-147f-439c-82c1-f50cebb0ac7a",
"updatedAt": "2026-09-10T15:08:17.451608Z"
}