# SEC Ownership API: 13F, N-PORT Fund Holdings, 13D/13G, Form 144 (`bosco_labs/sec-ownership`) Actor

Who owns a stock, from official SEC filings: a fund manager's 13F holdings, a mutual fund's or ETF's N-PORT holdings (with changes), the funds holding a ticker, 5%+ stakes (13D/13G) and Form 144 planned insider sales. One ticker or fund in, JSON out, a source link per row.

- **URL**: https://apify.com/bosco_labs/sec-ownership.md
- **Developed by:** [Bosco Labs](https://apify.com/bosco_labs) (community)
- **Categories:** Business, AI, News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 ownership rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## SEC Ownership API: 13F, N-PORT Fund Holdings, 13D/13G, Form 144

**Who owns a stock and who is about to sell it, from official SEC filings**: what a fund such as
Berkshire Hathaway holds (13F, with changes vs the previous quarter), what a mutual fund or ETF
such as VOO or ARKK holds (N-PORT), which managers and funds hold a ticker, who filed a 5%+ stake (13D activist, 13G passive), and which insiders filed to sell (Form 144).
For investors, analysts and AI agents.

**Pricing (pay per event):** $0.0018 per row ($1.80 per 1,000), plus $0.01 per "who holds this
stock" search (13F or N-PORT data set), no start fee. Empty or failed runs cost nothing.

One ticker or fund name in, a small JSON answer out, with a link to the exact SEC file on every
row. Data comes straight from the SEC: 13F information tables, N-PORT-P fund reports, the SEC's
quarterly Form 13F and Form N-PORT data sets, and the structured XML of Schedule 13D/13G and Form 144. No scraping of third-party sites,
no logins.

### Four modes

| `mode` | Question it answers | Input |
|---|---|---|
| `holdings13f` | "What does Berkshire Hathaway hold, and what changed?" | `filer`: name or CIK |
| `holdings13f` | "Which funds hold Apple?" | `ticker` or `cusip` |
| `holdingsNport` | "What does VOO / ARKK hold, and what changed?" | `fund`: fund or ETF ticker, series ID or name |
| `holdingsNport` | "Which mutual funds and ETFs hold Apple?" | `ticker` or `cusip` |
| `stakes13dg` | "Who filed a 5%+ stake in X?" / "New activist 13Ds this week?" | `ticker`, or nothing |
| `planned144` | "Which insiders filed to sell X?" / "Big Form 144s this week?" | `ticker`, or nothing + `minValueUsd` |

### Example outputs (real runs, 2026-11-05)

**Berkshire Hathaway's 13F** (`{"mode": "holdings13f", "filer": "Berkshire Hathaway"}`, 30 rows
in about 3 seconds): one row per position, largest first, plus positions closed since the
previous quarter.

```json
{
  "record_type": "holding",
  "filer_name": "BERKSHIRE HATHAWAY INC",
  "filer_cik": "0001067983",
  "period_of_report": "2026-06-30",
  "form": "13F-HR",
  "filing_date": "2026-08-14",
  "issuer_name": "ALPHABET INC",
  "title_of_class": "CAP STK CL A",
  "cusip": "02079K305",
  "ticker": "GOOGL",
  "ticker_candidates": [],
  "put_call": null,
  "shares": 78791167,
  "share_type": "SH",
  "value_usd": 28157599351,
  "portfolio_pct": 9.41,
  "previous_period": "2026-03-31",
  "previous_shares": 54249798,
  "previous_value_usd": 15600071913,
  "shares_change": 24541369,
  "shares_change_pct": 45.24,
  "change": "increased",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/0001193125-26-352200-index.htm",
  "source": "edgar-13f",
  "source_url": "https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/56757.xml"
}
```

**Which funds hold Apple** (`{"mode": "holdings13f", "ticker": "AAPL"}`, the 50 largest of 6,137
holders in about 15 seconds). Rows have `record_type: "holder"` and the same fields without the
change columns; the 8th largest:

