# 13F Holdings API (`conserving_celerytop/13f-holdings-api`) Actor

Get 13F holdings from SEC EDGAR for any institutional manager. One row per security: issuer, CUSIP, shares, value, put or call, portfolio share, plus quarter-over-quarter change. Read from the official filing. Independent tool, not affiliated with the SEC.

- **URL**: https://apify.com/conserving_celerytop/13f-holdings-api.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 holding records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Use this 13F holdings API to get the holdings of any institutional investment manager from the SEC Form 13F-HR filing, with the change against the previous quarter, for $1.50 per 1,000 holdings.

Enter an SEC CIK number such as 1067983, or a stock ticker such as BRK-B. Pick the latest quarter or a quarter such as 2026Q2. Each result is one security that the manager held on the last day of the quarter: issuer, CUSIP, shares, value in US dollars, put or call, and the share of the whole portfolio. Switch on Compare to the prior filing to add the shares of the quarter before, the change in shares, and a change type: new, increased, decreased, unchanged or sold out. The Actor reads the filing straight from SEC EDGAR, so there is no third-party site in between. You need no login, no API key and no proxy.

This is an unofficial tool built by an independent developer. It is not affiliated with, endorsed by or operated by the U.S. Securities and Exchange Commission or any investment manager.

### Sample output

One row per security. This is a real row from a run on 7 October 2026, the first of 29 rows for Berkshire Hathaway Inc, 13F-HR for the quarter ended 30 June 2026:

```json
{
  "managerCik": "0001067983",
  "managerName": "BERKSHIRE HATHAWAY INC",
  "filingAccession": "0001193125-26-352200",
  "filingForm": "13F-HR",
  "reportPeriod": "2026-06-30",
  "filedDate": "2026-08-14",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/0001193125-26-352200-index.htm",
  "amendmentsForPeriod": 0,
  "cusip": "037833100",
  "issuerName": "APPLE INC",
  "titleOfClass": "COM",
  "putCall": null,
  "shares": 227917808,
  "sharesType": "SH",
  "valueUsd": 65950296923,
  "portfolioPercent": 22.0383,
  "votingSole": 227917808,
  "votingShared": 0,
  "votingNone": 0,
  "investmentDiscretion": "DFND",
  "lineCount": 12,
  "priorReportPeriod": null,
  "priorShares": null,
  "priorValueUsd": null,
  "sharesChange": null,
  "sharesChangePercent": null,
  "changeType": null,
  "valueUnitAsFiled": "USD",
  "filingTotalValueUsd": 299253556246,
  "retrievedAt": "2026-10-07T12:37:09.579Z",
  "source": "SEC EDGAR (sec.gov)",
  "licence": "US government public filing data, free to reuse (SEC webmaster FAQ)",
  "resultStatus": "ok",
  "message": null
}
```

The filing has 89 lines. The Actor added up the lines of the same security, which gave 29 positions. The values of all positions add up to $299,253,556,246. This equals the table value total on the cover page of the filing.

### How to get 13F holdings with this Actor

1. Click **Try for free**. No API key is needed.
2. In **Managers**, enter one SEC CIK number or stock ticker per line.
3. Leave **Quarter** on latest, or enter a quarter such as 2026Q2 or a date such as 2026-06-30.
4. Switch on **Compare to the prior filing** if you want the change against the previous 13F-HR. Switch on **Include sold-out positions** to add the positions that the manager closed.
5. Set **Max results**. The default is 100.
6. Click **Start**, open the **Holdings** view, and export as JSON, CSV or Excel.

Typical uses:

- Track what a fund bought, added to, cut or sold in the last quarter.
- Build a watchlist of the biggest positions of a set of managers.
- Fill a database with 13F history, one quarter at a time, back to the quarter ended 30 June 2013.
- Check how much of a portfolio sits in one security with the portfolioPercent field.
- Feed an AI agent or a spreadsheet with clean rows instead of raw XML.

### What you get

