All Posts
TutorialETF Holdings APIS&P 500 Index ChangeDaily Holdings Data

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.

Published October 1, 202610 min readStockFit Engineering
Detect When an ETF Adds a Stock via API

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.

Announced
2026-09-04
Added
BE, P, ILMN
Industrials / Information Technology / Health Care
Removed
TAP, TTD, BLDR
Consumer Staples / Communication Services / Industrials
Official effective date
2026-09-21
prior to the open, a Monday

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.

bash
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:

json
{
  "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.

SPY's own published weight for all six tickers, before and after
Source: /api/fund/holdings/daily, symbol=SPY. The three additions go from 0% to a real weight; the three removals go to exactly 0%, on the same file date (2026-09-18).

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:

json
{
  "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?
Pull two /api/fund/holdings/daily snapshots bracketing the date you suspect the change happened, match positions by 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?
No. It diffs a fund's two most recently filed N-PORT holdings, which land quarterly. Checked for SPY and IVV on 2026-10-01, both were still comparing the 2026-03-31 to 2026-06-30 filings, under three months before the event this post is built around. For anything resolved to a specific day, diff two /api/fund/holdings/daily calls instead.
Q.How soon after an S&P 500 index change do ETFs update their published holdings?
In the one case this post verified end to end, both SPY and IVV updated their published holdings 2026-09-18, the Friday session immediately before S&P's own stated 2026-09-21 Monday effective open, the last trading session there was to do it in. That is a measurement of this specific event on these two funds, not a general guarantee for every future index change or every fund.
Q.Did SPY and IVV add the new S&P 500 stocks early, ahead of the official effective date?
No, they were on schedule. S&P's effective date is prior to the open on Monday, 2026-09-21, and the last trading session before that open is Friday, 2026-09-18, with no trading session in between. Both funds' published files show the complete swap in exactly that Friday file, not ahead of the Monday open. Holdings data shows when a fund's book changed, not why; it does not by itself explain a portfolio manager's reasoning for the timing.
Q.What is the difference between an index's effective date and an ETF's reported holdings date?
The effective date is when the index provider's own membership list officially changes, stated in advance. The holdings date is when a specific fund's own published portfolio file shows the change. They are set by different organizations for different purposes and, as verified here, do not have to be the same day.
Q.How far back does StockFit's daily ETF holdings history go?
Roughly 30 rolling days, and it is worth confirming live rather than assuming a fixed number: checked on 2026-10-01, SPY's retention floor was exactly 2026-09-01, with every date before that returning an empty result.
Q.Which StockFit plan includes daily ETF holdings data?
/api/fund/holdings/daily and /api/fund/changes both require the ETF plan ($59/mo, $39/mo billed annually) or Professional ($99/mo, $69/mo billed annually). The supported-funds list is free tier.

Ready to build?

Free API key, no credit card.