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

# Desfazer a troca de plano agendada

> Apaga uma troca marcada para a virada. A assinatura segue no plano atual.

`DELETE /subscriptions/:id/change-plan`

Faz parte do recurso [Assinaturas](/pt-BR/subscriptions) — o conceito e os dez estados estão lá.

Apaga uma [troca de plano](/pt-BR/subscriptions/change-plan) que estava marcada para a virada do ciclo. A assinatura continua no plano atual, e a próxima fatura sai com o preço de hoje.

Devolve a assinatura como ela ficou.

<Note>
  **Como saber se há o que desfazer.** O campo `scheduledPlanChange` da assinatura traz `{ planId, effectiveDate }` enquanto existir troca marcada, e `null` quando não existir. Ele vem no [`GET /subscriptions/{id}`](/pt-BR/subscriptions/get) e no corpo desta rota — é por ele que você confirma que a chamada fez efeito.
</Note>

<Note>
  **Não falha quando não há nada agendado.** A rota devolve a assinatura do mesmo jeito, com `200`. Desfazer duas vezes tem o mesmo efeito de desfazer uma — você não precisa consultar antes para saber se existe agendamento.
</Note>

<Warning>
  **Troca que já entrou em vigor não volta por aqui.** Esta rota só alcança o que está agendado. Se a troca já valeu — o caso de um plano mais caro, que passa a valer na hora —, o caminho de volta é uma nova troca para o plano anterior, com as regras normais: para baixo, ela será agendada para a virada.
</Warning>


## OpenAPI

````yaml openapi/billing.json DELETE /subscriptions/{id}/change-plan
openapi: 3.0.3
info:
  title: Z2Pay Billing API
  version: 1.0.0
  description: Cobrança recorrente da Z2Pay — planos, assinaturas e faturas
servers:
  - url: https://api.sandbox.z2pay.com/v1
    description: Sandbox
  - url: https://api.z2pay.com/v1
    description: Produção
security: []
tags:
  - name: Invoices
    description: Faturas emitidas pelas assinaturas
  - name: Plans
    description: Planos de cobrança e versões de preço
  - name: Subscriptions
    description: Assinaturas recorrentes
paths:
  /subscriptions/{id}/change-plan:
    delete:
      tags:
        - Subscriptions
      summary: Desfazer a troca de plano agendada
      description: >-
        Apaga uma troca marcada para a virada do ciclo, e a assinatura segue no
        plano atual. O campo `scheduledPlanChange` da assinatura diz se existe
        algo a desfazer.


        Não falha quando não há nada agendado: devolve a assinatura como ela
        está. Desfazer duas vezes tem o mesmo efeito de desfazer uma.


        Troca que já entrou em vigor não é desfeita por aqui — para voltar ao
        plano anterior, faça uma nova troca.
      operationId: SubscriptionController_cancelScheduledPlanChange
      parameters:
        - name: id
          in: path
          required: true
          description: ID da assinatura
          schema:
            type: string
        - name: Idempotency-Key
          in: header
          required: false
          description: Chave única para garantir idempotência da requisição
          schema:
            type: string
      responses:
        '200':
          description: Assinatura, com o agendamento removido se havia um
        '401':
          description: Chave de API ausente, malformada ou inválida
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: >-
                          Identificador estável do erro. É por ele que você deve
                          ramificar, não pela mensagem.
                      message:
                        type: string
                        description: >-
                          Descrição legível. Pode mudar sem aviso e não deve ser
                          usada em condicional.
              example:
                error:
                  code: UNAUTHORIZED
                  message: Invalid API key
        '404':
          description: Assinatura não encontrada
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: >-
                          Identificador estável do erro. É por ele que você deve
                          ramificar, não pela mensagem.
                      message:
                        type: string
                        description: >-
                          Descrição legível. Pode mudar sem aviso e não deve ser
                          usada em condicional.
              example:
                error:
                  code: NOT_FOUND
                  message: Subscription not found
        '409':
          description: >-
            Já existe uma requisição em andamento com esta Idempotency-Key. A
            API aguarda a primeira concluir por até 5 segundos antes de
            responder assim
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: >-
                      Mensagem do conflito de idempotência. Aqui `error` é
                      texto, não objeto — ramifique pelo status HTTP.
              example:
                error: A request with this idempotency key is already being processed
        '422':
          description: >-
            Idempotency-Key já usada com um corpo diferente. Use uma chave nova
            para uma operação diferente
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: >-
                      Mensagem do conflito de idempotência. Aqui `error` é
                      texto, não objeto — ramifique pelo status HTTP.
              example:
                error: Idempotency key already used with a different request body
      security:
        - apiKey: []
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: API Key da Credential (gerada no Backoffice)

````