| Field | Meaning |
|---|---|
| managerCik, managerName | SEC Central Index Key of the manager and its name in the SEC company record |
| filingAccession, filingForm, reportPeriod, filedDate, filingUrl | Which filing the row comes from: accession number, form, quarter end, date filed and a link to the filing on sec.gov |
| amendmentsForPeriod | How many 13F-HR/A amendments SEC lists for the same quarter. The Actor does not merge them into the rows |
| cusip, issuerName, titleOfClass | The security as filed |
| putCall | Put or Call for an option position, otherwise null |
| shares, sharesType | Number of shares, or principal amount for bonds (SH or PRN) |
| valueUsd | Value in whole US dollars. Old filings are in thousands of dollars, and the Actor multiplies them by 1,000 |
| portfolioPercent | Value as a percent of the total value of the filing |
| votingSole, votingShared, votingNone | Voting authority as filed |
| investmentDiscretion, lineCount | Investment discretion as filed, and how many filing lines were added up in this row |
| priorReportPeriod, priorShares, priorValueUsd | The previous filing used for the comparison. Only with Compare to the prior filing |
| sharesChange, sharesChangePercent, changeType | Shares now minus shares before, as a percent, and new, increased, decreased, unchanged or sold_out |
| valueUnitAsFiled, filingTotalValueUsd | USD or thousands of USD as filed, and the total value of the whole filing in dollars |
| retrievedAt, source, licence | When the Actor read the filing and where the data comes from |
| resultStatus, message | ok for a holding. A status row for a manager with no holdings explains why in message |

The Actor adds no data from other sources. Every value comes from the SEC filing. It does not add ticker symbols, because 13F filings carry only CUSIP codes.

### Pricing

Pay per event: **$1.50 per 1,000 holding rows** on the Free plan, with lower prices on Bronze, Silver and Gold plans. The start of a run costs $0.00005. Rows that carry a change type cost the same as other rows. A manager that gives no holdings returns one status row and counts as one result, because the lookup was done. A run that cannot read SEC is not charged.

Worked example: the latest Berkshire Hathaway filing has 29 positions and costs 29 x $0.0015 = $0.0435 on the Free plan. The same run with Compare to the prior filing and Include sold-out positions returned 30 rows on 7 October 2026 and costs 30 x $0.0015 = $0.045. The latest Morgan Stanley filing has 45,905 lines that add up to 8,402 positions, and one run costs 8,402 x $0.0015 = $12.603. Use Max results to set a ceiling.

### Input examples

Latest holdings of one manager:

```json
{
  "managers": ["1067983"],
  "maxResults": 25
}
```

What a manager bought and sold in the second quarter of 2026, including closed positions:

```json
{
  "managers": ["1067983"],
  "quarter": "2026Q2",
  "compareToPrior": true,
  "includeSoldOut": true
}
```

The comparison input above returned 30 rows on 7 October 2026: 15 unchanged, 7 increased, 6 decreased, 1 new and 1 sold out.

Positions of at least one billion dollars at two managers, with your own User-Agent:

```json
{
  "managers": ["1067983", "1336528"],
  "minValueUsd": 1000000000,
  "userAgent": "Acme Research data-team@example.com"
}
```

### Output example with a comparison

A real row from the comparison run. Berkshire Hathaway cut its Kroger position from 50,000,000 to 39,000,000 shares between the quarters ended 31 March 2026 and 30 June 2026:

