curl --request POST \
--url https://api.cakto.com.br/public_api/refunds/{id}/approve/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cakto.com.br/public_api/refunds/{id}/approve/"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cakto.com.br/public_api/refunds/{id}/approve/', 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/refunds/{id}/approve/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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/refunds/{id}/approve/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/refunds/{id}/approve/")
.header("Authorization", "Bearer <token>")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/refunds/{id}/approve/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": "5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41",
"refId": "Q7W2k9P",
"status": "in_settlement",
"amount": "197.00",
"currency": "BRL",
"paymentMethod": "pix",
"offerType": "main",
"parentOrderId": null,
"reason": "Comprei por engano",
"refundedBy": "producer",
"paidAt": "2026-09-26T10:14:03.201544-03:00",
"requestedAt": "2026-09-28T09:41:22.873610-03:00",
"autoApproveAt": "2026-09-29T09:41:22.873610-03:00",
"settlementStartedAt": "2026-09-28T11:02:40.118302-03:00",
"refundedAt": null,
"customer": {
"id": 183921,
"name": "Maria Souza",
"email": "maria.souza@example.com",
"birthDate": null,
"phone": "11999999999",
"docType": "cpf",
"docNumber": "12345678909"
},
"product": {
"id": "ff3fdf61-e88f-43b5-982a-32d50f112414",
"short_id": "AckhQ75",
"name": "Curso de Exemplo"
},
"offer": {
"id": "B8BcHrY",
"name": "Oferta principal"
}
}{
"detail": "Conta do produtor bloqueada."
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "Este reembolso não está aguardando aprovação.",
"code": "refund_not_pending",
"status": "paid"
}Aprovar Reembolso
Antecipa o reembolso pedido pelo comprador, sem esperar o fim da janela.
curl --request POST \
--url https://api.cakto.com.br/public_api/refunds/{id}/approve/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cakto.com.br/public_api/refunds/{id}/approve/"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cakto.com.br/public_api/refunds/{id}/approve/', 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/refunds/{id}/approve/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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/refunds/{id}/approve/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/refunds/{id}/approve/")
.header("Authorization", "Bearer <token>")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/refunds/{id}/approve/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": "5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41",
"refId": "Q7W2k9P",
"status": "in_settlement",
"amount": "197.00",
"currency": "BRL",
"paymentMethod": "pix",
"offerType": "main",
"parentOrderId": null,
"reason": "Comprei por engano",
"refundedBy": "producer",
"paidAt": "2026-09-26T10:14:03.201544-03:00",
"requestedAt": "2026-09-28T09:41:22.873610-03:00",
"autoApproveAt": "2026-09-29T09:41:22.873610-03:00",
"settlementStartedAt": "2026-09-28T11:02:40.118302-03:00",
"refundedAt": null,
"customer": {
"id": 183921,
"name": "Maria Souza",
"email": "maria.souza@example.com",
"birthDate": null,
"phone": "11999999999",
"docType": "cpf",
"docNumber": "12345678909"
},
"product": {
"id": "ff3fdf61-e88f-43b5-982a-32d50f112414",
"short_id": "AckhQ75",
"name": "Curso de Exemplo"
},
"offer": {
"id": "B8BcHrY",
"name": "Oferta principal"
}
}{
"detail": "Conta do produtor bloqueada."
}{
"detail": "As credenciais de autenticação não foram fornecidas."
}{
"detail": "Não encontrado."
}{
"detail": "Este reembolso não está aguardando aprovação.",
"code": "refund_not_pending",
"status": "paid"
}Escopo
write orders
O que esta chamada faz
Aprovar antecipa um reembolso que já vai acontecer: sem aprovação, ele é efetivado sozinho emautoApproveAt. Use quando não há motivo para esperar, por exemplo quando o comprador confirmou no
atendimento que quer o dinheiro de volta.
A resposta 200 traz o reembolso com status: "in_settlement": o estorno foi enviado à
adquirente e vira refunded quando ela confirmar a devolução.
refund_requested). Se o comprador desistiu, a venda voltou a
paid, e a chamada responde 409 sem estornar nada.É a diferença para Reembolsar Pedido, que estorna na hora
qualquer pedido pago. Numa automação disparada pelo webhook refund_requested, use esta rota:
aquela estornaria a compra de quem já tinha desistido.Repetir é seguro
Se a chamada der timeout, repita. Se a aprovação já tinha passado, a resposta é200 com o estado
atual, e nada é estornado de novo.
Erros
| Código | Quando |
|---|---|
400 | Conta do produtor bloqueada, ou a adquirente recusou o estorno. Neste caso o reembolso fica acquirer_error |
404 | Pedido inexistente ou de outra conta |
409 | A solicitação não está mais aberta. status no corpo diz por quê: paid (o comprador desistiu), in_settlement ou refunded (o prazo venceu e o reembolso saiu sozinho) ou acquirer_error |
| outros | Repassados da adquirente quando ela não responde ao estorno. O reembolso fica acquirer_error |
{
"detail": "Este reembolso não está aguardando aprovação.",
"code": "refund_not_pending",
"status": "paid"
}
Exemplo
import requests
resposta = requests.post(
"https://api.cakto.com.br/public_api/refunds/5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41/approve/",
headers={"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsIn..."},
timeout=30,
)
if resposta.status_code == 409:
print(f"Não estava mais aberto: {resposta.json()['status']}")
else:
resposta.raise_for_status()
print(f"Aprovado: {resposta.json()['status']}")
const resposta = await fetch(
"https://api.cakto.com.br/public_api/refunds/5f2a1c3e-8b7d-4e21-9f10-3c6d7a2b9e41/approve/",
{
method: "POST",
headers: { Authorization: "Bearer eyJhbGciOiJIUzI1NiIsIn..." },
},
);
if (resposta.status === 409) {
const corpo = await resposta.json();
console.log(`Não estava mais aberto: ${corpo.status}`);
} else if (!resposta.ok) {
throw new Error(`Cakto API error ${resposta.status}`);
}
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 reembolsado ou com reembolso solicitado.
Response
Estorno enviado à adquirente. status vem in_settlement até ela confirmar a devolução, e aí vira refunded. Repetir a chamada devolve o estado atual, sem estornar de novo.
Id do pedido. É também o id do reembolso: é por ele que se consulta e aprova.
Id curto do pedido, o mesmo que aparece no painel.
refund_requested: o comprador pediu e a janela está aberta; se ninguém agir, o reembolso é efetivado em autoApproveAt. in_settlement: aprovado, aguardando a adquirente confirmar a devolução. acquirer_error: a adquirente recusou o estorno. refunded: devolvido.
refund_requested- refund_requestedin_settlement- in_settlementacquirer_error- acquirer_errorrefunded- refunded
refund_requested, in_settlement, acquirer_error, refunded Valor deste pedido, como string decimal.
"2.49"
Moeda do pedido.
Método de pagamento do pedido.
main, orderbump, upsell ou downsell.
Id do pedido principal da mesma compra, quando este é order bump ou upsell.
Motivo informado pelo comprador ao pedir o reembolso.
Quem acionou o reembolso: customer (pedido pelo comprador), producer (aprovado ou feito pelo produtor) ou admin (suporte da Cakto).
Quando o pedido foi pago.
Quando o comprador pediu o reembolso. null em reembolso feito sem solicitação.
Fim da janela da solicitação: se o comprador não cancelar e ninguém aprovar antes, o reembolso é efetivado automaticamente neste instante. null fora da janela.
Quando o estorno foi enviado à adquirente.
Quando a adquirente confirmou a devolução. null enquanto não confirmou.
Comprador: nome e contato para falar com ele dentro da janela.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?