Contents Lesson 14 of 16

6 min read · professional

What would it take to rebuild the S&P 500 yourself?

You have the constituents. You have their prices. You have their share counts. Multiply, add up, and you have the index — right?

You have a very large number, and it is not the index. The missing ingredient is a single field called the divisor, and understanding it is the difference between reading index data and using it.

The two endpoints, and an honest caveat

Index composition lives in the marketplace section: /mp/unicornbay/spglobal/list returns "essential EOD details for 100+ S&P and Dow Jones indices", and /mp/unicornbay/spglobal/comp/{symbol} returns the components of one index, keyed by a symbol such as GSPC.INDX.

Both are a separate entitlement. On a key without it, both return 403 Forbidden; on a key with it, both return 200 and the field list below, checked against a live response. That distinction is worth stating rather than glossing over, because it is the same distinction you should demand of any source: which of these claims did somebody verify, and on what.

The divisor, and the identity that proves it

A list row carries ID, Code, Name, Constituents, Value, MarketCap, Divisor, DailyReturn, Dividend, AdjustedMarketCap, AdjustedDivisor, AdjustedConstituents, the three currency fields, and LastUpdate.

Take the S&P 1000 row and do the division:

4,276,250,432,997.92 ÷ 248,535,830.1502 = 17,205.77

The published Value is 17,205.7704. The identity holds to four decimal places:

Cap-weighted index level = float-adjusted market capitalisation ÷ divisor

Float-adjusted, and the word is doing work: the sum is price × shares × an investable weight factor, not price × every share in issue. Where a constituent has a controlling shareholder the two differ materially, and the identity above ties out only because the vendor's MarketCap already has the adjustment in it.

The formula also belongs to the weighting scheme rather than to indices in general. This endpoint carries Dow Jones indices as well, and the Dow is price-weighted: the sum of its constituents' prices divided by its divisor, with no market capitalisation anywhere in it. The index level is not a price and not an average; it is a scaled aggregate, and the scaling factor is a number the index provider maintains by hand.

Run the identity across the whole list, though, and it holds on a minority of rows — 32 of 110 on a live pull, to one part in a million. Before blaming the data, check the weighting scheme: a price-weighted index will never satisfy a cap-weighted identity, and the list mixes the two. For the rest, that is not a reason to distrust the formula; it is a reason to find out which of MarketCap, Value and the Adjusted triplet were refreshed at the same moment on any row you care about. Running the check at scale, rather than once, is how you learn that.

Why the divisor has to exist

Suppose a constituent is replaced. The company leaving has a market cap of 20 billion; the one arriving has 35. The aggregate jumps by 15 billion overnight for a reason that has nothing to do with anybody's shares going up.

The provider's answer is the divisor. Move it by exactly enough to leave the level unchanged across the event, and the index reports no jump at all. The same happens for share issuance, buybacks, spin-offs and every other corporate action that alters the aggregate without altering value.

Which means the divisor is a running record of every corporate action the index has ever absorbed. And it means something practical: you cannot reconstruct a historical index level from historical prices alone. You need the divisor as it stood on that day. This is the same idea as the adjustment problem in Reading the Market, one level up — there, a stock's history is rewritten by its own corporate actions; here, an index's history is held together by a number that changes every time its membership does.

The Adjusted triplet sits alongside the raw fields for exactly this reason. In the S&P 1000 example AdjustedMarketCap, AdjustedDivisor and AdjustedConstituents equal their unadjusted counterparts (4,276,250,432,997.9194, 248,535,830.1502 and 1,003), so that snapshot has nothing pending. When they differ, they differ because an event is being applied, and the difference is the story.

The same arithmetic, in another family

The CBOE list carries an index_divisor on every entry, so you can run the identity there too. From the live list on 2026-07-28, BUK100N reported index_close: 13763.7 and index_divisor: 118201885.578175.

Multiply: 13,763.7 × 118,201,885.58 ≈ 1.63 trillion. For a UK large-cap index that is a plausible aggregate market capitalisation, which is a useful confirmation that the field means what the name suggests. Running that multiplication is a thirty-second sanity check on any index whose divisor you are given.

Reading the components response

/mp/unicornbay/spglobal/comp/{symbol} returns three blocks: General, Components and HistoricalTickerComponents.

General carries Code, Type, Name, Exchange, MarketCap, the currency fields, CountryName, CountryISO and OpenFigi. Each entry in Components carries Code, Exchange, Name, Sector, Industry and Weight — where a weight of 0.0628 means 6.28%, a fraction rather than a percentage.

Two things will trip you up.

Components is a map, not an array. It is keyed by string indices — '0', '1', '2' — so a parser that expects a JSON list will fail on a valid response. The same is true of HistoricalTickerComponents.

Sum the weights. Across a complete constituent list they should total approximately 1. If you get 0.87, your list is incomplete and every weighted calculation you build on it is wrong by thirteen percent — and nothing in the response will tell you.

A related detail: the S&P 1000 example reports Constituents: 1003. An index named for a round number does not have to contain that many; multiple share classes and pending changes push the count around. Read the field, not the brand.

Try it now

  1. The S&P list is marketplace data, which this page does not render; the S&P 1000 division above is its worked row. Say what it would mean if that row's AdjustedDivisor differed from its Divisor, and which of the two a level for tomorrow would use. Then turn to a family this page can render, the CBOE list: multiply its first row's index_close by its index_divisor and judge whether the product is a plausible market capitalisation.
Live API response: mda22 cboe indices head
  1. Summed on 28 September 2026, the 503 component weights the components endpoint returned for the S&P 500 came to 1.0011, each weight published to four decimals, the smallest 0.0001 and the largest 0.0816. Work out the largest total error that rounding 503 weights to four decimals could produce, and say whether 1.0011 is complete, incomplete or merely rounded. Then say what a sum of 0.87 would have told you.
  2. Write down what the index level would do if a constituent were replaced by a much larger company and the divisor did not change. Then say, in one sentence, what the divisor is for.