/api/v1/tickers/{ticker}/fund-trendsHistorical quarterly Form 13F ownership totals and reporter-comparable trading trends.
Historical quarterly Form 13F ownership totals and reporter-comparable trading trends. Current total shares and holder count include every admitted current holdings report, including a manager's first report. Trading changes compare only managers with selected valid holdings reports in both adjacent quarters. Reporter entries, reporter exits, unusable comparisons, registered SPAC-merger discontinuities, and comparison coverage are disclosed separately. Security-successor resolution and split adjustment remain applied.
Why use this
Quarterly institutional ownership and trading history for a ticker. Ownership totals include every admitted current Form 13F holdings report. Trading fields use the intersection of selected current and prior holdings-report rosters, after security-successor normalization; within that shared roster an absent security is a provable zero position, so new positions and full liquidations remain counted. Managers present on only one reporting roster are disclosed as reporting entries or reporting exits instead of purchases or sales. Unusable common-reporter groups are disclosed separately, and comparison_status tells clients whether trading fields are complete, partial, unavailable, or legacy-unknown. A registered mergeable SPAC merger inside an adjacent-quarter interval also makes that trading comparison unavailable because converted legacy and sponsor holdings cannot be separated from open-market trades; comparison_event identifies the event while reported ownership totals remain valid. The ownership reconciliation is ownership_change = share_change + reporting_entry_shares - reporting_exit_shares + comparison_unavailable_shares_curr - comparison_unavailable_shares_prev. Share-valued fields are split-adjusted to a common current basis. Use GET /api/v1/tickers/{ticker}/holders for current per-manager detail.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| ticker | path | required | — | — | Stock ticker (case-insensitive). Server normalizes to canonical hyphen form (`BRK.A`/`BRK/A`/`BRKA` → `BRK-A`). Multi-class issuers preserve the requested class — `GOOGL` and `GOOG` return distinct trends. An unresolved ticker returns HTTP 200 with `quarters: []`; for canonical resolution see `/api/v1/cusip-successors`. | AAPL |
| limit | query | optional | 20 | — | Maximum quarters to return (oldest-first ordering). Reliable 13F coverage starts at 2018-Q3. Defaults to 20 (~5 years of history) and is capped at 100. | 20 |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| data.ticker | string | no | Ticker echoed back in canonical hyphen form (e.g. `BRK-A`). Useful for asserting your client passed the ticker you intended after server-side normalization. |
| data.quarters | array | no | Array of quarterly aggregate rows, sorted by `date ASC` (oldest first — chart-friendly ordering). One row per quarter where any 13F filer held the ticker. Empty for an unresolved ticker or one with no summarized 13F holdings. |
| data.quarters[].date | string | no | ISO `YYYY-MM-DD` quarter-end date (always 03-31 / 06-30 / 09-30 / 12-31). The 13F filing for this period was due 45 days later. Most-recent quarter may be partially populated during the 45-day filing window — see `/form-13f/filing-progress` for completeness gauge. |
| data.quarters[].fund_count | integer | no | Complete current-quarter holder count across all admitted current Form 13F holdings reports, including managers first appearing in the reporting roster this quarter. |
| data.quarters[].fund_count_comparable | integer | yes | Current holders among usable manager-security comparisons where the manager submitted selected holdings reports in both adjacent quarters. |
| data.quarters[].fund_count_prev | integer | yes | Prior holders inside the same usable common-reporter comparisons used for fund_change. |
| data.quarters[].fund_count_prev_reported | integer | yes | Complete prior-quarter holder count across all admitted prior holdings reports, including managers that did not report in the current quarter. |
| data.quarters[].total_shares | number | no | Complete current-quarter admitted ownership, split-adjusted to the most recent split. It includes first-time reporters; it is never filtered down to the trading-comparison cohort. |
| data.quarters[].total_shares_raw | number | no | Aggregate share count in the filing quarter's original share units, before the route applies its cumulative forward split factor. |
| data.quarters[].total_shares_comparable | number | yes | Current shares inside usable common-reporter comparisons, split-adjusted to the current basis. |
| data.quarters[].total_shares_prev | number | yes | Comparable prior shares used as the denominator for share_change_pct, split-adjusted to the current basis. Zero means a percentage cannot be calculated and can occur when common-reporting managers newly establish the security. |
| data.quarters[].total_shares_prev_reported | number | yes | Complete prior admitted ownership, split-adjusted to the current basis. |
| data.quarters[].ownership_change | number | yes | Observed ownership change: complete current ownership minus complete prior ownership. This can differ from comparable trading because reporter entries, exits, and unavailable comparisons are separate. |
| data.quarters[].total_value | number | no | Aggregate position USD value across all funds, post-Plan 51 holdings-quality correction (handles the thousands-vs-actual-dollars reporting issue). NOT mark-to-most-recent-price — uses the value as filed for that quarter (which is mark-to-quarter-end-price). For the price-adjusted view across quarters, multiply `total_shares` by your reference price. |
| data.quarters[].fund_change | number | yes | Current comparable holders minus prior comparable holders. Null when no usable manager-security comparison exists. A full liquidation by a manager who reported both quarters reduces this value; a manager who stopped reporting is a reporting exit instead. |
| data.quarters[].share_change | number | yes | Net share change from usable common-reporter comparisons only, split-adjusted to the current basis. Null when no comparison exists. |
| data.quarters[].fund_flow | number | yes | Net dollar flow from usable common-reporter comparisons only. Null means comparison unavailable; zero means measured no net flow. |
| data.quarters[].fund_flow_pct | number | yes | Comparable fund flow divided by current total value. Null when fund flow is unavailable or current total value is zero. |
| data.quarters[].share_change_pct | number | yes | Comparable share change divided by comparable prior shares after split adjustment. Null means no usable comparison or a zero comparable prior-share denominator; zero remains a measured 0% change when the denominator is positive. It is independent of the requested history limit. |
| data.quarters[].reporting_entry_count | integer | yes | Current holders whose manager has a selected current holdings report but no selected prior holdings report. Their shares are in ownership totals and are not classified as purchases. |
| data.quarters[].reporting_entry_shares | number | yes | Shares held by reporting-entry managers, split-adjusted to the current basis. |
| data.quarters[].reporting_exit_count | integer | yes | Prior holders whose manager has a selected prior holdings report but no selected current holdings report. Their prior shares are not classified as sales. |
| data.quarters[].reporting_exit_shares | number | yes | Prior shares held by reporting-exit managers, split-adjusted to the current basis. |
| data.quarters[].comparison_unavailable_count | integer | yes | Common-reporter manager-security groups that cannot be compared because at least one admitted group is unusable or a registered corporate action changed the security's economic basis. |
| data.quarters[].comparison_unavailable_shares_curr | number | yes | Current admitted shares in unavailable common-reporter comparisons, split-adjusted to the current basis. |
| data.quarters[].comparison_unavailable_shares_prev | number | yes | Prior admitted shares in unavailable common-reporter comparisons, split-adjusted to the current basis. |
| data.quarters[].comparison_position_count | integer | yes | Usable manager-security comparisons contributing to trading changes. |
| data.quarters[].comparison_status | string | yes | complete when all admitted comparison groups are usable, partial when usable and unavailable groups coexist, unavailable when no usable comparison exists, and null on legacy rows not yet rebuilt. |
| data.quarters[].comparison_event | object | yes | Registered corporate action that makes this quarter's adjacent-period trading comparison unavailable, or null on an ordinary quarter. The object is `{ type: 'SPAC_MERGER', effective_date: 'YYYY-MM-DD', description: string|null }`. Reported ownership remains valid; share change, fund flow, and buy/sell classifications are unavailable across this boundary. |
| data.quarters[].new_buys_count | integer | no | Common-reporting managers that held no position in the prior report and hold one now. |
| data.quarters[].closed_count | integer | no | Common-reporting managers that held the security in the prior report and omitted it from the current report, representing full liquidations. |
| data.splitAdjusted | boolean | yes | `true` when the corporate-actions table contains at least one split event for the ticker; `false` when no split event was found. Omitted on the early empty response for an unresolved ticker or a ticker with no summarized rows. |
| data.splits | array | yes | Split events used by the route, each `{ date, ratio }`, ordered by ex-date. Empty when no split event was found; omitted on the early empty response for an unresolved ticker or a ticker with no summarized rows. |
Sample response
- "data":
- "ticker": "AAPL"
- "security_name": "APPLE INC"
- "quarters":
Errors
| Status | Label | Description |
|---|---|---|
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Invalid query, body, or path parameter. |
| 401 | Unauthorized | Missing or invalid Authorization header / api_Token. |
| 402 | Payment Required | Insufficient token balance for this call. Top up |
| 429 | Too Many Requests | Rate limit exceeded for your tier (see /pricing for tier limits). Tier limits |
| 500 | Server Error | Unexpected server-side failure. Retry with backoff; report if persistent. |
Code samples
curl "https://api.finradar.ai/api/v1/tickers/AAPL/fund-trends?api_Token=YOUR_API_KEY&limit=20" \
-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).