> ## Documentation Index
> Fetch the complete documentation index at: https://commet.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 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.

End expanded access immediately and restore the base plan's limits. The subscription, billing cycle, invoices, and payment state remain unchanged.


## OpenAPI

````yaml /openapi/es/rest/2026-08-27.json post /customers/{id}/plan-grants/{grantId}/revoke
openapi: 3.1.0
info:
  title: Commet API
  version: '2026-08-27'
  description: Billing and payments API for SaaS and AI products.
servers:
  - url: https://commet.co/api/v1
security:
  - ApiKeyAuth: []
tags:
  - name: Test Clock
    description: >-
      Simulate the passage of time in sandbox to test billing flows. Mirrors
      Stripe test clocks: forward-only and sandbox-only.
  - name: Customers
  - name: Subscriptions
  - name: Plans
  - name: Markets
    description: >-
      Reusable country groups for market-specific prices and selectable price
      variants.
  - name: Offers
  - name: Promo Codes
  - name: Features
  - name: Usage
  - name: Seats
  - name: Quota
  - name: Add-ons
  - name: Portal
  - name: Credit Packs
  - name: Plan Groups
  - name: Invoices
  - name: Payments
    description: >-
      One-time payments with no subscription or plan. Charge a customer's saved
      payment method off-session, or create a payment link the customer opens to
      pay. Tax, invoice, and receipt are handled automatically.
  - name: Transactions
  - name: Webhooks
  - name: API Keys
  - name: Payouts
    description: >-
      Withdraw available balance to your bank and manage the payout account
      (verification + destination bank accounts).
  - name: Provisioning
    description: >-
      Take ownership of an organization an agent provisioned headlessly. The
      agent holds the API keys from the start; a human claims the account
      through a claim link.
paths:
  /customers/{id}/plan-grants/{grantId}/revoke:
    post:
      tags:
        - Customers
      summary: Revoke temporary plan access
      description: >-
        End expanded access immediately and restore the base plan's limits. The
        subscription, billing cycle, invoices, and payment state remain
        unchanged.
      operationId: revoke-plan-grant
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            Unique key used to safely retry this write for 24 hours without
            applying it twice.
          schema:
            type: string
            minLength: 1
            maxLength: 200
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: grantId
          in: path
          required: true
          schema:
            type: string
        - name: Commet-Version
          in: header
          required: false
          description: >-
            API version used by this reference. Send this header to select this
            contract explicitly.
          schema:
            type: string
            default: '2026-08-27'
          example: '2026-08-27'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string
                  minLength: 1
                  maxLength: 500
              required:
                - reason
      responses:
        '200':
          description: Success
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
            RateLimit-Limit:
              description: Maximum number of requests allowed in the current window.
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlanGrant'
              example:
                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
        '400':
          description: Bad request
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '401':
          description: Unauthorized
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '403':
          description: Forbidden
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '404':
          description: Not found
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '409':
          description: Conflict
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '429':
          description: Too many requests
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
            RateLimit-Limit:
              description: Maximum number of requests allowed in the current window.
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: Seconds until the rate limit window resets.
              schema:
                type: string
            Retry-After:
              description: Seconds to wait before retrying the request.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '500':
          description: Internal server error
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
        '503':
          description: Service unavailable
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                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
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: |-
            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",
            });
        - lang: python
          label: Python
          source: |-
            from commet import Commet

            commet = Commet("ck_xxx")

            plan_grant = commet.customers.revoke_plan_grant(
                "cus_xxx",
                "grant_xxx",
                reason="Customer requested",
            )
        - lang: go
          label: Go
          source: "client, err := commet.New(\"ck_xxx\")\nif err != nil {\n\tlog.Fatal(err)\n}\nctx := context.Background()\n\nplanGrant, err := client.Customers.RevokePlanGrant(ctx, \"cus_xxx\", \"grant_xxx\", &commet.RevokePlanGrantParams{\n\tReason: \"Customer requested\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            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()
            );
        - lang: php
          label: PHP
          source: |-
            use Commet\Commet;

            $commet = new Commet('ck_xxx');

            $planGrant = $commet->customers->revokePlanGrant(
                id: 'cus_xxx',
                grantId: 'grant_xxx',
                reason: 'Customer requested',
            );
components:
  headers:
    RequestId:
      description: >-
        Server-generated identifier that correlates this response with Platform
        logs.
      schema:
        type: string
        format: uuid
  schemas:
    PlanGrant:
      type: object
      properties:
        id:
          type: string
        customerId:
          type: string
        subscriptionId:
          type: string
        basePlanId:
          type: string
        planId:
          type: string
        planReleaseId:
          type: string
        status:
          type: string
          enum:
            - active
            - expired
            - revoked
        duration:
          type: string
          enum:
            - cycles
            - until_date
            - until_revoked
        durationCycles:
          anyOf:
            - type: integer
              exclusiveMinimum: 0
              maximum: 9007199254740991
            - type: 'null'
        startsAt:
          type: string
          format: date-time
        expiresAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
        reason:
          type: string
        source:
          type: string
          enum:
            - dashboard
            - api
        revokedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        events:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              type:
                type: string
                enum:
                  - created
                  - updated
                  - expired
                  - revoked
              reason:
                type: string
              source:
                type: string
                enum:
                  - dashboard
                  - api
                  - system
              previousExpiresAt:
                anyOf:
                  - type: string
                    format: date-time
                  - type: 'null'
              expiresAt:
                anyOf:
                  - type: string
                    format: date-time
                  - type: 'null'
              duration:
                anyOf:
                  - type: string
                    enum:
                      - cycles
                      - until_date
                      - until_revoked
                  - type: 'null'
              durationCycles:
                anyOf:
                  - type: integer
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                  - type: 'null'
              requestedExpiresAt:
                anyOf:
                  - type: string
                    format: date-time
                  - type: 'null'
              createdAt:
                type: string
                format: date-time
            required:
              - id
              - type
              - reason
              - source
              - previousExpiresAt
              - expiresAt
              - duration
              - durationCycles
              - requestedExpiresAt
              - createdAt
            additionalProperties: false
        object:
          type: string
          const: plan_grant
        livemode:
          type: boolean
      required:
        - id
        - customerId
        - subscriptionId
        - basePlanId
        - planId
        - planReleaseId
        - status
        - duration
        - durationCycles
        - startsAt
        - expiresAt
        - reason
        - source
        - revokedAt
        - createdAt
        - updatedAt
        - events
        - object
        - livemode
      additionalProperties: false
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
            code:
              type: string
            message:
              type: string
            param:
              type: string
            details: {}
            doc_url:
              type: string
          required:
            - type
            - code
            - message
            - doc_url
          additionalProperties: false
      required:
        - error
      additionalProperties: false
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````

## Related topics

- [Grant temporary plan access](/docs/es/api-reference/customers/create-plan-grant.md)
- [Update temporary access expiration](/docs/es/api-reference/customers/update-plan-grant.md)
- [Revoke scheduled pause](/docs/es/api-reference/subscriptions/revoke-subscription-pause.md)
- [plan_grant.revoked](/docs/es/webhooks/plan-grant-revoked.md)
- [subscription.plan_change_revoked](/docs/es/webhooks/subscription-plan-change-revoked.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.