Skip to content
/api/v1/form-13f/aggregation/by-ticker

Quarterly per-security Form 13F ownership totals and reporter-comparable trading activity with sorting, filtering, and market-data enrichment.

Quarterly per-security Form 13F ownership totals and reporter-comparable trading activity with sorting, filtering, and market-data enrichment. Current ownership includes every admitted current holdings report. Trading fields use only managers with selected valid holdings reports in both adjacent quarters; reporting entries, exits, unavailable comparisons, and coverage are returned separately.

free

Why use this

Institutional ownership screener backed by the published per-security summary. Use fund_count, total_shares_curr, and total_value for complete current admitted ownership. Use fund_flow, share_change, fund_change, position categories, and their percentages for activity by the common adjacent-quarter reporter cohort. Null activity means it could not be measured; zero means it was measured and netted to zero.

Common use case

Screen current institutional ownership and comparable trading without turning first-time reporters into artificial purchases or managers that stopped reporting into artificial liquidations. The same row shows the complete ownership total, the common-reporter trading result, and the components that reconcile the two.

Per-security quarterly Form 13F ownership and reporter-comparable trading data for the Grouped Hedge Funds page. Complete current ownership fields include all admitted current holdings reports, including managers first appearing this quarter. Activity fields compare only managers in both adjacent selected holdings-report rosters. Within that common roster, a security appearing is a new position and disappearing is a full liquidation. Current-only managers are reporting entries; prior-only managers are reporting exits; unusable common-reporter groups are comparison-unavailable. The row exposes each component and comparison_status, so clients can distinguish complete, partial, unavailable, and legacy-unknown activity. Security-successor normalization, quality admission, enrichment, filtering, pagination, and current ownership totals are unchanged.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
quarterqueryoptionallatestQuarter-end date (YYYY-MM-DD). Defaults to latest available quarter.2025Q4
sort_byqueryoptionalfund_flowColumn to sort by. Options: symbol, name_of_issuer, fund_count, fund_count_prev, fund_change, fund_change_pct, total_value, fund_flow, share_change, share_change_pct, total_shares_curr, total_shares_prev, new_buys_count, closed_count, increased_count, decreased_count, unchanged_count, new_buys_shares, increased_shares, decreased_shares, unchanged_shares, closed_shares, increased_delta_shares, decreased_delta_shares, increased_pct_shares, decreased_pct_shares, market_cap, close_price, shares_outstanding, first_traded, fund_flow_mcap_pct. Deprecated alias: 'sort'.filed_at
sort_orderqueryoptionaldescSort direction: 'asc' or 'desc'. Deprecated alias: 'order'.desc
limitqueryoptional100Page size (max 10000). Raised from 500 after enrichment materialization (#245).20
offsetqueryoptional0Pagination offset.0
security_groupqueryoptionalFilter by security group: 'Stocks', 'ETFs', 'Preferred', 'Warrants', 'Debt', 'Other'. Comma-separated for multiple. Omit for all.Stocks
is_etfqueryoptional(Deprecated -- use security_group instead) 'true' = ETFs only, 'false' = Stocks only.false
sectorqueryoptionalExact sector name filter (e.g. 'Technology', 'Healthcare').Technology
industryqueryoptionalExact industry name filter (e.g. 'Semiconductors').Consumer Electronics
min_market_capqueryoptionalLower bound on market capitalization in USD.1000000000
max_market_capqueryoptionalUpper bound on market capitalization in USD.1000000000
min_total_valuequeryoptionalLower bound on total 13F market value held in USD.50000000
max_total_valuequeryoptionalUpper bound on total 13F market value held in USD.50000000
min_shares_outstandingqueryoptionalLower bound on shares outstanding (canonical key; legacy alias `float`).10000000
max_shares_outstandingqueryoptionalUpper bound on shares outstanding (canonical key; legacy alias `float`).10000000
min_floatqueryoptionalLegacy alias of `min_shares_outstanding`.10000000
max_floatqueryoptionalLegacy alias of `max_shares_outstanding`.10000000
min_fund_flowqueryoptionalLower bound on net fund flow in USD.1000000
max_fund_flowqueryoptionalUpper bound on net fund flow in USD.1000000
min_fund_flow_mcap_pctqueryoptionalLower bound on fund flow as a fraction of market cap.0.05
max_fund_flow_mcap_pctqueryoptionalUpper bound on fund flow as a fraction of market cap.0.05
min_fund_countqueryoptionalLower bound on number of funds holding the ticker.10
max_fund_countqueryoptionalUpper bound on number of funds holding the ticker.10
min_fund_changequeryoptionalLower bound on quarter-over-quarter change in holder count.5
max_fund_changequeryoptionalUpper bound on quarter-over-quarter change in holder count.5
min_fund_change_pctqueryoptionalLower bound on quarter-over-quarter holder-count change as a fraction.0.10
max_fund_change_pctqueryoptionalUpper bound on quarter-over-quarter holder-count change as a fraction.0.10
min_share_changequeryoptionalLower bound on quarter-over-quarter change in shares held.100000
max_share_changequeryoptionalUpper bound on quarter-over-quarter change in shares held.100000
min_share_change_pctqueryoptionalLower bound on quarter-over-quarter share change as a fraction.0.10
max_share_change_pctqueryoptionalUpper bound on quarter-over-quarter share change as a fraction.0.10
min_first_tradedqueryoptionalLower bound on first-traded date, compared lexicographically as YYYY-MM-DD.2015-01-01
max_first_tradedqueryoptionalUpper bound on first-traded date, compared lexicographically as YYYY-MM-DD.2015-01-01
include_rangesqueryoptionalfalseSet to 'true' to include filter_ranges in response (min/max for each filterable column). Request this once on page load, not on every paginate/sort. Enriched column ranges (market_cap, shares_outstanding, fund_flow_mcap_pct, first_traded) are omitted for performance -- only native summary column ranges are returned.

Response schema

FieldTypeNullableDescription
statusstringnoAlways `success` on a 2xx response (deviation from the canonical `ApiResponse` envelope — this endpoint uses a custom shape because it pre-aggregates and emits `data.tickers[]` plus rich metadata blocks). Error responses use the standard `ApiResponse.error()` envelope with `status: 'error'`.
data.quarterstringnoISO `YYYY-MM-DD` reporting quarter — always a calendar quarter end (03-31, 06-30, 09-30, 12-31). Echoed from the request; defaults to the latest available quarter when omitted.
data.tickersarraynoPer-CUSIP aggregation rows from `sec_13f_summary`, enriched with market data (close_price, sector, industry) + XBRL (shares_outstanding) + computed market_cap. Sorted per `sort_by` / `sort_order`. Page size controlled by `limit`; offset by `offset`.
data.tickers[].cusipstringno9-character CUSIP — natural primary key. NVIDIA's canonical CUSIP is `67066G104`; Apple's is `037833100`.
data.tickers[].tickerstringyesResolved ticker (canonical hyphen form for multi-class issuers — e.g. `BRK-A`, `BRK-B`, `GOOG`, `GOOGL`). Null when CUSIP is unmapped (~3% of rows in steady state — debt instruments, private placements, delisted issuers).
data.tickers[].namestringnoIssuer name from `cusip_security_catalog` (canonical, NOT as-filed). For the as-filed name see [POST /api/v1/form-13f/holdings](/docs/institutional-holdings/form-13f-api/post-form-13f-holdings).
data.tickers[].sectorstringyesSector classification (e.g. `Technology`, `Healthcare`, `Financial Services`). Null when CUSIP is unmapped or the security predates our coverage.
data.tickers[].security_groupstringnoPer #241 6-bucket classification: `Stocks`, `ETFs`, `Preferred`, `Warrants`, `Debt`, `Other`. Replaces the older binary `is_etf` flag — query via `?security_group=Stocks,ETFs` for multi-bucket filtering. Coverage restored from 7,968 to ~25,000 CUSIPs by removing the equity-only whitelist.
data.tickers[].is_etfbooleannoDeprecated — use `security_group` instead. Kept for backwards compatibility with pre-#241 clients. True for `security_group === 'ETFs'`.
data.tickers[].close_pricenumberyesClose price (USD) on the last trading day of the quarter, from the daily price feed. Used to compute `market_cap = close_price * shares_outstanding`. Null when price coverage is missing for the quarter.
data.tickers[].market_capnumberyesMarket cap in USD = `close_price * shares_outstanding`. NVIDIA Q4 2025 ≈ $3.62T; mid-cap stocks $2-10B; micro-caps <$300M. Null when either input is missing. Used for size-bucket filtering via `min_market_cap` / `max_market_cap`.
data.tickers[].shares_outstandingnumberyesTotal shares outstanding (NOT free float — see legacy `float` alias in range filters). Sourced from XBRL `dei:EntityCommonStockSharesOutstanding`. Null when XBRL coverage is missing or the issuer is non-US.
data.tickers[].first_tradedstringyesISO `YYYY-MM-DD` date of the security's first trade. Useful for filtering out recent IPOs (`min_first_traded=2020-01-01` to exclude 2020+ IPOs). Null for unmapped securities.
data.tickers[].fund_flownumberyesNet dollar flow from usable comparisons between managers that submitted selected holdings reports in both adjacent quarters. Null means comparison unavailable; zero means measured no net flow.
data.tickers[].fund_flow_mcap_pctnumberyesComparable fund flow divided by market capitalization. Null when comparable flow or market capitalization is unavailable.
data.tickers[].total_valuenumbernoTotal institutional position value this quarter, in USD (post-Plan-51 thousands correction). Sum of `value_usd` across all funds holding this CUSIP. NOT a per-fund metric — for per-fund detail use [POST /api/v1/form-13f/holdings](/docs/institutional-holdings/form-13f-api/post-form-13f-holdings).
data.tickers[].fund_countintegernoComplete current holder count across every admitted current holdings report, including managers first entering the reporter roster this quarter.
data.tickers[].fund_count_comparableintegeryesCurrent holders inside usable common-reporter comparisons.
data.tickers[].fund_count_prev_reportedintegeryesComplete prior admitted holder count, including managers absent from the current reporter roster.
data.tickers[].fund_changeintegeryesCurrent comparable holders minus prior comparable holders. Null when no usable comparison exists. Full liquidations by common reporters count; reporting exits do not.
data.tickers[].share_changenumberyesNet share change from usable common-reporter comparisons. Null when no usable comparison exists. Shares are in the filing quarter's units on this endpoint.
data.tickers[].share_change_pctnumberyesComparable share change divided by comparable prior shares. Null when no usable comparison exists or the comparable prior-share denominator is zero; zero remains a measured 0% change when the denominator is positive.
data.tickers[].total_shares_comparablenumberyesCurrent shares inside usable common-reporter comparisons.
data.tickers[].total_shares_prevnumberyesComparable prior shares used as the denominator for share_change_pct. Zero means a percentage cannot be calculated and can occur when common-reporting managers newly establish the security.
data.tickers[].total_shares_prev_reportednumberyesComplete prior admitted ownership, including managers absent from the current reporter roster.
data.tickers[].ownership_changenumberyesComplete current ownership minus complete prior ownership.
data.tickers[].reporting_entry_countintegeryesCurrent holders whose manager appears only in the current selected holdings-report roster.
data.tickers[].reporting_entry_sharesnumberyesShares held by reporting-entry managers; included in ownership, excluded from purchases.
data.tickers[].reporting_exit_countintegeryesPrior holders whose manager appears only in the prior selected holdings-report roster.
data.tickers[].reporting_exit_sharesnumberyesPrior shares held by reporting-exit managers; excluded from sales.
data.tickers[].comparison_unavailable_shares_currnumberyesCurrent admitted shares in unusable common-reporter comparisons.
data.tickers[].comparison_unavailable_shares_prevnumberyesPrior admitted shares in unusable common-reporter comparisons.
data.tickers[].comparison_position_countintegeryesUsable manager-security comparisons contributing to activity fields.
data.tickers[].comparison_unavailable_countintegeryesCommon-reporter manager-security groups that could not be compared.
data.tickers[].comparison_statusstringyescomplete, partial, or unavailable comparison coverage; null on legacy rows not yet rebuilt.
data.tickers[].new_buys_countintegernoCommon-reporting managers that held no position in the prior report and hold one now. First-time reporters are counted under reporting_entry_count instead.
data.tickers[].increased_countintegernoNumber of funds that ADDED to an existing position this quarter. Companion fields: `decreased_count`, `unchanged_count`, `closed_count`.
data.volumeobjectnoQuarter-wide comparable buy and sell dollar totals plus comparison coverage. buy and sell are null when no known comparable flow exists, remain numeric for a known partial subtotal, and remain zero when comparison was measured and net volume was zero.
data.volume.buynumberyesSum of positive comparable security flows for the selected security-group scope.
data.volume.sellnumberyesAbsolute sum of negative comparable security flows for the selected security-group scope.
data.volume.comparison_position_countintegeryesUsable manager-security comparisons represented in the volume subtotal.
data.volume.comparison_unavailable_countintegeryesUnavailable manager-security comparisons represented in the same scope.
data.volume.comparison_statusstringyescomplete, partial, unavailable, or null for legacy unknown coverage.
data.quarter_metadataobjectnoFiling-completeness state for the quarter: `{ quarter, filing_deadline, is_complete, days_until_deadline }`. `is_complete=false` during filing season (within 45 days of quarter-end) means data is still accumulating; gate downstream analytics until `is_complete=true`. Same shape as [GET /api/v1/form-13f/filing-progress](/docs/institutional-holdings/filing-progress-tracking/get-form-13f-filing-progress).
data.available_quartersarraynoSorted-newest-first array of ISO `YYYY-MM-DD` quarter ends with parsed 13F coverage. Use to populate quarter-selector dropdowns.
data.filter_rangesobjectyesMin/max values for each filterable column (e.g. `{ market_cap: { min, max }, fund_count: { min, max } }`). Present ONLY when `include_ranges=true` — request once on page-load to initialize range sliders, NOT on every paginate/sort. Enriched columns (market_cap, shares_outstanding, fund_flow_mcap_pct, first_traded) omitted for performance — only native summary columns included.
meta.paginationobjectno`{ total, limit, offset, has_more }`. `total` reflects the full filter-applied count (not just the page); `has_more` is convenience-flag for cursor-style UI.
meta.sortobjectnoEchoes back applied sort: `{ column, order }`. Useful for stateful client-side rendering (e.g. arrow indicator on the active column header).
meta.filters_appliedobjectnoEchoes back the filter set used: `{ security_group, sector, industry, search, min_*, max_* }`. Null fields indicate an unfiltered dimension. Useful for rendering active-filter chips client-side.

Sample response

·
  • "status": "success"
  • "data":
    • "quarter": "2025-12-31"
    • "tickers":
    • "volume":
    • "quarter_metadata":
    • "available_quarters":
    • "filter_ranges":
    }
  • "meta":
    • "pagination":
    • "sort":
    • "filters_applied":
    }
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/form-13f/aggregation/by-ticker?quarter=2025Q4&sort_by=filed_at&sort_order=desc&limit=20&offset=0&security_group=Stocks&is_etf=false&sector=Technology&industry=Consumer+Electronics&search=apple&min_market_cap=1000000000&max_market_cap=1000000000&min_total_value=50000000&max_total_value=50000000&min_shares_outstanding=10000000&max_shares_outstanding=10000000&min_float=10000000&max_float=10000000&min_fund_flow=1000000&max_fund_flow=1000000&min_fund_flow_mcap_pct=0.05&max_fund_flow_mcap_pct=0.05&min_fund_count=10&max_fund_count=10&min_fund_change=5&max_fund_change=5&min_fund_change_pct=0.10&max_fund_change_pct=0.10&min_share_change=100000&max_share_change=100000&min_share_change_pct=0.10&max_share_change_pct=0.10&min_first_traded=2015-01-01&max_first_traded=2015-01-01" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).