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

# List a subscription's price and plan change attempts

> Every attempt to change this subscription's recurring amount (`price`) or to move it to
another plan (`plan`), newest first, whether it was applied or refused. A refused attempt
is recorded too and reads `status: failed` with a `failure` saying what stopped it, so an
empty list means no amount or plan change has ever been attempted.

**Pause, resume and cancel are not in this list.** Each of those three operations returns
the subscription it leaves behind, and so does `GET /v1/commerce/subscriptions/{id}`:
`status` reads `paused` after a pause and `canceling` after a cancel of either mode,
`paused_at` is set for as long as the subscription is paused and null once it is resumed,
and `cancel_at` carries when the cancellation takes effect.

An entry's `status` is the attempt's own, `processing` included while it is in flight;
`failure` is present only on a `failed` entry. A change is the subscription's
`pending_change` until a renewal bills its terms, and `effective_confirmed_at` records that
renewal.



## OpenAPI

````yaml /api-reference/commerce-v1.openapi.json get /v1/commerce/subscriptions/{id}/changes
openapi: 3.0.3
info:
  description: >-
    Public REST API for COPE vendor integrations. Authenticate with a COPE API
    key and call the endpoints described below.
  title: COPE Public API
  version: v1
servers:
  - description: Production
    url: https://api.cope.com
security:
  - cope_sk: []