```json
{
  "managerCik": "0001067983",
  "managerName": "BERKSHIRE HATHAWAY INC",
  "filingAccession": "0001193125-26-352200",
  "filingForm": "13F-HR",
  "reportPeriod": "2026-06-30",
  "filedDate": "2026-08-14",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/0001193125-26-352200-index.htm",
  "amendmentsForPeriod": 0,
  "cusip": "501044101",
  "issuerName": "KROGER CO",
  "titleOfClass": "COM",
  "putCall": null,
  "shares": 39000000,
  "sharesType": "SH",
  "valueUsd": 2165670000,
  "portfolioPercent": 0.7237,
  "votingSole": 39000000,
  "votingShared": 0,
  "votingNone": 0,
  "investmentDiscretion": "DFND",
  "lineCount": 4,
  "priorReportPeriod": "2026-03-31",
  "priorShares": 50000000,
  "priorValueUsd": 3618000000,
  "sharesChange": -11000000,
  "sharesChangePercent": -22,
  "changeType": "decreased",
  "valueUnitAsFiled": "USD",
  "filingTotalValueUsd": 299253556246,
  "retrievedAt": "2026-10-07T12:37:12.334Z",
  "source": "SEC EDGAR (sec.gov)",
  "licence": "US government public filing data, free to reuse (SEC webmaster FAQ)",
  "resultStatus": "ok",
  "message": null
}
```

A position that is in the prior filing and not in the current one comes back with shares 0 and the change type sold_out. This is a real row:

```json
{
  "managerCik": "0001067983",
  "managerName": "BERKSHIRE HATHAWAY INC",
  "filingAccession": "0001193125-26-352200",
  "filingForm": "13F-HR",
  "reportPeriod": "2026-06-30",
  "filedDate": "2026-08-14",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/0001193125-26-352200-index.htm",
  "amendmentsForPeriod": 0,
  "cusip": "21036P108",
  "issuerName": "CONSTELLATION BRANDS INC",
  "titleOfClass": "CL A",
  "putCall": null,
  "shares": 0,
  "sharesType": "SH",
  "valueUsd": 0,
  "portfolioPercent": 0,
  "votingSole": 0,
  "votingShared": 0,
  "votingNone": 0,
  "investmentDiscretion": "DFND",
  "lineCount": 0,
  "priorReportPeriod": "2026-03-31",
  "priorShares": 632890,
  "priorValueUsd": 94933500,
  "sharesChange": -632890,
  "sharesChangePercent": -100,
  "changeType": "sold_out",
  "valueUnitAsFiled": "USD",
  "filingTotalValueUsd": 299253556246,
  "retrievedAt": "2026-10-07T12:37:12.334Z",
  "source": "SEC EDGAR (sec.gov)",
  "licence": "US government public filing data, free to reuse (SEC webmaster FAQ)",
  "resultStatus": "ok",
  "message": null
}
```

A manager with no matching filing returns a status row. This is a real row for CIK 320193, which has no 13F-HR filing:

```json
{
  "managerCik": "0000320193",
  "managerName": "Apple Inc.",
  "filingAccession": null,
  "filingForm": null,
  "reportPeriod": null,
  "filedDate": null,
  "filingUrl": null,
  "amendmentsForPeriod": null,
  "cusip": null,
  "issuerName": null,
  "titleOfClass": null,
  "putCall": null,
  "shares": null,
  "sharesType": null,
  "valueUsd": null,
  "portfolioPercent": null,
  "votingSole": null,
  "votingShared": null,
  "votingNone": null,
  "investmentDiscretion": null,
  "lineCount": null,
  "priorReportPeriod": null,
  "priorShares": null,
  "priorValueUsd": null,
  "sharesChange": null,
  "sharesChangePercent": null,
  "changeType": null,
  "valueUnitAsFiled": null,
  "filingTotalValueUsd": null,
  "retrievedAt": "2026-10-07T12:37:18.814Z",
  "source": "SEC EDGAR (sec.gov)",
  "licence": "US government public filing data, free to reuse (SEC webmaster FAQ)",
  "resultStatus": "no_filing_found",
  "message": "Apple Inc. has no 13F-HR filing with holdings on file (searched filings back to 1994-01-26). A manager that only files 13F-NT reports its holdings under another manager."
}
```

### Run it every quarter

