Documentation
API reference
Everything for the DataCedar v3 API: authentication, symbol identity, every endpoint, the response contract, plan windows and the data model. Base URL https://api.datacedar.com/v3.
Base URL https://api.datacedar.com/v3. Every endpoint below is served from it; press / to search the contents.
Contents▾
Introduction
DataCedar serves historical price bars for listed equities, ETFs and headline indices on every exchange it covers. Daily history runs back to each listing's first day. One minute bars are captured every session from the day capture began for an exchange and are never discarded; the coarser intraday frames (5m, 15m, 1h) are rolled up from those minutes on read. Daily bars are fetched separately from the upstream and may differ in prices and volume. Intraday coverage can omit auction executions.
Everything is organised by exchange and country. One registry lists the exchanges; every symbol id names its exchange; every list endpoint filters by exchange or country. The same data is on every symbol page, on the REST API documented here, and in the MCP server for agents.
Quickstart
Create a key in the dashboard, then pull a year of daily bars for one symbol.
curl -s "https://api.datacedar.com/v3/stocks/nasdaq:AAPL/bars?timeframe=1d&from=2025-09-01&order=asc" \
-H "Authorization: Bearer $DATACEDAR_KEY"{
"data": [
{ "sid": "nasdaq:AAPL", "symbol": "AAPL", "timeframe": "1Day", "ts_ms": "1756728000000",
"open": 232.51, "high": 235.2, "low": 231.9, "close": 234.07, "volume": "41230311", "vwap": 233.8,
"trade_count": "0", "adjustment": "raw" },
...
],
"pagination": { "count": 261, "has_more": false, "limit": 500, "next_cursor": null },
"meta": { "request_id": "req_…", "timestamp": "…", "sid": "nasdaq:AAPL", "exchange": "nasdaq",
"currency": "USD", "timezone": "America/New_York", "attribution": "…" }
}Do not know the id? GET /v3/search?q=apple returns it. Want to see what is covered? GET /v3/exchanges and GET /v3/countries.
Authentication
Every request carries your key, either as Authorization: Bearer <key> or as X-API-Key: <key>. Keys are created and revoked in the dashboard; a key belongs to an account and inherits the account's plan. Keep keys server side; the browser never needs one because every symbol page is public.
| Header | Value |
|---|---|
Authorization | Bearer <key> |
X-API-Key | <key>, equivalent |
Accept | application/json |
Base URL & versioning
Base URL https://api.datacedar.com/v3. Field additions are not versioned; a breaking change to a field's meaning or type ships under a new path version with the old one kept alive for twelve months.GET /v3/health needs no key.
Symbol identity
A symbol id (sid) is {exchange}:{TICKER}: nasdaq:AAPL, nyse:IBM, nyse-arca:SPY. The exchange code is the one on the markets page and in /v3/exchanges; the ticker is the exchange's own. Matching is case insensitive on input; responses always return the canonical form. The same company on two exchanges is two ids, on purpose: they trade in different currencies on different calendars.
A bare US ticker (AAPL) is accepted too and resolved to its exchange, so nothing written against the first version of the API breaks. Every asset payload carries its sid, the bars_url to call next and the page it lives on.
Response format
Every endpoint returns the same envelope: data, pagination, meta.
| Field | Type | Meaning |
|---|---|---|
data | array or map | Rows, newest first for bars (order=asc flips it). The batch endpoint returns a map keyed by sid. |
ts_ms | string | Bar open time as epoch milliseconds UTC, serialised as a string so it never loses precision. |
open high low close | number | In the exchange currency, named in meta.currency. |
volume | string | Shares, as a string for the same reason as ts_ms. |
vwap | number | Volume weighted average price for the bar where the source publishes one. |
adjustment | string | raw, split, dividend or all. |
pagination | object | count, has_more, limit, next_cursor. |
meta | object | request_id, timestamp; on bars also sid, exchange, currency, timezone, attribution. |
Errors
Errors are { "error": { "code", "message", "details", "request_id" } }. The message says what to do next.
| Status | Code | When |
|---|---|---|
| 400 | INVALID_SYMBOL | The id is malformed. Use {exchange}:{TICKER}. |
| 400 | INVALID_TIMEFRAME | Not one of 1m 5m 15m 1h 1d. |
| 400 | INVALID_TIMESTAMP | Malformed from or to. |
| 400 | INVALID_CURSOR | The cursor was edited or came from another request. |
| 401 | AUTH_MISSING | No key on the request. |
| 401 | AUTH_INVALID | The key is unknown, expired or revoked. |
| 402 | BATCH_TOO_LARGE | More symbols than your plan allows in one request. |
| 403 | HISTORY_LIMIT_EXCEEDED | from is older than your plan's window for that timeframe. The body names the oldest allowed instant. |
| 404 | EXCHANGE_NOT_FOUND | No such exchange code. /v3/exchanges lists them. |
| 404 | EXCHANGE_NOT_LIVE | The exchange is in the registry but has no data yet. |
| 404 | SYMBOL_NOT_FOUND | No such symbol on that exchange. Try /v3/search. |
| 429 | RATE_LIMIT_BURST | Over the per second admission. Retry-After is set. |
| 429 | RATE_LIMIT_SUSTAINED | Over the per minute admission. Retry-After is set. |
Rate limits
| Plan | Admission | Symbols per request |
|---|---|---|
| Explorer | 1 req/sec | 3 |
| Quant | 25 req/sec · 1,000 req/min | 8 |
| Research | 50 req/sec · 3,000 req/min | 16 |
| Desk | 100 req/sec · 6,000 req/min | 32 |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and, when throttled, Retry-After.
Pagination & filters
Bar endpoints take timeframe (1m 5m 15m 1h 1d), from and to (YYYY-MM-DD, ISO 8601 or epoch milliseconds), adjustment (daily bars only), order (desc default, asc), limit (default 500, max 50,000 daily and 5,000 intraday) and cursor. When a response is cut, pagination.next_cursor resumes exactly after the last bar returned, with no overlap and no gap.
List endpoints (/v3/exchanges, /v3/stocks/assets, /v3/search) take exchange and country. Both accept a comma list; country takes an ISO code (US), a slug (united-states) or a name.
Plans & history windows
| Plan | Daily bars | Minute bars |
|---|---|---|
| Explorer (free) | 1 year | 7 days |
| Quant | Back to listing | 30 days |
| Research | Back to listing | 90 days |
| Desk | Back to listing | Full archive from capture start |
With no from, a request starts at the edge of your window. A from beyond it answers 403 HISTORY_LIMIT_EXCEEDED rather than a truncated series, so a study never silently loses its tail. See pricing.
Exchanges & countries
/v3/exchangesEvery exchange in the registry: code, name, country, currency, timezone, indices, languages, whether it is live and how many symbols it has. Filters: country, region, live, wave, language.
curl -s "https://api.datacedar.com/v3/exchanges?live=true" -H "X-API-Key: $DATACEDAR_KEY"/v3/exchanges/{code}One exchange, plus a count of its symbols by asset class.
/v3/exchanges/{code}/symbolsThe exchange's symbols, alphabetical, paged (limit up to 1,000, cursor). Filters: letter, asset_class (us_equity, equity, etf, index), q.
/v3/countriesCountries with their exchanges, grouped from the same registry. Filters: region, live.
Symbols & search
/v3/search?q=Find a symbol by ticker or name. Exact ticker first, then ticker prefix, then name. Filters: exchange, country, limit (max 50).
curl -s "https://api.datacedar.com/v3/search?q=apple&country=US" -H "X-API-Key: $DATACEDAR_KEY"/v3/stocks/{sid}The master record for one symbol: name, exchange, asset class, status, bars_url, page.
/v3/stocks/assetsThe whole master, paged 1,000 at a time. Filters: exchange, country, asset_class, status, q.
/v3/stocks/{sid}/actionsCash dividends and splits, oldest first. Filters: type (dividend, split, all), from, to as YYYY-MM-DD.
Bars
/v3/stocks/{sid}/barsBars for one symbol. timeframe, from, to, adjustment, order, limit, cursor.
/v3/stocks/{sid}/bars/rangeWhat is stored for one symbol: per timeframe the first bar, the last bar and the bar count, in one call. Use it before a history pull to size the request, or to state coverage.
/v3/stocks/barsBars for several symbols: symbols=comma separated ids, up to the plan's batch size, same parameters. data is a map keyed by sid. Every series is cut at the same instant and one next_cursor continues all of them together, so a page is directly comparable across symbols.
import requests
H = {"X-API-Key": KEY}
r = requests.get(
"https://api.datacedar.com/v3/stocks/bars",
params={"symbols": "nasdaq:AAPL,nasdaq:MSFT,nyse:IBM", "timeframe": "1d", "from": "2025-01-01", "adjustment": "all", "order": "asc"},
headers=H,
).json()
for sid, bars in r["data"].items():
print(sid, bars[0]["ts_ms"], "->", bars[-1]["ts_ms"], len(bars), "bars")History & coverage
Exchanges come online in launch order, published on the markets page and on /v3/exchanges, where liveflips the day an exchange's symbols have bars. When an exchange comes online, every listed symbol gets its full daily history and minute capture starts the same day. Minute bars are captured every session and never discarded.
Data model
Daily bars are stored raw and adjusted; adjustment=all applies the cumulative split and dividend factor to every bar before the action date, split and dividend apply one family each, and raw applies nothing. Intraday frames are rolled up from stored one minute bars on read; the roll up is deterministic, so two requests for the same range return identical series.
Code examples
import pandas as pd, requests
KEY = "..."
r = requests.get("https://api.datacedar.com/v3/stocks/nasdaq:AAPL/bars",
params={"timeframe": "1m", "from": "2026-09-25", "to": "2026-09-26", "order": "asc", "limit": 5000},
headers={"X-API-Key": KEY}).json()
df = pd.DataFrame(r["data"])
df.index = pd.to_datetime(df["ts_ms"].astype(int), unit="ms", utc=True).tz_convert(r["meta"]["timezone"])
print(df[["open", "high", "low", "close", "volume"]].head())const r = await fetch("https://api.datacedar.com/v3/stocks/bars?symbols=nyse:IBM,nasdaq:AAPL&timeframe=1d&from=2020-01-01&order=asc", {
headers: { "X-API-Key": process.env.DATACEDAR_KEY },
});
const { data, pagination } = await r.json();
console.log(Object.keys(data), data["nyse:IBM"].length, pagination.next_cursor);AI agents & MCP
The MCP server exposes the same data as the API, through the same handlers, so filters and plan windows behave identically: list_exchanges, list_countries, find_symbol, get_symbol, list_symbols, get_bars, get_actions, whoami. Authenticate with your key.
claude mcp add --transport http datacedar https://api.datacedar.com/mcp --header "Authorization: Bearer $DATACEDAR_KEY"A machine readable summary of the site and the API is published at /llms.txt.
Status & changelog
Newest first:
- 2026-09-28. Exchange registry:
/v3/exchanges,/v3/countries,/v3/search, exchange qualified ids,exchangeandcountryfilters, batch bars, corporate actions, plan windows enforced, MCP stocks tools. - v2. DataCedar rebuilt around one minute bars for every exchange: symbol pages, exchange hubs, MCP.
Minute history fills forward from capture start and cannot be backfilled; it matures toward your plan window over calendar time. Questions? Get in touch.
