cURL
curl --request POST \
--url https://api.cakto.com.br/public_api/disputes/{id}/defense/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'letter=<string>' \
--form confirmed=trueimport requests
url = "https://api.cakto.com.br/public_api/disputes/{id}/defense/"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"letter": "<string>",
"confirmed": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('letter', '<string>');
form.append('confirmed', 'true');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.cakto.com.br/public_api/disputes/{id}/defense/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cakto.com.br/public_api/disputes/{id}/defense/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.cakto.com.br/public_api/disputes/{id}/defense/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/disputes/{id}/defense/")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/disputes/{id}/defense/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AlwaysMultipartFormData = true;
request.AddHeader("Authorization", "Bearer <token>");
request.FormBoundary = "---011000010111000001101001";
request.AddFile("files", "example-file");
request.AddParameter("letter", "<string>");
request.AddParameter("confirmed", "true");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"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"
}
}{
"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."
]
}
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "A defesa deste pedido já foi enviada."
}{
"detail": "O prazo para contestar terminou em 25/10/2026."
}{
"detail": "Não foi possível falar com o serviço de pagamentos. Tente de novo em instantes."
}Chargeback e MED
Enviar Defesa
Responde ao chargeback ou MED com a carta e os documentos, dentro do prazo.
POST
/
public_api
/
disputes
/
{id}
/
defense
/
cURL
curl --request POST \
--url https://api.cakto.com.br/public_api/disputes/{id}/defense/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'letter=<string>' \
--form confirmed=trueimport requests
url = "https://api.cakto.com.br/public_api/disputes/{id}/defense/"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"letter": "<string>",
"confirmed": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('letter', '<string>');
form.append('confirmed', 'true');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.cakto.com.br/public_api/disputes/{id}/defense/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cakto.com.br/public_api/disputes/{id}/defense/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.cakto.com.br/public_api/disputes/{id}/defense/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/disputes/{id}/defense/")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"letter\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"confirmed\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/disputes/{id}/defense/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AlwaysMultipartFormData = true;
request.AddHeader("Authorization", "Bearer <token>");
request.FormBoundary = "---011000010111000001101001";
request.AddFile("files", "example-file");
request.AddParameter("letter", "<string>");
request.AddParameter("confirmed", "true");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"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"
}
}{
"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."
]
}
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "A defesa deste pedido já foi enviada."
}{
"detail": "O prazo para contestar terminou em 25/10/2026."
}{
"detail": "Não foi possível falar com o serviço de pagamentos. Tente de novo em instantes."
}Escopo
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 |
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.
201 traz a disputa como em Consultar, agora com
defense. Veja a documentação aceita em cada motivo no
guia de chargeback, pré-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 |
409.
Exemplo
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"
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,
},
);
Authorizations
Token de autenticação do tipo Bearer {access_token}, onde {access_token} é o token obtido no fluxo de autenticação.
Path Parameters
Id do pedido com chargeback ou MED.
Body
multipart/form-data
De 1 a 10 PDFs, até 1,9 MB cada. O conteúdo é conferido pelos bytes.
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.
Aceite de que os documentos não trazem dados do cartão nem links.
Response
Defesa gravada: a disputa, como no GET, agora com defense.
Was this page helpful?