Formato de montos en Kushki ONE

Aprende a construir el campo amount en unidades mínimas según la moneda de tu país y evita cobros con el monto equivocado

Todos los endpoints de Kushki ONE Connect que involucran dinero comparten el mismo objeto amount. Antes de construir tu primer request, necesitas entender una sola regla: los montos se envían como números enteros, en la unidad mínima de la moneda.

Nunca envíes puntos, comas, espacios ni ningún otro separador.

Tu moneda y sus decimales

En Colombia operas en pesos colombianos (COP), que usan dos decimales.

La regla de conversión

Los últimos dos dígitos del entero son siempre la parte decimal. Cuando el monto no tiene fracción, agrega igualmente los dos ceros.

Para cobrarEnvías
12.44 COP1244
12.00 COP1200
1,000.00 COP100000
25,800.00 COP2580000

Cómo se compone el monto

El monto cobrado es la suma de todos los campos del objeto amount.

CampoQué representa
subtotal_ivaPorción de la venta afecta a impuesto
ivaMonto del impuesto sobre esa porción
subtotal_iva0Porción exenta. Usa solo este campo cuando la venta no tiene desglose
extra_taxesImpuestos de giros específicos: airport_tax, iac, ice, travel_agency. Envía 0 cuando no aplican
tipPropina. Requiere la funcionalidad habilitada en el DMS

Ejemplo completo

Cuenta de restaurante: 20,000.00 COP en alimentos, IVA del 19% y una propina de 2,000.00 COP.

ComponenteValorUnidad mínima
subtotal_iva20,000.00 COP2000000
iva3,800.00 COP380000
tip2,000.00 COP200000
Total cobrado25,800.00 COP2580000
{
"amount": {
"iva": 380000,
"subtotal_iva": 2000000,
"subtotal_iva0": 0,
"tip": 200000,
"extra_taxes": { "airport_tax": 0, "iac": 0, "ice": 0, "travel_agency": 0 }
},
"client_transaction_id": "7f8e9d0c-1111-4000-8000-aabbccddeeff"
}

Venta sin desglose de impuestos

Cuando no detallas impuestos, coloca el monto completo en subtotal_iva0:

{
"amount": {
"iva": 0,
"subtotal_iva": 0,
"subtotal_iva0": 11800,
"extra_taxes": { "airport_tax": 0, "iac": 0, "ice": 0, "travel_agency": 0 }
},
"client_transaction_id": "1a2b3c4d-3333-4000-8000-112233445566"
}

Convierte sin perder centavos

Pasa el valor como cadena de texto, no como número decimal: Decimal(12.44) hereda el mismo error binario que intentas evitar.

  • Javascript
  • Python
const DECIMALES = { COP: 2, MXN: 2, PEN: 2, CLP: 0 };
function aUnidadMinima(valor, moneda) {
const [entero, frac = ""] = String(valor).split(".");
const exp = DECIMALES[moneda];
return Number(entero + frac.padEnd(exp, "0").slice(0, exp));
}
aUnidadMinima("12.44", "COP"); // 1244
aUnidadMinima("1244", "CLP"); // 1244
from decimal import Decimal
DECIMALES = {"COP": 2, "MXN": 2, "PEN": 2, "CLP": 0}
def a_unidad_minima(valor: str, moneda: str) -> int:
exp = DECIMALES[moneda]
return int(Decimal(valor).scaleb(exp).to_integral_value())
a_unidad_minima("12.44", "COP") # 1244
a_unidad_minima("1244", "CLP") # 1244

Errores frecuentes

ErrorQué pasaCómo lo evitas
Enviar el monto con decimalesEl cobro sale con el monto equivocado o el request se rechazaConvierte a unidad mínima antes de enviar
Enviar el monto como texto con separadoresError de validaciónElimina todos los separadores y envía un entero
Convertir con punto flotanteDiferencia de un centavo en algunos montosUsa enteros o un tipo decimal
Reutilizar un monto devuelto por un webhookMagnitud incorrectaLos eventos devuelven decimales (12000.0); los requests llevan enteros

Si operas en varios mercados

Esta sección aplica solo si tu sistema de caja atiende comercios en más de un país.

MonedaPaísDecimales
COPColombia2
MXNMéxico2
PENPerú2
CLPChile0
Acepta cobros con Kushki ONE

Con el monto correctamente construido, revisa los flujos de cobro: venta directa, pre-autorización, captura, propina posterior y anulación.

Catálogo de errores

Consulta los códigos de validación de monto y las acciones correctivas recomendadas.