Skip to main content
CVM’s portfolio composition filing (CDA) publishes, per fund and month, the B3 ticker of each equity position and the CNPJ of each held fund. That makes two questions answerable that nothing else in this warehouse can answer:
  • What does this fund actually own?
  • Which funds own this ticker, and how did that change?
This is the only join between funds and the quote tape, and it is CVM’s own published identifier — never a name match.

POST /rpc/fund_holdings

Give exactly one of p_cnpj or p_ticker. Neither would be an unbounded scan of every fund ever filed; both is ambiguous. Either mistake is a 22023 error naming which one you made, not a silently narrowed query.

Response

Rows are not summed. A fund files the same ticker under several application types — Ações, BDR nível I, BDR não patrocinado, “Ações e outros TVM cedidos em empréstimo” — and those are genuinely different positions with different quantities. One NFLX34 holding appears twice in a single month for a single fund because the fund holds two different BDR programmes. Sum them yourself if that is what you want; the API will not decide it for you.

POST /rpc/fund_debentures — the corporate-credit edge

CDA block 6 publishes, per fund and month, each debenture position with the issuer’s own CPF/CNPJ — so which funds hold this issuer’s paper? is answerable with no bridge table and no name match. It is a separate function, not a third p_kind, on purpose. A debenture has no CD_ATIVO: its identity is (issuer, maturity, rate structure), and two series of one issuer maturing the same day at different coupons are different securities holding different money. Forcing that into held_id / held_name would collapse them into indistinguishable rows. Give exactly one of p_cnpj or p_issuer:
One row per (fund, month, issuer, maturity, rate structure, application type), as filed — never summed: An unknown ticker raises 22023; an unknown CNPJ simply has no rows — the warehouse cannot tell an issuer it has never seen from one that has no debentures held.

Coverage

Holdings run from 2005, from the yearly CDA archives before 2023 and the monthly ones after. Blocks 1, 3, 5, 7 and 8 of the same filing are not served — see the data inventory for what each holds and why.