---
title: "Insider Summary"
method: GET
path: "/api/insider-summary"
tags: ["Analysis"]
---

# Insider Summary

`GET /api/insider-summary`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/insider-summary`
- Auth: none declared

Insider transaction summary — PG-first (SEC Form 4), Finnhub fallback.

2026-05-16 P1 incident fix: this endpoint (the primary
`#insider-activity` panel's source via peer-view) was Finnhub-ONLY.
When `FINNHUB_API_KEY` is unset/quota-limited/degraded it returned
empty or name-less rows → the panel rendered blank ("unknown" to the
user) while 384,118 rich, 100%-named, role-tagged Form 4 rows sat
UNUSED in `form4_transactions`. The `e8ac1dc4` repoint fixed
`/api/insiders`/SSR/digest but NOT this Finnhub path. Per
`feedback_local_data_fallback` (PG canonical when the API is
incomplete) we now read PG first via the (form4-backed)
`pg_get_insider_activity` and only fall back to Finnhub when PG has
nothing for the ticker. Emits `position` (OWNER directive — name is
signal-irrelevant; never blank) alongside the peer-view wire shape
(`{name,type,date,shares,value}` + `netAmount`); `type` is "Buy"/"Sell" for
P/S only (peer-view tests `tx.type.includes('buy')`); every other code
carries its Form 4 word and never moves `netAmount` (CHAOS 2026-10-11 MF-1).

## Query parameters

- `ticker` string, nullable
- `symbol` string, nullable

## Response `200`

Successful Response

- InsiderSummaryResponse: Per-ticker insider summary from GET /api/insider-summary. F4 schema-tightening (2026-04-30): `ticker` REQUIRED. Handler echoes the requested ticker on every 200 path: - with-data branch: `{ticker, **data}` where data is Finnhub's payload - no-data branch: `{ticker, transactions=[], netBuying6mo=0, error}` 400 raises HTTPException so response_model doesn't apply. `transactions` stays Optional because the with-data branch uses Finnhub's exact wire format which may omit it under certain upstream conditions.
  - `ticker` string, required
  - `transactions` InsiderTxn[], nullable
    - `name` string, nullable
    - `share` number, nullable
    - `change` number, nullable
    - `filingDate` string, nullable
    - `transactionDate` string, nullable
    - `transactionCode` string, nullable
    - `transactionPrice` number, nullable
    - `issuerSelfFiled` boolean, nullable: True when the reporting-owner CIK equals the issuer's CIK: filed under the company's own SEC ID, so the reporting-owner field names the company, not a person (footnotes may still name the officer). Shown, labelled, and never counted in any buy/sell summary, net figure or cluster. False when a CIK is missing.
  - `netBuying6mo` number, nullable
  - `netAmount` number, nullable: Form 4 branch: open-market purchases minus sales in dollars over every filing of the last `netWindowDays` days -- common stock only, each trade counted once when several owners (or a re-filing) report it, the issuer's own filings left out. Not a sum of `transactions`, which lists the newest filings, one per owner. Null when the summary could not be read.
  - `netWindowDays` integer, nullable: The trailing filing-date window, in days, that netAmount covers.
  - `error` string, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
