Billing & FinOps

Preview — pending review

This reference is generated from the platform API contract and is still under review. Operations, fields, and descriptions can change before publication.

Stop an entitlement renewing (no refund)

POST
/scopes/{scopeId}/billing/entitlements/{entitlementId}/actions/cancel

Turns RENEWAL off. There is no refund and no early teardown. The current term is already paid for and stays fully usable: the response still reports state: "active" and honoured: true, and the entitlement remains ASSIGNABLE and continues to be billed until termEndsAt. What changes is autoRenew: false, renewsAt: null and a cancelledAt stamp — cancelledAt is when renewal was switched off, NOT when the entitlement stops working. At termEndsAt it becomes expired. Validation: scopeId accessible; entitlementId resolvable. 409 CONFLICT when the term has already ended — there is no renewal left to stop. Caller needs billing:write, else 403. Async & state: Synchronous. Re-cancelling inside the term is an idempotent 200 preserving the first cancelledAt. Errors: 401; 403; 404 unknown scope or entitlement; 409 already expired; 500. Idempotency/Concurrency: Naturally idempotent; no key required.

Authorization

bearerToken
headerAuthorizationBearer <token>

An API token (pc_live_…) or a service-account key (sak_live_…), created in Identity & Access Management and sent as Authorization: Bearer <token>. Requests are rate limited per credential and per tenant: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refused request gets 429 RATE_LIMITED with Retry-After.

Path Parameters

scopeId*string

Opaque ownership+authorization scope resolving to tenant + subscription + project.

entitlementId*string

The subscription-scoped entitlement's id.

Response Body

Renewal is off; the entitlement stays active and usable until termEndsAt.

application/json
  1. response
data*

A subscription-scoped add-on or licence the account HOLDS, independent of any one resource. Unlike an instance-scoped add-on (which is born with a VM and dies with it), an entitlement survives the deletion of every resource it was applied to and can be re-applied elsewhere. quantity is a POOL OF SEATS: an entitlement with quantity: N may be assigned to N DISTINCT resources at the same time. Billing charges quantity units per period whether or not every seat is currently assigned — the customer bought the pool, not the occupancy.

curl -X POST "https://example.com/scopes/string/billing/entitlements/string/actions/cancel"
{  "data": {    "id": "string",    "itemKind": "addon",    "itemId": "string",    "itemSlug": "string",    "name": "string",    "period": "hour",    "unitPriceMinor": 0,    "currency": "string",    "sku": "string",    "quantity": 1,    "seatsUsed": 0,    "seatsAvailable": 0,    "state": "active",    "autoRenew": true,    "honoured": true,    "termStartedAt": "2019-08-24T14:15:22Z",    "termEndsAt": "2019-08-24T14:15:22Z",    "renewsAt": "2019-08-24T14:15:22Z",    "createdAt": "2019-08-24T14:15:22Z",    "cancelledAt": "2019-08-24T14:15:22Z",    "expiredAt": "2019-08-24T14:15:22Z",    "assignments": [      {        "id": "string",        "resourceType": "instance",        "resourceId": "string",        "assignedAt": "2019-08-24T14:15:22Z"      }    ],    "assignment": {      "id": "string",      "resourceType": "instance",      "resourceId": "string",      "assignedAt": "2019-08-24T14:15:22Z"    }  }}