```json
{
  "record_type": "holder",
  "filer_name": "Berkshire Hathaway Inc",
  "filer_cik": "0001067983",
  "period_of_report": "2026-06-30",
  "issuer_name": "APPLE INC",
  "cusip": "037833100",
  "ticker": "AAPL",
  "shares": 227917808,
  "value_usd": 65950296923,
  "source": "sec-13f-data-set",
  "source_url": "https://www.sec.gov/files/datastandardsinnovation/data/form-13f-data-sets/01jun2026-31aug2026_form13f.zip"
}
```

**ARK Innovation ETF's holdings** (`{"mode": "holdingsNport", "fund": "ARKK"}`, under 1 second):
one row per position from the fund's newest public N-PORT-P, with changes vs its report before
that. N-PORT rows add the fund's series, net assets and each security's ISIN, LEI, asset category
and currency; `portfolio_pct` is the share of the fund's net assets.

```json
{
  "record_type": "fund_holding",
  "filer_name": "ARK Innovation ETF",
  "filer_cik": "0001579982",
  "series_id": "S000042977",
  "registrant_name": "ARK ETF Trust",
  "fund_net_assets_usd": 5562264980.05,
  "period_of_report": "2026-07-31",
  "form": "NPORT-P",
  "filing_date": "2026-09-22",
  "issuer_name": "TESLA INC",
  "cusip": "88160R101",
  "isin": "US88160R1014",
  "ticker": "TSLA",
  "shares": 1740376,
  "share_type": "SH",
  "value_usd": 541622414.96,
  "portfolio_pct": 9.7374,
  "previous_period": "2026-04-30",
  "previous_shares": 1653653,
  "shares_change": 86723,
  "change": "increased",
  "asset_category": "EC",
  "currency": "USD",
  "source": "edgar-nport",
  "source_url": "https://www.sec.gov/Archives/edgar/data/1579982/000094040026037955/primary_doc.xml"
}
```

**Which mutual funds and ETFs hold Apple** (`{"mode": "holdingsNport", "ticker": "AAPL"}`, the 50
largest of 2,129 funds in about a minute): `record_type: "fund_holder"`, one row per fund from
its newest report in the SEC's quarterly Form N-PORT data set, largest first (Vanguard Total
Stock Market Index Fund, Vanguard 500 Index Fund, Fidelity 500 Index Fund, iShares Core S\&P 500
ETF, ...).

**A new activist stake** (`{"mode": "stakes13dg"}`: new 13D filings market-wide, last 7 days):

```json
{
  "record_type": "stake",
  "form": "13D",
  "stake_type": "activist",
  "amendment_no": null,
  "issuer_name": "cbdMD, Inc.",
  "issuer_cik": "0001644903",
  "ticker": "YCBD",
  "cusips": ["12482W408"],
  "security_class": "Common Stock, $0.001 par value",
  "filer_name": "Akretive Holdings LLC",
  "filer_cik": "0001655238",
  "percent_of_class": 15.9,
  "shares": 2229805,
  "reporting_persons": [
    {"name": "Akretive Holdings LLC", "cik": "0001655238", "percent_of_class": 15.9,
     "shares": 2229805, "person_type": ["OO"]}
  ],
  "event_date": "2026-10-30",
  "filing_date": "2026-11-04",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/1644903/000143774926035032/0001437749-26-035032-index.htm",
  "source_url": "https://www.sec.gov/Archives/edgar/data/1644903/000143774926035032/primary_doc.xml"
}
```

**A planned insider sale** (`{"mode": "planned144", "minValueUsd": 1000000}`):

```json
{
  "record_type": "form144",
  "form": "144",
  "issuer_name": "STRYKER CORP",
  "issuer_cik": "0000310764",
  "ticker": "SYK",
  "seller_name": "STRYKER RONDA E",
  "relationships": ["Director"],
  "security_class": "Common",
  "shares_to_be_sold": 550000,
  "aggregate_market_value_usd": 186807500,
  "shares_outstanding": 383573000,
  "approx_sale_date": "2026-11-06",
  "exchanges": ["NYSE"],
  "broker_names": ["APEX CLEARING"],
  "plan_adoption_dates": [],
  "notice_date": "2026-11-05",
  "filing_date": "2026-11-05",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/1242914/000124291426000011/0001242914-26-000011-index.htm",
  "source_url": "https://www.sec.gov/Archives/edgar/data/1242914/000124291426000011/primary_doc.xml"
}
```

