13F holdings API
13F holdings data comes from Form 13F-HR, which institutional managers with $100M or more in 13F securities file within 45 days of each quarter-end. The ownership endpoints serve it from both sides: who holds a ticker, and what a manager holds. Schedule 13D and 13G filings, which disclose stakes above 5%, are served as a separate blockholders list.
A holder is a filer family: a manager's filing entities are summed into one row with a stable holderKey. History reaches back to the 2017-03-31 quarter, 13D/13G coverage runs from 2015, and values are in USD because Form 13F is filed in USD. By default a response is the newest quarter that has passed a completeness check; the newest quarter on file can be a partial one.
Who holds a ticker, and what a manager holds
curl
curl -s "https://api.distillmarkets.com/api/v1/sec/ownership/AAPL" \-H "X-Api-Key: $DISTILL_API_KEY"curl -s "https://api.distillmarkets.com/api/v1/sec/managers/vanguard?limit=3" \-H "X-Api-Key: $DISTILL_API_KEY"curl -s "https://api.distillmarkets.com/api/v1/sec/ownership/AAPL/blockholders" \-H "X-Api-Key: $DISTILL_API_KEY"
python (requests)
import osimport requestsHEADERS = {"X-Api-Key": os.environ["DISTILL_API_KEY"]}BASE = "https://api.distillmarkets.com"r = requests.get(f"{BASE}/api/v1/sec/ownership/AAPL", headers=HEADERS, timeout=30)r.raise_for_status()own = r.json()print(own["periodOfReport"], own["isPeriodComplete"], own["holdersCount"])for h in own["topHolders"]:print(h["rank"], h["holderName"])
Sample response
GET /api/v1/sec/ownership/AAPL
{"ticker": "AAPL","periodOfReport": "<quarter-end date>","isPeriodComplete": <true|false>,"holdersCount": <number>,"filerCikCount": <number>,"totalValue": <number, USD>,"totalShares": <number>,"topHolders": [{ "rank": <number>, "holderName": "<string>", "holderKey": "<string>" }],"note": "<string>"}
Manager portfolio: Vanguard, 13F quarter ended 2026-06-30
{"holderKey": "vanguard","holderName": "The Vanguard Group","periodOfReport": "2026-06-30","isPeriodComplete": true,"positionCount": 5014,"totalValue": 7799885071085.00,"storedPositionCount": 200,"storedValueShare": 0.729682,"positions": [{"rank": 1,"ticker": "NVDA","value": 462177352662.00,"shares": 2309847332,"putCall": null,"isPrincipalAmount": false},{"rank": 2,"ticker": "AAPL","value": 418590626300.00,"shares": 1446608468,"putCall": null,"isPrincipalAmount": false},{"rank": 3,"ticker": "MSFT","value": 272652405713.00,"shares": 730932405,"putCall": null,"isPrincipalAmount": false}]}
Limits
- Form 13F reports long positions in Section 13(f) securities. Short positions and holdings outside 13(f) securities are not in it.
- A quarter fills in over the 45 days after quarter-end. Reading an in-flight quarter beside a complete one shows a drop that is a filing artefact, so the default response is the newest complete quarter.
- Null means unknown, never zero. A comparison that cannot be certified is returned as null, not as no change.
- A manager's stored positions cover about 95% of book value and at most 200 names; positionCount and totalValue describe the whole portfolio. The by-ticker manager list is therefore not a complete holder register.
- A free key returns the five largest holders. The top 20, per-holder changes and past quarters need the Analyst tier.
Related
- Ownership referenceTiers, completeness rules and null semantics.
- Manager endpointsSearch, portfolio and by-ticker manager lists.
- Blockholders (13D/13G)Beneficial owners above 5% and their stated percent of class.
- Manager pagesPublic 13F manager portfolios, readable without a key.
- Company pagesPer-company ownership and fundamentals.
- PricingFree key with no card; Analyst and Pro tiers add depth and history.
- Connect an agentClaude, ChatGPT, Cursor and Claude Code connect to the hosted MCP server; the same data is exposed as tools.
- MCP tool listThe keyed endpoints here are also MCP tools; the tool list names each one.