CommetCommet
GitHubDiscordStatus
Adjust balance POSTApply an Offer to a subscription PUTCancel subscription POSTChange plan POSTCreate a recovery payment link for a past due subscription POSTCreate subscription POSTGet active subscription GETGet subscription by ID GETList subscriptions GETPause subscription POSTPreview plan change POSTReactivate a past due or canceled subscription POSTRemove an Offer from a pending checkout DELETEResume subscription POSTRevoke scheduled pause DELETETop up balance POSTRevert scheduled cancellation POSTUpdate payment method POSTUpdate subscription pause PATCH
DocumentaciónRecursosConstruir con AIAPI ReferenceWebhooks

Preview plan change

Preview proration details for an immediate plan change without applying it. Free-to-paid changes are never scheduled and the change-plan endpoint always returns hosted checkout for them. For paid plans, interval direction takes precedence: a longer interval is immediate and a shorter interval is scheduled. When the interval is unchanged, a higher-sort-order plan is immediate and a lower-sort-order plan is scheduled. A paid-to-free change is always scheduled. Returns credit, charge, and net amount. The target plan must belong to the same plan group as the current plan, otherwise a 400 with code `plans_not_in_same_group` is returned. A change between two free plans has nothing to prorate and returns a zero-amount estimate. Scheduled changes return a 400 with code `plan_change_scheduled`; apply those via the change-plan endpoint. Pass offerId to quote the destination plan with an Offer.

POST
/subscriptions/{id}/preview-change

Preview proration details for an immediate plan change without applying it. Free-to-paid changes are never scheduled and the change-plan endpoint always returns hosted checkout for them. For paid plans, interval direction takes precedence: a longer interval is immediate and a shorter interval is scheduled. When the interval is unchanged, a higher-sort-order plan is immediate and a lower-sort-order plan is scheduled. A paid-to-free change is always scheduled. Returns credit, charge, and net amount. The target plan must belong to the same plan group as the current plan, otherwise a 400 with code plans_not_in_same_group is returned. A change between two free plans has nothing to prorate and returns a zero-amount estimate. Scheduled changes return a 400 with code plan_change_scheduled; apply those via the change-plan endpoint. Pass offerId to quote the destination plan with an Offer.

Authorization

ApiKeyAuth
x-api-key<token>

In: header

Path Parameters

id*string

Header Parameters

Idempotency-Key?string

Unique key used to safely retry this write for 24 hours without applying it twice.

Length1 <= length <= 200

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/subscriptions/string/preview-change" \  -H "Content-Type: application/json" \  -d '{    "planId": "string"  }'
{  "currency": "usd",  "currentPlanCredit": 2000,  "newPlanCharge": 4000,  "estimatedTotal": 2000,  "effectiveDate": "2026-09-07T12:00:00.000Z",  "daysRemaining": 30,  "totalDays": 30,  "isUpgrade": true,  "object": "plan_change_preview",  "livemode": false}
{  "error": {    "type": "validation_error",    "code": "validation_error",    "message": "The request contains an invalid parameter.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/validation_error.md"  }}
{  "error": {    "type": "authentication_error",    "code": "unauthorized",    "message": "A valid API key is required.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/unauthorized.md"  }}
{  "error": {    "type": "authentication_error",    "code": "forbidden",    "message": "You do not have permission to perform this operation.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/forbidden.md"  }}
{  "error": {    "type": "not_found_error",    "code": "not_found",    "message": "The requested resource was not found.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/not_found.md"  }}
{  "error": {    "type": "conflict_error",    "code": "idempotency_in_progress",    "message": "A request with this idempotency key is still being processed.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/idempotency_in_progress.md"  }}
{  "error": {    "type": "rate_limit_error",    "code": "rate_limited",    "message": "Too many requests. Retry after the interval specified in the Retry-After header.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/rate_limited.md"  }}
{  "error": {    "type": "internal_error",    "code": "internal_error",    "message": "An unexpected error occurred while processing the request.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/internal_error.md"  }}
{  "error": {    "type": "internal_error",    "code": "idempotency_unavailable",    "message": "Idempotency storage is temporarily unavailable. Retry with the same idempotency key.",    "doc_url": "https://commet.co/docs/api-reference/2026-08-27/errors/idempotency_unavailable.md"  }}

Pause subscription POST

Pause immediately or schedule a pause for the end of the current billing or trial period. Set durationDays to null for an indefinite pause.

Reactivate a past due or canceled subscription POST

Reactivates a subscription. A past_due subscription retries its outstanding renewal charge (recovering to active on success). A canceled subscription generates a fresh invoice, charges the saved card, and resets the billing period. On a successful charge the subscription becomes active; a declined charge returns an error with a recoveryUrl in the error details that can be sent to the customer to update their card. A canceled subscription may apply an Offer by offerId; past-due recovery cannot.

planId*string
Length1 <= length
billingInterval?string

Value in

  • "weekly"
  • "monthly"
  • "quarterly"
  • "yearly"
  • "one_time"
offerId?string
Length1 <= length