Every row also has `schema_version`, `accession_number` and `retrieved_at`. Field descriptions
are in the dataset schema.

### Input

| Field | Meaning |
|---|---|
| `mode` | `holdings13f` (default), `holdingsNport`, `stakes13dg` or `planned144` |
| `filer` | 13F: fund manager name or CIK, e.g. `"Berkshire Hathaway"` or `"1067983"` |
| `fund` | N-PORT: mutual fund or ETF ticker (any share class), e.g. `"VOO"`; series ID `"S000002839"`; or name, e.g. `"Vanguard 500 Index Fund"` |
| `ticker` / `issuerCik` | The company: holders of it (13F, N-PORT), stakes in it, planned sales of it |
| `cusip` | 13F and N-PORT: one share class, e.g. `"037833100"` |
| `quarter` | 13F and N-PORT: e.g. `"2026Q2"`. Empty = newest |
| `stakeForms` | `13D`, `13D/A`, `13G`, `13G/A`. Empty = all for a ticker, 13D + 13D/A market-wide |
| `minValueUsd` | Form 144 aggregate value, or 13F / N-PORT position value |
| `dateFrom` / `dateTo` / `lookbackDays` | 13D/13G and Form 144 filing dates. Default: 365 days (13D/G of a ticker), 90 days (Form 144 of a ticker), 7 days (whole market) |
| `maxResults` | Default 50 |

### Use from an AI agent (MCP)

Agents can call this Actor as a tool through the
[Apify MCP server](https://github.com/apify/apify-mcp-server). Add this server URL to your MCP
client (Claude, Cursor, VS Code, ...):

```text
https://mcp.apify.com?tools=bosco_labs/sec-ownership
```

It loads this Actor as a tool, plus the tools that read its results (`get-actor-run`,
`get-dataset-items`). The hosted server signs you in with OAuth, or accepts your Apify token as
`Authorization: Bearer <APIFY_TOKEN>`.

Example prompts this Actor answers:

- *"What did Berkshire Hathaway buy and sell last quarter?"*
- *"Which funds hold the most Nvidia stock?"*
- *"What are ARKK's top holdings and what did it add last quarter?"*
- *"Which ETFs and mutual funds hold Palantir?"*
- *"Has anyone filed an activist 13D on Peraso?"*
- *"Which insiders filed to sell more than $1 million of stock this week?"*

For the first one, the agent passes:

```json
{"mode": "holdings13f", "filer": "Berkshire Hathaway"}
```

**Output for agents:** small, typed JSON, one row per position, holder or filing, with
`schema_version`, a `source_url` pointing to the exact SEC file and a `filing_url` for the
filing, so the agent can cite its source. Bad input fails within seconds with a status message
that says what to fix and shows a valid input.

**Cost:** $0.0018 per row, plus $0.01 per "who holds this stock" search (13F or N-PORT data
set), billed to the Apify account the MCP server is signed in with. A fund's 50 largest holdings
cost $0.09; the 50 largest holders of Apple cost $0.10. Runs without rows cost nothing.

### How fresh, how fast

- **A fund's holdings** (`filer`) come straight from its newest 13F on EDGAR: a few requests,
  about 3 seconds.
- **The holders of a stock** come from the SEC's quarterly Form 13F data set (about 100 MB,
  downloaded per run): about 15 seconds. The data set is published a few weeks after the 45-day
  filing deadline, so this answer is one quarter behind a fund's own newest 13F.
- **A mutual fund's or ETF's holdings** (`fund`) come straight from its two newest N-PORT-P
  reports on EDGAR: under 1 second for an equity ETF, about 3 seconds for a bond fund with
  17,000 holdings.
- **The mutual funds and ETFs holding a stock** come from the SEC's quarterly Form N-PORT data set
  (about 460 MB, downloaded per run): about a minute. A set holds the reports filed in one
  calendar quarter, so the default answer is each fund's newest report filed last quarter.
