Cancel subscriptions

Ends a subscription.

POST /v1/billing/subscriptions/{id}/cancel

Addresshttps://api.hanzo.ai/v1/billing/subscriptions/{id}/cancel
MethodPOST
OperationcancelSubscription
AuthAuthorization: Bearer $HANZO_API_KEY

Ends a subscription.

It cancels at the END OF THE PAID PERIOD by default, because a customer who cancels has already paid for the period they are in and taking it away is taking money for nothing. atPeriodEnd: false ends it at once, which is the caller asking for that.

A subscription from another org is not found rather than refused, so an id cannot be probed for existence.

A named handler, not a closure, so zipdoc can lift this prose into the registry.

Request

3 fields, body application/json (required).

FieldInTypeRequiredDescription
idpathstringyes
atPeriodEndbodyboolean—AtPeriodEnd cancels at the end of the paid period rather than at once.
idbodystring—

Response

StatusBodyMeaning
200billing.Subscriptionok
defaultproblem-detailsrefused

200 body — 26 fields.

FieldInTypeAlwaysDescription
cancelAtPeriodEndbodyboolean—CancelAtPeriodEnd reports that the plan ends at CurrentPeriodEnd.
canceledAtbodystring—CanceledAt is when it was canceled; absent when it was not.
chargedCentsbodyinteger (int64)—ChargedCents is what the period in hand was actually paid, after any discount and net of refunds.
createdAtbodystring—CreatedAt is when the row was written, RFC 3339.
currentPeriodEndbodystring—CurrentPeriodEnd is when it ends, RFC 3339.
currentPeriodStartbodystring—CurrentPeriodStart is when the period in hand began, RFC 3339.
defaultPaymentMethodbodystring—DefaultPaymentMethod is the saved method a renewal would use.
endedAtbodystring—EndedAt is when it ended; absent while it runs.
idbodystring—ID is the subscription's own id, the one cancel and reactivate take.
mrrCentsbodyinteger (int64)—MRRCents is what this subscription contributes per month — commerce's own figure, interval-normalized and multiplied by its seats, so no reader re-derives it from price and interval.
planbodybilling.SubscriptionPlan—
plan.currencybodystring—Currency is the ISO code the price is in, lower-cased.
plan.idbodystring—ID is the plan row the subscription was opened on.
plan.intervalbodystring—Interval is the billing period: "month" or "year".
plan.namebodystring—Name is the plan's display name, e.g. "Max 20x".
plan.pricebodyinteger (int64)—Price is what one period costs per seat, in cents, as the subscription snapshotted it: a later catalog price change does not move it.
planIdbodystring—PlanID is the plan slug, e.g. "max-20x".
providerTypebodystring—ProviderType is who collects it: a processor ("square"), "credit" for a plan bought with credits, "internal" or "bundle" for a row nobody paid for.
quantitybodyinteger (int64)—Quantity is the seat count; a flat plan holds 1.
seatsbodyinteger (int64)—Seats is the seat count the period in hand was paid for — its paid invoice's quantity, or the quantity recorded with an external period — never the row's live Quantity, which the holder may change.
settledbodystring—Settled is how the period in hand was paid: "card" (a card paid all of it), "external:<processor>" (a payment recorded as collected outside commerce), "balance", "credit" or "mixed" (prepaid money).
statusbodystring—Status is trialing, active, past_due, canceled or unpaid.
trialEndbodystring—TrialEnd is when that trial ends; absent when there was none.
trialStartbodystring—TrialStart is when a trial began; absent when there was none.
updatedAtbodystring—UpdatedAt is when the row last changed, RFC 3339.
userIdbodystring—UserID is the billing account that holds it: the org slug for an org's own plan, "<org>/<name>" for a member's.

Failure carries the platform error shape — see Errors.

Examples

hanzo billing subscriptions cancel <id>
import { Configuration, BillingApi } from 'hanzoai';

const api = new BillingApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.cancelSubscription({ id: 'id', atPeriodEnd: false, id: "<id>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import BillingApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = BillingApi(client).cancel_subscription(id='id', at_period_end=False, id="<id>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.BillingAPI.CancelSubscription(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, billing_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = billing_api::cancel_subscription(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.BillingApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new BillingApi(client).cancelSubscription();
curl -X POST https://api.hanzo.ai/v1/billing/subscriptions/<id>/cancel \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "atPeriodEnd": false,
       "id": "<id>"
     }'

Tool billing, op cancelSubscription — POST the JSON-RPC envelope to https://api.hanzo.ai/v1/mcp.

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "billing",
         "arguments": {
           "op": "cancelSubscription",
           "input": {
             "id": "<id>",
             "atPeriodEnd": false
           }
         }
       }
     }'

Billing API · All Hanzo APIs · Interactive reference

Was this page useful?