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

# Cancelar venda rápida

> Encerra uma cobrança que ainda não foi paga — a URL para de aceitar pagamento.

`POST /checkout/charges/{id}/cancel`

Faz parte do recurso [Vendas rápidas](/pt-BR/checkout/charges) — a relação com Link e Session está
lá.

Leva a cobrança para `canceled`, que é estado terminal: a URL para de aceitar pagamento e não há
como reabri-la. A resposta é `200` com a Session já no estado novo.

<Warning>
  **Só cancela o que ainda não foi pago.** Os estados aceitos são `created`, `opened`, `filling` e
  `failed`. Uma cobrança `paid` ou `paying` responde `409` com
  `key: "errors.checkout.session_not_cancellable"`, e o estado atual vem em `params.status`.

  Para desfazer uma cobrança **já paga**, o caminho é outro: o [estorno](/pt-BR/refunds), sobre a
  transação.
</Warning>

<Note>
  **Este é o único endpoint de cancelamento do Checkout, e ele não se limita às vendas rápidas.**
  Apesar do endereço, ele aceita qualquer Session da sua conta em estado cancelável — inclusive as
  materializadas a partir de um [Link](/pt-BR/checkout/links).
</Note>

<Note>
  **Cancelar é opcional.** Session não cancelada expira sozinha ao atingir `expiresAt` (24h por
  padrão) e vai para `expired`. Cancelar serve para encerrar antes disso.
</Note>

