/api/v1/form-13f/cross-filing-signalsIdentify smart money convergence: securities where both corporate insiders (Form 4 open-market purchases) and institutional funds (13F accumulation) are buying in overlapping time windows.
Identify smart money convergence: securities where both corporate insiders (Form 4 open-market purchases) and institutional funds (13F accumulation) are buying in overlapping time windows. Each signal includes insider buyer count, buy value, institutional fund flow, fund count, and an investment attractiveness score (0-100) computed from market data components. Response includes quarter_metadata (quarter, filing_deadline, is_complete, days_until_deadline) indicating whether the quarter's data is complete or still accumulating.
Why use this
Common use case
Identifies 'smart money convergence' signals — securities where BOTH corporate insiders (Form 4 open-market purchases via the P transaction code) AND institutional funds (13F accumulation) are buying within an overlapping time window. The signal type is the headline output of FinRadar's Phase 47-era 13D/G + 13F unified-holder signal: when an insider with private knowledge of company prospects AND institutional funds with deep research teams INDEPENDENTLY conclude a position is worth buying at the same time, the convergence is a powerful conviction signal.
Cross-schema SQL join: insider.transactions_non_derivative (Form 4 P-code purchases) ⋈ sec_13f_summary (13F quarterly aggregates) via issuer ticker/CUSIP matching, with the Phase 47 unified-holder normalization layer ensuring 13D/G filers (often the same insiders that show up on Form 4) are correctly attributed.
The attractiveness score (0-100) is a composite of 5 independently-computed components: (1) ownership ratio, (2) fund stability (consistency of holders across quarters), (3) market cap, (4) inverse volatility (lower vol = higher score), (5) fund flow significance. Components are NULL-tolerant — if Yahoo Finance volatility lookup fails for a security, the score still computes from the other 4 components. Enrichment is capped to the top-20 signals by fund_flow (Yahoo Finance rate limit); signals 21+ have null attractiveness_score.
For the canonical Form 4 insider feed see GET /insider-module/api/insiders/transactions/latest; for the 13D/G unified-holder surface (which feeds the Phase 47 normalization layer used here) see GET /api/v1/13dg/holders/{ticker}. All monetary values in USD (post-Plan-51 thousands correction).
Cost: heavy quant endpoint — runs a cross-schema JOIN + Yahoo Finance enrichment on the top-20 results. Read-time computation (no precompute layer); typical latency 200-800ms depending on Redis cache hit rate on the YF enrichment.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| quarter | query | optional | — | — | Quarter end date YYYY-MM-DD (e.g. 2025-12-31). Defaults to latest available. | 2025Q4 |
| window_before | query | optional | 30 | — | Days before quarter start to look for insider purchases (0-90). | — |
| window_after | query | optional | 45 | — | Days after quarter end to look for insider purchases (0-90). | — |
| limit | query | optional | 50 | — | Max results (1-100). | 20 |
| min_insider_buyers | query | optional | 1 | — | Minimum distinct insider buyers to include in results. | — |
| min_fund_flow | query | optional | 0 | — | Minimum institutional fund flow ($) to include in results. | — |
Response schema
| Field | Type | Nullable | Description |
|---|---|---|---|
| status | string | no | Always `success` on a 2xx response. Custom envelope (not the standard `ApiResponse`) — `data` carries `quarter`, `time_window`, `signal_count`, `signals[]`, `coverage_note`. |
| data.quarter | string | no | ISO `YYYY-MM-DD` reporting quarter — always a calendar quarter end. Echoed from the request; defaults to the latest available quarter. |
| data.time_window | object | no | The exact insider-purchase window used for cross-filing convergence: `{ start, end, description }`. `start = quarter_start - window_before` (default 30 days); `end = quarter_end + window_after` (default 45 days). The 45-day default tail captures Form 4 filings that arrive AFTER the 13F quarter-end (insiders have 2 business days post-trade to file Form 4). |
| data.signal_count | integer | no | Total number of convergence signals — securities with BOTH insider buying (Form 4 P-code purchases) AND institutional accumulation (positive 13F fund_flow) within `time_window`. Capped by `limit` (default 50). |
| data.signals | array | no | Per-security convergence signals. Sorted by `fund_flow DESC` by default. Each signal carries the institutional-side aggregates from `sec_13f_summary` AND the insider-side aggregates from `insider.transactions_non_derivative` (P-code = open-market purchase) — the headline 'smart money convergence' rows. |
| data.signals[].cusip | string | no | 9-character CUSIP — natural primary key for the convergence row. |
| data.signals[].symbol | string | yes | Resolved ticker (canonical hyphen form for multi-class issuers). Null when CUSIP is unmapped. |
| data.signals[].name_of_issuer | string | no | Issuer name from `cusip_security_catalog`. Casing preserved verbatim. |
| data.signals[].issuer_cik | string | yes | Issuer CIK as a 10-character zero-padded string (the COMPANY's CIK, NOT the institutional filer's CIK). Null when the issuer-CIK enrichment is missing for this CUSIP. |
| data.signals[].fund_flow | number | no | Net institutional dollar flow this quarter (USD, post-Plan-51 thousands correction). For convergence signals to be meaningful, this is always positive. |
| data.signals[].fund_count | integer | no | Number of distinct institutional funds with a position in this CUSIP this quarter. |
| data.signals[].new_buys_count | integer | no | Number of institutional funds that opened a NEW position this quarter (no prior-quarter row). Sub-aggregate of `fund_count`. High new_buys_count + insider buying = strong conviction signal. |
| data.signals[].total_value | number | no | Total institutional position value this quarter, in USD. Sum of `value_usd` across all funds holding this CUSIP. |
| data.signals[].total_shares | number | no | Total shares held across all institutional funds this quarter. NOT split-adjusted — for split-adjusted aggregations use [GET /api/v1/tickers/{ticker}/fund-trends](/docs/ticker-research/get-tickers-ticker-fund-trends). |
| data.signals[].fund_flow_pct | number | no | `fund_flow / total_value * 100` — flow significance relative to total institutional ownership. 100% means ALL institutional value is from this quarter's flow (i.e. brand-new institutional discovery). |
| data.signals[].insider_buyer_count | integer | no | Distinct count of insiders who made open-market PURCHASES (Form 4 P-code) within `time_window`. Use `min_insider_buyers=2` to filter for multi-insider convergence (e.g. CEO AND CFO both buying — a much stronger signal than a single insider). |
| data.signals[].insider_buy_value | number | no | Total dollar value of insider purchases (Form 4 P-code) within `time_window`, in USD. Computed as `sum(shares_traded * price_per_share)` across all P-code transactions for the issuer's CIK. |
| data.signals[].first_buy_date | string | no | ISO `YYYY-MM-DD` date of the EARLIEST insider purchase within `time_window`. Useful for sequencing analysis ('insider bought first, then funds piled in'). |
| data.signals[].last_buy_date | string | no | ISO `YYYY-MM-DD` date of the LATEST insider purchase within `time_window`. `last_buy_date - first_buy_date = insider_buying_duration` — concentrated buying (small range) is a stronger signal than spread-out buying. |
| data.signals[].attractiveness_score | number | yes | 0-100 investment attractiveness composite score — only computed for the TOP 20 signals by fund_flow (Yahoo Finance enrichment is rate-limited; results Redis-cached 24h). Combines 5 components: ownership ratio, fund stability, market cap, inverse volatility, and fund flow significance. Null for signals 21+ (out of enrichment budget). |
| data.signals[].attractiveness_components | array | yes | Individual scoring component breakdown: `[{ name, score }, ...]`. Components are independently nullable — partial scores computed from available data (e.g. if Yahoo Finance volatility lookup fails, the volatility component is omitted but the others still surface). Null for signals beyond the top-20 enrichment cap. |
| data.coverage_note | string | no | Human-readable note on enrichment coverage: e.g. `'4/4 signals enriched with attractiveness scores (top 20 by fund flow).'`. Render in UI to set expectations on which signals have full vs partial scoring. |
Sample response
- "status": "success"
- "data":
- "quarter": "2025-12-31"
- "time_window":
- "signal_count": 4
- "signals":
- "coverage_note": "4/4 signals enriched with attractiveness scores (top 20 by fund flow)."
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/form-13f/cross-filing-signals" \
-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).