Skip to main content
POST
Charge an Unpaid Subscription
Available only for accounts enabled for the retry_then_unpaid policy, and only for card subscriptions in unpaid. The charge uses the card saved on the subscription and goes through the same checks as an automatic renewal. Choosing the cycles. cycles is required. A subscription can have several open cycles when it stayed unpaid for more than one billing period.
  • current charges one cycle, the one that covers today, and forgives the older open cycles.
  • all charges every open cycle in a single transaction, for the cycle amount times the number of open cycles. A fee passed to the buyer applies to that total.
Either way a paid charge moves the subscription along its original billing calendar, so a subscription due on the 31st stays due on the last day of each month. It returns to active when the paid cycle still covers the moment the charge is applied; read subscription.status in the response. With a single open cycle both options charge the same. GET /v2/subscriptions/{id} returns the open cycles in nextManualCharge: openCycles, the cycle that covers today (currentPeriodStart, currentPeriodEnd), the base amount of one cycle (cycleAmount) and of charging them all (allCyclesAmount), in cents. A scheduled plan change applies before the charge, so both amounts already use the new plan’s price. The response and subscription.renewed carry cyclesCharged and cyclesForgiven (cycles_charged and cycles_forgiven in the webhook). Declined charges. The subscription stays unpaid and subscription.payment_failed is sent. After a declined charge, another one for the same subscription is accepted only after 24 hours. When the card is declined for good, the response is PAYMENT_METHOD_REPLACEMENT_REQUIRED and the card has to be replaced before charging again. Charging the cycles you showed. Send expected_period_start with the start of the oldest open cycle you showed to the user or confirmed, and expected_open_cycles with how many open cycles you showed, usually nextManualCharge.periodStart and nextManualCharge.openCycles from GET /v2/subscriptions/{id}. If another charge (another screen, another integration) already settled the oldest cycle, or a new cycle opened since you read it, the request answers 409 SUBSCRIPTION_CHARGE_CYCLE_CHANGED and nothing is charged; read the subscription again to see the cycles open now. Without the fields, the cycles open at the time of the request are charged. Retries. Send idempotency_key to retry safely: the same key returns the outcome of the first request instead of charging again. A response of SUBSCRIPTION_CHARGE_INDETERMINATE means the charge did not return a result yet: the subscription stays unpaid and new charges are refused while that charge is open. If it later settles as paid, that payment is not applied to the subscription on its own: new charges answer MANUAL_CHARGE_PENDING_RESOLUTION, so the same cycle is never charged twice, until support resolves that payment.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string<uuid>
required

Public subscription id (UUID).

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$

Body

application/json
cycles
enum<string>
required

Which open cycles to charge. current charges the cycle that covers today and forgives the older open cycles; all charges every open cycle in one transaction. With one open cycle both charge the same.

Available options:
current,
all
idempotency_key
string
Required string length: 1 - 255
expected_period_start
string<date-time>

Start of the oldest open cycle you showed or confirmed (nextManualCharge.periodStart from GET by id). When another charge already settled it, the request is refused with 409 SUBSCRIPTION_CHARGE_CYCLE_CHANGED and nothing is charged.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
expected_open_cycles
integer

Number of open cycles you showed or confirmed (nextManualCharge.openCycles from GET by id). When a new cycle opened since then, the request is refused with 409 SUBSCRIPTION_CHARGE_CYCLE_CHANGED and nothing is charged.

Required range: 1 <= x <= 3660

Response

Success

success
boolean
required
requestId
string
required
data
object
required