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

# Update plan price

> Update a base price or market price variant. Removing a base market override is rejected while a variant depends on it. Offer terms are managed through Offers.

Update a base price or market price variant. Removing a base market override is rejected while a variant depends on it. Offer terms are managed through Offers.

Publishes a new current version of the plan. New buyers get it; existing subscribers stay on their version until you move them with [Change subscription version](https://commet.co/docs/api-reference/subscriptions/change-subscription-version.md) or [Move subscribers to a plan version](https://commet.co/docs/api-reference/plans/create-plan-move.md).


## OpenAPI

````yaml /openapi/en/rest/2026-08-27.json patch /plans/{id}/prices/{priceId}
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:
  /plans/{id}/prices/{priceId}:
    patch:
      tags:
        - Plans
      summary: Update plan price
      description: >-
        Update a base price or market price variant. Removing a base market
        override is rejected while a variant depends on it. Offer terms are
        managed through Offers.
      operationId: update-plan-price
      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: priceId
          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:
                price:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                isDefault:
                  type: boolean
                trialDays:
                  type: integer
                  minimum: 0
                  maximum: 730
                trialRequiresPaymentMethod:
                  description: >-
                    Set to false so the price's free trial starts without a
                    payment method. Requires trialDays on the price.
                  type: boolean
                includedBalance:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                includedCredits:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                metadata:
                  description: Metadata keys to merge into the existing price metadata.
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                marketPrices:
                  type: array
                  items:
                    type: object
                    properties:
                      marketGroupId:
                        type: string
                        minLength: 1
                      currency:
                        type: string
                        enum:
                          - usd
                          - ars
                          - brl
                          - clp
                          - cop
                          - pen
                          - uyu
                          - pyg
                          - bob
                          - mxn
                          - cad
                          - eur
                          - gbp
                          - jpy
                          - cny
                          - krw
                          - hkd
                          - sgd
                          - twd
                          - inr
                          - thb
                      price:
                        type: integer
                        minimum: 0
                        maximum: 9007199254740991
                    required:
                      - marketGroupId
                      - currency
                      - price
                    additionalProperties: false
              additionalProperties: false
      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/PlanPrice'
              example:
                id: price_1a2b3c4d
                planId: plan_1a2b3c4d
                billingInterval: monthly
                price: 2000
                isDefault: true
                trialDays: 0
                includedBalance: null
                includedCredits: null
                offerId: null
                inheritsFromPriceId: null
                metadata: {}
                marketPrices: []
                createdAt: '2026-09-07T12:00:00.000Z'
                updatedAt: '2026-09-07T12:00:00.000Z'
                object: plan_price
                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 planPrice = await commet.plans.updatePrice({
              id: "pln_xxx",
              priceId: "pp_xxx",
            });
        - lang: python
          label: Python
          source: |-
            from commet import Commet

            commet = Commet("ck_xxx")

            plan_price = commet.plans.update_price(
                "pln_xxx",
                "pp_xxx",
            )
        - lang: go
          label: Go
          source: "client, err := commet.New(\"ck_xxx\")\nif err != nil {\n\tlog.Fatal(err)\n}\nctx := context.Background()\n\nplanPrice, err := client.Plans.UpdatePrice(ctx, \"pln_xxx\", \"pp_xxx\", nil)\nif err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            import co.commet.Commet;
            import co.commet.params.UpdatePlanPriceParams;

            var commet = Commet.builder().apiKey("ck_xxx").build();

            var planPrice = commet.plans().updatePrice(
                "pln_xxx",
                "pp_xxx",
                UpdatePlanPriceParams.builder().build()
            );
        - lang: php
          label: PHP
          source: |-
            use Commet\Commet;

            $commet = new Commet('ck_xxx');

            $planPrice = $commet->plans->updatePrice(
                id: 'pln_xxx',
                priceId: 'pp_xxx',
            );
components:
  headers:
    RequestId:
      description: >-
        Server-generated identifier that correlates this response with Platform
        logs.
      schema:
        type: string
        format: uuid
  schemas:
    PlanPrice:
      type: object
      properties:
        id:
          type: string
          description: Public plan price ID.
        planId:
          type: string
        billingInterval:
          $ref: '#/components/schemas/BillingInterval'
        price:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Price in the currency's minor unit (for example, cents for USD).
        isDefault:
          type: boolean
        trialDays:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        trialRequiresPaymentMethod:
          description: >-
            Whether the price's free trial needs a payment method to start. When
            false, a new subscription starts trialing right away without
            checkout; without a payment method added by the trial end, the
            customer moves to the plan group's default plan, or the subscription
            is canceled when there is none. Null when the price has no trial.
          type:
            - boolean
            - 'null'
        includedBalance:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        includedCredits:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        offerId:
          description: Automatic introductory offer for this price.
          type:
            - string
            - 'null'
        inheritsFromPriceId:
          description: >-
            Public base price ID for a market price variant, or null for a base
            price.
          type:
            - string
            - 'null'
        metadata:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
          description: Application metadata. Variant display names may use metadata.name.
        marketPrices:
          type: array
          items:
            type: object
            properties:
              marketGroupId:
                type: string
                description: Public pricing market group ID.
              currency:
                type: string
                description: Presentment currency for this market.
              price:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
                description: Market price in the currency's minor unit.
            required:
              - marketGroupId
              - currency
              - price
            additionalProperties: false
          description: >-
            Country-market overrides. Variants inherit their base price for
            every market not listed.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        object:
          type: string
          const: plan_price
        livemode:
          type: boolean
      required:
        - id
        - planId
        - billingInterval
        - price
        - isDefault
        - trialDays
        - trialRequiresPaymentMethod
        - includedBalance
        - includedCredits
        - offerId
        - inheritsFromPriceId
        - metadata
        - marketPrices
        - createdAt
        - updatedAt
        - 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
    BillingInterval:
      type: string
      enum:
        - weekly
        - monthly
        - quarterly
        - semiannual
        - yearly
        - one_time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````

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