Skip to main content
Parameters, response columns and types are generated from the SQL catalog and render under Endpoints → Funds in the sidebar. This page carries what a schema cannot: the conventions, the nulls that are deliberate, and the traps.

Overview

Brazilian investment vehicles as disclosed to the CVM, keyed by CNPJ. CNPJ input is stripped to its 14 digits, so 12.345.678/0001-90 and 12345678000190 are the same argument. Monthly periods are keyed on the first day of the month. Note: ETFs are carved out of this universe and are not in api.funds. Post-CVM-175 share classes make their NAV series structurally different from the rest of the fund population, so they are ranked and served separately.

GET /funds

The registry view: one row per (cnpj, entity_type) — what we hold, not what the fund is worth.
This view has no built-in cap — always send limit. The registry is large, and an unbounded read is cut at 1,000 rows server-side with no signal beyond Content-Range.

POST /rpc/search_funds

Substring search over the registry, ordered by latest_aum descending, nulls last.
No match returns [].

POST /rpc/fund_profile

One fund’s summary card: coverage plus peak and latest AUM.
Note: a CNPJ in the registry with no monthly fundamentals returns [] — the profile is built from the monthly facts, so there is nothing to summarize. A CNPJ filing under more than one entity_type returns one row per type; do not assume a single row.

POST /rpc/fund_nav

The monthly fundamentals series for one CNPJ — the fund-side equivalent of quote_history.
p_from’s default is a fixed date, not a rolling window — omit it for the full stored history. p_entity_type is needed only for the rare CNPJ that reports under two. Rows are ordered by period, then entity_type.

Which columns each family files

Every family returns the same eleven columns, but each family’s arm of the fact table fills only some; the rest are NULL by construction. So a null has two meanings: outside a family’s list it is not applicable and carries no information; inside it, it is a blank in that month’s filing. Machine-readable as catalog().applicability.fund_nav.columns_by_family, and it is what the panel metric table’s Asset class column is derived from.
FIDC delinquency starts in 2025-01 — a regime break, not a series. CVM’s pre-2025 monthly FIDC file (tab II/III) carries no delinquency field, so every fidc row through 2024-12-31 has delinquency: null — not zero, not clean books, not a missing month. From 2025-01-31 the tab IV/VI format is ingested and the field is filed on every row (a fund with none files 0).Never chain-link, difference or average across 2024-12 → 2025-01; start the series at 2025-01. Published in catalog().regime_breaks and on the funds_fidc coverage row, so a program can check it rather than a reader remembering it.
A fidc row: nav and delinquency are the two columns that family files, the other six are null by construction, and period is the month’s last day.

Notes

  • Nulls here are real. A column is null because the family does not file that field, or because the filing left it blank — never because a value was dropped or replaced. Nothing is forward-filled, and a month with no filing is an absent row, not a repeated one. Check period continuity before differencing.
  • One 1,000-row page, and it refuses above it (22023). At a monthly grain 1,000 rows is over 80 years of one fund, so reaching it usually means the request is wrong rather than the fund.
  • Paging requires p_entity_type. The cursor is a bare period, unique only within one family — 385 CNPJs file under two (fi and fidc) in the same month, so a bare-date cursor would skip or repeat a row at a page edge. Drop p_after to get the whole result with every row labelled by entity_type.
    In the SDK: silo.iter_fund_nav("05754060000113", "fi"), which raises locally if you leave the family out.
  • period and period_month are two conventions for the same month. period is CVM’s filed month-end date (2024-01-31); the trailing period_month is the first of that month (2024-01-01), which is how panel keys fund observations. Join a nav series to a panel on period_month, not on period.
  • Empty results: unknown CNPJ, or a real CNPJ with no filings in the window → 200 []. A CNPJ that exists only as an ETF is absent from this universe by design. Passing "p_from": null explicitly returns [] — omit the key to get the default instead.