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

Get all tickers for a given quarter with full sorting, range filtering, and market data enrichment.

Get all tickers for a given quarter with full sorting, range filtering, and market data enrichment. Serves the 'Grouped Hedge Funds' page for both incomplete (current filing season) and complete (past) quarters. Enriches 13F summary data with close price, market cap, shares_outstanding, first traded date, and ETF flag from Sharadar and XBRL sources. Previous path /api/v1/form-13f/market/tickers is kept as a deprecated alias.

free

Why use this

Pre-aggregated per-CUSIP quarterly 13F data from sec_13f_summary, enriched with market data (close price from all_stocks_prices, shares outstanding from XBRL, market cap computed as close x shares_outstanding). Supports 30 sortable columns, 11 range filters (min/max), sector/industry/security group filters, and text search. Returns filter_ranges with actual min/max for each filterable column so frontends can initialize range sliders. Pagination via limit/offset with total count. Per #241: security_group filter (Stocks, ETFs, Preferred, Warrants, Debt, Other) replaces old security_type and is_etf/etf params. Coverage restored from 7,968 to ~25,000 CUSIPs by removing equity-only whitelist.

Common use case

Building an institutional ownership screener: 'Show me all equity tickers held by hedge funds this quarter, sorted by fund flow, filtered to Technology sector with market cap > $10B.' Two sub-pages: incomplete quarter (filing season, is_complete=false) and complete quarter (historical, is_complete=true).

Pre-aggregated per-CUSIP quarterly 13F data — the headline analytics endpoint that powers the 'Grouped Hedge Funds' / 'Institutional Ownership' page. Backed by the sec_13f_summary materialized view (refreshed ~6h post-filing) and enriched with market data from Sharadar (close_price, sector, industry, first_traded) + XBRL (shares_outstanding) + computed market_cap. Coverage restored from 7,968 to ~25,000 CUSIPs after #241 lifted the equity-only whitelist.

Designed for institutional-ownership screeners: 'Show me all Technology stocks held by hedge funds this quarter, sorted by fund flow, filtered to market cap > $10B'. Supports 30 sortable columns, 11 range filters, sector/industry/security-group filters, and free-text search across ticker/name/CUSIP. Use ?include_ranges=true ONCE on page load to populate range-slider min/max values, then OMIT it on subsequent paginate/sort calls (saves ~20% latency).

The quarter_metadata block surfaces filing-season completeness — is_complete=false during the 45-day post-quarter window means the quarter is still accumulating filings (gate downstream analytics until is_complete=true, or render with a 'filing season in progress' banner). For quarter-completeness as a standalone polling endpoint see GET /api/v1/form-13f/filing-progress; for sector-level rollup see GET /api/v1/form-13f/aggregation/by-sector. All monetary values are in USD (post-Plan-51 thousands correction); share counts are NOT split-adjusted — for split-adjusted aggregations use GET /api/v1/tickers/{ticker}/fund-trends.

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 from Sharadar (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[].sectorstringyesSharadar sector classification (e.g. `Technology`, `Healthcare`, `Financial Services`). Null when CUSIP is unmapped or the security predates Sharadar's 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 `all_stocks_prices` (Sharadar). 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_flownumbernoNet dollar flow this quarter — sum of (new_buys_value + increased_value) - (closed_value + decreased_value), in USD (post-Plan-51 thousands correction). Positive = net institutional buying; negative = net selling. The headline fund-rotation metric.
data.tickers[].fund_flow_mcap_pctnumberyes`fund_flow / market_cap * 100` — measures flow significance relative to the issuer's size. Useful for filtering out 'noise' from mega-caps where $1B flow is <0.05% of cap. Null when `market_cap` is missing.
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_countintegernoNumber of distinct funds holding this CUSIP this quarter. NVIDIA Q4 2025 ≈ 3,200 funds; Apple ≈ 5,500 funds. Indicates institutional ownership breadth.
data.tickers[].fund_changeintegernoQoQ change in `fund_count` — positive = more funds added the position; negative = funds exited. Computed against the prior quarter's aggregate.
data.tickers[].share_changenumbernoQoQ change in total shares held by all funds. NOT split-adjusted — for split-adjusted aggregations use [GET /api/v1/tickers/{ticker}/fund-trends](/docs/ticker-research/get-tickers-ticker-fund-trends). Phase 52 split-adjustment work is shipped on the ticker-research surface.
data.tickers[].new_buys_countintegernoNumber of funds that opened a NEW position this quarter (no prior-quarter row). High new-buys count is a signal of conviction — multiple funds independently initiating positions.
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 buy/sell volume aggregates: `{ buy: <total dollars added>, sell: <total dollars removed> }`. The buy-vs-sell ratio is a macro-level institutional sentiment indicator.
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" \
  -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).