# SEC 13F Institutional Investor & Hedge Fund Holdings Tracker (`afkdigital/sec-13f-institutional-holdings-tracker`) Actor

Track reported quarter-end institutional holdings from official SEC EDGAR 13F-HR filings and amendments. USD values, provenance, deduplication and JSON/CSV for Clay or n8n.

- **URL**: https://apify.com/afkdigital/sec-13f-institutional-holdings-tracker.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$7.50 / 1,000 unique reported positions

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 Form 13F Institutional Investor & Hedge Fund Holdings Tracker

Extract reported quarter-end positions from official SEC EDGAR 13F-HR and 13F-HR/A filings. Designed for institutional ownership research, Clay enrichment and n8n workflows. This Actor accepts verified manager CIKs; it does not guess which manager a name refers to.

### Pricing

$0.0075 per successfully emitted unique position ($7.50 per 1,000). No start fee, no event charge for failed managers, HTTP retries or suppressed duplicates. Platform usage for standard runs is included. Apify may apply ordinary post-run dataset access/storage costs. The live Store pricing tab is authoritative. Set a run spending limit to control costs.

### Quick start

```json
{"ciks":["0001067983"],"maxResults":50,"maxRequests":120,"secUserAgent":"Your Organization research@example.com"}
```

The example resolves Berkshire Hathaway's latest reported quarter. Add `"reportPeriod":"2023-12-31"` to select a quarter explicitly. The default smoke test is designed to finish in under five minutes. SEC availability can affect runs. Up to 20 CIKs, 10,000 output positions and 500 HTTP attempts are supported. XML periods start at 2013-06-30; legacy ASCII is deliberately rejected.

### Output

Each Dataset item contains `cik`, `fund_manager_name`, `report_period`, `issuer_name`, `cusip`, `shares_held`, `position_value_usd`, `investment_discretion`, `filing_date` and `sec_filing_url`.

Additional columns preserve `title_of_class`, `share_type`, `put_call`, `other_manager`, voting authority, `figi`, accession number, amendment type, source value unit and deterministic `position_id`. `shares_held` is the source quantity; when `share_type` is `PRN` it means principal amount, not a share count. Option quantities are reported underlying quantities, not option contract counts. CIK and CUSIP are strings; preserve leading zeros when importing CSV.

Export the default Dataset as JSON or CSV. The key-value store also contains `OUTPUT` (JSON), `OUTPUT.csv` and `SUMMARY`. Output links are shown in the run's Output tab. Errors and filing validation audits appear only in `SUMMARY` and are uncharged.

For n8n, start the Actor with your input, wait for completion, then GET `/v2/datasets/{defaultDatasetId}/items?format=json&clean=true` with your Apify authorization header. Clay can import the CSV export or consume JSON through its HTTP API enrichment. Keep Apify tokens out of shared CSVs and URLs.

### Amendments and uniqueness

For each manager/quarter, discover relevant filings in current and historical SEC submission indexes and process them in filing/acceptance order. A RESTATEMENT replaces the earlier table. NEW HOLDINGS appends the disclosed additional records. Additive amendments without a base or restatement, unknown amendment semantics, missing XML, and mismatched source entry/value totals suppress that manager's entire output. Result limits apply after amendment resolution.

Exact identical position records are emitted once per manager and quarter, including repetitions across additive amendments. We retain distinct classes, options, share/principal types, discretion, included managers, voting authority and different quantities/values; these must not be merged merely because CUSIP matches. Rows are not aggregated across managers. `filing_date` and `sec_filing_url` identify the filing that supplied each retained row. Resurrected runs inspect the existing dataset before emitting positions again. Do not manually add/remove items while a run executes.

### Dollar units and verification

SEC switched from thousands of dollars to nearest-dollar values for filings submitted on or after January 3, 2023. We use the filing date (not the report quarter) to normalize older XML amounts to USD. Current specification checked: Form 13F XML v2.0, September 14, 2026. Source totals and entry counts are reconciled before deduplication. We do not silently repair a filer's incorrect unit reporting or use inferred market prices. Filers can make mistakes even when totals reconcile; check the source and amendments.

### SEC fair access

Requests identify the organization and monitored contact email through User-Agent. All SEC hosts and retries share a sequential 2-request/second limiter, maximum-attempt budget and 240-second discovery budget, with 5-second connect and configurable read timeouts, up to 3 retries, exponential backoff/jitter and bounded Retry-After. HTTP 403 stops the affected manager; no proxy rotation or access-control bypass. Do not run concurrent copies or other SEC clients that together exceed SEC's 10 requests/second total per user across machines. Download only what you need. Incomplete manager chains never produce paid rows.

### Interpretation limits

Form 13F reports selected reportable securities at a historical quarter end, generally filed with a delay of up to 45 days. It is neither a live portfolio nor a complete portfolio, exposure statement, hedge fund directory or investment recommendation. Short positions, many derivatives, non-reportable assets, confidential holdings and other omissions can limit coverage. A filing manager may report shared discretion for other managers; do not assume all positions belong to one fund or add overlapping managers blindly. Latest means latest discoverable report period, not current holdings. SEC corrections/deletions may affect later runs.

### Source references

- [SEC fair access and EDGAR data](https://www.sec.gov/search-filings/edgar-search-assistance/accessing-edgar-data)
- [Form 13F FAQ](https://www.sec.gov/rules-regulations/staff-guidance/frequently-asked-questions-about-form-13f)
- [Current SEC XML specifications](https://www.sec.gov/submit-filings/technical-specifications)
- [Apify pay-per-event](https://docs.apify.com/actors/monetize/pay-per-event)

### Development

Python 3.13, Apify SDK 4.1.0. `pip install -r requirements.txt`, then `python -m src.main` in an Apify local environment. Tests: `python -m pytest -q` (install pytest separately). Real SEC fixtures and reconciliation evidence are retained in the Netcup source project, excluded from the production image. No third-party market data service is used.

# Actor input Schema

## `ciks` (type: `array`):

1–20 verified SEC manager CIKs. Leading zeros optional. The SEC submissions API verifies each identifier; no guessed name matching.

## `reportPeriod` (type: `string`):

YYYY-MM-DD quarter end, from 2013-06-30 onward. Omit for the latest reported period per manager.

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

Run-wide cap. Amendments are resolved before truncating results.

## `maxRequests` (type: `integer`):

Includes submissions, archives, filings and retries across all managers. Incomplete chains are suppressed.

## `requestTimeoutSecs` (type: `integer`):

Connection timeout is 5 seconds. Bounded retries with exponential backoff.

## `secUserAgent` (type: `string`):

Organization/product name and a monitored contact email. Use your own identity for your SEC requests. No anonymous or browser impersonation.

## Actor input object example

```json
{
  "ciks": [
    "0001067983"
  ],
  "maxResults": 50,
  "maxRequests": 120,
  "requestTimeoutSecs": 20,
  "secUserAgent": "AFK Mesh NEWAPI36 hello@afkmesh.com"
}
```

# Actor output Schema

## `positions` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `summary` (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 = {
    "ciks": [
        "0001067983"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/sec-13f-institutional-holdings-tracker").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 = { "ciks": ["0001067983"] }

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/sec-13f-institutional-holdings-tracker").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 '{
  "ciks": [
    "0001067983"
  ]
}' |
apify call afkdigital/sec-13f-institutional-holdings-tracker --silent --output-dataset

```

## MCP server setup

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

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/LRtJMIcnCS6VYtFfq/builds/hqXZ6ehhek3XXRndT/openapi.json
