How to Use Historical Index Data APIs for Benchmarking and Performance Analysis

By Intrinio
October 2, 2026

"The portfolio returned eight percent" is not an analysis. "The portfolio returned eight percent against a benchmark that returned six" is.

Benchmarking is what turns a performance number into a judgment, and it runs on one of the least glamorous datasets in finance: a single value per index per day. Historical index data is simple enough that teams assume it is free and easy, then discover two things late. Comparing a total return portfolio to a price index quietly inflates their numbers. And showing an index level to end users is a licensing question, not a technical one.

Both are solvable. Here is what the data is and how to use it correctly.

What Is Historical Index Data?

A market index is a rules-based basket of securities, and its level is a single calculated number representing that basket's value. Historical index data is that level recorded over time, one observation per trading day for end-of-day data.

The important conceptual point is that an index level is not a price. Nothing trades at 5,800. The level is a computed value derived from the constituent securities according to the index provider's methodology, which is why two indices covering the same market can move differently.

Intrinio's US EOD Index Levels feed covers the three most widely used US benchmarks, the S&P 500, the Dow Jones Industrial Average, and the Russell 2000, sourced from EDI and updated daily. Each record carries symbol, name, a unique identifier, and open, high, low, close and volume.

Two details matter more than they sound. The feed is available over the API, CSV, Snowflake and S3, so a warehouse team and an application team can consume the same data without one of them building a pipeline. And display licensing is included, which is the part that usually stops a benchmark chart from shipping.

Index Levels vs. Index Constituents: What Is the Difference?

These are two different datasets answering two different questions, and conflating them leads to buying the wrong one.

Index levels tell you how the index performed. One number per day, retrieved as a time series. This is what benchmarking, charting, and return comparison need.

Index constituents tell you what the index is made of. Which securities are members, and at what weight. This is retrieved through a separate constituents endpoint and answers a different class of question: replicating an index, attributing performance to sectors or names, analyzing exposure overlap, or screening within a defined universe.

Most benchmarking work needs only levels. If the question is "did we beat the market," a level series answers it completely. Constituents become necessary when you need to decompose the benchmark rather than just compare against it.

There is also a trap on the constituents side worth knowing before you go near it. Index membership changes constantly through rebalances, additions, and deletions. A current constituent list is not a historical one, and applying today's membership to a past period produces survivorship bias, because the companies that were dropped were disproportionately the ones that did badly. Any historical analysis using constituents needs point-in-time membership, not a current snapshot.

How to Use End-of-Day Index Levels for Benchmarking

Index levels are retrieved through /indices/stock_market/{identifier}/historical_data/{tag}, where the identifier is the index symbol, such as $DJI, and the tag identifies the series you want, such as level.

The call takes start_date and end_date to bound the window, sort_order for ascending or descending, and pagination through page_size and next_page. The response gives you an array of date and value pairs, plus an index object describing the series itself.

That index object is worth reading before you build anything. It carries observation_start and observation_end, which tell you the actual window of available history, along with update_frequency and last_updated. Check those rather than assuming a history depth. It is the difference between discovering a coverage boundary during development and discovering it in production when a user requests a ten-year chart.

Two alignment rules will save you most of the debugging:

Align on the close. End-of-day means one observation per trading day, struck at the market close. Your portfolio valuation has to be struck at the same close, or you are comparing two different moments and calling the difference performance.

Align on the trading calendar. Index levels exist only on trading days. If your portfolio series includes weekends, holidays, or carries forward values the index does not have, your return and volatility calculations will both be wrong. Decide how to handle non-trading days once and apply it to both series identically.

Open, high, low and volume are available, but for benchmarking you almost always want close. The others are useful for intraday range context, not for performance comparison.

Comparing Portfolio Performance Against Market Indices

Normalize before you chart. Rebase both the portfolio and the index to 100 at the start of your comparison window. Plotting a portfolio value against a raw index level on the same axis produces a chart that is technically accurate and visually useless.

The big one: price return versus total return. Headline levels for the S&P 500, the Dow, and the Russell 2000 are price indices. They track price movement and exclude dividends. If your portfolio return includes reinvested dividends and you compare it to a price index, you will show outperformance you did not earn, by roughly the dividend yield of the market each year. Compounded over a multi-year window that is a substantial overstatement.

You have two honest options: compare price return to price return by stripping dividends out of your portfolio figure, or source a total return version of the index. What you cannot do is compare a dividend-inclusive portfolio to a dividend-exclusive benchmark and present the gap as skill.

Pick a benchmark that matches the portfolio. The Russell 2000 is the small-cap reference. The S&P 500 is large-cap. The Dow deserves a specific warning: it holds only 30 names and it is price-weighted rather than market-cap weighted, meaning a high-priced stock influences it more than a larger company with a lower share price. It is the most quoted US index and one of the least appropriate benchmarks for a diversified portfolio. Use it because your users recognize it, not because it measures anything you are doing.

The standard measures all follow from a clean aligned pair of series: excess return, tracking error, beta, correlation, and up and down capture ratios.

Match the window exactly. Annualizing from a partial period, or comparing a portfolio that started mid-month against a full-month index return, introduces distortions that look like performance.

Using Historical Index Data in Dashboards and Backtests

Dashboards. An index level makes a natural reference line on nearly every performance chart. Because end-of-day data changes once per day, cache it aggressively. There is no reason to call the API repeatedly for a value that will not move until tomorrow's close.

Backtests. A backtest needs the full historical window at once, which is a bulk operation rather than a paged API loop. This is where the Snowflake, S3 and CSV delivery options earn their place: load history in bulk, then keep it current with a small daily API call.

Rolling comparisons. Trailing one-month, three-month, and year-to-date comparisons against a benchmark are among the most-used views in any reporting product, and they all come from the same cached level series.

Treat recent values as provisional. Index data can be revised after publication. Re-pull a trailing window rather than assuming a value written once is final.

Then there is the part that decides whether any of this ships. Benchmark charts are user-facing by nature, and showing third-party index values to your own users normally requires a display licence negotiated with the index provider. That requirement is what leaves benchmark comparison sitting in a backlog at a lot of fintechs. This feed includes display licensing, which removes that blocker rather than deferring it.

Access U.S. EOD Index Levels With Intrinio

Intrinio's US EOD Index Levels feed provides end-of-day levels for the S&P 500, the Dow Jones Industrial Average, and the Russell 2000, with open, high, low, close and volume, sourced from EDI, updated daily, and delivered over the API, CSV, Snowflake and S3. Display licensing is included.

This feed sits in the Other Data family and is available on the Enterprise plan, priced per feed, so you take the index coverage your product needs.

Request Enterprise Access to talk through index coverage, available history, delivery method, and how benchmark data fits alongside the pricing and fundamentals feeds you are already running.

‍

No items found.