<Note>
  **O conflito de domínio não vai em `code`.** A resposta traz `code: "CONFLICT"` — o que distingue o
  caso é a `key`, com o prefixo inteiro. Comparar `error.code === "session_not_cancellable"` nunca
  casa. Veja [Erros de domínio](/pt-BR/erros#erros-de-dom%C3%ADnio-a-key).
</Note>

<Info>
  Endpoint idempotente. Veja [Convenções](/pt-BR/convencoes#idempot%C3%AAncia).
</Info>

## Exemplo

```bash theme={null}
curl -X POST https://api.sandbox.z2pay.com/v1/checkout/charges/cs_50b0abc54b632e7c57de3a73815413ace1d545dcd16da95c/cancel \
  -H "x-api-key: SUA_CHAVE_DE_SANDBOX"
```

```json Resposta 200 theme={null}
{
  "id": "cs_50b0abc54b632e7c57de3a73815413ace1d545dcd16da95c",
  "linkId": null,
  "status": "canceled",
  "amount": 30000,
  "currency": "BRL",
  "transactionId": null,
  "createdAt": "2026-06-24T12:00:00.000Z",
  "expiresAt": "2026-06-25T12:00:00.000Z"
}
```


## OpenAPI

````yaml openapi/checkout.json POST /checkout/charges/{id}/cancel
openapi: 3.0.3
info:
  title: Z2Pay Checkout API
  version: 1.0.0
  description: >-
    API pública dedicada do Checkout. Autenticação via header x-api-key com a
    API key unificada da conta (z2_{live|test}_{sk|pk}_...). Endpoints privados
    exigem uma key secret (sk); endpoints públicos aceitam a key publishable
    (pk) consumida pelo frontend do comprador.
servers:
  - url: https://api.sandbox.z2pay.com/v1
    description: Sandbox
  - url: https://api.z2pay.com/v1
    description: Produção
security: []
tags:
  - name: Checkout Links
    description: Checkout Links (integração API via sk_)
  - name: Checkout Sessions
    description: Checkout Sessions (integração API via sk_)
  - name: Vendas rápidas
    description: Cobrança individual sem Link — Sessions ad-hoc criadas com a chave secreta
paths:
  /checkout/charges/{id}/cancel:
    post:
      tags:
        - Vendas rápidas
      summary: Cancelar venda rápida
      description: >-
        Move a Session para status `canceled`. Permitido apenas quando o status
        atual é `created`, `opened`, `filling` ou `failed`.
      operationId: CheckoutChargeApiController_cancel
      parameters:
        - name: id
          in: path
          required: true
          description: ID da Session (cs_*)
          schema:
            type: string
      responses:
        '200':
          description: Venda rápida cancelada
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: Identificador único do registro.
                  linkId:
                    type: string
                    nullable: true
                    description: >-
                      Identificador do link de checkout que originou o registro;
                      nulo em sessões ad-hoc.
                  status:
                    type: string
                    description: Estado atual do registro.
                  mode:
                    type: string
                    description: >-
                      Modo do checkout: 'payment' (pagamento único) ou
                      'subscription' (assinatura).
                  currency:
                    type: string
                    description: 'Moeda no padrão ISO 4217 (ex.: BRL).'
                  locale:
                    type: string
                    description: 'Idioma do checkout (ex.: pt-BR, en-US, es-ES).'
                  config:
                    type: object
                    description: >-
                      Snapshot da configuração do checkout (formas de pagamento,
                      itens e personalização visual).
                  customer:
                    type: object
                    nullable: true
                    description: >-
                      Dados do comprador (nome, e-mail, documento e demais
                      informações).
                  customFieldValues:
                    type: object
                    nullable: true
                    description: >-
                      Valores preenchidos nos campos personalizados, indexados
                      pela key de cada campo.
                  paymentMethodSelected:
                    type: string
                    nullable: true
                    description: >-
                      Forma de pagamento selecionada pelo comprador na sessão
                      (ex.: credit_card, pix, boleto).
                  subtotal:
                    type: integer
                    description: Soma dos itens antes dos descontos, em centavos.
                  discountTotal:
                    type: integer
                    description: Total de descontos aplicados, em centavos.
                  amount:
                    type: integer
                    description: Valor total a ser cobrado, em centavos.
                  discounts:
                    type: array
                    items:
                      type: object
                    nullable: true
                    description: Descontos aplicados ao valor da sessão.
                  paymentAttempts:
                    type: integer
                    description: >-
                      Quantidade de tentativas de pagamento realizadas na
                      sessão.
                  transactionId:
                    type: string
                    nullable: true
                    description: >-
                      Identificador da transação gerada pelo pagamento da
                      sessão; nulo até haver pagamento.
                  subscriptionId:
                    type: string
                    nullable: true
                    description: >-
                      Identificador da assinatura criada a partir da sessão;
                      nulo até a ativação.
                  metadata:
                    type: object
                    nullable: true
                    description: >-
                      Metadados livres (pares chave-valor) para uso do
                      integrador; não afeta o processamento.
                  createdAt:
                    type: string
                    format: date-time
                    description: Data e hora de criação do registro (ISO 8601).
                  updatedAt:
                    type: string
                    format: date-time
                    description: Data e hora da última atualização do registro (ISO 8601).
                  openedAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      Data e hora em que a sessão foi aberta pelo comprador (ISO
                      8601); nula se ainda não aberta.
                  paidAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      Data e hora em que o pagamento foi confirmado (ISO 8601);
                      nula se não pago.
                  canceledAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      Data e hora do cancelamento (ISO 8601); nula se não
                      cancelado.
                  expiresAt:
                    type: string
                    format: date-time
                    description: Data e hora de expiração (ISO 8601).
                  url:
                    type: string
                    description: >-
                      URL pública do checkout para o comprador finalizar o
                      pagamento.
              example:
                id: cs_02f232c4dcf8eec4c29e0f3748476d1339b63c0e7ffab1dc
                linkId: null
                status: canceled
                mode: payment
                currency: BRL
                locale: pt-BR
                config:
                  paymentMethods:
                    card:
                      enabled: true
                      installments:
                        maxInstallments: 12
                    pix:
                      enabled: true
                      expiresIn: 3600
                  description: Curso de Marketing Digital
                customer:
                  name: Maria Souza
                  email: maria.souza@example.com
                  document: '12345678909'
                  documentType: cpf
                customFieldValues: null
                paymentMethodSelected: null
                subtotal: 19900
                discountTotal: 0
                amount: 19900
                discounts: []
                paymentAttempts: 0
                transactionId: null
                subscriptionId: null
                metadata: null
                createdAt: '2025-06-29T13:45:30.000Z'
                updatedAt: '2025-06-29T14:10:00.000Z'
                openedAt: '2025-06-29T13:46:02.000Z'
                paidAt: null
                canceledAt: '2025-06-29T14:10:00.000Z'
                expiresAt: '2025-06-30T13:45:30.000Z'
                url: >-
                  https://checkout.z2pay.com.br/c/s/cs_02f232c4dcf8eec4c29e0f3748476d1339b63c0e7ffab1dc
        '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
        '403':
          description: >-
            A chave é válida, mas não tem permissão para esta operação — é o
            caso de usar uma publishable key (pk) onde a rota exige uma secret
            key (sk)
          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: FORBIDDEN
                  message: Forbidden — insufficient permissions
        '404':
          description: Venda rápida 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: Charge not found
        '409':
          description: Status atual não permite cancelamento
          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: CONFLICT
                  message: No refundable payment found
        '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 unificada (z2_{live|test}_{sk|pk}_...) — secret (sk) para
        integração backend, publishable (pk) para uso no frontend público

````