SEC Form N-PORT Mutual Fund Holdings Scraper avatar

SEC Form N-PORT Mutual Fund Holdings Scraper

Pricing

Pay per event

Go to Apify Store
SEC Form N-PORT Mutual Fund Holdings Scraper

SEC Form N-PORT Mutual Fund Holdings Scraper

Extract SEC EDGAR N-PORT/NPORT-P mutual fund holdings by CIK or ticker with identifiers, balances, USD values, and filing URLs.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Extract structured mutual fund portfolio holdings from public SEC EDGAR N-PORT and NPORT-P filings. Provide fund tickers or CIKs and get a flat dataset of securities, identifiers, balances, values, classifications, and source filing metadata.

What does this actor do?

This actor turns SEC N-PORT filings into analysis-ready holding rows. It resolves fund tickers through SEC ticker maps, reads each registrant's submissions JSON, filters NPORT filings, downloads the raw SEC submission document, and parses each invstOrSec holding.

Who is it for?

  • ๐Ÿงพ Compliance teams monitoring mutual fund portfolio disclosures.
  • ๐Ÿ“ˆ Fund analysts comparing disclosed holdings across report periods.
  • ๐Ÿฆ Fintech data teams enriching security master or portfolio databases.
  • ๐Ÿ”Ž Researchers who need repeatable EDGAR extraction without hand-opening filings.
  • ๐Ÿค– Automation builders feeding BI, alerts, or data warehouses.

Why use it?

SEC N-PORT filings are public, but the raw XML is nested and inconsistent enough to slow down analysts. This actor provides a polite API-first workflow and returns a normalized table suitable for CSV, JSON, API, or scheduled exports.

Data you can extract

Field groupExamples
FilingCIK, form type, accession number, filing date, report date, raw filing URL
Fundregistrant name, series name, series ID, class ID, ticker
Securityname, title, LEI, CUSIP, ISIN
Positionbalance, units, currency, exchange rate, value USD, percent value
Classificationpayoff profile, asset category, issuer category, issuer country, restricted flag

How much does it cost to scrape SEC Form N-PORT mutual fund holdings?

The actor uses pay-per-event pricing: a small start event and a per-holding result event. SEC data is public and HTTP-based, so runs are designed to be low-cost. Use maxHoldings and maxFilingsPerCik to control run size.

Input options

  • tickers โ€” mutual fund/share-class tickers such as LACAX.
  • ciks โ€” SEC registrant CIKs with or without leading zeros.
  • startDate / endDate โ€” filing date range filters.
  • formTypes โ€” defaults to NPORT-P and NPORT-EX.
  • maxFilingsPerCik โ€” recent matching filings per registrant.
  • maxHoldings โ€” maximum dataset rows for cost control.
  • requestDelayMs โ€” polite delay between SEC requests.
  • userAgent โ€” SEC-compliant descriptive User-Agent.

Example input

{
"tickers": ["LACAX"],
"ciks": ["0000002110"],
"startDate": "2025-01-01",
"formTypes": ["NPORT-P"],
"maxFilingsPerCik": 2,
"maxHoldings": 100,
"requestDelayMs": 350
}

Example output

{
"cik": "0000002110",
"ticker": "LACAX",
"formType": "NPORT-P",
"accessionNumber": "0001410368-26-055109",
"filingDate": "2026-05-28",
"registrantName": "COLUMBIA ACORN TRUST",
"seriesName": "Columbia Acorn International Select",
"securityName": "adidas AG",
"cusip": "000000000",
"isin": "DE000A1EWWW0",
"balance": 15472,
"units": "NS",
"currency": "EUR",
"valueUsd": 2504247.42,
"percentValue": 1.35812107416,
"assetCategory": "EC",
"issuerCountry": "DE",
"rawFilingUrl": "https://www.sec.gov/Archives/..."
}

How to run it

  1. Open the actor input page.
  2. Enter one or more fund tickers or CIKs.
  3. Set a filing date range if needed.
  4. Choose the maximum filings and holdings.
  5. Run the actor.
  6. Export the dataset as CSV, JSON, Excel, or via API.

SEC fair access

The actor sends a descriptive User-Agent and includes a configurable request delay. Keep concurrency low and avoid unnecessary repeat runs against the same filings. For scheduled monitoring, prefer daily or weekly cadence unless your workflow requires more frequent updates.

Ticker resolution

Mutual fund tickers are resolved through company_tickers_mf.json. If a ticker is not found there, the actor also checks the standard SEC company ticker map. You can always bypass ticker resolution by providing a CIK directly.

