Skip to main content
POST
Use this endpoint for win-back campaigns. Calling it returns a CANCELED or COMPLETED subscription to ACTIVE — or to TRIALING when a trial phase covers the reactivated cycle — keeping the same id and its full payment history. No successor subscription is ever created and previous_subscription_id is never set by this call. No charge is made on the call itself.
Allowlisted organizations onlyReactivation is gated per organization, and this is checked before the subscription’s status. If your calls return 409 "Subscription reactivation is not enabled for this organization.", contact your Yuno representative to have it enabled.

Which subscriptions can be reactivated

409 — status is not CANCELED or COMPLETED
A subscription whose availability.finish_at has already passed is refused with 400 INVALID_DATE, whatever its status:
400 — availability window already closed

When the billing cycles are used up

A COMPLETED subscription that used every cycle in billing_cycles.total is refused with 409 INVALID_SUBSCRIPTION_STATUS:
409 — no billing cycles left
Send billing_cycles.total with a value higher than the current one to raise the limit and reactivate in the same call. This does not create a successor — it raises the limit on the same subscription, keeping its id and history intact:
Raise the limit and reactivate
Sending billing_cycles.total: Sending billing_cycles.total for a subscription that still has cycles left is accepted the same way: it raises the limit, it is not restricted to exhausted subscriptions. An explicit billing_cycles.total: null is treated the same as omitting the field — the current total is left unchanged.

Choosing the next billing date

billing_cycle_behavior is the same axis used on resume and on plan changes.
No charge is made on the call either way. An invalid value returns 400 BAD_REQUEST — "billing_cycle_behavior must be one of KEEP, RESTART." Reactivate has no gateway-side validation of its own: the same text comes back unchanged through the gateway.
RESTART and the monthly billing dayOn a monthly subscription that had no frequency.monthly_billing_day set, RESTART stamps it to the day of the reactivation — the same rule Update Subscription and Resume Subscription apply. A subscription that already declares a billing day keeps it.

The payment method

The vaulted payment method is revalidated before the subscription is reactivated. If it is no longer enrolled, the call returns 400 PAYMENT_METHOD_STATUS_INVALID and the subscription is not modified — the payment method check runs before the status write:
400 — payment method no longer enrolled

What reactivation clears

Reactivating a subscription clears:
  • cancellation_time
  • cancellation_source
  • ending_time
  • reason
  • any scheduled cancellation (cancel_scheduled)
  • any pause that was scheduled to end on its own — a reactivated subscription never carries pause_until
The subscription.reactivate webhook fires once, carrying the reactivated subscription.

Errors

Authorizations

public-api-key
string
header
default:<Your public-api-key>
required
private-secret-key
string
header
default:<Your private-secret-key>
required

Path Parameters

subscription_id
string
required

The unique identifier of a subscription.

Body

application/json
billing_cycle_behavior
enum<string>

RESTART re-anchors the next charge to now plus the subscription's frequency (and stamps frequency.monthly_billing_day on a monthly subscription that had none). KEEP or omitted: the stored anchor is left untouched while it is still in the future, otherwise rolled forward to its next future occurrence. No charge is made on the call either way.

Available options:
KEEP,
RESTART
Example:

"RESTART"

billing_cycles
object

Raises the subscription's cycle limit so it can be reactivated. Only the nested total is allowed.

Response

200

id
string
Example:

"7304911d-5df9-429e-8488-ad41abea1a4c"

name
string
Example:

"sub_001"

description
string | null
Example:

"streaming service"

account_id
string
Example:

"2404911d-5df9-429e-8488-ad41abea1a4b"

country
string

The subscription's country (ISO 3166-1 alpha-2).

Example:

"US"

merchant_reference
string
Example:

"001_marzo_23"

soft_descriptor
string | null
Example:

"ACME SUBSCRIPTION"

status
string
Example:

"ACTIVE"

amount
object
frequency
object
billing_cycles
object
current_period_start
string | null

Start of the billing period the subscription is currently in, one cadence before current_period_end. Inside a trial or any other plan phase it follows that phase's cadence. A terminal subscription (CANCELED or COMPLETED) keeps its final window rather than going null. Null only for a subscription with no recurring cadence. Always returned together with current_period_end.

Example:

"2023-01-16T20:00:00.912480Z"

current_period_end
string | null

End of the billing period the subscription is currently in. Equal to billing_cycles.next_at. Always returned together with current_period_start.

Example:

"2023-02-16T20:00:00.786342Z"

billing_date
object | null

Only present on subscriptions billed on a fixed date instead of a frequency; mutually exclusive with frequency.

customer_payer
object
payment_method
object
availability
object
retries
object | null

The retry policy applied when a recurring charge is declined. See Retries.

trial_period
object
metadata
object[] | null
additional_data
object | null

The optional order enrichment sent at creation, echoed back. See The Subscription Object for its full shape.

initial_payment_validation
boolean

Whether the subscription waited for its first payment to succeed before activating. false by default.

Example:

false

reason
string | null

Free-form reason for the subscription's current status, when one was recorded; null otherwise.

Example:

"merchant request"

renewal_notification_days
integer | null

How many days before the next billing date the subscription.close_to_renewal webhook is sent. null means no renewal notification is sent.

Example:

3

payments
string[]
subscription_agreement_id
string | null
Example:

"sa_6af2dfcd-44c0-4f16-a331-8bed3ed9c9fa"

cancellation_time
string | null

When the subscription was canceled. Only set once it reaches CANCELED; null otherwise.

Example:

"2023-12-16T20:46:54.786342Z"

cancellation_source
string | null

What triggered the cancellation: MERCHANT, SYSTEM, PLAN_CHANGE or RETRIES_EXHAUSTED. Only set once the subscription reaches CANCELED; null otherwise. Treat as open-ended — handle unrecognized values gracefully.

Example:

"MERCHANT"

ending_time
string | null

When the subscription completed or expired. Only set once it reaches COMPLETED; null otherwise.

Example:

"2024-12-16T20:46:54.786342Z"

plan_id
string

Only present when the subscription is linked to a plan.

Example:

"00000000-0000-4000-8000-000000000001"

plan_assigned_at
string

Only present on plan-linked subscriptions. The moment the plan was attached — at creation from a plan, migration onto a plan, or a plan change.

Example:

"2023-12-16T20:46:54.786342Z"

previous_subscription_id
string | null

Only present when this subscription was created by a plan change (switching an existing subscription to a different plan).

phases
object[]

The linked plan's phase definitions, as the plan declares them — including the terminal REGULAR phase. Only present on plan-linked subscriptions whose plan has phases. This is the plan's own ladder, not this subscriber's snapshot: for what was pinned for this subscription at creation, use billing_phases.

current_phase
string

Only present on plan-linked subscriptions.

Example:

"REGULAR"

current_phase_end
string | null

When the phase named by current_phase hands over to the next one — for a subscription in its trial, when it switches to the regular price. End of the last billing period the phase covers, so on the final period of a trial it equals current_period_end. Null for a subscription with no plan and for one that already left the phase ladder.

Example:

"2023-03-16T20:00:00.786342Z"

billing_phases
object[]

Only present on plan-linked subscriptions whose plan has phases. Contains the leading TRIAL phases only, snapshotted at creation — the terminal REGULAR phase is never included, since its price isn't pinned and instead resolves from the plan at every billing. current_phase: "REGULAR" is how you know the ladder is exhausted.

pending_plan_change
object | null

The plan change scheduled for the next billing cycle, or null when none is pending. Schedule one with the plan_change block on Update Subscription.

created_at
string
Example:

"2023-12-16T20:46:54.786342Z"

updated_at
string
Example:

"2023-12-16T21:00:54.786342Z"

refund_rule
object

The stored refund rule used to resolve a CUSTOM cancel refund when the cancel request sends no refund_amount of its own. Present only when one is configured; omitted, not null, otherwise. Available to organizations enabled for it; contact Yuno.

pause_until
string

When the subscription is scheduled to resume automatically. Present only on a subscription currently paused with a duration (pause_cycles or pause_until sent at pause); absent, not null, on every other read.

Example:

"2026-10-15T15:54:22.780166Z"

cancel_scheduled
object | null

null when no cancellation is pending.

refund
object | null

null when refund was NONE or omitted. Present on the cancel response and on every later read once computed.

unpaid_cycle
object

Present only when the current billing cycle is PAST_DUE and has not settled.