Managers file Form 13F within 45 days after the end of each quarter. The deadlines fall on about 14 February, 15 May, 14 August and 14 November, and many managers file on the last day. A schedule that starts on the 18th of those months runs after the deadline. In the Apify Console, open **Schedules**, create a schedule with the cron expression `0 6 18 2,5,8,11 *`, and add this Actor with your input. Use a dataset export, a webhook, or an integration with Make, Zapier or n8n to send the rows on. You can also call the Actor from your own code with the Apify API.

### FAQ

**Where does the data come from?** From the filings that managers submit to the SEC. The Actor reads the list of filings of each manager from the SEC submissions service on data.sec.gov. Then it downloads the XML information table of the filing from sec.gov. It never uses a third-party site.

**Is it legal to use?** The SEC webmaster FAQ states: "All Government-created content on sec.gov and EDGAR public filing content are free to access and reuse." The SEC privacy page adds: "Information presented on sec.gov is considered public information and may be copied or further distributed by users of the web site without the SEC's permission. Please consider appropriate citation to the SEC as the source." This README gives that credit: data from SEC EDGAR. The SEC also sets a fair access rule of no more than 10 requests per second and asks automated tools to declare a User-Agent. The Actor follows both. The SEC marks its own 13F data sets as data that it cannot guarantee to be accurate, and says that they are not a substitute for the filings.

**Does the data hold personal data?** The rows hold institution names, security names, CUSIP codes, share counts and values. The Actor does not read or return the signature block of a filing, which holds the name, title and phone number of the signer. It does not return business addresses or the names of other included managers. A few filers are named after a person, and the manager name is returned as the SEC shows it. Do not use the data to profile private persons.

**What User-Agent does the Actor send?** The SEC asks every automated tool to declare itself. The default is Sec13fHoldingsActor-bot/1.0 (Apify Actor; unofficial SEC 13F holdings reader; no contact given). It names the tool and holds no email address and no other personal data. The SEC sample asks for a company name and a contact email. If SEC answers HTTP 403, put your own company or tool name and a contact email into the User-Agent field, and run again. The Actor stops at the first 403 and does not try other managers.

**How fast does it read?** One request at a time, with a pause of at least 150 ms. That is fewer than 7 requests per second. The SEC limit counts all requests from one user, so do not start many runs at the same moment.

**What does a 13F filing cover?** Managers with at least $100 million in 13(f) securities must file. The filing lists long positions in those securities on the last day of the quarter: mainly U.S. listed shares, ETFs, some options and convertible bonds. It does not show short positions or cash, and it can omit positions for which the manager has requested confidential treatment. The data is 45 days old or more when it appears.

**Why do I get fewer rows than the filing has lines?** The same security often fills many lines, because a filing splits a position by other manager and by discretion. By default the Actor adds up the lines of the same CUSIP, put or call and share type. The Berkshire Hathaway filing has 89 lines and 29 positions. Switch off Combine lines of one security to get every line as filed. The comparison always combines lines.

**How does the comparison work?** The Actor reads the previous 13F-HR of the same manager, which is the original filing with the next older quarter end. If a manager skipped a quarter, it compares with the filing before the gap and shows the date in priorReportPeriod. Positions match on CUSIP, put or call and share type. sharesChange is a plain difference in shares. It does not adjust for stock splits, so check a large change on a split date. A manager with no earlier filing gets the change type no_prior_filing.

**Why is the latest filing of a manager older than the latest quarter?** Some managers file a 13F-NT notice instead of holdings, because another manager reports their holdings. The Actor skips notices and uses the latest 13F-HR. Check reportPeriod in the row.

**Why is valueUsd so much larger than the number I see in an old filing?** Filings made before 3 January 2023 state the value in thousands of dollars. The Actor multiplies them by 1,000, and valueUnitAsFiled shows what the filer used.

**Are amendments included?** The Actor reads the original 13F-HR of the quarter. If the manager filed a 13F-HR/A for the same quarter, amendmentsForPeriod shows the count, and you can open filingUrl to see the filings. Amendments are not merged into the rows.

