Detect When an ETF Adds a Stock via API
See the exact day SPY and IVV showed three new S&P 500 stocks in their own holdings, in sync with the index change to the day.

An S&P 500 index change has an official effective date, stated down to the day. S&P's own press release says Bloom Energy, Everpure, and Illumina joined the index effective prior to the open of trading on Monday, 2026-09-21. Pull SPY's and IVV's own published holdings directly, and both funds already carried all three names, at a real weight, in the 2026-09-18 file: the Friday close immediately before that Monday open, the last trading session there was to do it in.
This post is a walkthrough: the exact /api/fund/holdings/daily calls that caught the change, how to diff two snapshots into a clean added-and-removed list, and what /api/fund/changes was still showing instead on the day of writing. It closes with the honest limits of day-level detection, because catching a change in a daily file is a detection, not an explanation of a portfolio manager's reasoning, and the two are easy to blur.
A real S&P 500 index change, named and dated
On 2026-09-04, S&P Dow Jones Indices announced three additions to the S&P 500: Bloom Energy Corp (BE), Everpure, Inc. (P), and Illumina, Inc. (ILMN). They replace Molson Coors Beverage Co (TAP), The Trade Desk, Inc. (TTD), and Builders FirstSource, Inc. (BLDR), effective prior to the open of trading on Monday, 2026-09-21, according to S&P's own press release. That release is the primary source for this entire post, every date below traces back to it.
That is the headline event, straight from the index provider. The rest of this post is about a second, independent question: when did a real fund tracking that index actually show the change in its own published portfolio?
Pulling two snapshots and diffing them
/api/fund/holdings/daily returns a fund's full position list as published by the issuer, current to the prior close, for any date within roughly the last 30 rolling days. Detecting an addition is a three-step diff: pick a date you suspect is on one side of the change, pick a later date you suspect is on the other, and compare the two position lists.
curl -H "Authorization: Bearer $TOKEN" \
"https://api.stockfit.io/v1/api/fund/holdings/daily?symbol=SPY&reportDate=2026-09-17&pageSize=1000"
curl -H "Authorization: Bearer $TOKEN" \
"https://api.stockfit.io/v1/api/fund/holdings/daily?symbol=SPY&reportDate=2026-09-24&pageSize=1000"Each row carries a ticker, a pctVal (portfolio weight), and, for most issuers, a cusip. Here is TAP in SPY's 2026-09-17 file, trimmed to one row:
{
"name": "MOLSON COORS BEVERAGE CO B",
"ticker": "TAP",
"cusip": "60871R209",
"balance": 1915744,
"pctVal": 0.009529
}Match every position across the two snapshots by cusip where it is present, falling back to ticker where it is not. SPY carries a cusip on every row; IVV's own daily file carries no cusip field at all, so matching it has to fall back to ticker. A position present in the later snapshot and absent from the earlier one is an addition; the reverse is a removal. That is the whole algorithm, no statistics required, which is also why it is worth being precise about what it can and cannot tell you, covered near the end of this post.
To the day: both funds' books already matched the new index
Running that diff across every trading day from 2026-09-04 through 2026-09-21 turns up a specific, verifiable answer: the exact file date each fund's own book changed. BE, P, ILMN are absent from SPY's and IVV's files through 2026-09-17 and present, at a real weight, from the very next published file, dated 2026-09-18. TAP, TTD, BLDR run the same transition in reverse, present through 2026-09-17 and gone from 2026-09-18 onward. 2026-09-18 was a Friday, the last trading session before S&P's effective Monday, 2026-09-21 open, with zero trading sessions in between. The funds were exactly on schedule, not early: their own published book matched the new index to the day, months before a quarterly N-PORT filing would ever catch it.
IVV confirms the same transition on the same day, independently. BlackRock's file carries dollar values where SPY's does not: by 2026-09-18, IVV had already committed $1.00 billion to Bloom Energy, $443 million to Everpure, and $463 million to Illumina, real positions, not a rounding artifact. Two issuers, two different matching strategies (cusip for SPY, ticker for IVV, since IVV carries no cusip), one transition date.
Both transitions were clean, single-file swaps, not a gradual build-up: every added ticker goes from completely absent to a full weight in one published file, and every removed ticker goes to exactly zero in that same file, with no partial position on 2026-09-17 or earlier. What the daily holdings data adds is precision: the exact file date this specific event shows up in, for these two specific funds. Holdings data shows when a fund's book changed. It does not, by itself, prove why; see the honest-limits section below before you lean on this distinction too hard.
Why quarterly N-PORT data would never show this
/api/fund/changes diffs a fund's two most recently filed N-PORT holdings, SEC filings that land quarterly. Called for SPY on 2026-10-01, 13 days after the 2026-09-18 swap above, here is exactly what it returns:
{
"latestDate": "2026-06-30",
"previousDate": "2026-03-31",
...
}2026-03-31 to 2026-06-30, the same result on IVV when checked the same way. Neither comparison has advanced far enough to even reach the quarter this event happened in. The earliest N-PORT filing that could possibly reflect it is the one covering the quarter ending September 30, 2026, due roughly 60 days later, which puts it on the calendar around late November, two months after the fact. A quarterly diff is the wrong tool for a question with a specific day as the answer; that is true whether the question is turnover, rebalancing, or, as here, exactly when one stock replaced another.
What this detection can and can't tell you
Four honest limits, worth stating plainly rather than letting a clean result overstate itself. First, this is daily, not intraday: the file publishes once a day, current to the prior close, so a date-level finding like this one is only precise to the resolution of a trading day, not an hour or a trade. Second, it is detection, not explanation: the data confirms exactly when SPY's and IVV's own books changed, not the portfolio manager's reasoning for timing it that way. Third, the retention window is real and rolling, confirmed live on 2026-10-01 to reach back to 2026-09-01, not further; this method only works looking backward within roughly the last month, it cannot retroactively investigate an event from further back. Fourth, the matching method matters: a fund without a stable identifier like cusip has to be matched by ticker or name, which can misfire on a pure rename or a reformatted identifier rather than a genuine addition, a trap covered in more depth in our ETF holdings cadence and turnover companion posts.
None of this is investment advice, and none of the tickers above are a signal to buy, sell, or avoid anything. They illustrate a detection method, not a trade idea.
Daily holdings requires the ETF plan ($59/mo, $39/mo billed annually) or Professional ($99/mo, $69/mo billed annually). Portfolio changes is on the same two plans, and the supported-funds list is free tier, the right place to confirm a fund is covered before you build against it. Every N-PORT filing behind both endpoints is itself filed under SEC EDGAR, searchable directly if you want to read a fund's own quarterly filing behind any number here. For the full shape of the daily file across index, active, and leveraged funds, see our daily ETF holdings API walkthrough. Full fund and ETF coverage is on the ETF and fund data page. to try the supported-funds list on the free tier first.
FAQ
Q.How do I detect when an ETF adds a new stock via API?
cusip where it is present, falling back to ticker, and diff. A ticker present in the later snapshot and absent from the earlier one is an addition; the reverse is a removal.Q.Does /api/fund/changes show when an ETF adds a stock the same day it happens?
Q.How soon after an S&P 500 index change do ETFs update their published holdings?
Q.Did SPY and IVV add the new S&P 500 stocks early, ahead of the official effective date?
Q.What is the difference between an index's effective date and an ETF's reported holdings date?
Q.How far back does StockFit's daily ETF holdings history go?
Q.Which StockFit plan includes daily ETF holdings data?
Ready to build?
Free API key, no credit card.