Parameters, response columns and types are generated from the SQL catalog and
render under Endpoints → Short interest & flows in the sidebar. This page carries what a
schema cannot: the conventions, the nulls that are deliberate, and the traps.
Overview
investor_flow answers one question: what did each class of investor do on a given session? Foreign investors, institutionals, individuals and the rest, bought and sold, in R$ thousands.
A view:
GET, PostgREST filters, limit/offset paging. The securities-lending views are on Securities lending.
Read flow_basis before anything else
Field notes
The
mtd_* columns are the check on everything above them: within one month, mtd_buy_value_thousands on consecutive sessions should differ by exactly buy_value_thousands on the later one. That subtraction is the audit, and it is why the cumulative columns are published beside the differenced ones instead of being discarded.
Example
One investor type across a month, with the uninterpretable rows kept visible:coverage for the newest reference_date before pinning a window.
What this is not
- Not a flow by security. The grain is investor type, market-wide. There is no per-ticker breakdown in the source, so no join to
quotesorshort_interestexists at this grain. Aligning a market-wide flow series against one ticker’s return is your inference to make and own, not an edge this warehouse publishes. - Not a position. These are gross purchases and sales over a session. A net figure is the session’s direction, not anyone’s holdings.
- Not a panel metric. These rows carry no id in the panel’s sense, so there is no
panelarm — the same reasonanbima_classeshas none.
Paging and empty results
The 1,000-row page is PostgREST’sdb-max-rows, and on a view it cuts silently with a 200, keeping the oldest rows. Send Prefer: count=exact and read Content-Range (0-999/* means cut), or page with limit/offset and an explicit order. The SDK does both: silo.investor_flow(...) for one page, silo.view_all("investor_flow", order="reference_date.asc") to walk them all.
Given the retention window and a handful of investor types, a whole capture window fits inside one page today — but do not build on that; it is a property of the ratchet, not a guarantee.
- Unknown investor type →
200 []. Spelling must match B3’s. - Empty window →
200 []. Common, given ~21 business days of retention and the T+2 lag. Checkcoverage’sinvestor_flowrow first. - The landing tables are not readable by client roles; this view is owner-privileged and the columns it selects are the whole boundary.