Skip to content
/api/v1/ownership/aggregation/by-ticker

13D/G activity aggregated per issuer over a filing-date window — counts, distinct companies/holders, and event-date-priced dollar flow for fast-clock filings.

13D/G activity aggregated per issuer over a filing-date window — counts, distinct companies/holders, and event-date-priced dollar flow for fast-clock filings.

Why use this

The 5%-plus-holder counterpart to the 13F and Form 4 sector aggregations: where are beneficial owners building and cutting. Aggregated ONE ROW PER FILING, never per filer — 13D/G filings are routinely made by a group of affiliated entities reporting the same block (measured: 94 of 100 recent amendments name more than one filer, up to 18), so a per-filer sum would multiply the same shares by the number of entities on the cover page. Dollar flow is 13D ONLY, valued at the close on each filing's event date: a 13D amendment is due within two business days of the change and an initial 13D within five business days of the acquisition, so that close is a fair proxy for what was paid. 13G returns COUNTS ONLY and always will — an institutional 13G is filed up to 45 days after quarter end and its position change accumulates over months (median 156 days between filings), so no transaction price can be honestly inferred. Schedule conversions (13G to 13D and the reverse) are counted on their own line and excluded from every flow figure: a form change is not a purchase. by-ticker covers EVERY filing including issuers with no sector classification.

Common use case

Rank the issuers where 5%-plus holders moved most this month; spot new activist positions; feed a per-stock smart-money panel.

Per-issuer 13D/G aggregation over a filing-date window. Aggregated one row per filing (group-filing safe), 13D priced at the event-date close, 13G counts only, conversions excluded from flow.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
dateFromqueryoptionalInclusive lower bound on `filedAt` (ISO `YYYY-MM-DD`). Defaults to `dateTo` minus 30 days. The window is bounded by FILING date — see `meta.clock.windowBoundedBy`.2026-06-27
dateToqueryoptionalInclusive upper bound on `filedAt` (ISO `YYYY-MM-DD`). Defaults to today. Maximum window `dateFrom`→`dateTo` is 366 days — larger windows return HTTP 400.2026-07-27
formTypequeryoptionalRestrict to exactly one of `SC_13D`, `SC_13D_A`, `SC_13G`, `SC_13G_A` before aggregation. Omit for all four.SC_13D
minOwnershipqueryoptionalMinimum aggregate percent of class on the filing. Continuous — pass any value, not a fixed threshold bucket. A threshold is a disclosure trigger, not a measurement, so the caller picks the number.11.5
maxOwnershipqueryoptionalKeep only filings whose aggregate percent-of-class is at most this value. Combine with `minOwnership` for a band (e.g. 5-10% accumulation watch).20
directionqueryoptional`up` keeps only filings whose position INCREASED vs the prior filing (share change, falling back to percent change when shares are unavailable); `down` keeps decreases. Filings with no usable delta are excluded when this filter is set.up
minPercentChangequeryoptionalKeep only amendments whose ABSOLUTE percent-of-class change is at least this value. Filings without a percent change are excluded when set.1
limitqueryoptional50Maximum group rows returned (1-500, default 50). `meta.totalGroups` always reports the full group count before this cut.50

Response schema

FieldTypeNullableDescription
data[].groupstringnoThe issuer ticker (by-ticker), sector name (by-sector) or industry name (by-industry).
data[].issuer_namestringyesIssuer name. by-ticker only.
data[].filingsintegerno13D/G filings in the window for this group. One filing counts once regardless of how many affiliated filers it names.
data[].companiesintegernoDistinct issuers (by CIK). Always 1 for by-ticker.
data[].holdersintegernoDistinct beneficial holders, keyed on the unified holder identity rather than the filer name — the same firm appears in raw EDGAR data as both `JPMORGAN CHASE & CO.` and `JPMORGAN CHASE & CO`, which a name-keyed count would treat as two.
data[].form_13dobjectno13D bucket. Counts plus dollar flow.
data[].form_13d.filingsintegerno13D and 13D/A filings in the window.
data[].form_13d.new_positionsintegernoInitial 13D filings — a holder crossing 5% for the first time. The whole reported stake is treated as the position established.
data[].form_13d.amendmentsintegerno13D/A filings.
data[].form_13d.increasesintegernoAmendments whose position grew.
data[].form_13d.decreasesintegernoAmendments whose position shrank.
data[].form_13d.unchangedintegernoAmendments that changed something other than position size (purpose, address, group membership).
data[].form_13d.no_deltaintegernoAmendments with no usable change figure, because the prior filing in the chain could not be linked. Reported rather than assumed to be zero movement.
data[].form_13d.inflow_usdnumbernoSum of positive position changes valued at the event-date close.
data[].form_13d.outflow_usdnumbernoAbsolute sum of negative position changes, same valuation.
data[].form_13d.net_flow_usdnumbernoinflow minus outflow. The headline magnitude for this endpoint — dollars are the only quantity additive across issuers.
data[].form_13d.priced_filingsintegerno13D filings that contributed to the dollar figures.
data[].form_13d.unpriced_filingsintegerno13D filings excluded from the dollar figures because no close was available on the event date or no change figure existed. Non-zero means the flow understates activity.
data[].form_13gobjectno13G bucket. COUNTS ONLY — carries no money keys at all, deliberately, so an absent figure can never be read as zero flow. Same count fields as form_13d minus the money ones.
data[].conversionsobjectno`{to_13d, to_13g, total}`. Schedule conversions, excluded from every flow figure. `to_13d` (a passive holder going active) is the single most decisive signal in this dataset.
meta.coverageobjectnoWhat the window contained and what was left out: filings_in_window, filings_grouped, filings_ungrouped (no sector match), filings_13d, filings_13g, conversions_excluded_from_flow, amendments_without_delta, and on by-sector/by-industry the priced/unpriced 13D split. A partial answer never looks complete.

Sample response

·
  • "status": "success"
  • "data":
    ]
  • "meta":
    • "groupBy": "ticker"
    • "dateFrom": "2026-06-27"
    • "dateTo": "2026-07-27"
    • "returned": 1
    • "totalGroups": 412
    • "coverage":
    }
}

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/ownership/aggregation/by-ticker?api_Token=YOUR_API_KEY&dateFrom=2026-06-27&dateTo=2026-07-27&formType=SC_13D&minOwnership=11.5&maxOwnership=20&direction=up&minPercentChange=1&limit=50" \
  -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).