Subscriptions
A customer on a plan, over time.
A subscription puts one customer on one plan, over time. The subscription tracks the billing period, and it grants credits again at renewal.
Subscriptions are optional. A customer can buy credits with a one-time topup instead, with no subscription at all.
Which call do I want?
- You are putting a customer on a plan for the first time →
POST /v1/subscriptionscreateSubscriptiongrants the plan variant's credits in the same call. There is no separate grant step. - The customer is moving to a more expensive variant →
POST /v1/subscriptions/{id}/upgrade - The customer is moving to a cheaper variant →
POST /v1/subscriptions/{id}/downgradeUpgrade grants prorated credit right away. Downgrade grants nothing until the next renewal. The two are not mirror images. - The customer is stopping, but may come back →
POST /v1/subscriptions/{id}/pauseExisting credit stays spendable. The billing period stops moving too. Sendingresume_atdoes nothing. Nothing brings it back on its own — callresumeSubscription. - The customer is stopping for good →
POST /v1/subscriptions/{id}/cancelPause freezes the period and keeps the account open. Cancel ends it, right away or at period end, and never comes back on its own. - A paused subscription is coming back →
POST /v1/subscriptions/{id}/resumeRestarts the billing period from right now. Whatever time was left when it paused is gone. - You are advancing a manual prepaid subscription yourself →
POST /v1/subscriptions/{id}/renewUse this call when old credit can roll over. Postpaid plans move on their own. A payment connector moves after a paid charge. - You only need to push out a contract's end date →
POST /v1/subscriptions/{id}/extendThis call touchescontract_endalone. Nothing here moves the billing period or grants credit — userenewSubscriptionfor that.
List subscriptions
/v1/subscriptions | Idempotency-Key | Not used. This is a read. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Nothing. A read has no side effects. |
| Fires | No webhooks. |
This call lists every subscription for your tenant, newest first. Filter by customer_id, status, or both — both are optional. An unrecognized customer_id returns an empty list, not 404. An unrecognized status is different. QuotaStack does not check it first. The query then fails at the database with 500, since status is a fixed set of values there, not free text.
| Field | Type | Meaning |
|---|---|---|
customer_idoptional | string | Only subscriptions for this customer. Takes your own If you leave it out: Every subscription comes back, with no filter. |
statusoptional | string | Only subscriptions in this state. QuotaStack does not check it against the eight real values. An unknown value returns If you leave it out: Every status comes back, with no filter.
|
cursoroptional | string | Opaque pagination cursor from the previous page's |
limitoptional | integer | Page size. Default 20, max 100. |
{
"data": [
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
}
],
"pagination": {
"has_more": false,
"next_cursor": null
}
} | Field | Type | Meaning |
|---|---|---|
datarequired | array | |
data.statusrequired | string | This subscription's current state in its lifecycle.
|
data.originoptional | string | How this subscription came to exist.
|
data.trial_ends_atoptional | string (date-time) | When the trial ends. |
data.current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
data.current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
data.billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
data.cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
data.scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
data.external_subscription_idoptional | string | Your own identifier for this subscription. |
data.paused_atoptional | string (date-time) | When |
data.resumed_atoptional | string (date-time) | When |
data.expired_atoptional | string (date-time) | When this subscription reached |
data.contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
data.contract_endoptional | string (date-time) | When the contract ends. |
data.contract_ending_soon_daysrequired | integer | Days before |
data.metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
paginationrequired | object | Cursor-based pagination envelope. Returned on every list endpoint. No |
See also
Create a subscription
/v1/subscriptions | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | One new subscription. QuotaStack also grants the plan variant's credits in the same call, best-effort. The grant never applies an accumulation_cap or rollover_percentage, even if the variant's grant defines one — only a renewal does. |
| Fires | subscription.created, credit.granted |
This call puts one customer on one plan variant, starting now. QuotaStack grants that variant's credits in the same call. A failed grant does not fail the subscription itself. A trial variant starts the subscription as trialing. Every other variant starts it active. Send customer_id or external_customer_id, never both. QuotaStack rejects the call with neither too. external_customer_id looks up, or creates, a customer by that value alone. customer_id is the lenient form: it also takes your own external ID, and a UUID from a different tenant returns 400. The reply never says how many credits the call granted — check the customer's balance or ledger history for that. Skip this call for a customer already mid-plan somewhere else — it starts the period now and grants the full activation credits again. Use POST /v1/imports/customers for that case instead.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
customer_idoptional | string | QuotaStack's own id for this customer. Send this or If you leave it out: Send |
external_customer_idoptional | string | Your own id for this customer. Looked up, or created, strictly by this value — no UUID fallback. If you leave it out: Send |
plan_variant_idrequired | string (uuid) | Which plan variant to subscribe the customer to. If you leave it out: QuotaStack rejects the call. This field is required. |
billing_anchoroptional | integer | The day of the month, 1 through 31, a monthly period should renew on. If you leave it out: QuotaStack uses today's day of the month. An out-of-range value falls back to the same default. |
external_subscription_idoptional | string | Your own identifier for this subscription. QuotaStack stores it unchanged. If you leave it out: Left |
contract_endoptional | string (date-time) | When the contract ends. If you leave it out: The subscription has no contract end, and never reaches |
contract_ending_soon_daysoptional | integer | Days before If you leave it out: QuotaStack stores |
metadataoptional | object | Your own key-value tags, stored as the subscription's starting value. If you leave it out: An empty object is stored instead. |
{
"external_customer_id": "user_42",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"contract_end": "2027-07-01T00:00:00Z"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors
400— Sending bothcustomer_idandexternal_customer_id, or neither, returns this. So does acustomer_idUUID that belongs to a different tenant. bad-request401— Missing or invalid authentication.404— No plan variant here has thisplan_variant_id. not-found422— A missingplan_variant_idreturns this, under that name. Aplan_variant_idfor a retired variant returns this too, undervariant-not-activeinstead. validation-error429— Rate limit exceeded.500— Unexpected server error.
Retrieve a subscription
/v1/subscriptions/{id} | Idempotency-Key | Not used. This is a read. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Nothing. A read has no side effects. |
| Fires | No webhooks. |
This call returns one subscription by its own id. The lookup is environment-scoped. A sandbox key resolves only a sandbox subscription. A live key resolves only a live one. Add include_plan=true to also embed the plan variant and its credit grants. openapi.yaml does not declare that parameter, though QuotaStack accepts it.
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors
404— No subscription here has thisid. Passing a customer's ownidinstead also returns this — this path only takes a subscription's ownid. So does a sandbox key naming a live subscription, or a live key naming a sandbox one. not-found
Upgrade a subscription
/v1/subscriptions/{id}/upgrade | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Changes plan_variant_id right away and clears scheduled_variant_id. Grants prorated credit for the rest of this period. No accumulation_cap or rollover applies. |
| Fires | subscription.upgraded, credit.granted |
This call switches plan_variant_id right away. The subscription keeps its current status. This call also clears any downgrade scheduled by downgradeSubscription, canceling that schedule outright, not merging with it. QuotaStack grants prorated credit for the rest of the current period, best-effort, in the same call. The amount ignores any accumulation_cap or rollover_percentage the new variant's grant defines; only a renewal honors those. Only an active or trialing subscription can upgrade. Any other status returns 409, a status openapi.yaml does not declare here. This reply is not the full Subscription object the field table below describes. The real reply adds credits_granted, in millicredits, and drops origin, paused_at, resumed_at, expired_at, contract_start, contract_end, and contract_ending_soon_days.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
plan_variant_idrequired | string (uuid) | The plan variant to switch to, right away. If you leave it out: QuotaStack rejects the call. This field is required. |
metadataoptional | object | QuotaStack accepts this field and stores nothing from it. Upgrade never reads it. If you leave it out: No difference. This field has no effect either way. |
{
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"started_at": "2026-06-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T00:00:00Z",
"current_period_end": "2026-08-01T00:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"credits_granted": 6774,
"metadata": {},
"created_at": "2026-06-01T09:00:00Z",
"updated_at": "2026-07-15T14:22:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors
400— QuotaStack could not parse the request body as JSON. bad-request404— No subscription here has thisid, or no plan variant has thisplan_variant_id. not-found422— A missingplan_variant_idreturns this, under that name. A retired target variant returns this too, undervariant-not-activeinstead. validation-error
Downgrade a subscription
/v1/subscriptions/{id}/downgrade | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Sets scheduled_variant_id. plan_variant_id and the account balance stay as they were until the next renewal applies the switch. |
| Fires | subscription.downgraded |
This call schedules a variant switch for the end of the current period. plan_variant_id on the subscription does not change now — only scheduled_variant_id does. QuotaStack grants no credit here. The new variant's credits wait for the renewal that applies the switch. Only an active or trialing subscription can downgrade. Any other status returns 409, also undeclared here.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
plan_variant_idrequired | string (uuid) | The plan variant to switch to at the next renewal. If you leave it out: QuotaStack rejects the call. This field is required. |
metadataoptional | object | QuotaStack accepts this field and stores nothing from it. Downgrade never reads it. If you leave it out: No difference. This field has no effect either way. |
{
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors
404— No subscription here has thisid, or no plan variant has thisplan_variant_id. not-found422— A missingplan_variant_idreturns this, under that name. A retired target variant returns this too, undervariant-not-activeinstead. validation-error
Cancel a subscription
/v1/subscriptions/{id}/cancel | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Sets status to canceled (immediate) or cancelling (default) and merges metadata, adding reason under cancel_reason when sent. Grants and takes no credit. |
| Fires | subscription.canceled |
With cancel_immediately: true, this call ends the subscription right away. status becomes canceled, terminal, no further credit grants. Left at the default false, this call schedules the end instead. status becomes cancelling, cancel_at_period_end becomes true, and the customer keeps access until the period ends. Then status becomes expired. QuotaStack grants and takes back no credit either way — remaining balance is not refunded. A reason you send lands in metadata.cancel_reason, merged alongside any metadata you send. The two modes guard different statuses. The default path only works from active; every other status, including trialing, paused, and overdue, returns 409, undeclared here. cancel_immediately: true is more lenient: it works from trialing, active, cancelling, paused, or overdue, and 409s only from canceled, expired, or contract_ended.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
cancel_immediatelyoptional | boolean |
If you leave it out: By default, it is |
reasonoptional | string | Your own words for why. QuotaStack stores this under If you leave it out: Nothing gets written to |
metadataoptional | object | Your own key-value tags. QuotaStack merges this into the existing map, one key at a time. If you leave it out: Nothing changes. The tags stay as they are. |
{
"cancel_immediately": false,
"reason": "Customer requested downgrade"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "cancelling",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": true,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {
"cancel_reason": "Customer requested downgrade"
},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
What comes back in each case
The customer keeps access until the period ends. Then the subscription expires on its own.
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "cancelling",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": true,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {
"cancel_reason": "Customer requested downgrade"
},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} cancel_immediately: trueThe subscription ends right away. Terminal — nothing here changes again.
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "canceled",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} Errors
404— No subscription here has thisid. not-found
See also
Pause a subscription
/v1/subscriptions/{id}/pause | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Sets status to paused and records paused_at. resume_at and metadata are accepted and discarded. |
| Fires | subscription.paused |
This call suspends a subscription without ending it. QuotaStack fires no credit grants and does not move the billing period while paused. Existing credit stays spendable. Only an active subscription can pause — not trialing, not overdue. An unknown id returns 404. Pausing from any other status returns 409. openapi.yaml declares neither status for this call. resume_at and metadata on the request have no effect. QuotaStack accepts both and stores neither. Nothing auto-resumes a paused subscription — call resumeSubscription when you want it back.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
resume_atoptional | string (date-time) | QuotaStack accepts this field and stores nothing from it. Nothing auto-resumes a paused subscription. If you leave it out: No difference. This field has no effect either way — call |
metadataoptional | object | QuotaStack accepts this field and stores nothing from it. Pause never reads it. If you leave it out: No difference. This field has no effect either way. |
{
"resume_at": "2026-08-01T00:00:00Z"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "paused",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": "2026-07-20T11:00:00Z",
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
See also
Resume a subscription
/v1/subscriptions/{id}/resume | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Sets status to active, records resumed_at, and resets current_period_start/current_period_end to a fresh period starting now. Merges metadata. Grants credit for the new period, best-effort, with no rollover or accumulation_cap applied. |
| Fires | subscription.resumed, credit.granted |
This call is for a paused subscription. QuotaStack's status guard also allows a trialing, overdue, or contract_ended subscription to resume, though none of those is the case this call is built for. Resuming a contract_ended subscription reactivates it too — the same outcome extendSubscription produces. Resuming restarts the billing period from right now. Whatever time was left when it paused is gone. QuotaStack also grants credit for the new period, best-effort, the same amount createSubscription grants on activation: no rollover, no accumulation_cap. A grant with grant_interval: on_activation or grant_type: one_time does not fire again on resume. An unknown id returns 404. Resuming from a status that cannot reach active returns 409. Neither status is declared for this call.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
metadataoptional | object | Your own key-value tags. QuotaStack merges this into the existing map, one key at a time. If you leave it out: Nothing changes. The tags stay as they are. |
{
"metadata": {
"resumed_via": "support-ticket-482"
}
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-22T08:00:00Z",
"current_period_end": "2026-08-22T08:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": "2026-07-22T08:00:00Z",
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": null,
"contract_ending_soon_days": 0,
"metadata": {
"resumed_via": "support-ticket-482"
},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
See also
Renew a subscription
/v1/subscriptions/{id}/renew | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Advances current_period_start/current_period_end and grants that cycle's credit, applying rollover_percentage, max_rollover_cycles, and accumulation_cap. Merges metadata. external_payment_id overwrites external_subscription_id. |
| Fires | subscription.renewed, credit.granted |
This call is the credit-grant path for a manual prepaid subscription. Renewing moves the billing period forward and grants that cycle's credit. A connector-managed subscription advances only after a verified provider payment. This public call returns 409 for one. This call is the only one of the ten that honors rollover_percentage, max_rollover_cycles, and accumulation_cap. A postpaid variant moves its own period forward; you never call this for one. external_payment_id, when sent, overwrites external_subscription_id directly — it is not a field of its own. QuotaStack merges metadata. A failed grant aborts the whole call: nothing moves, and QuotaStack saves nothing. A retry is safe. If two renewal attempts race for the same subscription, the loser gets 200 back with credits_granted: 0. Treat that as done, not as a failure. A race with upgradeSubscription, downgradeSubscription, cancelSubscription, pauseSubscription, or resumeSubscription on the same subscription is a different case. This kind of race can fail the call with 500 instead, a status the spec never lists here. Any credit already granted stays granted, and a later retry will not grant it twice. An unknown id returns 404. Renewing from a status that cannot renew, one already set to cancel, or one managed by a payment connector returns 409. Neither is declared. This reply is not the full Subscription object either: the real reply adds credits_granted, in millicredits, and drops origin, started_at, trial_ends_at, paused_at, resumed_at, expired_at, contract_start, contract_end, and contract_ending_soon_days. The subscription.renewed webhook this call fires carries a different payload than this reply. That payload carries usage and balance totals for the period that ended, not the Subscription fields below.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
external_payment_idoptional | string | Your own id for the payment behind this renewal. QuotaStack writes it into If you leave it out: |
metadataoptional | object | Your own key-value tags. QuotaStack merges this into the existing map, one key at a time. If you leave it out: Nothing changes. The tags stay as they are. |
{
"external_payment_id": "pay_xyz789"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"current_period_start": "2026-08-01T00:00:00Z",
"current_period_end": "2026-09-01T00:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": "pay_xyz789",
"credits_granted": 10000,
"metadata": {},
"created_at": "2026-06-01T09:00:00Z",
"updated_at": "2026-08-01T00:03:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
What comes back in each case
The period moved forward. This cycle's credit was granted too.
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"current_period_start": "2026-08-01T00:00:00Z",
"current_period_end": "2026-09-01T00:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": "pay_xyz789",
"credits_granted": 10000,
"metadata": {},
"created_at": "2026-06-01T09:00:00Z",
"updated_at": "2026-08-01T00:03:00Z"
} The scheduler, or another call, already advanced this period. QuotaStack grants nothing and reports the subscription as it now stands. Treat this as success, not as an error.
{
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"current_period_start": "2026-08-01T00:00:00Z",
"current_period_end": "2026-09-01T00:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": "pay_xyz789",
"credits_granted": 0,
"metadata": {},
"created_at": "2026-06-01T09:00:00Z",
"updated_at": "2026-08-01T00:02:47Z"
} Extend a contract
/v1/subscriptions/{id}/extend | Idempotency-Key | Required. Returns 422 without it. |
|---|---|
| Environment | Sandbox and Live |
| Auth | Tenant API key |
| Writes | Replaces contract_end and merges metadata. Reactivates a contract_ended subscription to active; every other status is unaffected. Grants no credit and fires no event. |
| Fires | No webhooks. |
This call changes contract_end alone. The billing period stays put, and no credit changes hands — use renewSubscription for that. This call works on a subscription in any status. Only a contract_ended subscription gets reactivated, back to active. Every other status stays as it is. Omitting contract_end does not return an error. QuotaStack decodes the missing field as 0001-01-01T00:00:00Z and stores that as the new contract end. Always send a real date. reason has no effect — unlike cancelSubscription's reason, QuotaStack accepts this one and stores it nowhere. An unknown id returns 404, undeclared here.
| Field | Type | Meaning |
|---|---|---|
Idempotency-Keyrequired | string | A unique string you choose, up to 256 characters. It stops a retry from doing the work twice. This header is required on every POST and PATCH. Leave it out and the request fails with Send the same key twice and QuotaStack replays the first response. The second call's status and body match the first, and the response carries Derive the key from the business event rather than a random value, so a retry from anywhere reuses it — for example |
| Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | The subscription's own UUID. Not a customer If you leave it out: QuotaStack rejects the call. This path segment is required. |
| Field | Type | Meaning |
|---|---|---|
contract_endrequired | string (date-time) | The contract's new end date. If you leave it out: QuotaStack does not reject a missing value. QuotaStack stores the zero date |
reasonoptional | string | QuotaStack accepts this field and stores nothing from it, unlike If you leave it out: No difference. This field has no effect either way. |
metadataoptional | object | Your own key-value tags. QuotaStack merges this into the existing map, one key at a time. If you leave it out: Nothing changes. The tags stay as they are. |
{
"contract_end": "2027-07-01T00:00:00Z",
"reason": "Annual renewal"
} {
"id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a21",
"customer_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a05",
"plan_variant_id": "0192f5a4-7c31-7b8e-9a2d-4f6c8e1b3a12",
"environment": "live",
"status": "active",
"origin": "api",
"started_at": "2026-07-01T09:00:00Z",
"trial_ends_at": null,
"current_period_start": "2026-07-01T09:00:00Z",
"current_period_end": "2026-08-01T09:00:00Z",
"billing_anchor": 1,
"cancel_at_period_end": false,
"scheduled_variant_id": null,
"external_subscription_id": null,
"paused_at": null,
"resumed_at": null,
"expired_at": null,
"contract_start": "2026-07-01T09:00:00Z",
"contract_end": "2027-07-01T00:00:00Z",
"contract_ending_soon_days": 0,
"metadata": {},
"created_at": "2026-07-01T09:00:00Z",
"updated_at": "2026-07-01T09:00:00Z"
} | Field | Type | Meaning |
|---|---|---|
idrequired | string (uuid) | |
tenant_idrequired | string (uuid) | |
customer_idrequired | string (uuid) | |
plan_variant_idrequired | string (uuid) | |
environmentrequired | string |
Which environment this resource lives in. Determined by the API key prefix used ( |
statusrequired | string | This subscription's current state in its lifecycle.
|
originoptional | string | How this subscription came to exist.
|
started_atrequired | string (date-time) | |
trial_ends_atoptional | string (date-time) | When the trial ends. |
current_period_startoptional | string (date-time) | The start of the billing period this subscription is in right now. |
current_period_endoptional | string (date-time) | The end of the billing period this subscription is in right now. |
billing_anchoroptional | integer | The day of the month a monthly period renews on, 1 through 31. |
cancel_at_period_endrequired | boolean | Whether this subscription stops at the end of its current period instead of right away. |
scheduled_variant_idoptional | string (uuid) | The plan variant a pending |
external_subscription_idoptional | string | Your own identifier for this subscription. |
paused_atoptional | string (date-time) | When |
resumed_atoptional | string (date-time) | When |
expired_atoptional | string (date-time) | When this subscription reached |
contract_startoptional | string (date-time) | When the contract began. QuotaStack sets this once, at creation. |
contract_endoptional | string (date-time) | When the contract ends. |
contract_ending_soon_daysrequired | integer | Days before |
metadatarequired | object | Your own key-value tags, as they stand after the last write that touched them. |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
See also
Loading…