- **13D/13G and Form 144** come from EDGAR, today's filings included (live feed): seconds for
  one company. A whole-market week reads one small XML file per filing, newest first, and stops
  at `maxResults`: about 15 seconds for 50 13Ds, under 30 seconds for 50 Form 144s over
  $1 million.

### FAQ (limits)

**How current is 13F data?** 13F reports are quarterly and due 45 days after quarter end, so
holdings are up to 4.5 months old when they appear. Positions are what the manager reported:
long US-listed equities, options and convertibles on the SEC's 13(f) list; no shorts, no
non-US holdings, no cash.

**How current is N-PORT data?** Funds report holdings monthly, but only the report for the last
month of each fiscal quarter is made public, 60 days after that month ends. A fund's
`period_of_report` is therefore its own fiscal quarter end (ARKK: 2026-07-31; VOO: 2026-06-30),
and the holders of a stock can be as of different month ends (each row says which). N-PORT covers
registered funds and ETFs (open-end funds, closed-end funds, most ETFs), not money market funds or
unit investment trusts such as SPY; it includes bonds, cash vehicles, derivatives and short
positions (`payoff_profile`).

**Values?** As reported, in US dollars at quarter end (reports filed before 2023 used $1,000s and
are converted). Amendments are applied: a restatement replaces the original report, a "new
holdings" amendment adds to it.

**Tickers?** 13F filings carry CUSIPs, not tickers, and the SEC publishes no CUSIP-to-ticker list.
The company is found by its CIK or, on 13F rows, its name in the SEC's ticker list (renamed or
oddly abbreviated names stay `null`). The share class comes from the CUSIP (Alphabet class C
`02079K107` is GOOG, class A `02079K305` is GOOGL; likewise Fox, News Corp, Under Armour, Zillow
and the Liberty tracking stocks) or from the class in `title_of_class` when the ticker names it
(BRK-A / BRK-B, LEN / LEN-B, HEI / HEI-A). When a company has several listed classes and the row
doesn't say which, `ticker` is `null` and `ticker_candidates` lists the company's tickers; a
`ticker` filter matches those too. `cusip` is always the exact security.

**Which funds hold a ticker: which CUSIP?** The ticker's CUSIPs are read from the company's
recent Schedule 13D/13G filings, which can cover several share classes; CUSIPs of another class
(GOOGL when you ask for GOOG) are left out and named in the status message. Pass `cusip` for one
exact security, or when the company has no recent 13D/13G.

**A name matched the wrong fund?** Manager names (`filer`) go through EDGAR's company search;
the status message lists the other matches. Pass the CIK as `filer` to be exact. Fund names
(`fund`) are matched with the SEC's yearly series and class list: case, punctuation and words
like "fund", "index", "trust", "ETF" and share classes ("Admiral Shares", "Class K") are ignored;
an exact name wins, then names containing all your words, funds with a ticker and shorter names
first. The status message names the fund picked and up to 3 alternatives; pass the ticker or
series ID to be exact. Funds launched after the list's yearly update (June) are found by ticker
only.

**Older 13D/13G?** Only filings since 2024-12-18, when Schedule 13D/13G became structured XML.
For older ones, use our SEC EDGAR Filings Actor for the filing links.

**13D vs 13G?** A 13D is filed by a holder of more than 5% who may seek to influence the company
(activist); a 13G by passive holders and institutions. `percent_of_class` is the highest among
the filing's reporting persons; all of them are in `reporting_persons`.

**Form 144?** A notice by an insider or affiliate of a planned sale of restricted or control
stock, filed when the order is placed. It is not proof that the sale happened (Form 4 reports
that: see our SEC Insider Trading Actor). Not every Form 144 is followed by a sale.

**Legal basis?** SEC filings are US government public records; see LEGAL.md. This is data, not
investment advice.

# Actor input Schema

## `mode` (type: `string`):

holdings13f = Form 13F: pass `filer` for a fund manager's holdings (with changes vs the previous quarter), or `ticker`/`cusip` for the managers holding a stock. holdingsNport = Form N-PORT: pass `fund` (a mutual fund or ETF ticker) for its holdings (with changes vs its previous report), or `ticker`/`cusip` for the mutual funds and ETFs holding a stock. stakes13dg = Schedule 13D/13G filings about `ticker`, or new 13D filings market-wide. planned144 = Form 144 notices of planned insider sales for `ticker`, or market-wide. Default holdings13f.

