En el contrato, todo monto es un texto decimal: el esquema MoneyCOP ("3500000", "467009.88", "53500.00"). Nunca un número de punto flotante.

JSON
{ "amount": "467009.88", "currency": "COP" }

La razón es simple: 0.1 + 0.2 no es 0.3 en binario. Un float puede convertir 467009.88 en 467009.87999999995 en algún punto del camino (tu ORM, tu serializador JSON, una hoja de cálculo), y en dinero un centavo de diferencia rompe una conciliación. El texto viaja exacto de punta a punta.

Enviar montos #

Cada SDK normaliza lo que le pases al mismo texto que enviaría el SDK de Python:

SDKTipos aceptadosRecomendado
Pythonstr, int, DecimalDecimal("467009.88") o "467009.88"
JavaScript / TSstring, number, bigintstring para dinero que no calculaste tú
PHPstring, int, objetos Stringable decimales (p. ej. brick/math BigDecimal); float se acepta pero se desaconsejastring
.NETAmount, con conversión implícita desde string, int, long, decimal (y double, desaconsejado)decimal o string
Gocompense.Amount (constante de texto), AmountFromInt, AmountFromRat, AmountFromFloat (desaconsejado)"467009.88" o AmountFromInt
from decimal import Decimal

client.loans.register_payment("CRD-00123", amount=Decimal("467009.88"),
                              reference="REC-2026-001", channel="CASH")
client.wallet.topups.create(document="1032456789", phone_number="3001234567",
                            carrier="CLARO", amount=20000)          # int también vale

Leer montos #

Las respuestas también traen los montos como texto. Los modelos tipados los exponen como Money (amount en texto + currency), por ejemplo el saldo:

from decimal import Decimal

balance = client.wallet.balance("1032456789")
available = Decimal(balance.available.amount)       # nunca float(...)
print(available, balance.available.currency)

En los cuerpos sin modelo (dict, JsonObject, array, map[string]any) los montos llegan como el texto del motor. En Go, el SDK decodifica con json.Number, así que los números del motor conservan sus dígitos exactos (v.(json.Number).String()).

Algunas respuestas del sandbox traen números

Unos pocos cuerpos del sandbox (simuladores, cuota monetaria) devuelven montos como número JSON (50000.0). Escribe tu código para aceptar ambos y convertir siempre a decimal, nunca a float.

Moneda #

La moneda por defecto es COP y los montos se expresan en pesos (no en centavos). Las operaciones de cambio de divisas (FX) llevan la moneda explícita (sell_currency, buy_currency).