Saltar al contenido principal

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:

feeModeamount es…Se debitaLlega al destino
deduct (por defecto)el total a debitaramountamount − fee
addel monto que debe llegaramount + feeamount

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ónRespuesta
El saldo no alcanza para total422 unprocessableInsufficient available balance for this withdrawal.
Con deduct, amount no cubre la comisión422 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 cadena422 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.

Ver también: Retiros · Activos · Contactos.