---
title: "Reactivate Plan"
method: POST
path: "/api/v1/payments/reactivate_plan"
tags: ["Billing"]
---

# Reactivate Plan

`POST /api/v1/payments/reactivate_plan`

Reactivate a previously canceled subscription.

Returns the fresh `SubscriptionInfo` after reactivation so callers can
avoid a follow-up fetch. Raises `NO_CANCELABLE_SUBSCRIPTION` if there is
no active subscription to reactivate.

## Response `200`

Successful Response

- SubscriptionInfo
  - `status` 'none' | 'autorenew' | 'canceled' | 'expired' | 'trial' | 'trial_canceled', required — Current subscription status. `none` = never subscribed, `autorenew` = active and renewing, `canceled` = active until period end, `expired` = no longer active, `trial` = in free trial, `trial_canceled` = trial that will not convert.
  - `plan` 'free' | 'pro' | 'pro_gifted' | 'pro_legacy', required — Plan tier the user is currently on.
  - `expiration_date` string, nullable, required — Date the current paid period ends, in `YYYY-MM-DD` format.
  - `activation_method` 'stripe' | 'appstore' | 'playstore' | 'teams' | 'manual', required — How the active subscription was purchased.
  - `plan_price` PlanPrice, required
    - `amount` string, required — Formatted plan price amount.
    - `raw_amount` number, required — Raw plan price amount in the currency's smallest unit.
    - `currency` string, required — ISO 4217 currency code.
    - `billing_cycle` 'monthly' | 'yearly', nullable, required — Billing cycle for the plan price, or `null` if unknown.
    - `tax_behavior` 'exclusive' | 'inclusive' | 'unspecified', required — Tax behavior for the plan price.
  - `billing_portal_url` string, nullable, required — One-time URL to the Stripe customer portal, if available.
  - `billing_portal_switch_to_annual_url` string, nullable, required — One-time URL to a Stripe portal flow for switching from monthly to annual billing, if eligible.
  - `has_billing_portal` boolean, required — `true` when the user has a Stripe customer with a portal session.
  - `has_billing_portal_switch_to_annual` boolean, required — `true` when a switch-to-annual flow is available in Stripe.
  - `invoice_credit_balance` object, nullable, required — Stripe customer credit balance, keyed by ISO 4217 currency code, with values in the smallest currency unit (e.g. cents).
  - `has_switch_legacy_to_current` boolean, required — `true` when the user is eligible to switch from a legacy Pro price to the current one.

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found

---

[API](https://skmtc.net/todoist/apis/todoist-api.md) · [All operations](https://skmtc.net/todoist/apis/todoist-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/todoist/todoist-api/revisions/69a962f1578f/schema)
