---
title: "Get last-known prices for equity/forex/commodity symbols"
method: GET
path: "/markets/equity/snapshot"
tags: ["Markets"]
---

# Get last-known prices for equity/forex/commodity symbols

`GET /markets/equity/snapshot`

## Request

- Base URL: `https://data.kairos.trade`
- URL: `https://data.kairos.trade/markets/equity/snapshot`
- Auth: HTTP bearer

Returns last-known prices for a fixed allow-list of stock, ETF, forex, and commodity symbols (e.g. AAPL, SPY, EURUSD, XAUUSD), mapped internally to their upstream tickers. A request is served straight from cache only if every requested symbol is already cached. Otherwise, missing symbols are fetched and merged into the existing cache, and only the newly-fetched subset is returned with `cached: false` — symbols already warm in the cache are NOT re-included in that response body (the endpoint returns either the full cached hit set with `cached: true`, or just the freshly-fetched symbols with `cached: false`, never a merge of both in one response). Returns prices even when markets are closed (uses the last regular-session print) so the UI is never blank outside trading hours. **Auth differs from every other endpoint in this router**: this accepts a first-party session JWT (`Authorization: Bearer ...`) or an internal admin credential — it does **not** accept the `X-Client-Id`/`X-Api-Key`/ `X-Api-Secret` API-key headers that the rest of `/markets/*` accepts.

## Query parameters

- `symbols` string, required

## Response `200`

Last-known prices for the requested symbols.

- MarketsEquitySnapshotResponse
  - `prices` object, required: Keyed by the requested (upper-cased) symbol. Either the full cache hit set or just the freshly-fetched subset — see `cached`.
  - `cached` boolean, required: True only if every requested symbol was already cached and `prices` is that full cached set. False means `prices` contains only symbols that had to be freshly fetched for this request.

## Other responses

- `400`: No symbols given, or a symbol outside the supported allow-list.
- `401`: No valid credential presented — missing/invalid API-key headers, or an invalid/expired session token.
- `403`: Authenticated but not permitted. Three distinct causes: the session user is not invited (`Invite required`), the API key lacks the operation's scope, or API-key access to the requested venue is switched off (`API access is disabled for <provider>`). Admin and API-key callers bypass the invite check; session and admin callers bypass scope and venue checks.
- `422`: Request failed FastAPI parameter validation.
- `429`: Rate limit exceeded for this route's sliding window, keyed on the session `sub` when authenticated and on the trusted client IP otherwise. Honor `Retry-After`. A per-API-key data ceiling (set per credential) rejects with `{"detail": "API key data rate limit exceeded"}` instead of the `error` envelope below.

---

[API](https://skmtc.dev/kairos/apis/kairos-data-api.md) - [All operations](https://skmtc.dev/kairos/apis/kairos-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kairos/apis/kairos-data-api/revisions/cf6b76079e38?raw)
