Skip to main content
Parameters, response columns and types are generated from the SQL catalog and render under Endpoints → FNET documents in the sidebar. This page carries what a schema cannot: how a document is tied to a fund, how versions are paired, and where the history starts.

Overview

CVM’s open-data CSVs are republished in place: when a fund restates an informe, the new figures overwrite the old ones and the fact that anything changed is gone. B3’s Fundos.NET (FNET) keeps every version as its own document, says whether it is the original or a restatement, and keeps the superseded version listed. Silo crawls that register and serves it three ways. For the FIDC monthly informe it also downloads both versions of each restatement and stores the fields that changed (no document body is kept): The FNET vocabulary, served as published:
A document’s fund is known only by link. FNET’s rows carry no CNPJ — not even when the query filters on one. Silo knows a document belongs to a fund because FNET returned it when Silo asked for that CNPJ, in a sweep that reaches every FII and FIDC once a fortnight. So a document delivered since its fund was last swept is in the register but not yet in fund_documents, and fund_restatements serves it with cnpj: null. fund_name is FNET’s label; it is never used to match a fund, and you should not use it to either.

fund_documents

One row per document, newest delivery first. source_url is FNET’s own public download link for the id (…/fnet/publico/downloadDocumento?id=<fnet_id>), so every row carries provenance you can open.

fund_restatements

A three-version group, with illustrative values:
FNET does not link versions, so the pairing is by a stated key. Nothing in a FNET row says which document a re-filing replaces. previous_fnet_id is the document in the same group — (cnpj link, categoria, tipo_documento, especie, reference_raw) — with the highest versao below this one. A group can legitimately hold several v1 documents (a general assembly convened twice for one reference, for instance), so on a tie the greatest fnet_id wins — the most recently assigned id. A document with no cnpj link, or with no reference text, is never paired: its previous_* and lag_days are null, which means “not pairable”, not “no predecessor”.
  • tipo_fundo is the label of FNET’s tipoFundo filter the document was returned under (1 FII, 2 FIDC, 3 ETF), null when it was not returned under any — some documents belong to no queryable type.
  • lag_days is the delivery date of the restatement minus that of the version it replaced. It measures how long after the earlier filing the correction came, not how late either one was against a deadline.
  • A document FNET returned for two fund queries would appear once per fund; nothing is collapsed silently.
  • diff_status says whether Silo diffed this exact pair (the same previous_fnet_id): compared, or why not — unpairable_no_link, unpairable_no_reference, no_predecessor (all re-tried daily), body_not_xml, parse_error, unsupported_root, declared_mismatch (the XML’s own CNPJ or reference disagrees with the link or the register), body_hash_mismatch (a stored version re-fetched with different bytes). null means not diffed: every document outside the FIDC informe mensal, for now. It is as of the last daily diff run. n_fields_changed is how many rows fund_restatement_diff returns for the pair (0 = re-filed with nothing changed).

fund_restatement_diff

Two rows of FIDC PCG Brasil’s second restatement of its 12/2024 informe (fnet_id 857292, 31 fields changed against 828381):
Every row also carries tipo_documento, reference_raw, versao, modalidade, both delivery timestamps, lag_days, diff_version, and source_url / previous_source_url to open both versions.
No rows does not mean nothing changed. Rows exist only for pairs Silo diffed. Read fund_restatements’ diff_status first: compared with no rows here is a re-filing that changed nothing; anything else, or null, means the pair was not diffed.
  • Repeated blocks are matched by their declared key — a tranche by SERIE / TIPO / ID_SUBCLASSE, a cedente by its CPF/CNPJ — and addressed that way in field_path (match_basis: key). A block with no usable key (missing, or repeated inside one version) falls back to its position, [#2] (match_basis: position). Position rows are approximate by construction: when a restatement drops two duplicate blocks, you see the fields of blocks #2 and #3 as removed.
  • Text as printed. old_value / new_value keep FNET’s own formatting, comma decimals included. null is nil or absent; change_kind (changed, added, removed, nil_to_value, value_to_nil) tells them apart.
  • Numbers only where the field is a number. old_num, new_num and delta are set on amounts, quantities, percentages and rates. An identifier such as a CNPJ is compared as text, so 3017677000120 and 03017677000120 are a change.
  • cvm_column is null until a crosswalk from XML paths to CVM’s CSV columns exists; do not assume a path maps onto a column of fund_nav or fidc_*.
  • The diff is of FNET’s two documents, not of CVM’s CSVs, which are republished in place. Tab VIII (the top-25 debtors) is not in the XML, so its restatements are invisible here.

Limits and freshness

  • One 1,000-row page, and all three refuse above it (22023). No cursor: narrow the window, pin p_tipo, p_fnet_id, or p_cnpj / p_tipo_fundo. See Conventions.
  • coverage() carries an fnet_documents row keyed on the delivery day: as_of is the newest delivery day held, and complete_through the day before it — the crawl that saw as_of may have run while FNET was still receiving that day’s documents. notes states that history begins at Silo’s first crawl or backfill (an earlier day with no rows was not crawled, not empty) and that fund links come from the fortnightly sweep.
  • An unknown CNPJ is an empty array, never a guessed row.