paths:
  /v1/commerce/subscriptions/{id}/changes:
    get:
      tags:
        - Subscriptions
      summary: List a subscription's price and plan change attempts
      description: >-
        Every attempt to change this subscription's recurring amount (`price`)
        or to move it to

        another plan (`plan`), newest first, whether it was applied or refused.
        A refused attempt

        is recorded too and reads `status: failed` with a `failure` saying what
        stopped it, so an

        empty list means no amount or plan change has ever been attempted.


        **Pause, resume and cancel are not in this list.** Each of those three
        operations returns

        the subscription it leaves behind, and so does `GET
        /v1/commerce/subscriptions/{id}`:

        `status` reads `paused` after a pause and `canceling` after a cancel of
        either mode,

        `paused_at` is set for as long as the subscription is paused and null
        once it is resumed,

        and `cancel_at` carries when the cancellation takes effect.


        An entry's `status` is the attempt's own, `processing` included while it
        is in flight;

        `failure` is present only on a `failed` entry. A change is the
        subscription's

        `pending_change` until a renewal bills its terms, and
        `effective_confirmed_at` records that

        renewal.
      operationId: commerce.subscriptions.changes.list
      parameters:
        - description: id public identifier.
          example: ps_A1b2C3d4E5f6
          in: path
          name: id
          required: true
          schema:
            example: ps_A1b2C3d4E5f6
            pattern: ^ps_[A-Za-z0-9]{8,32}$
            type: string
        - description: >-
            Page number for paginated results. Values below 1 and non-numeric
            values are ignored and the first page is returned; a page past the
            last one returns the last page.
          in: query
          name: page
          required: false
          schema:
            minimum: 1
            type: integer
        - description: >-
            Number of records per page. Defaults to 12; values above 25 are
            clamped to 25; values below 1 and non-numeric values are ignored and
            the default is used.
          in: query
          name: per_page
          required: false
          schema:
            maximum: 25
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  data:
                    items:
                      additionalProperties: false
                      properties:
                        created_at:
                          description: When the attempt was recorded.
                          type: string
                        effective_at:
                          nullable: true
                          type: string
                        effective_confirmed_at:
                          description: >-
                            When a renewal billed this change: the boundary of
                            the cycle that billed its new terms, recorded when
                            that cycle is booked, on every payment method.
                            `null` until one has — and for good on a change
                            superseded before it billed.
                          nullable: true
                          type: string
                        failure:
                          additionalProperties: false
                          description: >-
                            Present only when `status` is `failed`: the code and
                            the message saying why.
                          nullable: true
                          properties:
                            code:
                              type: string
                            message:
                              type: string
                          required:
                            - code
                            - message
                          type: object
                        from:
                          additionalProperties: false
                          properties:
                            amount_cents:
                              type: integer
                            currency:
                              type: string
                            plan:
                              additionalProperties: false
                              description: >-
                                The plan this side's terms were sold on or
                                switched to: a plan change's target on `to`,
                                otherwise the plan the terms name. `null` when
                                no recorded fact names one — for example, terms
                                sold through an offer, a plan since deleted, or
                                terms from before plans were recorded.
                              nullable: true
                              properties:
                                id:
                                  example: plan_A1b2C3d4
                                  pattern: ^plan_[A-Za-z0-9]{8,32}$
                                  type: string
                                object:
                                  enum:
                                    - payment_plan
                                  type: string
                              required:
                                - object
                                - id
                              type: object
                          required:
                            - plan
                            - amount_cents
                            - currency
                          type: object
                        reason:
                          nullable: true
                          type: string
                        status:
                          description: >-
                            What became of the attempt. `succeeded`: it was
                            applied. `failed`: it was refused, and `failure`
                            carries the code and the message saying why —
                            nothing changed. `processing`: it is still in
                            flight.
                          enum:
                            - processing
                            - succeeded
                            - failed
                          type: string
                        to:
                          additionalProperties: false
                          properties:
                            amount_cents:
                              nullable: true
                              type: integer
                            currency:
                              type: string
                            plan:
                              additionalProperties: false
                              description: >-
                                The plan this side's terms were sold on or
                                switched to: a plan change's target on `to`,
                                otherwise the plan the terms name. `null` when
                                no recorded fact names one — for example, terms
                                sold through an offer, a plan since deleted, or
                                terms from before plans were recorded.
                              nullable: true
                              properties:
                                id:
                                  example: plan_A1b2C3d4
                                  pattern: ^plan_[A-Za-z0-9]{8,32}$
                                  type: string
                                object:
                                  enum:
                                    - payment_plan
                                  type: string
                              required:
                                - object
                                - id
                              type: object
                          required:
                            - plan
                            - amount_cents
                            - currency
                          type: object
                        type:
                          description: >-
                            Which change was attempted: `price` for the
                            recurring amount, `plan` for a move to another plan.
                            A pause, a resume and a cancel are not in this
                            history — see the operation description.
                          enum:
                            - price
                            - plan
                          type: string
                      required:
                        - type
                        - status
                        - created_at
                        - effective_at
                        - effective_confirmed_at
                        - reason
                        - from
                        - to
                      type: object
                    type: array
                  pagination:
                    additionalProperties: false
                    properties:
                      current_page:
                        type: integer
                      per_page:
                        type: integer
                      total_count:
                        type: integer
                      total_pages:
                        type: integer
                    required:
                      - total_pages
                      - current_page
                      - per_page
                      - total_count
                    type: object
                required:
                  - data
                  - pagination
                type: object
          description: Successful response
        '400':
          content:
            application/problem+json:
              examples:
                unparsable_request:
                  summary: Unparsable request
                  value:
                    code: invalid_request
                    detail: >-
                      The request could not be parsed. Check the query string
                      and the request body.
                    request_id: req_123
                    status: 400
                    title: Invalid Request
                    type: https://docs.cope.com/errors/invalid_request
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Invalid request
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Missing or invalid bearer token
        '403':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Bearer token is not authorized for this route
        '404':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Resource not found
      security:
        - cope_sk: []
components:
  schemas:
    PublicProblemDetail:
      additionalProperties: false
      properties:
        code:
          type: string
        detail:
          nullable: true
          type: string
        errors:
          items:
            additionalProperties: false
            properties:
              code:
                type: string
              detail:
                type: string
              param:
                type: string
            required:
              - code
              - detail
            type: object
          type: array
        request_id:
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          type: string
      required:
        - type
        - title
        - status
        - code
        - request_id
      type: object
  securitySchemes:
    cope_sk:
      description: >-
        Bearer credential for the public API: a live COPE API key (`ck_live_*`;
        keys issued earlier as `cope_sk_live_*` keep working). Dashboard sign-in
        tokens are not accepted.
      scheme: bearer
      type: http

````