curl --request POST \
--url https://api.cakto.com.br/public_api/withdrawals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": "2.49"
}
'import requests
url = "https://api.cakto.com.br/public_api/withdrawals/"
payload = { "amount": "2.49" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: '2.49'})
};
fetch('https://api.cakto.com.br/public_api/withdrawals/', 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/withdrawals/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => '2.49'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/withdrawals/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"2.49\"\n}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/withdrawals/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"2.49\"\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/withdrawals/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"amount\": \"2.49\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Solicitar Saque
Solicita o saque do seu saldo disponível para a chave Pix cadastrada no painel.
curl --request POST \
--url https://api.cakto.com.br/public_api/withdrawals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": "2.49"
}
'import requests
url = "https://api.cakto.com.br/public_api/withdrawals/"
payload = { "amount": "2.49" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: '2.49'})
};
fetch('https://api.cakto.com.br/public_api/withdrawals/', 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/withdrawals/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => '2.49'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/withdrawals/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"2.49\"\n}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://api.cakto.com.br/public_api/withdrawals/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"2.49\"\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.cakto.com.br/public_api/withdrawals/");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"amount\": \"2.49\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Escopo
write withdrawals_write
Antes de integrar, três coisas
201 não é dinheiro na conta. Todo saque pedido pela API entra na fila de análise com
status: "pending". O estado final se acompanha por Consultar Saque.pixKey ou account no corpo não muda o destino — os campos são ignorados. É de
propósito: quem tem a chave de API pode decidir quanto sacar, nunca para onde.429 com
Retry-After.X-Idempotency-Key é obrigatório
Sem ela a requisição é recusada com 400. O motivo é específico desta operação: se a sua chamada
der timeout, você não sabe se o saque foi criado — e repetir sem chave de idempotência cria um
segundo saque.
Gere um identificador único por intenção de saque (um UUID serve) e repita a mesma chave em
toda retentativa daquela intenção. A Cakto guarda a resposta por 24 horas: a repetição devolve o
mesmo resultado em vez de sacar de novo.
Reusar a mesma chave com um amount diferente responde 409 — é o contrário do que você quer, e
a API prefere recusar a adivinhar qual dos dois valores vale.
Valores
amounté string decimal ("150.00"), como todo dinheiro no contrato.- Mínimo de R$ 10,00.
- A taxa de saque é descontada do valor pedido: você pede
amount, a conta recebeamountReceived. A sua taxa está em Taxas e Prazos. - O saldo que pode ser sacado agora é o
availablede Saldo — não opending.
Exemplo
import uuid
import requests
resposta = requests.post(
"https://api.cakto.com.br/public_api/withdrawals/",
headers={
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsIn...",
"X-Idempotency-Key": str(uuid.uuid4()),
},
json={"amount": "150.00"},
timeout=30,
)
if resposta.status_code == 429:
raise RuntimeError("Limite de 2 saques por hora atingido.")
resposta.raise_for_status()
saque = resposta.json()
print(f"Saque {saque['id']} em análise. Cai na conta: R$ {saque['amountReceived']}")
const idempotencyKey = crypto.randomUUID();
const resposta = await fetch("https://api.cakto.com.br/public_api/withdrawals/", {
method: "POST",
headers: {
Authorization: "Bearer eyJhbGciOiJIUzI1NiIsIn...",
"X-Idempotency-Key": idempotencyKey,
"Content-Type": "application/json",
},
body: JSON.stringify({ amount: "150.00" }),
});
if (!resposta.ok) throw new Error(`Cakto API error ${resposta.status}`);
const saque = await resposta.json();
console.log(`Saque ${saque.id} em análise.`);
Boas práticas
- Guarde o
idretornado. É por ele que você acompanha o pedido, e é o que liga o seu registro ao nosso. - Em
503, repita com a mesmaX-Idempotency-Key. É exatamente o cenário para o qual ela existe: a chamada pode ter chegado. - Não trate
429como erro de integração. São 2 por hora; agrupe saques em vez de pedir de centavo em centavo. - Não saque o
pending. Só oavailablepode ser sacado hoje; o resto libera nas datas da Agenda de Recebimentos.
Authorizations
Token de autenticação do tipo Bearer {access_token}, onde {access_token} é o token obtido no fluxo de autenticação.
Body
Valor a sacar, como string decimal ("150.00"). Mínimo de "10.00". A taxa de saque é descontada deste valor — o que cai na conta é amountReceived.
"2.49"
Response
Pedido registrado. status vem pending: o saque entrou na fila de análise, e 201 não significa dinheiro transferido.
Identificador do saque.
Valor solicitado, como string decimal.
"2.49"
Taxa de saque cobrada.
"2.49"
amount menos fee: o que efetivamente cai na conta de destino.
"2.49"
Moeda do saque.
Estado do pedido. Saque solicitado pela API nasce pending: entra na fila de análise em vez de sair automático. approved é o dinheiro já enviado; rejected devolve o valor ao saldo, com o motivo em reason; blocked exige contato com o suporte.
pending- pendingapproved- approvedrejected- rejectedblocked- blocked
pending, approved, rejected, blocked Motivo da recusa, quando houver — o mesmo texto que o produtor vê no painel. null enquanto o pedido não foi recusado.
Quando o saque foi solicitado.
Quando o dinheiro foi enviado. null enquanto o saque não foi pago.
Was this page helpful?