**Why is there no ticker?** The filing carries CUSIP codes and issuer names, not tickers. Match CUSIP codes to tickers with your own security master.

**How do I find the CIK of a manager?** Use the free company search on sec.gov, or enter a stock ticker if the manager is a listed company. CIK numbers read in the checks of 7 October 2026: Berkshire Hathaway Inc 1067983, Morgan Stanley 895421, Pershing Square Capital Management, L.P. 1336528, Bridgewater Associates, LP 1350694, Scion Asset Management, LLC 1649339.

**What are the limits?** Up to 50 managers and 100,000 results per run. Max results counts all rows, including status rows. Quarters start with the one ended 30 June 2013, the first quarter with an XML table on the filing checked. Within a manager, rows are sorted by value, largest first. Sold-out rows come last.

**What if the run fails?** If SEC does not answer, refuses the request, or the table format changes, the run stops with a clear message and charges nothing for that manager. If other managers worked, you keep their rows. Run it again later.

### Related Actors

For SEC filings by company, such as 8-K and 10-K lists, the same author has [SEC EDGAR API for Company Filings by Ticker or CIK](https://apify.com/conserving_celerytop/sec-edgar-filings-api). For annual and quarterly XBRL numbers such as revenue and EPS, see [SEC Company Financials API](https://apify.com/conserving_celerytop/sec-company-financials-api). Other public-data Actors by the same author are listed on the author's Store profile.

I built this Actor myself as an independent developer. Data: SEC EDGAR.

# Actor input Schema

## `managers` (type: `array`):

Enter one manager per line, as an SEC CIK number such as 1067983, or a stock ticker such as BRK-B. Find the CIK of any manager with the free EDGAR company search. A manager that matches nothing returns one status row.

## `quarter` (type: `string`):

Enter latest for the newest 13F-HR filing of each manager, a quarter such as 2026Q2, or a quarter end date such as 2026-06-30. The SEC XML tables start with the quarter ending 2013-06-30.

## `compareToPrior` (type: `boolean`):

Add the shares of the previous 13F-HR filing, the change in shares and a change type to every row: new, increased, decreased or unchanged. This reads one more filing per manager.

## `includeSoldOut` (type: `boolean`):

Add one row for every position that is in the prior filing and not in the current one, with change type sold_out. Each such row is one charged result. This switches Compare to the prior filing on.

## `combineLines` (type: `boolean`):

Add up all filing lines of the same CUSIP, put or call and share type, so each security is one row. Switch it off to get every line exactly as filed. The comparison always combines lines.

## `minValueUsd` (type: `number`):

Return only positions worth at least this many US dollars. Leave 0 for every position. The portfolio percent is still computed on the whole filing.

## `maxResults` (type: `integer`):

Return at most this many rows in total, across all managers, including status rows. Each row returned is one charged result. A very large filer such as a big bank can have more than 8,000 positions.

## `userAgent` (type: `string`):

The SEC asks every automated tool to declare itself in the User-Agent header. The default names this Actor and holds no personal data. If SEC answers HTTP 403, enter your company or tool name and a contact email, for example Acme Research data-team@example.com.

## Actor input object example

```json
{
  "managers": [
    "1067983"
  ],
  "quarter": "latest",
  "compareToPrior": false,
  "includeSoldOut": false,
  "combineLines": true,
  "minValueUsd": 0,
  "maxResults": 25,
  "userAgent": "Sec13fHoldingsActor-bot/1.0 (Apify Actor; unofficial SEC 13F holdings reader; no contact given)"
}
```

# Actor output Schema

## `holdings` (type: `string`):

No description

## `stats` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "managers": [
        "1067983"
    ],
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/13f-holdings-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "managers": ["1067983"],
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/13f-holdings-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "managers": [
    "1067983"
  ],
  "maxResults": 25
}' |
apify call conserving_celerytop/13f-holdings-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/13f-holdings-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IN1crtnVcATfBnJGq/builds/Q7vZfmJQXwv9QZenB/openapi.json
