Free 13F Fund Holdings API
Quarterly portfolios of 30 famous funds, parsed from SEC 13F-HR filings. Berkshire Hathaway, Bridgewater, Citadel, Pershing Square, Scion, and more, with position values, share counts, portfolio weights, and quarter-over-quarter changes.
Endpoints
/api/markets/funds/{slug}e.g. berkshire-hathawayLatest reported quarter for one fund: top 200 holdings by value. An unknown slug returns the full list of valid fund slugs.
/api/markets/funds?ticker=AAPLThe tracked managers holding one ticker's shares at their latest 13F, largest position first: fund, quarter, shares, value, share of portfolio, change in shares. Puts and calls on it are in each fund's portfolio. Without ticker: the list of tracked funds (slug, name, manager, cik, url). Every row carries canonicalUrl, the fund's page on xoomar.com.
/api/markets/funds/csvHoldings across all funds and recent quarters as CSV, newest first (50k row cap).
Example
import requests
r = requests.get("https://xoomar.com/api/markets/funds/berkshire-hathaway")
data = r.json()["data"]
print(data["fund"]["name"], data["quarter"])
for h in data["holdings"][:5]:
print(h["issuerName"], h["valueUsd"], h["pctOfPortfolio"])Response shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs, license, attribution, meta }. In meta, source names who publishes the data and sourceAttribution is the credit line to show with it. The data field is an object with these fields:
| Field | Type | Description |
|---|---|---|
| fund | object | slug, name, manager, and SEC CIK of the fund |
| quarter | string (date) | null | Reporting quarter end, e.g. 2026-03-31 |
| holdings | array | Lines of the latest filing, largest value first (up to 200) |
| holdings[].issuerName | string | Issuer name as filed |
| holdings[].ticker | string | null | Ticker for the CUSIP, where one is known |
| holdings[].cusip | string | null | CUSIP as filed |
| holdings[].putCall | string | "Put" or "Call" for an option the manager holds, "" for the shares themselves |
| holdings[].valueUsd | number | Value in US dollars; for a put or call, the value of the shares it covers |
| holdings[].shares | number | null | Shares or principal amount; for a put or call, the shares it covers |
| holdings[].pctOfPortfolio | string | null | Weight within the filing's total value |
| holdings[].changeShares | number | null | Change in shares vs the fund's prior quarter, per security and kind of line; equal to shares for a new position; null when the prior quarter is not on file |
13F filings are due 45 days after quarter end, so the latest quarter reflects positions up to that lag. Only long US-listed positions are reportable on 13F; puts and calls the manager holds are lines of their own, marked in putCall.
Numeric fields typed string in the table carry exact decimals; parse them with your language's decimal type. No key needed to start: 10 requests a minute per IP without a key and 30 a minute with a free account key, with at least six months of history. A 429 response carries a Retry-After header in seconds. Credit XOOMAR with a link to the dataset page when you republish the data; the data terms are on the terms page.
A free account key raises the limit; send it in an X-API-Key header.
Frequently Asked Questions
Which funds are covered?
How much history is available?
Why is the data delayed?
What are the rate limits?
Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.