Skip to main content
Un producto de inversión no se describe con un saldo. Tiene tres montos distintos (lo invertido, lo que vale hoy, lo ganado), una cantidad de cuotas, un precio unitario y —lo más fácil de perder— una fecha a la que ese precio corresponde, que no es la fecha en que Rail fue al banco. Todo eso viaja en un bloque investment dentro del recurso account.
Es un cambio aditivo. investment es un campo nuevo del account que ya consumes: si tu integración lo ignora, sigue funcionando igual, sin coordinar deploys. Viene poblado sólo en cuentas type: "investment"; en cualquier otra es null.

El shape

Campos

Todos los campos salvo kind pueden venir en null: el banco no informa lo mismo para cada producto — ver Qué campos trae cada producto más abajo.

kind

El producto concreto se distingue con kind, no con account.type — así el switch (type) de tu integración no se rompe cuando aparece un producto nuevo. El enum está cerrado y completo, pero no todos los valores se emiten hoy — ver cobertura.

Precisión: la plata es entera, las cuotas son strings

Esto es lo que más fácil rompe a un integrador.
Formato canónico de los strings decimales: ^-?\d+(\.\d+)?$ — punto como separador decimal, sin separador de miles, sin notación exponencial, y con los dígitos que informó el banco (no los normalizamos ni recortamos ceros).
No conviertas las cuotas ni el valor cuota a float para después multiplicarlos: el error se acumula y el total que muestres no va a cuadrar con lo que el titular ve en el portal del banco.

Las dos fechas

El valor cuota de un fondo mutuo chileno es T-1: se publica por día hábil cerrado, no en vivo. Por eso hay dos relojes y publicamos los dos.
Si muestras “ganaste $575.182” fechado con refreshed_at, estás fechando mal la plata: puede ser el número del viernes mostrado un lunes. Para la valorización usa priced_at.
Cuando el banco no informa la fecha de valorización, priced_at viene null: preferimos el hueco antes que ponerle la fecha del sync, que sería mentir.

Balance de una cuenta de inversión

balance no cambia de semántica, pero sí cambia lo que significa “disponible” según el producto: limit es siempre null: un producto de captación no tiene cupo.
available: 0 significa “hoy no puede retirar esta plata”, y es distinto de null, que significaría “el banco no lo informa”.

Una cuenta de inversión no tiene movimientos

GET /v1/accounts/{id}/movements sobre una cuenta investment devuelve una lista vacía, en live y en sandbox. No es un bug: un DAP, un fondo mutuo o un APV no tienen cartola — el sync baja cartola para las cuentas vista/corriente y estado de cuenta para las tarjetas. Para detectar que algo cambió, compara investment.priced_at y el delta de balance.current entre syncs.
Los aportes y rescates (la “cartola” del producto de inversión) no están disponibles por la API. Si los agregamos van a ser un recurso aparte, no estos movimientos.

Qué campos trae cada producto

Lo que el banco informa no es lo mismo para un depósito que para un fondo. Hoy, con Banco de Chile:

Dos cosas que sorprenden en los depósitos a plazo

rate_basis: "period" quiere decir que la tasa aplica sobre el plazo del depósito, no al mes ni al año. Es lo que informa Banco de Chile: 0,28% sobre un producto “HASTA 30 DS” es el rendimiento del período completo. No la anualices asumiendo que es mensual.
maturity_date puede estar en el pasado con el depósito vigente. Un Depósito Renovable Indefinido (DPRI) se renueva solo y el banco muestra el vencimiento del período corriente. Si filtras los depósitos por fecha de vencimiento vas a borrar productos vivos.
term_days sale best-effort del nombre del producto cuando el banco no lo entrega como número ("DPRI HASTA 30 DS" → 30). Si no se puede leer viene null, nunca un número inventado.

Cobertura

Hoy ninguna otra institución emite el bloque. De los kind, en live sólo verás time_deposit y mutual_fund: el apv está implementado en el adapter de Banco de Chile pero todavía sin validar contra un producto real, y stock y cash no los emite ningún adapter. El sandbox sí emite un APV, para que puedas integrarlo antes de que llegue.
Una cuenta puede venir con type: "investment" y investment: null: hay instituciones que clasifican el producto (porque su nombre dice “inversión” o “fondo”) sin que todavía podamos leer su detalle. Trata investment: null como “no tenemos el detalle”, no como “no es una inversión”.

Probarlo sin un banco real

En test mode el RUT mágico 11.111.111-1 devuelve un DAP, un fondo mutuo y un APV con la misma forma que live, y con priced_at de ayer a propósito para que veas la diferencia con refreshed_at. El RUT de empresa 22.222.222-2 trae un DAP. Ojo con un detalle: el depósito a plazo del sandbox sí informa gain_pct y priced_at, mientras que en live Banco de Chile los deja en null. Trata todo campo como nullable y no te apoyes en que venga poblado.

Cuentas

El recurso account completo y sus tipos.

Test mode

Los productos de inversión del sandbox.