cURL
curl --request POST \
--url https://commet.co/api/v1/customers/{id}/plan-grants/{grantId}/revoke \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"reason": "<string>"
}
'import { Commet } from "@commet/node";
const commet = new Commet({ apiKey: "ck_xxx" });
const planGrant = await commet.customers.revokePlanGrant({
id: "cus_xxx",
grantId: "grant_xxx",
reason: "Customer requested",
});from commet import Commet
commet = Commet("ck_xxx")
plan_grant = commet.customers.revoke_plan_grant(
"cus_xxx",
"grant_xxx",
reason="Customer requested",
)client, err := commet.New("ck_xxx")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
planGrant, err := client.Customers.RevokePlanGrant(ctx, "cus_xxx", "grant_xxx", &commet.RevokePlanGrantParams{
Reason: "Customer requested",
})
if err != nil {
log.Fatal(err)
}import co.commet.Commet;
import co.commet.params.RevokePlanGrantParams;
var commet = Commet.builder().apiKey("ck_xxx").build();
var planGrant = commet.customers().revokePlanGrant(
"cus_xxx",
"grant_xxx",
RevokePlanGrantParams.builder("Customer requested").build()
);use Commet\Commet;
$commet = new Commet('ck_xxx');
$planGrant = $commet->customers->revokePlanGrant(
id: 'cus_xxx',
grantId: 'grant_xxx',
reason: 'Customer requested',
);{
"id": "grant_1a2b3c4d",
"customerId": "cus_1a2b3c4d",
"subscriptionId": "sub_1a2b3c4d",
"basePlanId": "plan_1a2b3c4d",
"planId": "plan_5e6f7a8b",
"planReleaseId": "release_5e6f7a8b",
"status": "revoked",
"duration": "until_date",
"durationCycles": null,
"startsAt": "2026-09-07T12:00:00.000Z",
"expiresAt": "2026-10-07T12:00:00.000Z",
"reason": "Evaluate Business features",
"source": "api",
"revokedAt": "2026-09-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z",
"updatedAt": "2026-09-07T12:00:00.000Z",
"events": [
{
"id": "event_1a2b3c4d",
"type": "created",
"reason": "Evaluate Business features",
"source": "api",
"previousExpiresAt": null,
"expiresAt": "2026-10-07T12:00:00.000Z",
"duration": "until_date",
"durationCycles": null,
"requestedExpiresAt": "2026-10-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z"
},
{
"id": "event_5e6f7a8b",
"type": "revoked",
"reason": "Evaluation ended",
"source": "api",
"previousExpiresAt": "2026-10-07T12:00:00.000Z",
"expiresAt": "2026-10-07T12:00:00.000Z",
"duration": "until_date",
"durationCycles": null,
"requestedExpiresAt": "2026-10-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z"
}
],
"object": "plan_grant",
"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"
}
}Customers
Revoke temporary plan access
End expanded access immediately and restore the base plan’s limits. The subscription, billing cycle, invoices, and payment state remain unchanged.
POST
/
customers
/
{id}
/
plan-grants
/
{grantId}
/
revoke
cURL
curl --request POST \
--url https://commet.co/api/v1/customers/{id}/plan-grants/{grantId}/revoke \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"reason": "<string>"
}
'import { Commet } from "@commet/node";
const commet = new Commet({ apiKey: "ck_xxx" });
const planGrant = await commet.customers.revokePlanGrant({
id: "cus_xxx",
grantId: "grant_xxx",
reason: "Customer requested",
});from commet import Commet
commet = Commet("ck_xxx")
plan_grant = commet.customers.revoke_plan_grant(
"cus_xxx",
"grant_xxx",
reason="Customer requested",
)client, err := commet.New("ck_xxx")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
planGrant, err := client.Customers.RevokePlanGrant(ctx, "cus_xxx", "grant_xxx", &commet.RevokePlanGrantParams{
Reason: "Customer requested",
})
if err != nil {
log.Fatal(err)
}import co.commet.Commet;
import co.commet.params.RevokePlanGrantParams;
var commet = Commet.builder().apiKey("ck_xxx").build();
var planGrant = commet.customers().revokePlanGrant(
"cus_xxx",
"grant_xxx",
RevokePlanGrantParams.builder("Customer requested").build()
);use Commet\Commet;
$commet = new Commet('ck_xxx');
$planGrant = $commet->customers->revokePlanGrant(
id: 'cus_xxx',
grantId: 'grant_xxx',
reason: 'Customer requested',
);{
"id": "grant_1a2b3c4d",
"customerId": "cus_1a2b3c4d",
"subscriptionId": "sub_1a2b3c4d",
"basePlanId": "plan_1a2b3c4d",
"planId": "plan_5e6f7a8b",
"planReleaseId": "release_5e6f7a8b",
"status": "revoked",
"duration": "until_date",
"durationCycles": null,
"startsAt": "2026-09-07T12:00:00.000Z",
"expiresAt": "2026-10-07T12:00:00.000Z",
"reason": "Evaluate Business features",
"source": "api",
"revokedAt": "2026-09-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z",
"updatedAt": "2026-09-07T12:00:00.000Z",
"events": [
{
"id": "event_1a2b3c4d",
"type": "created",
"reason": "Evaluate Business features",
"source": "api",
"previousExpiresAt": null,
"expiresAt": "2026-10-07T12:00:00.000Z",
"duration": "until_date",
"durationCycles": null,
"requestedExpiresAt": "2026-10-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z"
},
{
"id": "event_5e6f7a8b",
"type": "revoked",
"reason": "Evaluation ended",
"source": "api",
"previousExpiresAt": "2026-10-07T12:00:00.000Z",
"expiresAt": "2026-10-07T12:00:00.000Z",
"duration": "until_date",
"durationCycles": null,
"requestedExpiresAt": "2026-10-07T12:00:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z"
}
],
"object": "plan_grant",
"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"
}
}End expanded access immediately and restore the base plan’s limits. The subscription, billing cycle, invoices, and payment state remain unchanged.
Autorizaciones
Encabezados
Unique key used to safely retry this write for 24 hours without applying it twice.
Required string length:
1 - 200API version used by this reference. Send this header to select this contract explicitly.
Cuerpo
application/json
Required string length:
1 - 500Respuesta
Success
Opciones disponibles:
active, expired, revoked Opciones disponibles:
cycles, until_date, until_revoked Rango requerido:
0 < x <= 9007199254740991Opciones disponibles:
dashboard, api Show child attributes
Show child attributes
Allowed value:
"plan_grant"¿Esta página le ayudó?