Why does an index have no financial statements?
The mistake here is common, confident and wrong. Somebody builds a fundamentals pipeline, points it at the S&P 500, expects a balance sheet, and gets almost nothing back. They conclude the data is missing. It is not missing. An index does not have financial statements, because an index is not a company.
What actually comes back
Call /fundamentals/GSPC.INDX and the entire response is one block:
General: {
Code: "GSPC", Type: "INDEX", Name: "S&P 500 Index",
Exchange: "INDX", MarketCap: 63706729098586,
CurrencyCode: "USD", CountryName: "USA", ...
}
No Highlights. No Valuation. No Financials. No Earnings. General carries eleven keys and that is the whole of what an index has in common with a company.
What sits beside General depends on your entitlement, and this is worth knowing before you conclude anything. On one key the response is General alone; on a key with index-components access the same call also returns Components and HistoricalTickerComponents — the membership list and its history, in the fundamentals payload. Both were checked. So "an index returns one block" is a statement about a subscription, not about indices.
Why that is correct behaviour, not a gap
The S&P 500 is a rule, not a legal entity. It has no revenue, because it sells nothing. It has no cash flow statement, because it has no bank account. It cannot file with a regulator, because there is nobody to file. What it does have is a level, a currency, a calculation methodology, and a membership list.
The one aggregate every key gets is MarketCap — about $63.7 trillion when this was written, and a different figure whenever you read it, being the summed capitalisation of the constituents. That is a derived roll-up, not an accounting figure, and it behaves like one: it moves every day with prices and jumps whenever membership changes.
Where membership lives
Index constituents are a separate question from index fundamentals, and the answer to it is an entitlement question rather than a schema one. The documented switch is the historical parameter — historical=1 — which turns on historical sections for the ticker types that have them.
So state the boundary honestly, because it is what a learner needs:
- You will never get
Balance_Sheet,Income_StatementorCash_Flowfrom an index ticker. There is nothing to return, on any key, ever. - Membership may or may not be there. Count the top-level keys on your own key before you design around either answer. Getting
Generalalone is not evidence that components do not exist; gettingComponentsis not a promise every key does. - If you want statement-level data for "the index", you have to fetch the constituents, call
/fundamentalsper constituent, and aggregate them yourself — which is a real piece of work, and exactly the job the bulk endpoint in Unit 4 exists for.
The general principle
This is a specific case of something worth generalising: an API path names a resource, not a schema. /fundamentals/{ticker} promises to tell you what it knows about a ticker. What it knows about a manufacturer, an ETF and an index are three genuinely different things, and a response that returned empty statement objects for an index would be lying more than an absent key does.
When a section is missing, the first question is not "is this a bug?" but "does this instrument have such a thing?" Half the time the answer is no, and the API is being honest.
Try it now
- Unfiltered, on 28 September 2026,
/fundamentals/AAPL.USreturned 13 top-level keys and/fundamentals/GSPC.INDXreturned three on the academy's key:General,ComponentsandHistoricalTickerComponents. Thirteen against three, where another key gets thirteen against one. Say which of the two index answers your pipeline has to survive, and write it down before it surprises one. The index'sGeneralblock is below.
- Take
MarketCapfrom the index table above and divide it by the market capitalisation of its largest constituent, NVIDIA on 28 September 2026, below. That ratio is a concentration measure you computed from two fields, without a screener. Both are snapshots, so read them from the same refresh.
- Write down the sentence "an index has no accounts" and put it in the docstring of whatever function calls this endpoint. The next person to read your code will need it.