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

# med.opened

> Enviado quando o comprador abre uma contestação de Pix. O valor sai do saldo e fica retido até a decisão.

<Warning>
  **Segure a entrega.** Uma contestação pode terminar com o dinheiro devolvido ao comprador, e o
  produto já entregue não volta. Confira a assinatura antes de gravar qualquer coisa. Ver
  [Verificar a assinatura](/webhooks/assinatura).
</Warning>

Trate este evento como um [`charge.in_analysis`](/api-reference/webhooks/charge-in-analysis) de Pix:
é um aviso de espera, não um desfecho. O resultado chega depois, como
[`med.approved`](/api-reference/webhooks/med-approved) ou
[`med.rejected`](/api-reference/webhooks/med-rejected).

Quando o evento chega, o valor já saiu do saldo disponível e não é sacável — ele aparece em "Em
contestação" no painel. `held_amount` é o que foi retido, congelado na abertura.

## O prazo diz de quem é a vez

`defence_deadline` é até quando você pode enviar a sua versão pelo painel. Ele não trava a decisão
da Vext: um caso sem defesa é decidido do mesmo jeito, com o que houver nos autos.

## Quem contestou não é quem pagou

`data.med.claimant` traz **só o nome** de quem abriu a contestação. Os dados de quem pagou continuam
em `data.charge.customer`, gravados no checkout — e podem ser outra pessoa, que é justamente a
alegação numa contestação por fraude.

`opened_by` muda o que você está respondendo: `customer` é o formulário público preenchido pela
pessoa, `support` é a Vext registrando o que ouviu por outro canal. As duas retêm igual, mas
sustentam alegações diferentes.

## Guarde o caso pelo `id`

Os três eventos de MED carregam o mesmo objeto `med`, com o mesmo `id`, em estados diferentes.
Guarde o caso e atualize-o a cada evento, em vez de esperar corpos diferentes por tipo — é o que
evita reescrever o seu parser quando um passo novo aparecer na linha do tempo.


## OpenAPI

````yaml api-reference/openapi.yaml webhook med.opened
openapi: 3.1.0
info:
  title: Vext - API de pagamentos PIX com split
  version: 1.0.0
  summary: Cobranças PIX, estornos e saldo do vendedor.
  description: |
    API pública do gateway. Todo endpoint desta versão vive sob `/v1`.

    ## Dinheiro é sempre CENTAVOS INTEIROS

    Não há exceção. `amount`, `platform_fee`, `net_amount`, `refunded_amount`,
    `fee_returned`, `seller_debit`, `balance`, `available`, `reserved`, `debt`
    e `withdrawable` são inteiros em centavos de real.

    | Valor       | Envie / receba |
    |-------------|----------------|
    | R$ 1,00     | `100`          |
    | R$ 10,50    | `1050`         |
    | R$ 1.234,56 | `123456`       |

    Enviar `10.50` devolve `422`. A recusa é deliberada: `10.50` chega ao
    servidor como ponto flutuante, `10.50 * 100` não é exatamente `1050` em
    binário, e o centavo perdido só aparece na conciliação do mês. Diante de
    um decimal preferimos recusar a adivinhar a intenção - com dinheiro,
    adivinhar sai caro.

    ## Autenticação

    Toda chamada leva a chave no header:

    ```
    Authorization: Bearer sk_live_...
    ```

    A chave é criada em **Desenvolvedores** no painel e o valor em claro
    aparece **uma única vez**, na criação - guardamos apenas um hash
    SHA-256. Perdeu, gere outra.

    Cada chave carrega escopos (`charges:read`, `charges:write`,
    `refunds:write`, `balance:read`). Chamar um endpoint fora do escopo
    devolve `403`, e não `401`: a chave está certa, faltou permissão.

    Chaves de teste usam o prefixo `sk_test_`. A diferença é visível a olho
    nu de propósito - uma chave de teste colada em produção precisa ser
    reconhecível antes de alguém passar a tarde investigando.

    ## Idempotência

    Envie `Idempotency-Key` em todo `POST`. A conexão que cai depois da
    requisição e antes da resposta deixa você sem saber se cobrou; repetir
    com a mesma chave resolve isso sem risco de cobrar duas vezes.

    - **mesma chave, mesmo corpo** → a resposta gravada, com
      `Idempotent-Replayed: true`. A cobrança não é recriada.
    - **mesma chave, corpo diferente** → `409 idempotency_key_reused`.
      Devolver a cobrança antiga faria você acreditar que cobrou o valor
      novo.
    - **mesma chave, primeira ainda em voo** → `409
      idempotency_key_in_progress`. Repita em instantes.

    A ordem dos campos no JSON não invalida o retry. A chave vale por 24
    horas e é sua: dois clientes diferentes podem usar `pedido-1` sem
    colidir.

    ## Erros

    Todo erro - inclusive os que não previmos - tem a mesma forma:

    ```json
    {
      "error": {
        "type": "invalid_request_error",
        "code": "amount_below_minimum",
        "message": "…",
        "details": {}
      }
    }
    ```

    Trate pelo `code`, nunca pela `message`: o código é contrato, o texto
    pode ser reescrito a qualquer momento.
  contact:
    name: Suporte Vext
    url: https://wa.me/5511936185272
servers:
  - url: https://api.usevext.com
    description: Produção
security:
  - apiKey: []
tags:
  - name: Cobranças
    description: Criação, consulta e estorno de cobranças PIX.
  - name: Saldo
    description: Quanto o vendedor tem e quanto pode sacar.
  - name: Eventos de cobrança
    description: O que chamamos no seu endpoint quando uma venda muda de estado.
  - name: Eventos de saque
    description: O que chamamos no seu endpoint quando o dinheiro sai para o vendedor.
  - name: Eventos de contestação (MED)
    description: |
      Abertura e desfecho de uma contestação de Pix. Veja
      [Visão geral dos webhooks](/webhooks/visao-geral).
paths: {}
components:
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: sk_live_… | sk_test_…
      description: |
        Chave secreta do vendedor, criada no painel em **Desenvolvedores**.

        O valor em claro existe uma única vez, na criação. Guardamos só o
        hash SHA-256 - nem o suporte consegue recuperá-lo, o que é o ponto:
        um dump do nosso banco não permite cobrar em nome de ninguém.

        A chave vai no **servidor**. Colocá-la no navegador do comprador a
        entrega a qualquer pessoa que abra a página.

````