Criar um saque
Solicita a transferência de fundos disponíveis do seu saldo na Selectwin para uma carteira bancária cadastrada. O saque é criado com status pending e segue de forma assíncrona por etapas de verificaçã
Solicita a transferência de fundos disponíveis do seu saldo na Selectwin para uma carteira bancária cadastrada. O saque é criado com status pending e segue de forma assíncrona por etapas de verificação até ser pago — você acompanha o resultado por webhooks ou consultando o recurso.
POST /v1/withdrawals
Como funciona
Um saque (withdrawal, prefixo de ID cash_) move dinheiro do seu saldo disponível para uma carteira (wall_) que você já registrou — uma conta bancária ou chave Pix. A criação é apenas o pedido: o repasse em si não é instantâneo.
Ao receber o POST, o servidor:
- Valida o corpo (
amountinteiro positivo em centavos,walletIdno formatoprefixo_valor). - Verifica se a carteira existe e está apta a receber.
- Confere se o valor atende ao mínimo do seu plano de taxas e se há saldo suficiente.
- Calcula a taxa do saque (
fee) e cria o registro comstatus: "pending".
A partir daí o saque percorre seu ciclo de vida de forma assíncrona. O method (ex.: bankTransfer, pix) é determinado pela carteira de destino, não enviado por você.
Enquanto está pending, os campos approvedAt e paidAt vêm null; eles são preenchidos conforme o saque avança. Use os campos de timestamp para saber em que etapa ele está.
Acompanhe por webhooks, não por polling
A criação retorna pending imediatamente. Não fique repetindo GET em loop para descobrir quando o saque foi pago — assine os webhooks de saque e reaja aos eventos. Veja Proibição de polling.
Quando usar
- Repassar para a conta da empresa o que você acumulou de vendas.
- Pagar fornecedores, parceiros ou sócios a partir do saldo disponível.
- Programar retiradas recorrentes no seu próprio sistema (cada uma é uma chamada a este endpoint).
Quando não usar: este endpoint não cria nem edita a carteira de destino — a carteira precisa existir antes (recurso Wallets). Ele também não consulta saldo: para saber quanto está disponível e qual o mínimo do plano, use Consultar Saldo primeiro.
Requisição
Headers
| Cabeçalho | Obrigatório | Valor |
|---|---|---|
SelectKey | Sim | Sua chave de API. Produção: sl_live_…; sandbox: sl_test_…. Nunca use Authorization: Bearer/Basic. |
Content-Type | Sim | application/json |
X-Idempotency-Key | Recomendado | Chave única por tentativa. Garante que reenvios (timeout, retry) não criem dois saques. Veja Idempotência. |
Use sempre uma chave de idempotência
Saque é uma operação de escrita que move dinheiro. Se a rede cair depois de enviar mas antes de receber a resposta, repetir sem X-Idempotency-Key pode gerar dois saques. Com a chave, a segunda chamada retorna o mesmo saque da primeira.
Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | number (inteiro) | Sim | Valor do saque em centavos (45000 = R$ 450,00). Deve ser >= 1 e respeitar o mínimo do seu plano de taxas. |
walletId | string | Sim | ID da carteira de destino, no formato prefixo_valor (ex.: wall_01hqzvabc). Trate como opaco. |
O
methode acurrency(BRL) não são enviados: derivam da carteira e da conta. A taxa (fee) é calculada pelo servidor.
Exemplo curl
curl -X POST https://api.selectwin.io/v1/withdrawals \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 9f1c2e7a-4b3d-4a6e-9c10-2f8b7d5e1a23" \
-d '{
"amount": 50000,
"walletId": "wall_01hqzvabc"
}'Resposta
Em caso de sucesso, o servidor responde 201 Created com o objeto do saque recém-criado.
{
"id": "cash_01hqzvabc",
"walletId": "wall_01hqzvabc",
"amount": 50000,
"status": "pending",
"method": "bankTransfer",
"currency": "BRL",
"fee": 15,
"transferCode": null,
"paidAt": null,
"approvedAt": null,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z",
"merchant": {
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": {
"self": {
"href": "https://api.selectwin.io/v1/withdrawals/cash_01hqzvabc",
"method": "GET",
"description": "Read a withdrawal."
},
"create": {
"href": "https://api.selectwin.io/v1/withdrawals",
"method": "POST",
"description": "Make a withdrawal."
},
"list": {
"href": "https://api.selectwin.io/v1/withdrawals",
"method": "GET",
"description": "List withdrawals."
}
}
}Campos da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do saque (cash_…). Guarde-o para consultas posteriores. |
walletId | string | Carteira de destino. |
amount | integer | Valor solicitado, em centavos. |
status | string | Estado atual; no create vem pending. |
method | string | Forma do repasse, derivada da carteira (ex.: bankTransfer, pix). |
currency | string | Moeda ISO 4217 — BRL. |
fee | integer | Taxa do saque, em centavos. |
transferCode | string | null | Código de rastreio do repasse; null enquanto não há repasse efetivado. |
paidAt | string | null | Data-hora do pagamento (ISO 8601 UTC) ou null se ainda não pago. |
approvedAt | string | null | Data-hora da aprovação ou null se ainda não aprovado. |
createdAt / updatedAt | string | Timestamps ISO 8601 UTC. |
merchant | object | Dados do estabelecimento: name, merchantId, isSubAccount. |
_links | object | Links HATEOAS (self, create, list) para navegar pelo recurso sem montar URLs à mão. |
Diferença em relação à listagem
O objeto retornado aqui é completo, igual ao de Consultar Saque. Em Listar Saques, cada item de data[] é uma projeção leve (campos como walletId podem ser omitidos). Para o objeto inteiro, consulte o saque individual.
Erros
Trate sempre pelo error.code (estável), nunca pela message. A estrutura do envelope está em Tratamento de Erros; a lista completa em Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Corpo malformado ou campo inválido (veja error.params; ex.: amount ausente ou <= 0). |
withdrawalInvalid | 400 | Saque inválido (combinação de dados não aceita). |
walletIdIsInvalid | 400 | walletId fora do formato esperado (prefixo_valor). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para sacar nesta conta. |
withdrawalAmountLessThanMinimum | 422 | Valor abaixo do mínimo do seu plano de taxas. |
balanceIsInsufficient | 422 | Saldo disponível insuficiente para o valor + taxa. |
withdrawalCreateNotProcessable | 422 | Regra de negócio impede criar o saque. |
withdrawalProcessFailedByWalletNotRegistered | 422 | A carteira de destino não está registrada/apta. |
tooManyRequests | 429 | Limite de requisições excedido; respeite error.retryAfterMinutes. Veja API Limits. |
serverError | 500 | Erro interno; tente novamente com backoff. |
Exemplo de erro de validação (400):
{
"error": {
"code": "invalidParameters",
"statusCode": 400,
"category": "validation",
"message": "Validation errors occurred.",
"params": [
{ "amount": "amount must be a positive integer" }
]
}
}Boas práticas
- Cheque o saldo e o mínimo antes: chame Consultar Saldo e leia o
feePlanpara evitarbalanceIsInsufficientewithdrawalAmountLessThanMinimum. - Envie centavos, sempre como inteiro:
R$ 450,00é45000(número), nunca"450.00"nem string. - Use
X-Idempotency-Keyem toda criação: protege contra saques duplicados em retries de rede. - Garanta a carteira antes: confirme que
walletIdexiste e está registrada para não cair emwithdrawalProcessFailedByWalletNotRegistered. - Guarde o
id(cash_…) retornado: é a chave para consultar o status e para correlacionar com seus registros internos. - Reaja por webhooks, não por polling: o saque nasce
pending; aprovação e pagamento chegam por eventos. Veja Proibição de polling. - Trate o erro pelo
code: ramifique a lógica noerror.codee use oerror.statusCode/categorynodefault.
Veja também
- Visão geral de Saques — o que é o recurso e seu ciclo de vida.
- Consultar Saque — ver o status e os detalhes de um saque.
- Listar Saques — histórico com filtros e paginação.
- Consultar Saldo — saldo disponível e mínimo do plano de taxas.
- Convenções da API · Idempotência · Catálogo de Códigos de Erro
How is this guide?