Filing selection

The actor reads data.sec.gov/submissions/CIK##########.json, then filters recent filings by form type and filing date. It downloads the raw .txt submission for each selected accession because that file contains the original N-PORT XML data.

Output quality notes

N-PORT filings can vary by registrant and period. Some securities may not have every identifier, and some derivatives or non-standard positions may omit fields such as ISIN or CUSIP. Missing upstream values are left blank rather than guessed.

Tips for best results

  • Start with one ticker and maxHoldings around 100 to confirm the target fund.
  • Use CIKs for production workflows when you already know the registrant.
  • Increase maxFilingsPerCik for historical comparisons.
  • Keep requestDelayMs at 350 ms or higher for polite EDGAR access.
  • Export CSV when analysts need quick spreadsheet review.

Integrations

  • ๐Ÿ“Š Send results to Google Sheets or a BI warehouse.
  • ๐Ÿง  Feed holdings into portfolio analytics or risk classification systems.
  • ๐Ÿ”” Schedule recurring runs and alert when a fund discloses new holdings.
  • ๐Ÿงพ Archive source filing URLs for compliance evidence.

API usage: Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/sec-form-nport-mutual-fund-holdings-scraper').call({
tickers: ['LACAX'],
maxFilingsPerCik: 2,
maxHoldings: 100
});
console.log(run.defaultDatasetId);

API usage: Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/sec-form-nport-mutual-fund-holdings-scraper').call(run_input={
'tickers': ['LACAX'],
'maxFilingsPerCik': 2,
'maxHoldings': 100,
})
print(run['defaultDatasetId'])

API usage: cURL

curl -X POST "https://api.apify.com/v2/acts/automation-lab~sec-form-nport-mutual-fund-holdings-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"tickers":["LACAX"],"maxFilingsPerCik":2,"maxHoldings":100}'

MCP usage

Use the Apify MCP server with Claude Code or Claude Desktop.

Claude Code setup:

$claude mcp add apify https://mcp.apify.com/?tools=automation-lab/sec-form-nport-mutual-fund-holdings-scraper

Claude Desktop JSON config:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=automation-lab/sec-form-nport-mutual-fund-holdings-scraper"
}
}
}

Direct MCP URL:

https://mcp.apify.com/?tools=automation-lab/sec-form-nport-mutual-fund-holdings-scraper

Example prompts:

  • "Run the SEC N-PORT holdings scraper for LACAX and summarize the top holdings by value."
  • "Compare the latest two NPORT-P filings for CIK 0000002110."
  • "Export mutual fund holdings with CUSIP and ISIN fields for compliance review."

Scheduling and monitoring

Create an Apify task with your preferred tickers, date window, and row limit. Schedule it monthly or quarterly to track new disclosures. The raw filing URL in every row makes it easy to audit where a value came from.

FAQ

Can I scrape all holdings for a fund?

Yes. Increase maxHoldings high enough for the target filing. Large diversified funds may contain hundreds or thousands of rows.

Common troubleshooting

Why did my ticker return no filings?

Some tickers map to a class or series whose registrant may not have recent NPORT filings in the selected date range. Try providing the registrant CIK directly or widening the date window.

Why are some identifiers blank?

The actor only returns identifiers present in the SEC filing. Some holdings omit ISIN, LEI, CUSIP, currency, or fair-value fields.

Why should I provide a User-Agent?

SEC fair-access guidance asks automated clients to identify themselves. The actor includes a default User-Agent, but organizations may prefer to include their own contact string.

Legality

This actor reads public SEC EDGAR data. You are responsible for using the data in compliance with SEC terms, Apify terms, and any rules that apply to your organization or jurisdiction.

Changelog

  • 0.1 โ€” Initial SEC EDGAR N-PORT holdings extraction by ticker/CIK.

Support

If a run fails or a filing parses unexpectedly, share the run ID, input, and target CIK/ticker so the issue can be reproduced.

Output field reference

  • cik
  • ticker
  • formType
  • accessionNumber
  • filingDate
  • reportDate
  • registrantName
  • seriesName
  • seriesId
  • classId
  • securityName
  • securityTitle
  • lei
  • cusip
  • isin
  • balance
  • units
  • currency
  • exchangeRate
  • valueUsd
  • percentValue
  • payoffProfile
  • assetCategory
  • issuerCategory
  • issuerCountry
  • isRestrictedSecurity
  • fairValueLevel
  • rawFilingUrl
  • scrapedAt