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

# Enviar Defesa

> Responde ao chargeback ou MED com a carta e os documentos, dentro do prazo.

#### Escopo

```bash theme={null}
    write orders
```

## O que esta chamada faz

Grava a defesa do pedido `{id}`, que vai para a conferência do Compliance da Cakto. É o mesmo envio
do painel, com as mesmas regras, e só vale uma vez por pedido, dentro do prazo (`deadline`).

O corpo vai em `multipart/form-data`:

| Campo | Regra |
| - | - |
| `files` | De 1 a 10 PDFs, até 1,9 MB cada. O arquivo é conferido pelos bytes, não pela extensão. Repita o campo para cada arquivo |
| `letter` | A carta ao **banco do comprador**, de 300 a 5.000 caracteres. Ela vai como está: o que foi vendido, quando o acesso foi liberado, o que o comprador usou e qual documento prova cada ponto |
| `confirmed` | `true`: os documentos seguem as regras das bandeiras, sem dados do cartão nem links |

> [!WARNING]
>
> Escreva a carta para o banco, não para a Cakto. No MED, ela é a peça principal: o que chega à
> instituição do Pix é uma justificativa em texto montada a partir dela.

A resposta `201` traz a disputa como em [Consultar](/api-reference/disputes/retrieve), agora com
`defense`. Veja a documentação aceita em cada motivo no
[guia de chargeback, pré-chargeback e MED](https://ajuda.cakto.com.br/pt-br/articles/73-chargeback-pre-chargeback-e-med).

## Erros

| Código | Quando |
| - | - |
| `400` | Arquivo, carta ou aceite fora da regra. `errors` diz o campo e o motivo |
| `404` | Pedido sem chargeback ou MED, inexistente ou de outra conta |
| `409` | A defesa do pedido já foi enviada, ou não há chargeback nem MED em aberto. Nada foi gravado |
| `422` | O prazo do produtor terminou |
| `502` | O serviço de pagamentos não respondeu. Nada foi gravado: repita a chamada |

Repetir o envio depois de um timeout é seguro: se a defesa já tinha sido gravada, a resposta é `409`.

***

## Exemplo

```python Python theme={null}
import requests

carta = "Prezado banco, a compradora adquiriu o curso em 02/10/2026 e acessou as aulas em ..."

with open("registro-de-acesso.pdf", "rb") as acesso, open("nota-fiscal.pdf", "rb") as nota:
    resposta = requests.post(
        "https://api.cakto.com.br/public_api/disputes/5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41/defense/",
        headers={"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsIn..."},
        data={"letter": carta, "confirmed": "true"},
        files=[
            ("files", ("registro-de-acesso.pdf", acesso, "application/pdf")),
            ("files", ("nota-fiscal.pdf", nota, "application/pdf")),
        ],
        timeout=60,
    )

if resposta.status_code == 400:
    print(resposta.json()["errors"])
else:
    resposta.raise_for_status()
    print(resposta.json()["status"])  # "submitted"
```

```javascript Node.js theme={null}
import { readFile } from "node:fs/promises";

const corpo = new FormData();
corpo.append("letter", carta);
corpo.append("confirmed", "true");
corpo.append(
  "files",
  new Blob([await readFile("registro-de-acesso.pdf")], { type: "application/pdf" }),
  "registro-de-acesso.pdf",
);

const resposta = await fetch(
  "https://api.cakto.com.br/public_api/disputes/5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41/defense/",
  {
    method: "POST",
    headers: { Authorization: "Bearer eyJhbGciOiJIUzI1NiIsIn..." },
    body: corpo,
  },
);
```


## OpenAPI

````yaml POST /public_api/disputes/{id}/defense/
openapi: 3.0.3
info:
  title: Cakto API
  version: 1.0.0
  description: Documentação da API pública do Cakto.
servers:
  - url: https://api.cakto.com.br
    description: Cakto API
security: []
paths:
  /public_api/disputes/{id}/defense/:
    post:
      tags:
        - disputes
      description: >-
        Envia a defesa do chargeback ou do MED, em `multipart/form-data`: de 1 a
        10 PDFs (`files`, até 1,9 MB cada), a carta ao banco do comprador
        (`letter`, de 300 a 5.000 caracteres) e o aceite das regras das
        bandeiras (`confirmed=true`). Só dentro do prazo e uma vez por pedido:
        depois do envio, o Compliance confere e encaminha.
      operationId: disputes_defense_create
      parameters:
        - in: path
          name: id
          schema:
            type: string
          description: Id do pedido com chargeback ou MED.
          required: true
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/DisputeDefenseRequestSchema'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                DefesaEnviada:
                  value:
                    paymentId: 0c9d4e7a-1b2f-4a6e-8d35-7f1e2a9c4b60
                    kind: chargeback
                    status: submitted
                    statusLabel: Em análise pela Cakto
                    canSubmit: false
                    canComplement: false
                    openedAt: '2026-10-19T10:12:40.118302-03:00'
                    deadline: '2026-10-25T23:59:59-03:00'
                    reason: null
                    amount: '197.00'
                    currency: BRL
                    submittedAt: '2026-10-20T09:41:22.873610-03:00'
                    sentAt: null
                    decidedAt: null
                    rules:
                      maxFiles: 10
                      maxFileSizeBytes: 1900000
                      acceptedTypes:
                        - application/pdf
                      letterMaxLength: 5000
                      letterMinLength: 300
                      messageMaxLength: 2000
                    guideUrl: >-
                      https://ajuda.cakto.com.br/pt-br/articles/73-chargeback-pre-chargeback-e-med
                    defense:
                      status: submitted
                      submittedAt: '2026-10-20T09:41:22.873610-03:00'
                      letter: >-
                        Prezado banco, a compradora Maria Souza adquiriu o Curso
                        de Exemplo em 02/10/2026 e acessou as aulas em 03/10 e
                        05/10, como mostra o registro de acesso anexo...
                      documents:
                        - id: 912
                          name: registro-de-acesso.pdf
                          sizeBytes: 184213
                          origin: seller
                          uploadedAt: '2026-10-20T09:41:22.873610-03:00'
                      infoRequest: null
                      declineReason: null
                      sentAt: null
                      decidedAt: null
                      timeline:
                        - at: '2026-10-19T10:12:40.118302-03:00'
                          label: Chargeback registrado na sua conta
                          detail: null
                          state: done
                        - at: '2026-10-20T09:41:22.873610-03:00'
                          label: Defesa enviada por você
                          detail: 1 arquivo
                          state: done
                        - at: null
                          label: Conferência da Cakto
                          detail: null
                          state: current
                    refId: Q7W2k9P
                    orderId: 5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41
                    order:
                      productName: Curso de Exemplo
                      amount: '197.00'
                      formattedAmount: R$ 197,00
                      paymentMethod: credit_card
                      paymentMethodLabel: Cartão de Crédito
                      installments: 1
                      createdAt: '2026-10-02T14:03:11.204871-03:00'
                      paidAt: '2026-10-02T14:03:15.664021-03:00'
                      customerName: Maria Souza
                      customerEmail: maria.souza@example.com
                  summary: Defesa enviada
          description: 'Defesa gravada: a disputa, como no `GET`, agora com `defense`.'
        '400':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                CamposInvalidos:
                  value:
                    detail: Revise os campos destacados.
                    errors:
                      letter:
                        - >-
                          Escreva a carta com pelo menos 300 caracteres. Ela vai
                          ao banco como está: ...
                      files:
                        - 'contrato.pdf: não é um PDF.'
          description: Arquivo, carta ou aceite fora da regra, por campo em `errors`.
        '401':
          description: Request não autenticado devido à ausência ou invalidez do token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthenticatedError'
              examples:
                Token ausente ou inválido:
                  $ref: '#/components/examples/UnauthenticatedErrorExample'
        '404':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                NaoEncontrado:
                  value:
                    detail: Não encontrado.
          description: >-
            Pedido sem chargeback ou MED, ou de outra conta: 403 confirmaria que
            o id existe.
        '409':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                JaEnviada:
                  value:
                    detail: A defesa deste pedido já foi enviada.
          description: >-
            Já existe defesa para o pedido, ou ele não tem chargeback nem MED em
            aberto. Nada foi gravado.
        '422':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                PrazoEncerrado:
                  value:
                    detail: O prazo para contestar terminou em 25/10/2026.
          description: 'O prazo do produtor terminou: a defesa não é mais aceita.'
        '502':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                ServicoIndisponivel:
                  value:
                    detail: >-
                      Não foi possível falar com o serviço de pagamentos. Tente
                      de novo em instantes.
          description: >-
            O serviço de pagamentos não respondeu. Nada foi gravado: repita a
            chamada.
      security:
        - OAuth Token: []
components:
  schemas:
    DisputeDefenseRequestSchema:
      type: object
      properties:
        files:
          type: array
          items:
            type: string
            format: binary
          description: De 1 a 10 PDFs, até 1,9 MB cada. O conteúdo é conferido pelos bytes.
        letter:
          type: string
          description: >-
            Carta ao banco do comprador, de 300 a 5.000 caracteres. Vai ao banco
            como está: o que foi vendido, quando o acesso foi liberado, o que o
            comprador usou e qual documento prova cada ponto.
        confirmed:
          type: boolean
          description: Aceite de que os documentos não trazem dados do cartão nem links.
      required:
        - confirmed
        - files
        - letter
    UnauthenticatedError:
      type: object
      properties:
        detail:
          type: string
  examples:
    UnauthenticatedErrorExample:
      summary: Token ausente ou inválido
      description: Token ausente ou inválido
      value:
        detail: As credenciais de autenticação não foram fornecidas.
  securitySchemes:
    OAuth Token:
      type: http
      scheme: bearer
      in: header
      name: Authorization
      description: >-
        Token de autenticação do tipo `Bearer {access_token}`, onde
        `{access_token}` é o token obtido no fluxo de
        [autenticação](/authentication).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.