cURL
curl --request POST \
--url https://api.cakto.com.br/public_api/disputes/{id}/complement/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'letter=<string>' \
--form 'message=<string>'import requests
url = "https://api.cakto.com.br/public_api/disputes/{id}/complement/"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"letter": "<string>",
"message": "<string>"
}
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('message', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.cakto.com.br/public_api/disputes/{id}/complement/', 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}/complement/",
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=\"message\"\r\n\r\n<string>\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}/complement/")
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=\"message\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/disputes/{id}/complement/")
.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=\"message\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/disputes/{id}/complement/");
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("message", "<string>");
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": {
"files": [
"Anexe ao menos um PDF ou reescreva a carta."
]
}
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "O Compliance não pediu complemento para esta defesa."
}{
"detail": "O prazo para complementar terminou em 25/10/2026 às 23:59."
}{
"detail": "Não foi possível falar com o serviço de pagamentos. Tente de novo em instantes."
}Chargeback e MED
Complementar Defesa
Responde ao pedido de complemento do Compliance, dentro do mesmo prazo.
POST
/
public_api
/
disputes
/
{id}
/
complement
/
cURL
curl --request POST \
--url https://api.cakto.com.br/public_api/disputes/{id}/complement/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'letter=<string>' \
--form 'message=<string>'import requests
url = "https://api.cakto.com.br/public_api/disputes/{id}/complement/"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"letter": "<string>",
"message": "<string>"
}
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('message', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.cakto.com.br/public_api/disputes/{id}/complement/', 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}/complement/",
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=\"message\"\r\n\r\n<string>\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}/complement/")
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=\"message\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/disputes/{id}/complement/")
.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=\"message\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/disputes/{id}/complement/");
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("message", "<string>");
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": {
"files": [
"Anexe ao menos um PDF ou reescreva a carta."
]
}
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "O Compliance não pediu complemento para esta defesa."
}{
"detail": "O prazo para complementar terminou em 25/10/2026 às 23:59."
}{
"detail": "Não foi possível falar com o serviço de pagamentos. Tente de novo em instantes."
}Escopo
write orders
Quando usar
Quando o Compliance da Cakto pede um ajuste na defesa, a disputa fica comstatus: "needs_info", e a
mensagem dele está em defense.infoRequest. Esta chamada responde: soma PDFs à defesa e, se for o
caso, troca a carta. A disputa volta à conferência.
| Campo | Regra |
|---|---|
files | PDFs somados aos já enviados, nas mesmas regras do envio. Opcional quando a carta é reescrita |
letter | A carta reescrita, que substitui a anterior. De 300 a 5.000 caracteres |
message | Mensagem ao Compliance, até 2.000 caracteres |
multipart/form-data. Só com a carta reescrita, pode ir em JSON.
O pedido de complemento não estende o prazo da contestação. Depois do
deadline, o
complemento não é mais aceito (422).Erros
| Código | Quando |
|---|---|
400 | Sem arquivo e sem carta nova, ou campo fora da regra |
404 | Pedido sem chargeback ou MED, inexistente ou de outra conta |
409 | O Compliance não pediu complemento, ou a disputa já foi encerrada |
422 | O prazo terminou |
502 | O serviço de pagamentos não respondeu |
status já não é needs_info, o complemento chegou.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-dataapplication/json
Response
Complemento gravado: a disputa volta à conferência do Compliance.
Was this page helpful?