Comisiones de retiro
Un retiro externo de cripto paga una comisión plana, denominada en el mismo activo que se retira. No es un porcentaje: retirar 10 USDT y retirar 284.000 USDT cuestan lo mismo.
Los retiros internos (de una cuenta Skipo a otra) y los pagos a cuenta bancaria no pagan comisión.
:::info No es la comisión de la red La comisión que ves en la API es la que cobra Skipo. El costo de gas en la cadena lo asume Skipo y nunca se te factura ni aparece en tus movimientos. :::
feeMode
POST /v2/withdrawals acepta un campo opcional feeMode que define cómo se interpreta amount:
feeMode | amount es… | Se debita | Llega al destino |
|---|---|---|---|
deduct (por defecto) | el total a debitar | amount | amount − fee |
add | el monto que debe llegar | amount + fee | amount |
deduct es el comportamiento de Binance, Kraken, Coinbase y OKX. Es el que conviene para
barrer un saldo: envías el saldo y listo.
add conviene cuando el monto que llega tiene que ser exacto —liquidar una factura, una línea
de nómina, dejar una dirección en una cifra específica.
Ambos modos son igual de válidos y la respuesta es idéntica en forma: siempre trae los tres números, así que nunca tienes que recalcular nada.
{
"amount": "999.5", // lo que se envía al destino
"fee": "0.5", // la comisión de Skipo
"total": "1000" // lo que sale del saldo
}
En ambos modos se cumple total = amount + fee. Lo único que cambia es cuál de los dos aportaste
tú.
Ejemplo
Saldo de 1.000 USDT sobre BNB Smart Chain, comisión de 0,5 USDT.
POST /v2/withdrawals
{ "assetSymbol": "USDT", "amount": "1000", "contactId": "..." }
Con el deduct por defecto se debitan 1.000 USDT y llegan 999,5. Para que lleguen exactamente
1.000, envía "amount": "1000" con "feeMode": "add" — se debitarán 1.000,5.
:::caution Si vienes de la v1 o integraste antes de agosto de 2026
El comportamiento anterior de este endpoint era el de add. Si tu código ya envía
saldo − comisión, agrega "feeMode": "add" y sigue funcionando igual, sin tocar tus cálculos.
:::
La comisión depende de la RED, y el cuerpo no la nombra
POST /v2/withdrawals recibe assetSymbol, amount y el contacto. No recibe una red. La
cadena —y por lo tanto la comisión— es aquella en la que está registrado el contacto de destino.
Esto importa porque un mismo activo puede costar cosas muy distintas según la cadena. USDT es el
caso vivo: sobre BNB Smart Chain la comisión es de 0,5 USDT y sobre Tron es de 6 USDT. El mismo
assetSymbol, doce veces la comisión.
:::danger No uses el withdrawalFee de nivel activo
En GET /v2/assets, el withdrawalFee que cuelga del activo es el de la cadena más barata.
Para USDT eso es 0.5, y dimensionar con él un retiro por Tron subestima el costo en 5,5 USDT.
El valor que manda es networks[].withdrawalFee.
:::
Cómo leer la comisión correcta
// 1. ¿En qué cadena está este destino?
const contact = await get(`/v2/contacts/${contactId}`)
const networkId = contact.crypto.networkId // "BSC" | "TRON" | "ETH" | ...
// 2. La comisión y el mínimo DE ESA cadena.
const asset = await get('/v2/assets?assetSymbol=USDT')
const network = asset.networks.find((n) => n.networkId === networkId)
network.withdrawalFee // lo que cobra Skipo en esta cadena
network.minimumWithdrawal // el mínimo efectivo en esta cadena
networkId es la misma clave en /v2/assets, /v2/contacts y en los movimientos, así que se
cruzan sin interpretar texto.
Mínimos
networks[].minimumWithdrawal es el mínimo efectivo de esa cadena: ya viene resuelto como el
mayor entre el piso de la plataforma y el piso propio de la cadena. Valida contra él y no contra
el minimumWithdrawal de nivel activo, que solo reporta la mitad de plataforma y puede quedar
por debajo de lo que la cadena acepta.
El mínimo aplica a lo que se envía. Con el deduct por defecto eso es amount − fee, así
que el amount más chico que acepta una cadena es minimumWithdrawal + withdrawalFee.
En algunos activos la comisión está cerca del mínimo o por encima —DOGE cobra 5 y permite un mínimo de 5—, así que conviene calcularlo en vez de asumirlo.
Errores relacionados
| Situación | Respuesta |
|---|---|
El saldo no alcanza para total | 422 unprocessable — Insufficient available balance for this withdrawal. |
Con deduct, amount no cubre la comisión | 422 unprocessable — nada llegaría al destino. El saldo puede estar perfectamente fondeado: lo que falta es monto, no fondos. |
| El monto queda bajo el mínimo de la cadena | 422 unprocessable |
Un rechazo no mueve nada: el saldo se valida antes de retener fondos.
Y si un retiro ya aceptado falla, se devuelve el total completo —monto y comisión—. Skipo
no se queda con la comisión de un envío fallido.
Dónde aparece la comisión después
GET /v2/withdrawals y GET /v2/withdrawals/{id} devuelven amount, fee y total en cada
retiro, igual que la respuesta de creación. El webhook withdrawal.status.updated publica los
mismos tres campos.
Un retiro es una fila, con su comisión incluida: la comisión nunca se emite como un movimiento
aparte, así que sumar total sobre la lista da la salida real de la cuenta sin filtrar nada.