SEC 13F Institutional Holdings Tracker
Track what the world's largest institutional investors are buying and selling by extracting position-level portfolio data from SEC 13F-HR filings. Enter an investor name, ticker, or CIK number and get back their complete portfolio with every holding, dollar values, share counts, voting authority, and quarter-over-quarter changes showing new positions, exits, increases, and decreases.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| result-returned | Charged per financial/government data result returned. | $0.03 |
Example: 100 events = $3.00 · 1,000 events = $30.00
Documentation
Track what the world's largest institutional investors are buying and selling by extracting position-level portfolio data from SEC 13F-HR filings. Enter an investor name, ticker, or CIK number and get back their complete portfolio with every holding, dollar values, share counts, voting authority, and quarter-over-quarter changes showing new positions, exits, increases, and decreases.
SEC 13F Institutional Holdings Tracker queries the SEC EDGAR database to fetch the latest 13F-HR filings for any institutional investment manager. It parses the XML information tables to extract every position, computes portfolio-level statistics (total value, top 10 concentration, position count), and optionally compares the latest filing with the previous quarter to identify exactly what changed. The actor handles CIK lookups, accession number resolution, and XML parsing automatically -- you just provide a list of investor names.
What data can you extract?
| Data Point | Source | Example |
|---|---|---|
| Investor name | SEC EDGAR | BERKSHIRE HATHAWAY INC |
| CIK number | SEC company tickers | 0001067983 |
| Filing date | 13F-HR submission | 2024-02-14 |
| Report date | Quarter end | 2023-12-31 |
| Total portfolio value | Computed | $348.7B |
| Number of positions | Computed | 42 |
| Top 10 concentration | Computed | 87.3% |
| Holdings | 13F information table | Name, CUSIP, value, shares, voting authority |
| Quarter-over-quarter changes | Computed | NEW, EXIT, INCREASE, DECREASE, UNCHANGED |
| Filing URL | SEC EDGAR | Direct link to the filing document |
Why use SEC 13F Institutional Holdings Tracker?
Researching 13F filings manually on SEC EDGAR is painful. You have to search by CIK, navigate the filing index, find the right XML file among multiple documents, parse the XML to extract holdings, and then repeat the entire process for the previous quarter to see what changed. For tracking multiple investors, this does not scale.
This actor automates every step: looks up the CIK from a company name or ticker, finds the latest 13F-HR filings, locates and parses the information table XML, extracts every position, computes portfolio statistics, and calculates quarter-over-quarter changes.
Built on the Apify platform, SEC 13F Institutional Holdings Tracker gives you:
- Scheduling -- run quarterly after 13F filing deadlines (45 days after quarter end)
- API access -- integrate into investment research platforms, portfolio analytics tools, or trading systems
- Batch processing -- track multiple investors in a single run
- Integrations -- connect to Google Sheets, Zapier, Make, or webhooks
Features
- Flexible investor lookup -- search by company name, stock ticker, or CIK number
- Full position extraction -- every holding from the 13F information table including name of issuer, title of class, CUSIP, value (in dollars), share count, share type, investment discretion, and voting authority (sole, shared, none)
- Quarter-over-quarter change tracking -- automatically fetches the previous quarter's filing and computes changes for every position: NEW (not in previous quarter), EXIT (removed), INCREASE (more shares), DECREASE (fewer shares), or UNCHANGED
- Portfolio summary -- total portfolio value, total positions, top 10 concentration percentage, and top 10 holdings with portfolio weight
- Batch investor tracking -- process multiple investors in a single run
- Minimum position filter -- exclude small positions below a dollar threshold
- Configurable holding limits -- cap the number of holdings per investor (sorted by value)
- SEC rate limit compliance -- enforces 200ms minimum between requests (5 req/sec, well within SEC's 10 req/sec limit)
- Robust XML parsing -- handles the various 13F XML formats across different filers with namespace stripping and recursive element search
Use cases for tracking 13F holdings
Following legendary investors
Track the portfolios of Warren Buffett (Berkshire Hathaway), Bill Ackman (Pershing Square), Cathie Wood (ARK Investment), Ray Dalio (Bridgewater), and other prominent investors. See exactly what they bought and sold each quarter.
Investment idea generation
Screen new positions (changeType: NEW) from top-performing funds to discover stocks that sophisticated investors are initiating positions in. Cross-reference multiple funds to find convergent bets.
Portfolio overlap analysis
Compare holdings across multiple institutional investors to identify crowded trades (stocks held by many funds) and contrarian bets (stocks where one fund is buying while others sell).
Hedge fund monitoring
Track activist investors and hedge funds known for influencing corporate governance. Monitor new positions that could signal upcoming activist campaigns.
Institutional ownership research
For any publicly traded company, identify which institutions hold positions by searching multiple 13F filers and filtering for the relevant CUSIP.
Compliance and reporting
Regulatory compliance teams track institutional ownership patterns for securities lending, proxy voting, and beneficial ownership reporting purposes.
How to track 13F holdings
- Enter investor names -- Provide one or more investor names, tickers, or CIK numbers in the input. For example: "BERKSHIRE HATHAWAY", "BRK-A", or "1067983".
- Configure options -- Enable or disable change tracking, set maximum holdings per investor, and optionally set a minimum position value filter.
- Run the actor -- Click "Start" to begin. The actor looks up CIKs, fetches 13F filings, parses XML information tables, and computes statistics.
- Download results -- Once finished, download your data as JSON, CSV, or Excel from the Dataset tab. Each investor produces one output record.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
investors | string[] | Yes | -- | List of institutional investors to look up. Accepts company names, stock tickers, or CIK numbers. |
includeChangeTracking | boolean | No | true | Compare latest filing with previous quarter to show position changes (NEW, EXIT, INCREASE, DECREASE). |
maxHoldings | integer | No | 500 | Maximum number of holdings to include per investor, sorted by value descending (1-10,000). |
minPositionValue | integer | No | 0 | Only include positions worth at least this amount in dollars. Set to 1000000 to filter out positions under $1M. |
Input examples
Track a single legendary investor:
{
"investors": ["BERKSHIRE HATHAWAY"],
"includeChangeTracking": true,
"maxHoldings": 100
}
Batch track multiple funds:
{
"investors": [
"BERKSHIRE HATHAWAY",
"PERSHING SQUARE",
"BRIDGEWATER ASSOCIATES",
"ARK INVESTMENT MANAGEMENT",
"SCION ASSET MANAGEMENT"
],
"maxHoldings": 50,
"minPositionValue": 10000000
}
Full portfolio dump without changes:
{
"investors": ["1067983"],
"includeChangeTracking": false,
"maxHoldings": 10000
}
Input tips
- Use company names for best results -- "BERKSHIRE HATHAWAY" works better than trying to guess the exact CIK number. The actor searches SEC's company tickers database.
- Set minPositionValue for cleaner output -- Large institutional portfolios can have hundreds of small positions. Filter at $1M+ or $10M+ to focus on meaningful positions.
- Disable change tracking for speed -- If you only need the current portfolio, set
includeChangeTrackingto false to skip fetching the previous quarter's filing.
Output example
Each item in the output dataset represents one investor's portfolio:
{
"investor": "BERKSHIRE HATHAWAY INC",
"cik": "0001067983",
"filingDate": "2024-02-14",
"reportDate": "2023-12-31",
"accessionNumber": "0000950123-24-001234",
"filingUrl": "https://www.sec.gov/Archives/edgar/data/1067983/000095012324001234/primary_doc.xml",
"portfolio": {
"totalValue": 348700000000,
"totalPositions": 42,
"top10Concentration": 87.3,
"top10Holdings": [
{
"name": "APPLE INC",
"value": 174300000000,
"percentOfPortfolio": 49.98
},
{
"name": "BANK OF AMER CORP",
"value": 34800000000,
"percentOfPortfolio": 9.98
}
]
},
"holdings": [
{
"nameOfIssuer": "APPLE INC",
"titleOfClass": "COM",
"cusip": "037833100",
"value": 174300000000,
"shares": 905560000,
"sharesType": "SH",
"investmentDiscretion": "SOLE",
"votingSole": 905560000,
"votingShared": 0,
"votingNone": 0
}
],
"changes": [
{
"cusip": "037833100",
"nameOfIssuer": "APPLE INC",
"titleOfClass": "COM",
"currentValue": 174300000000,
"previousValue": 156400000000,
"valueChange": 17900000000,
"valueChangePercent": 11.44,
"currentShares": 905560000,
"previousShares": 915560000,
"sharesChange": -10000000,
"sharesChangePercent": -1.09,
"changeType": "DECREASE"
},
{
"cusip": "92556V106",
"nameOfIssuer": "VISA INC",
"titleOfClass": "COM CL A",
"currentValue": 0,
"previousValue": 2100000000,
"valueChange": -2100000000,
"valueChangePercent": -100,
"currentShares": 0,
"previousShares": 8297460,
"sharesChange": -8297460,
"sharesChangePercent": -100,
"changeType": "EXIT"
}
],
"previousFilingDate": "2023-11-14",
"searchedAt": "2026-03-18T14:30:00.000Z"
}
Output fields
| Field | Type | Description |
|---|---|---|
investor | string | Investor/company name from SEC records |
cik | string | SEC Central Index Key (10-digit, zero-padded) |
filingDate | string | Date the 13F-HR was filed with the SEC |
reportDate | string | Quarter end date the filing covers |
accessionNumber | string | SEC accession number for the filing |
filingUrl | string | Direct URL to the filing on SEC EDGAR |
portfolio.totalValue | number | Total portfolio value in dollars |
portfolio.totalPositions | number | Number of positions in the portfolio |
portfolio.top10Concentration | number | Percentage of portfolio value in the top 10 holdings |
portfolio.top10Holdings | object[] | Top 10 positions with name, value, and percentOfPortfolio |
holdings | object[] | Complete position list with nameOfIssuer, titleOfClass, cusip, value, shares, sharesType, investmentDiscretion, votingSole, votingShared, votingNone |
changes | object[]/null | Quarter-over-quarter changes (null if change tracking disabled). Each with cusip, currentValue, previousValue, valueChange, valueChangePercent, currentShares, previousShares, sharesChange, sharesChangePercent, changeType |
previousFilingDate | string/null | Filing date of the previous quarter's 13F used for change comparison |
searchedAt | string | ISO timestamp of when the search was performed |
How much does it cost to track 13F holdings?
SEC 13F Institutional Holdings Tracker uses compute-based pricing on the Apify platform. Costs depend on memory allocation (512 MB default) and run time.
| Scenario | Investors | Change Tracking | Est. Runtime | Est. Cost |
|---|---|---|---|---|
| Single investor (latest only) | 1 | No | ~15 sec | ~$0.005 |
| Single investor (with changes) | 1 | Yes | ~30 sec | ~$0.01 |
| Batch of 5 investors | 5 | Yes | ~2 min | ~$0.04 |
| Batch of 20 investors | 20 | Yes | ~8 min | ~$0.12 |
Apify Free Tier: New Apify accounts receive $5 of free platform credits each month.
Track 13F holdings using the API
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/sec-13f-holdings").call(run_input={
"investors": ["BERKSHIRE HATHAWAY", "PERSHING SQUARE"],
"includeChangeTracking": True,
"maxHoldings": 50,
"minPositionValue": 10000000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
p = item["portfolio"]
print(f"{item['investor']}: ${p['totalValue']/1e9:.1f}B across {p['totalPositions']} positions")
if item.get("changes"):
new_pos = [c for c in item["changes"] if c["changeType"] == "NEW"]
exits = [c for c in item["changes"] if c["changeType"] == "EXIT"]
print(f" {len(new_pos)} new positions, {len(exits)} exits")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/sec-13f-holdings").call({
investors: ["BERKSHIRE HATHAWAY", "PERSHING SQUARE"],
includeChangeTracking: true,
maxHoldings: 50,
minPositionValue: 10000000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
const p = item.portfolio;
console.log(`${item.investor}: $${(p.totalValue / 1e9).toFixed(1)}B across ${p.totalPositions} positions`);
if (item.changes) {
const newPos = item.changes.filter(c => c.changeType === "NEW").length;
const exits = item.changes.filter(c => c.changeType === "EXIT").length;
console.log(` ${newPos} new positions, ${exits} exits`);
}
}
cURL
# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~sec-13f-holdings/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"investors": ["BERKSHIRE HATHAWAY"],
"includeChangeTracking": true,
"maxHoldings": 50
}'
# Fetch results (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How the SEC 13F holdings tracker works
Step 1: CIK lookup
For each investor query, the actor loads the SEC company tickers file (~14,000 entries) and searches by CIK number, stock ticker, or company name (case-insensitive substring match). This maps the user's query to the SEC's Central Index Key needed for all subsequent API calls.
Step 2: Find 13F filings
The actor fetches the investor's submissions from data.sec.gov/submissions/CIK{cik}.json, which contains the complete filing history. It filters for 13F-HR form types and takes the most recent filing (plus the second-most-recent if change tracking is enabled).
Step 3: Fetch and parse XML
For each filing, the actor fetches the filing index to locate the information table XML file. 13F filers use inconsistent naming -- the actor searches for files containing "infotable", "info_table", or "13f" in the filename, with fallback heuristics for non-standard names. The XML is parsed with fast-xml-parser, handling namespace prefixes and case variations in element names.
Step 4: Extract holdings
Each infoTable entry is transformed into a holding record. The value field in the XML is reported in thousands of dollars, so the actor multiplies by 1,000 to convert to actual dollar values. Share counts, share types (SH for shares, PRN for principal amount), investment discretion, and voting authority breakdowns are extracted from their respective XML elements.
Step 5: Compute changes
If change tracking is enabled and two filings are available, the actor maps both quarters' holdings by CUSIP. Positions present in the current quarter but not the previous are tagged NEW. Positions absent from the current quarter but present in the previous are tagged EXIT. Positions in both quarters are compared by share count: more shares = INCREASE, fewer = DECREASE, same = UNCHANGED. Changes are sorted by absolute value change.
Step 6: Output
Holdings are filtered by minimum value, sorted by value descending, and capped at the maxHoldings limit. The portfolio summary, holdings, and changes are assembled into the final output record.
Limitations
- 13F filers only -- Only institutional investment managers with over $100M in qualifying assets are required to file 13F-HR. Smaller funds, individuals, and non-U.S. investors are not covered.
- Quarterly snapshots -- 13F filings are snapshots of holdings as of the end of each calendar quarter. Intra-quarter trading activity is not visible.
- 45-day filing delay -- Managers have 45 days after quarter end to file. Q4 filings (December 31) are due by February 14; Q1 (March 31) by May 15; etc.
- Long equity only -- 13F filings only report long positions in qualifying securities (equities, options, warrants, convertible bonds). Short positions, fixed income, derivatives, and private investments are not included.
- Confidential treatment -- Some filers request confidential treatment for certain positions, which means those holdings may be omitted or delayed.
- XML format variations -- 13F XML formats vary across filers and time periods. The actor handles known variations but rare edge cases may result in incomplete parsing.
- SEC rate limits -- The actor respects SEC EDGAR's rate limit (10 req/sec) by enforcing a 200ms minimum interval between requests.
Integrations
- Zapier -- Trigger workflows when new 13F data is available (run quarterly after filing deadlines).
- Make -- Build automated portfolio monitoring pipelines.
- Google Sheets -- Export holdings to Google Sheets for collaborative analysis and charting.
- Apify API -- Call the actor programmatically from investment research platforms or trading systems.
- Webhooks -- Get notified when a tracking run completes.
FAQ
What is a 13F filing? SEC Form 13F-HR is a quarterly report filed by institutional investment managers who exercise investment discretion over $100M or more in qualifying securities. It lists every equity position held as of the end of the calendar quarter.
When are 13F filings due? Filings are due 45 calendar days after the end of each quarter: February 14 (Q4), May 15 (Q1), August 14 (Q2), November 14 (Q3). Most managers file on or near the deadline.
Can I look up an investor by ticker symbol? Yes. The actor searches SEC's company tickers database, so you can use company names ("BERKSHIRE HATHAWAY"), tickers ("BRK-A"), or CIK numbers ("1067983").
What does "top 10 concentration" mean? It is the percentage of the total portfolio value held in the top 10 largest positions. A high concentration (e.g., 90%) means the portfolio is concentrated in a few stocks. A low concentration (e.g., 30%) means holdings are widely diversified.
Why are some positions missing from the changes?
If you set a minPositionValue filter, small positions are excluded from the current holdings list. However, if a position was above the threshold in the previous quarter, it will appear as an EXIT in the changes.
How is "value" calculated?
Values in the 13F XML are reported in thousands of dollars. The actor converts to actual dollars by multiplying by 1,000. For example, a value of 174300 in the XML becomes $174,300,000.
Can I track changes across more than two quarters? Currently, the actor compares the latest filing with the immediately previous filing. For multi-quarter trend analysis, run the actor quarterly and compare datasets over time.
What is CUSIP? CUSIP is a 9-character identifier assigned to securities traded in the U.S. and Canada. The actor uses CUSIP to match positions across quarters for change tracking.
Related actors
| Actor | How to combine |
|---|---|
| Website Contact Scraper | Find investor relations contacts at companies identified in 13F holdings |
| B2B Lead Gen Suite | Build profiles of companies that appear in institutional portfolios |
| WHOIS Domain Lookup | Research domain details for investment managers and portfolio companies |
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom investment research solutions, reach out through the Apify platform.
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Weather Forecast Search
Get weather forecasts for any location worldwide using the free Open-Meteo API. Returns current conditions, daily and hourly forecasts with temperature, precipitation, wind, UV index, and more. No API key needed.
EUIPO EU Trademark Search
Search EU trademarks via official EUIPO database. Find registered and pending trademarks by name, Nice class, applicant, or status. Returns full trademark details and filing history.
Ready to try SEC 13F Institutional Holdings Tracker?
Start for free on Apify. No credit card required.
Open on Apify Store