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

# Resume a paused subscription

> Starts collecting renewals again on a `paused` subscription and returns the subscription.

**Nothing is charged now.** Collection restarts at the cycle boundary the payment provider
still holds, which the pause did not move, and `next_billing_at` carries it again once the
provider has answered. The subscription leaves `paused` for what its own terms make it —
`active`, `trial` while a trial is still running, or `overdue` if a payment was already
outstanding — and `paused_at` is `null` again.

There is no renewal cutoff on a resume, and a refund or a chargeback does not block one.

Refused with 422 `subscription_not_eligible` when the subscription is not paused
(`not_paused` — one whose collection stopped after a failed payment reads `overdue`, not
`paused`, and restarts on its own when the buyer pays), has no subscription at the payment
provider (`missing_processor_subscription`), or has another change still processing
(`change_in_flight`).

The body is optional and carries one member: `reason`, your own note, recorded on the attempt. Text longer than 500 characters is truncated.



## OpenAPI

````yaml /api-reference/commerce-v1.openapi.json post /v1/commerce/subscriptions/{id}/resume
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}/resume:
    post:
      tags:
        - Subscriptions
      summary: Resume a paused subscription
      description: >-
        Starts collecting renewals again on a `paused` subscription and returns
        the subscription.


        **Nothing is charged now.** Collection restarts at the cycle boundary
        the payment provider

        still holds, which the pause did not move, and `next_billing_at` carries
        it again once the

        provider has answered. The subscription leaves `paused` for what its own
        terms make it —

        `active`, `trial` while a trial is still running, or `overdue` if a
        payment was already

        outstanding — and `paused_at` is `null` again.


        There is no renewal cutoff on a resume, and a refund or a chargeback
        does not block one.


        Refused with 422 `subscription_not_eligible` when the subscription is
        not paused

        (`not_paused` — one whose collection stopped after a failed payment
        reads `overdue`, not

        `paused`, and restarts on its own when the buyer pays), has no
        subscription at the payment

        provider (`missing_processor_subscription`), or has another change still
        processing

        (`change_in_flight`).


        The body is optional and carries one member: `reason`, your own note,
        recorded on the attempt. Text longer than 500 characters is truncated.
      operationId: commerce.subscriptions.resume
      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: >-
            Required. At most 255 characters of valid UTF-8 with no NUL byte.
            The change attempt is recorded against this key for this
            subscription, and a retry that carries the same key and the same
            body does not change the subscription twice: it returns the
            subscription as it stands now. The exception is an attempt that
            failed at the payment provider or stopped responding: it is
            re-checked and then re-attempted. COPE also re-attempts, on its own,
            an attempt the payment provider did not confirm or that stopped
            responding, under the same re-check: usually within minutes, for up
            to 24 hours after it was recorded. The re-check asks whether
            subscription changes through the API are still enabled for the
            business and whether another change is still processing
            (`change_in_flight`: repeat under the same key once it settles); a
            price or plan change is also refused as `not_active` (final) once
            the subscription has ended and as `superseded` (final) when another
            price or plan change has been applied since it was recorded, and a
            pause, resume or cancel when the subscription has left the status it
            needs. A refusal of the first request under a key,
            `change_in_flight` included, is recorded against that key: once it
            settles, send the request again under a new key. The same key with a
            different body is refused with 409 idempotency_conflict.
          in: header
          name: Idempotency-Key
          required: true
          schema:
            maxLength: 255
            type: string
      requestBody:
        content:
          application/json:
            examples:
              with_reason:
                summary: Resume, with a note kept on the attempt
                value:
                  reason: Buyer asked to start again
            schema:
              additionalProperties: false
              properties:
                reason:
                  description: >-
                    Optional. Recorded on the attempt and returned as `reason`;
                    longer text is truncated to 500 characters.
                  maxLength: 500
                  type: string
              type: object
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  data:
                    additionalProperties: false
                    properties:
                      amount_cents:
                        description: The recurring amount in force, in minor units.
                        type: integer
                      business:
                        additionalProperties: false
                        description: The business that sold the subscription.
                        properties:
                          id:
                            example: biz_A1b2C3d4E5f6G7h8
                            pattern: ^biz_[A-Za-z0-9_-]{8,32}$
                            type: string
                          object:
                            enum:
                              - business
                            type: string
                        required:
                          - object
                          - id
                        type: object
                      cancel_at:
                        description: >-
                          When the cancellation takes effect, or took effect.
                          `null` when none was scheduled, and when it is not
                          recorded.
                        nullable: true
                        type: string
                      cancelled_at:
                        description: >-
                          When the cancellation was accepted, or when the
                          subscription ended for an ending nobody asked for.
                          `null` when not cancelled, and when it is not
                          recorded.
                        nullable: true
                        type: string
                      created_at:
                        type: string
                      currency:
                        type: string
                      id:
                        example: ps_A1b2C3d4E5f6
                        pattern: ^ps_[A-Za-z0-9]{8,32}$
                        type: string
                      line_item:
                        additionalProperties: false
                        description: The order line it was sold on.
                        properties:
                          id:
                            example: li_A1b2C3d4E5f6
                            pattern: ^li_[A-Za-z0-9]{8,32}$
                            type: string
                          object:
                            enum:
                              - line_item
                            type: string
                        required:
                          - object
                          - id
                        type: object
                      next_billing_at:
                        description: >-
                          The next renewal. `null` while paused, once a
                          cancellation has started, and while no renewal date is
                          known.
                        nullable: true
                        type: string
                      object:
                        enum:
                          - subscription
                        type: string
                      order:
                        additionalProperties: false
                        description: >-
                          The order it was sold in: `GET
                          /v1/commerce/orders/{id}`.
                        properties:
                          id:
                            example: ord_A1b2C3d4E5f6
                            pattern: ^ord_[A-Za-z0-9]{8,32}$
                            type: string
                          object:
                            enum:
                              - order
                            type: string
                        required:
                          - object
                          - id
                        type: object
                      paused_at:
                        description: '`null` unless `paused`.'
                        nullable: true
                        type: string
                      pending_change:
                        additionalProperties: false
                        description: >-
                          A price or plan change waiting for the next renewal:
                          present until a renewal bills its terms, on every
                          payment method. `null` when none is waiting and once a
                          cancellation has started. A renewal that bills nothing
                          (a 100% discount) does not count, so the change stays
                          pending until a paid renewal bills it.
                        nullable: true
                        properties:
                          amount_cents:
                            type: integer
                          effective_at:
                            description: >-
                              The next renewal, which is when it takes effect.
                              `null` while paused.
                            nullable: true
                            type: string
                          plan:
                            additionalProperties: false
                            properties:
                              id:
                                description: >-
                                  The id of the plan these terms were sold on or
                                  switched to. `null` when no recorded fact
                                  names the plan — for example, a subscription
                                  sold through an offer, a plan since deleted
                                  from the product, or one sold before plans
                                  were recorded.
                                example: plan_A1b2C3d4
                                nullable: true
                                pattern: ^plan_[A-Za-z0-9]{8,32}$
                                type: string
                              interval:
                                type: string
                              interval_count:
                                type: integer
                              name:
                                nullable: true
                                type: string
                              object:
                                enum:
                                  - payment_plan
                                type: string
                            required:
                              - object
                              - id
                              - name
                              - interval
                              - interval_count
                            type: object
                          type:
                            enum:
                              - price
                              - plan
                            type: string
                        required:
                          - type
                          - amount_cents
                          - plan
                          - effective_at
                        type: object
                      plan:
                        additionalProperties: false
                        description: The plan in force for the period already billed.
                        properties:
                          id:
                            description: >-
                              The id of the plan these terms were sold on or
                              switched to. `null` when no recorded fact names
                              the plan — for example, a subscription sold
                              through an offer, a plan since deleted from the
                              product, or one sold before plans were recorded.
                            example: plan_A1b2C3d4
                            nullable: true
                            pattern: ^plan_[A-Za-z0-9]{8,32}$
                            type: string
                          interval:
                            type: string
                          interval_count:
                            type: integer
                          name:
                            nullable: true
                            type: string
                          object:
                            enum:
                              - payment_plan
                            type: string
                        required:
                          - object
                          - id
                          - name
                          - interval
                          - interval_count
                        type: object
                      status:
                        description: >-
                          `canceling` means a cancellation was accepted and has
                          not taken effect; it becomes `cancelled` when the
                          subscription ends.
                        enum:
                          - pending
                          - trial
                          - active
                          - overdue
                          - paused
                          - canceling
                          - cancelled
                        type: string
                    required:
                      - id
                      - object
                      - status
                      - business
                      - order
                      - line_item
                      - plan
                      - amount_cents
                      - currency
                      - next_billing_at
                      - paused_at
                      - cancel_at
                      - cancelled_at
                      - created_at
                      - pending_change
                    type: object
                required:
                  - data
                type: object
          description: Successful response
        '400':
          content:
            application/problem+json:
              examples:
                subscription_idempotency_key_required:
                  summary: Missing Idempotency-Key header
                  value:
                    code: idempotency_key_required
                    detail: >-
                      an Idempotency-Key header is required for a subscription
                      change
                    errors:
                      - code: idempotency_key_required
                        detail: >-
                          an Idempotency-Key header is required for a
                          subscription change
                        param: idempotency_key
                    request_id: req_123
                    status: 400
                    title: Idempotency Key Required
                    type: https://docs.cope.com/errors/idempotency_key_required
                subscription_invalid_idempotency_key:
                  summary: Malformed Idempotency-Key header
                  value:
                    code: invalid_idempotency_key
                    detail: >-
                      Idempotency-Key header must be at most 255 characters of
                      valid UTF-8 without a NUL byte
                    errors:
                      - code: invalid_idempotency_key
                        detail: >-
                          Idempotency-Key header must be at most 255 characters
                          of valid UTF-8 without a NUL byte
                        param: idempotency_key
                    request_id: req_123
                    status: 400
                    title: Invalid Idempotency Key
                    type: https://docs.cope.com/errors/invalid_idempotency_key
                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
        '409':
          content:
            application/problem+json:
              examples:
                subscription_idempotency_conflict:
                  summary: Idempotency key reused with a different body
                  value:
                    code: idempotency_conflict
                    detail: >-
                      request body does not match the original request for this
                      idempotency key
                    errors:
                      - code: idempotency_body_mismatch
                        detail: >-
                          request body does not match the original request for
                          this idempotency key
                        param: idempotency_key
                    request_id: req_123
                    status: 409
                    title: Idempotency Conflict
                    type: https://docs.cope.com/errors/idempotency_conflict
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: >-
            The idempotency key was already used for this subscription with a
            different body.
        '422':
          content:
            application/problem+json:
              examples:
                subscription_status_validation_failed:
                  summary: The body carries an unsupported member
                  value:
                    code: validation_failed
                    detail: null
                    errors:
                      - code: unsupported
                        detail: resumes_at is not supported by this public endpoint
                        param: resumes_at
                    request_id: req_123
                    status: 422
                    title: Validation Failed
                    type: https://docs.cope.com/errors/validation_failed
                subscription_not_eligible:
                  summary: The subscription cannot be changed
                  value:
                    code: subscription_not_eligible
                    detail: non stripe rail
                    errors:
                      - code: non_stripe_rail
                        detail: non stripe rail
                        param: subscription_id
                    request_id: req_123
                    status: 422
                    title: Subscription Not Eligible
                    type: https://docs.cope.com/errors/subscription_not_eligible
                subscription_not_paused:
                  summary: Only a paused subscription can be resumed
                  value:
                    code: subscription_not_eligible
                    detail: not paused
                    errors:
                      - code: not_paused
                        detail: not paused
                        param: subscription_id
                    request_id: req_123
                    status: 422
                    title: Subscription Not Eligible
                    type: https://docs.cope.com/errors/subscription_not_eligible
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: The body is invalid, or the subscription cannot be changed now
        '502':
          content:
            application/problem+json:
              examples:
                subscription_payment_provider_unconfirmed:
                  summary: The payment provider did not confirm the change
                  value:
                    code: payment_provider_unconfirmed
                    detail: >-
                      The payment provider did not confirm this change. It is
                      recorded, and COPE keeps completing or refusing it on its
                      own, usually within minutes, for up to 24 hours. Repeat
                      the request under the same Idempotency-Key to ask again
                      now; a price or plan change also shows its outcome in GET
                      …/changes.
                    errors:
                      - code: payment_provider_unconfirmed
                        detail: >-
                          The payment provider did not confirm this change. It
                          is recorded, and COPE keeps completing or refusing it
                          on its own, usually within minutes, for up to 24
                          hours. Repeat the request under the same
                          Idempotency-Key to ask again now; a price or plan
                          change also shows its outcome in GET …/changes.
                        param: subscription_id
                    request_id: req_123
                    status: 502
                    title: Payment Provider Unconfirmed
                    type: https://docs.cope.com/errors/payment_provider_unconfirmed
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: >-
            The payment provider did not confirm this change, and may already
            hold it. COPE keeps completing or refusing it on its own for up to
            24 hours. To act now, repeat the request under the same
            Idempotency-Key, never a new one: COPE retries the same change, and
            the answer may be success, a refusal such as `superseded` or
            `change_in_flight`, or 502 again. `detail` is fixed text and never
            repeats what the provider said.
        '504':
          content:
            application/problem+json:
              examples:
                gateway_timeout:
                  summary: The request did not complete in time
                  value:
                    code: gateway_timeout
                    detail: The request did not complete in time
                    errors:
                      - code: gateway_timeout
                        detail: The request did not complete in time
                    request_id: req_123
                    status: 504
                    title: Gateway Timeout
                    type: https://docs.cope.com/errors/gateway_timeout
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: >-
            The request did not complete in time, so its outcome is unknown and
            the change may have been applied. Repeat it under the same
            Idempotency-Key, never a new one: a new key asks for a second
            change.
      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

````