---
title: "Returns daily end-of-day closing-price history for one US-listed ticker (stocks, ETFs, mutual funds — including delisted tickers, so historical analysis is survivorship-bias-free)"
method: GET
path: "/v1/daily-prices"
---

# Returns daily end-of-day closing-price history for one US-listed ticker (stocks, ETFs, mutual funds — including delisted tickers, so historical analysis is survivorship-bias-free)

`GET /v1/daily-prices`

## Request

- Base URL: `https://api.keyvex.com`
- URL: `https://api.keyvex.com/v1/daily-prices`
- Auth: API key in header `x-api-key`

Returns daily end-of-day closing-price history for one US-listed ticker (stocks, ETFs, mutual funds — including delisted tickers, so historical analysis is survivorship-bias-free). Coverage extends back as far as 1962 for the oldest names, subject to plan history limits. PAID PLANS ONLY.  Each row: date, close (as-traded), adj_close (split+dividend adjusted — use THIS for charts and return calculations), div_cash (dividend with that ex-date), split_factor (e.g. 4 = 4:1 split that session).  include_ohlc=true adds the session's open / high / low / volume and their adjusted variants — the day's RANGE, which is what a stop or a target is actually tested against. On weekly/monthly these are aggregated over the period (first open, highest high, lowest low, summed volume), not the last session's values. Omit the flag and the response is unchanged.  At most 5,000 rows per call (5,000 daily rows is about 20 years). When the window holds more, the response says truncated=true. Without since, you get the NEWEST 5,000 and prev_until: call again with until=prev_until for the page before. With since, you get the 5,000 from since onward and next_since: call again with since=next_since for the page after. Rows are never dropped silently. For multi-year ranges prefer frequency='weekly' or 'monthly' (last bar per period; dividends summed, split factors compounded), which never page: 10 years daily ≈ 2,500 rows vs ~120 monthly.  One call = one ticker. Compare securities with multiple calls. Close Prices from Tiingo.com.

## Query parameters

- `ticker` string, required
- `since` string
- `until` string
- `frequency` 'daily' | 'weekly' | 'monthly'
- `include_ohlc` boolean

## Response `200`

JSON envelope: { results: [...], count, has_more }.

## Other responses

- `400`: Invalid parameter.
- `401`: Missing or invalid API key.
- `402`: This tool requires a higher plan (upgrade_required). Retrying will not help.
- `429`: Tier rate/quota limit reached (rate_limited). Retry-After points at the reset.

---

[API](https://skmtc.dev/keyvex/apis/keyvex-api.md) · [All operations](https://skmtc.dev/keyvex/apis/keyvex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/keyvex/apis/keyvex-api/revisions/01c0210c19cd?raw)
