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

# Enviar Evidência da Disputa

> Envia o arquivo de evidência e a descrição da defesa. Pode ser chamado múltiplas vezes para anexar evidências adicionais — a última prevalece no campo `content`. Internamente, o gateway envia a defesa ao PSP upstream (hoje apenas Woovi tem caminho server-to-server).

Envia o arquivo de evidência e a descrição da defesa para o `medId` indicado. Internamente, o gateway encaminha a defesa ao PSP upstream.

<Note>
  Pode ser chamado mais de uma vez para anexar evidências adicionais — a última prevalece no campo `content`.
</Note>

## Status final retornado

O `status` na resposta indica o resultado imediato do envio:

| Status              | Significado                                                                                                                                                    |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DEFENSE_SUBMITTED` | Defesa entregue ao PSP com sucesso (caminho feliz).                                                                                                            |
| `DEFENSE_FAILED`    | O PSP rejeitou o envio (erro de transporte/4xx). Detalhes em `last_error`. Pode chamar o PATCH novamente para tentar outra evidência.                          |
| `REQUESTED`         | O PSP da transação ainda não tem caminho server-to-server suportado (hoje apenas **Woovi**). Nesses casos o time interno é notificado e acompanha manualmente. |

## Exemplo cURL

```bash theme={null}
curl -X PATCH "https://gateway.3xpay.co/med-contest/exposes/1024" \
  -H "api_key: SUA_API_KEY" \
  -H "api_secret: SEU_API_SECRET" \
  -F "file=@/caminho/comprovante.pdf" \
  -F "description=Comprovante de pagamento original emitido pelo nosso PSP."
```

<Warning>
  O arquivo tem **tamanho máximo de 10 MB** e a descrição **até 2000 caracteres**. Ambos os campos são obrigatórios.
</Warning>


## OpenAPI

````yaml PATCH /med-contest/exposes/{medId}
openapi: 3.0.1
info:
  title: 3X Pay Gateway
  description: >-
    Para autenticar as rotas dessa API são necessario ter em mãos a
    **api_secret** e **api_key** da sua conta. Este podem ser encontrados dentro
    do painel https://app.3xpay.co acessando a página de Configurações e
    clicando na opção de Credencias de API.
  version: 1.0.0
servers:
  - url: https://gateway.3xpay.co
security:
  - apiKeyAuth: []
    apiSecretAuth: []
tags:
  - name: Transações
    description: Operações relacionadas a transações financeiras
  - name: Webhooks
    description: Notificações de eventos da API
  - name: Balance
    description: Operações relacionadas ao saldo da conta
  - name: Sub-accounts
    description: Operações relacionadas a subcontas BaaS
  - name: MED Contest
    description: >-
      Endpoints server-to-server para responder a solicitações de MED (Mecanismo
      Especial de Devolução do Pix)
paths:
  /med-contest/exposes/{medId}:
    patch:
      tags:
        - MED Contest
      summary: Enviar evidência da disputa
      description: >-
        Envia o arquivo de evidência e a descrição da defesa. Pode ser chamado
        múltiplas vezes para anexar evidências adicionais — a última prevalece
        no campo `content`. Internamente, o gateway envia a defesa ao PSP
        upstream (hoje apenas Woovi tem caminho server-to-server).
      operationId: submitMedContestEvidence
      parameters:
        - name: medId
          in: path
          required: true
          schema:
            type: integer
          description: ID numérico da disputa.
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
                - description
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    Documento de evidência (PDF, imagem, etc.). Tamanho máximo:
                    10 MB.
                description:
                  type: string
                  maxLength: 2000
                  description: Descrição/texto da defesa. Máximo 2000 caracteres.
      responses:
        '200':
          description: Evidência registrada com sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MedContestRecord'
        '400':
          description: Erro de validação no envio
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                descriptionRequired:
                  summary: Descrição ausente
                  value:
                    error: 400
                    message: Descrição é obrigatória.
                descriptionTooLong:
                  summary: Descrição muito longa
                  value:
                    error: 400
                    message: Descrição deve ter no máximo 2000 caracteres.
                fileTooLarge:
                  summary: Arquivo excede o limite
                  value:
                    error: 400
                    message: Arquivo muito grande (máximo 10MB).
        '404':
          description: Disputa não encontrada
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                notFound:
                  summary: medId inexistente
                  value:
                    error: 404
                    message: Disputa de MED não encontrada
components:
  schemas:
    MedContestRecord:
      type: object
      description: >-
        Registro da disputa de MED. O campo `id` é o `medId` usado nos demais
        endpoints.
      properties:
        id:
          type: integer
          description: ID numérico da disputa (medId).
          example: 1024
        transactionId:
          type: integer
          description: ID interno da transação relacionada.
          example: 50231
        status:
          $ref: '#/components/schemas/MedContestStatus'
        content:
          type: string
          nullable: true
          description: >-
            URL do arquivo de evidência armazenado. `null` enquanto a evidência
            não foi enviada.
          example: https://s3.../comprovante.pdf
        description:
          type: string
          nullable: true
          description: Descrição/texto da defesa enviada com a evidência.
          example: Comprovante de pagamento original.
        external_med_id:
          type: string
          nullable: true
          description: ID da disputa no PSP upstream (preenchido após o envio).
          example: dispute_8f3a...
        processor_name:
          type: string
          nullable: true
          description: Nome do PSP upstream que recebeu a defesa.
          example: woovi
        retry_count:
          type: integer
          description: Quantidade de tentativas de envio.
          example: 0
        last_error:
          type: string
          nullable: true
          description: Mensagem do último erro de transporte, se houver.
        created_at:
          type: string
          format: date-time
          example: '2026-05-12T10:30:00.000Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-05-12T10:30:00.000Z'
    Error:
      required:
        - error
        - message
      type: object
      properties:
        error:
          type: integer
          format: int32
        message:
          type: string
    MedContestStatus:
      type: string
      description: Status do registro de disputa.
      enum:
        - WAITING_CONTENT
        - REQUESTED
        - DEFENSE_SUBMITTED
        - DEFENSE_FAILED
        - APPROVED
        - REJECTED
        - REFUNDED
        - CANCELLED
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: api_key
    apiSecretAuth:
      type: apiKey
      in: header
      name: api_secret

````