Get started
Integrations

Stock prices in Excel,
refreshable with one click.

Every OHLC data endpoint can return CSV. Point Power Query at it, keep your API key in a request header, and Refresh pulls the latest end-of-day bars into a normal Excel table.

CSV from any endpoint

Add format=csv and the response is the data rows with a header row, ready for Excel.

Key out of the URL

Power Query sends Authorization: Bearer as a header, so the key never appears in the workbook's URLs.

Exact values

Decimal strings arrive unrounded; nested fields become dotted columns and nulls become empty cells.

Runs on your computer

Power Query calls the API from your machine, so keys with an IP allowlist work.

Load daily bars with Power Query

  1. In Excel, choose Data → Get Data → From Other Sources → From Web, then Advanced.
  2. Enter the URL without your key: https://api.ohlc.io/v1/eod?symbols=XNAS:AAPL&from=2026-01-01&limit=500&format=csv.
  3. Under HTTP request header parameters, add Authorization with the value Bearer YOUR_API_KEY.
  4. If Excel asks how to connect, choose Anonymous: the header already carries the key.
  5. In the preview, choose Transform Data, set open, high, low, close and volume to Decimal Number and date to Date, then Close & Load.
  6. Use Refresh (or Refresh All) to fetch new bars. Each refresh is one request.

The same query in Power Query's formula language, if you prefer to paste it into the Advanced Editor:

Power Query (M)Text
let
    Source = Csv.Document(
        Web.Contents(
            "https://api.ohlc.io/v1/eod",
            [
                Query = [symbols = "XNAS:AAPL,XNYS:JNJ", from = "2026-01-01", limit = "500", format = "csv"],
                Headers = [Authorization = "Bearer YOUR_API_KEY"]
            ]
        ),
        [Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
    ),
    Promoted = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
    Typed = Table.TransformColumnTypes(
        Promoted,
        {{"date", type date}, {"open", type number}, {"high", type number},
         {"low", type number}, {"close", type number}, {"volume", Int64.Type}},
        "en-US"
    )
in
    Typed

A single value with WEBSERVICE

For one number in a cell, such as the latest close, WEBSERVICE can fetch CSV directly. It only takes a URL, so the key goes in the api_key query parameter. WEBSERVICE works in Excel for Windows (it returns no results on Mac) and fails with #VALUE! past 32,767 characters, so keep the request to a row or two. TEXTSPLIT, TAKE and XMATCH need Microsoft 365.

Latest daily close in one cellText
=LET(
  csv, WEBSERVICE("https://api.ohlc.io/v1/eod?symbols=XNAS:AAPL&order=desc&limit=1&format=csv&api_key=YOUR_API_KEY"),
  t, TEXTSPLIT(csv, ",", CHAR(13)&CHAR(10), TRUE),
  VALUE(INDEX(t, 2, XMATCH("close", TAKE(t, 1))))
)

Looking the column up by name with XMATCH keeps the formula working if columns are added. The value is the most recent end-of-day close; for a delayed intraday price use /v1/quotes and the last_price column, which is at least 15 minutes old.

Other endpoints worth loading

Power Query handles any GET data endpoint the same way: change the path and query, keep format=csv and the header. A few that suit workbooks:

  • /v1/eod?symbols=...&adjustment=total_return for return calculations that include dividends. See adjusted stock prices.
  • /v1/quotes?symbols=... for a watchlist of delayed prices, with last_price and last_at columns in UTC.
  • /v1/dividends?symbols=...&from=2021-01-01 for ex-dates, pay dates and amounts.
  • /v1/financials/metrics?symbols=... for valuation ratios, market capitalization and dividend yield, at 50 credits per symbol.

Nested objects become dotted columns such as address.city, lists arrive as JSON text in one cell, and text that starts with =, +, - or @ is prefixed with an apostrophe so Excel shows it instead of running it. Timestamps are UTC; daily bars use the exchange-local trading date.

Rows, pages and credits

  • A CSV response holds one page of up to 500 rows (limit=500). For longer history, split the range with from and to and use one query per range.
  • The next page's cursor is in the X-Next-Cursor response header, and symbols that returned no rows are listed in X-Meta-Errors.
  • Every refresh or recalculation is a request: daily bars cost 5 credits per symbol, so a 20-symbol query costs 100 credits per refresh.
  • For whole markets or years of history, use flat files on Pro and above, or exports on Commercial and Scale.

Use a separate API key for each workbook so you can revoke one without breaking the others. A key in a WEBSERVICE URL is visible to anyone who opens the file; prefer Power Query with a header for shared workbooks.

Questions, answered.

Can I get stock prices in Excel without a plugin?

Yes. Power Query's From Web connector can load the OHLC API's CSV output directly, and WEBSERVICE can fetch a single value on Excel for Windows.

Why does Excel ask for credentials?

Power Query asks how to authenticate to each new URL. Choose Anonymous; the Authorization header in the query already carries your key.

Does the Excel connection give real-time prices?

No. Daily bars are end-of-day values and quotes are delayed at least 15 minutes. Refreshing more often does not make them live.

Does it work on the Free plan?

Yes, for AAPL, NVDA, JNJ, PEP, MSFT, SPY and QQQ with five years of daily history. Developer and above cover all U.S. stocks and ETFs; Pro and above add Canada, the UK, France, the Netherlands and Australia.

How do I get more than 500 rows?

Each request returns one page of up to 500 rows. Split long histories by date range, follow the cursor in X-Next-Cursor, or use flat files for bulk history.

A little JSON.
A lot of possibility.

Explore the API