Docs / API reference
GET /v1/holdings/{identifier}
A fund's latest 13F portfolio, parsed from the SEC information table, ranked by value, and diffed against the prior quarter so every position is labelled new / added / reduced / unchanged, with exits listed separately.
identifier is a FUND, not a company ticker. Pass a known name
(berkshire, burry, pershing-square), a CIK, or a ticker whose
company is itself the filer (BRK-B). A company ticker like AAPL has no 13F of
its own — to see who holds a company, use /v1/activist.Parameters
| Param | In | Values |
|---|---|---|
identifier | path | fund name, CIK, or filer ticker — not a company ticker |
limit | query | 1–500 positions (default 50) |
changes | query | true (default) to diff against the prior quarter |
Request
curl "https://api.edgrapi.com/v1/holdings/berkshire?limit=20" -H "X-API-Key: edgr_..."
Response
{
"manager": "Berkshire Hathaway", "cik": "0001067983",
"period": "2025-06-30", "total_value": 258712000000,
"positions": [
{ "issuer": "APPLE INC", "cusip": "037833100", "ticker": "AAPL",
"value": 66000000000, "shares": 300000000, "pct_portfolio": 25.5,
"put_call": null, "change": { "status": "reduced" } }
],
"exits": [ { "issuer": "HP INC", "cusip": "40434L105" } ],
"changes": { "new": 2, "added": 5, "reduced": 3, "exited": 1 },
"source": "SEC EDGAR Form 13F-HR (information table)"
}
The parsing traps we handle. Positions are aggregated by CUSIP (funds split one
holding across sub-managers, so the raw table double-counts). A
put_call of PUT
is a bearish bet, not a long — reporting it as a holding is the classic 13F mistake. Pre-2023 filings
report value in thousands, newer ones in whole dollars; we normalize to whole dollars.