Investment fund statement
A period's movements in cash and in units, with the unit value, the return and the closing balance the holder receives.
extracto-de-fondo, with the banca design: what came in, what went out, how much it earned and what the holder was left with over a period.
"yourCompany": { "name": "Fiduciaria del Ejemplo S.A.", "nit": "800.123.456-7" }, // the manager
"fund": { "name": "Fondo de Inversión Colectiva Abierto Ejemplo Liquidez", "nit": "800.123.456-7" },
"billTo": { "name": "MARTA ELENA OSORIO RIVERA", "nit": "43.210.987",
"address": "Calle 10 Sur # 48-120", "city": "Sabaneta / Antioquia",
"advisor": "Julián Betancur Mesa" }, // the holder; advisor is optional
"statement": {
"account": "550000012345",
"from": "2026-09-01", "to": "2026-09-30", // required
"unitValueAtEnd": "21.834,50712390", // text: printed as it arrives
"periodReturn": "9,26 % E.A. neta",
"maturityDate": "2027-03-20", // optional: only if the investment matures
"feeNote": "Comisión promedio mensual sobre el valor de la cartera: 1,50 % anual."
},
"movements": [
{ "date": "2026-09-02", "transaction": "Adición",
"amount": 4500000, "units": "206,09579023", "balance": 22840225.60 }
],
"summary": {
"previousBalance": 18340225.60, "previousUnits": "839,96517512",
"additions": 18300000, "withdrawals": 7650000,
"netReturns": 196480.55, "withholdingTax": 17927.59,
"newBalance": 29168778.56, "newUnits": "1.335,90277053" // newBalance is required
}
- Nothing is calculated here. The new balance is not the previous one plus additions minus withdrawals, a movement’s units don’t come from dividing its amount by the unit value, and the return is not derived from the balances: everything arrives ready and is printed as it arrives.
- Units are sent as text and printed verbatim, with whatever decimals and separators you use. They are never reformatted: rounding eight decimals would change the stake the holder believes they hold.
- The issuer of the document is whoever manages the money (
yourCompany); the holder goes inbillTo. The table states each movement in both measures —cash and units— and the closing grid repeats the balance in both, which is how one period is compared with the next. - A period with no movements is a valid statement: send
movements: []and the document says «Sin movimientos en el periodo» (“No movements in the period”), with its closing grid printed all the same. - What is required is which period it covers and how it ended:
statement.from,statement.to,summaryandsummary.newBalance. Without them the response is400listing what is missing, and no PDF is composed. Movements are not required. - If there are more movements than fit on one page, the table continues on the next one repeating its header, and the closing grid is never split across pages.
- Legal notices go in
legalNotesand the vertical margin text insideNotes: they are statements by the issuer —supervision, risk warnings, guarantees— and the engine never picks any of them. maturityDateis printed only when it arrives: an open-ended fund does not mature, and a «Sin vencimiento» (“No maturity date”) would claim it is missing something it never had.- What doesn’t arrive is said instead of filled in: with no fund, «Sin fondo» (“No fund”); without
unitValueAtEnd, «Sin valor de la unidad» (“No unit value”); withoutperiodReturn, «Sin rentabilidad» (“No return”). An amount that doesn’t arrive is left blank, because a$ 0,00in a balance would claim there is nothing left. It also acceptsnotes,fieldsandselectedCurrency.
Example: extracto-de-fondo.json.