## `filer` (type: `string`):

holdings13f only: the fund manager's name or SEC CIK, e.g. "Berkshire Hathaway" or "1067983". A name is matched with EDGAR's company search (the first match that files 13F reports); a CIK is exact. Empty = look up the holders of `ticker`/`cusip` instead.

## `fund` (type: `string`):

holdingsNport only: the fund's ticker (any share class), e.g. "VOO" or "ARKK"; its SEC series ID, e.g. "S000002839"; or its name, e.g. "Vanguard 500 Index Fund" (matched with the SEC's series and class list; the fund picked and up to 3 close alternatives are named in the status message). Letters, digits, spaces and . , & ' ( ) / + -, up to 100 characters. Empty = look up the funds holding `ticker`/`cusip` instead.

## `ticker` (type: `string`):

The company the shares are in, as a current US ticker, e.g. "AAPL". holdings13f/holdingsNport: the managers or funds holding it (or, with `filer`/`fund`, only that position). stakes13dg / planned144: filings about it. Empty = whole market (stakes13dg, planned144).

## `issuerCik` (type: `string`):

Instead of `ticker`: the company's SEC CIK as digits, e.g. "320193" for Apple. Use for delisted or renamed companies. Empty = use `ticker`.

## `cusip` (type: `string`):

holdings13f/holdingsNport only: the 9-character CUSIP of one share class, e.g. "037833100" (Apple common stock). Most precise way to ask which managers or funds hold a security. Empty = CUSIPs found in the company's recent Schedule 13D/13G filings (all its share classes).

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

holdings13f/holdingsNport only: the quarter of the holdings, as "2026Q2" or the quarter end "2026-06-30". Empty = the newest: the filer's or fund's latest report, or for holders of a stock the newest SEC data set (13F reports are due 45 days after quarter end; N-PORT reports are public 60 days after a fund's fiscal quarter end, so a fund's report can fall in any month of the quarter).

## `stakeForms` (type: `array`):

stakes13dg only: which forms, e.g. \["13D"] for new activist stakes only. Empty = all four for a ticker; 13D and 13D/A for the whole market (activist alerts).

## `minValueUsd` (type: `integer`):

Minimum value in US dollars, e.g. 1000000. planned144: the notice's aggregate market value; holdings13f/holdingsNport: the position value. Default 0 = no minimum. Not used by stakes13dg.

## `dateFrom` (type: `string`):

stakes13dg / planned144: earliest filing date, YYYY-MM-DD, e.g. "2026-10-01". Structured 13D/13G start 2024-12-18. Empty = `lookbackDays` before today.

## `dateTo` (type: `string`):

stakes13dg / planned144: latest filing date, YYYY-MM-DD, e.g. "2026-10-31". Empty = today, including today's filings from the EDGAR live feed.

## `lookbackDays` (type: `integer`):

stakes13dg / planned144, used when `dateFrom` is empty: filings from this many days back until today, e.g. 30. Empty = 365 days for a ticker's 13D/13G, 90 for a ticker's Form 144, 7 for the whole market.

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

Maximum rows (one charged event each), e.g. 200. Default 50: a fund's largest positions, a stock's largest holders, or the newest filings.

## Actor input object example

```json
{
  "mode": "holdings13f",
  "filer": "Berkshire Hathaway",
  "minValueUsd": 0,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (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 = {
    "mode": "holdings13f",
    "filer": "Berkshire Hathaway"
};

// Run the Actor and wait for it to finish
const run = await client.actor("bosco_labs/sec-ownership").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 = {
    "mode": "holdings13f",
    "filer": "Berkshire Hathaway",
}

# Run the Actor and wait for it to finish
run = client.actor("bosco_labs/sec-ownership").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 '{
  "mode": "holdings13f",
  "filer": "Berkshire Hathaway"
}' |
apify call bosco_labs/sec-ownership --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bosco_labs/sec-ownership"
        }
    }
}
```

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/75zLgQh6ujjDJG8t0/builds/0VYt6CVMgVH6OeJeV/openapi.json
