SEC N-PORT Holdings Diff - Fund Position Changes
Pricing
from $4.00 / 1,000 holding change detecteds
SEC N-PORT Holdings Diff - Fund Position Changes
Period-over-period holdings changes for any SEC-registered mutual fund, ETF or closed-end fund, straight from Form N-PORT on EDGAR: new positions, exits, buys and sells with balance, USD value and portfolio weight before and after.
Pricing
from $4.00 / 1,000 holding change detecteds
Rating
0.0
(0)
Developer
Daniel Matthee
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
SEC N-PORT Fund Holdings Diff — what mutual funds and ETFs bought and sold
Period-over-period holdings changes for any SEC-registered fund — mutual funds, ETFs and closed-end funds — built by diffing a fund's two most recent Form N-PORT filings on EDGAR. One row per portfolio action: new position, exited, increased, decreased, with balance, USD value and percent-of-net-assets on both sides.
Unlike a 13F feed, this covers the whole portfolio: corporate and government
bonds, mortgage- and asset-backed securities, bank loans, derivatives, repos,
foreign holdings and short positions. Public domain data, no API key, no
scraping of a paywalled site — the actor reads SEC EDGAR directly and identifies
itself with the userAgent you set, per SEC's fair-access policy.
Read this first: cadence
N-PORT holdings are public four times a year, roughly 55–60 days late. Funds file quarterly and only the quarter-end month's holdings are public. Measured on real filings: holdings as of 30 Jun 2026 were filed 28 Aug 2026 (59 days); a fund with a February fiscal year reported 31 May 2026 holdings on 24 Jul 2026 (54 days). Filings arrive in four clusters a year, and funds do not share a calendar — a fund's periods depend on its own fiscal year.
So this is ownership research, not a trading signal. A new-position row
may describe a purchase two to five months old. What it is good for: knowing who
owns what, tracking manager behaviour and drift, and finding every fund that
bought or sold a specific bond or stock last quarter.
Run it on a weekly Apify Schedule. Most weeks a watched fund has no new filing, the run costs one small JSON fetch per registrant and emits nothing — that is a successful run, and it is what keeps the bill at cents.
Example output
One real record (SPDR S&P 500 ETF Trust, 2026-06-30 vs 2026-03-31):
{"registrantCik": "0000884394","registrantName": "State Street(R) SPDR(R) S&P 500(R) ETF Trust","seriesId": null,"fundName": "State Street(R) SPDR(R) S&P 500(R) ETF Trust","fundTickers": [],"accessionNumber": "0001410368-26-089410","reportPeriod": "2026-06-30","previousAccessionNumber": "0001410368-26-055357","previousPeriod": "2026-03-31","changeType": "new-position","holdingName": "Marvell Technology Inc","holdingTitle": "Marvell Technology Inc","cusip": "573874104","isin": "US5738741041","otherId": null,"otherIdType": null,"lei": "549300LTSA1J5FJ7NF61","units": "NS","payoffProfile": "Long","balanceBefore": null,"balanceAfter": 10607672.0,"balanceChange": 10607672.0,"balanceChangePct": null,"valUSDBefore": null,"valUSDAfter": 3159919412.08,"valUSDChange": 3159919412.08,"pctValBefore": null,"pctValAfter": 0.404501334428,"assetCat": "EC","issuerCat": "CORP","invCountry": "US","filedAt": "2026-08-28","filingUrl": "https://www.sec.gov/Archives/edgar/data/884394/000141036826089410/0001410368-26-089410-index.htm","detectedAt": "2026-09-01T07:52:11Z"}
Both source filings are named on every row, so any number can be checked against EDGAR in one click.
Input options
| Input | Type | Default | What it does |
|---|---|---|---|
tickers | array | – | Share-class tickers: VFIAX, VOO, BND, AGG, FXAIX. Resolved to a fund series through SEC's own public fund-ticker file. Works for ETFs too. |
seriesIds | array | – | SEC series ids (S000016548). N-PORT is filed per series, so this is the precise way to watch one fund inside a big trust. |
ciks | array | – | Registrant (trust) CIKs, e.g. 0000884394 for the SPDR S&P 500 ETF Trust. Watches every series the trust files for. |
changeTypes | array | all four | new-position, exited, increased, decreased. |
minChangePct | integer | 5 | Minimum relative balance move for increased/decreased. See below — the default matters. |
minValUSD | integer | 0 | Floor on the larger absolute before/after USD value. Cuts the long tail. |
assetCategories | array | all | N-PORT assetCat allow-list. EC alone gives a clean equity-ownership feed. |
maxItems | integer | 1000 | Cap per run. Split fairly between the funds you watch; the overflow carries to the next run with no duplicates. |
emitInitialSnapshot | boolean | false | Only for a fund with exactly one public N-PORT and nothing to diff against. |
userAgent | string | placeholder | SEC requires a contact string. Set your own. |
At least one of tickers / seriesIds / ciks is required — there is no
whole-market default, because thousands of series file and each diff reads two
multi-megabyte documents.
Why minChangePct defaults to 5
A raw balance diff is mostly noise, for two reasons we measured on real filings:
- Index funds re-scale everything, every quarter. Creations and redemptions move the share count of every line. The S&P 500 ETF Trust had 494 of 504 positions changed and zero flat between two real quarters — and 461 of those moves were under 5%.
- Bond principal amounts amortise. Mortgage pools pay down monthly. Of one large bond fund's 5,210 sub-5% moves, 4,658 were mortgage-backed.
Neither is a portfolio decision. At the default, that ETF's quarter becomes
52 meaningful rows instead of 513. Set minChangePct: 0 if you want the raw
diff — it is your call, and it is priced per row.
new-position and exited are never thresholded.
Three ways buyers use it
- "Which funds bought this bond?" — Watch a panel of credit funds by
ticker, filter
assetCategoriestoDBT/ABS-MBS/LON, and you get a quarterly feed of fixed-income ownership changes that no 13F product can produce, because 13F does not report debt at all. - "Did my manager drift?" — Watch the mutual funds you or your clients hold. New positions, exits and material trims land as structured rows with portfolio weights, so style drift and concentration changes show up without reading a shareholder report.
- "What changed in the index?" — Watch an index ETF's series. Index adds and
deletes surface as
new-position/exitedrows against the fund's own filing (Marvell in, Honeywell out, in the real quarter above).
Search terms buyers use: SEC N-PORT scraper, mutual fund holdings API, ETF holdings change, fund portfolio diff, NPORT-P parser, who owns this bond, fund ownership data, mutual fund position changes.
Sister actor: sec-13f-diff does the same thing for institutional
managers' quarterly 13F filings — long US equities only, but it covers hedge
funds and family offices that file no N-PORT. The two together are the full
public picture of US ownership.
How the diff works
- Change types are decided on
balance— the share count, principal amount or contract count the fund reported. A value move at a flat balance is a price move, not a portfolio action, and is never emitted. - Positions are aggregated per
(identifier, units, payoffProfile)before diffing, because a filer can report one position over several rows. A security's long and short legs stay separate, and shares (NS) are never mixed with principal amounts (PA) or contracts (NC). - Identity is ISIN, then CUSIP, then issuer name + security title. Filers
write
000000000incusipwhen there is none, and theirotheridentifiers are internal trade ids that change every quarter — neither is ever used as identity. - State is the last-diffed accession number per fund series. A run skips any
series whose newest filing was already diffed, without fetching a single
document.
maxItemsoverflow is lossless: over-cap changes carry to the next run with zero duplicate rows. - Warehouse dedupe key:
accessionNumber+isin/cusip+units+payoffProfile+changeType.
Honest limitations
- Quarterly and ~60 days late. Stated above; it is the nature of the filing, not of this actor.
- Derivatives, FX forwards and repos churn. Filers identify them by
per-trade internal ids and roll them constantly, so they have no stable
identity across periods. Use
assetCategoriesto exclude them (ECfor equities only, or list the debt categories you want). - Corporate actions look like an exit plus a new position. When a CUSIP changes — a spin-off, a redomicile, a share-class reorganisation — the feed reports it honestly as what the filing says, not as a continuation.
- Numbers are the filer's own, never recomputed.
pctValis a percent of net assets as filed and can sum well past 100 for a levered fund. NPORT-P/Aamendments are ignored by default.- Funds without a series (unit investment trusts such as SPY) are absent from SEC's fund-ticker file and must be watched by registrant CIK.
- A big fund family is expensive to watch whole. One real trust filed 94 separate N-PORT reports for a single quarter. Name the funds you want.
Pricing (pay per event)
| Event | Price (USD) | Charged |
|---|---|---|
| Actor start | $0.005 | Flat, per run |
| Holding change detected | $0.004 / $0.003 / $0.002 | Per emitted row, volume-tiered: first 500 in a run, then 501–2000, then beyond |
| Fund series checked | $0.002 | Per watched series whose newest filing was checked, emitted or not |
A 10-series weekly schedule costs about $0.025 on a quiet run — roughly $1.30 a year — plus the four real diffs per series. The tiering keeps a 10,000-holding bond fund's quarter affordable.
Maintenance
Schema checked against live EDGAR filings; a missing field logs a named warning and skips one row rather than failing the run. Issues and field requests via the Apify actor's issues tab.
Changelog
- 0.1 — first release. NPORT-P diff per fund series; ticker/series/CIK
targeting via SEC's own public files; relative-move floor; fair per-series
maxItemssplit with lossless carry-over.