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.

Get an API key

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.

These are source attributed bars for research, screening and backtesting. They are not a consolidated exchange feed and are not suitable for best execution reporting or regulatory record keeping.

Quickstart

Create a key in the dashboard, then pull a year of daily bars for one symbol.

shell
curl -s "https://api.datacedar.com/v3/stocks/nasdaq:AAPL/bars?timeframe=1d&from=2025-09-01&order=asc" \
  -H "Authorization: Bearer $DATACEDAR_KEY"
json
{
  "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.

HeaderValue
AuthorizationBearer <key>
X-API-Key<key>, equivalent
Acceptapplication/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.

FieldTypeMeaning
dataarray or mapRows, newest first for bars (order=asc flips it). The batch endpoint returns a map keyed by sid.
ts_msstringBar open time as epoch milliseconds UTC, serialised as a string so it never loses precision.
open high low closenumberIn the exchange currency, named in meta.currency.
volumestringShares, as a string for the same reason as ts_ms.
vwapnumberVolume weighted average price for the bar where the source publishes one.
adjustmentstringraw, split, dividend or all.
paginationobjectcount, has_more, limit, next_cursor.
metaobjectrequest_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.

StatusCodeWhen
400INVALID_SYMBOLThe id is malformed. Use {exchange}:{TICKER}.
400INVALID_TIMEFRAMENot one of 1m 5m 15m 1h 1d.
400INVALID_TIMESTAMPMalformed from or to.
400INVALID_CURSORThe cursor was edited or came from another request.
401AUTH_MISSINGNo key on the request.
401AUTH_INVALIDThe key is unknown, expired or revoked.
402BATCH_TOO_LARGEMore symbols than your plan allows in one request.
403HISTORY_LIMIT_EXCEEDEDfrom is older than your plan's window for that timeframe. The body names the oldest allowed instant.
404EXCHANGE_NOT_FOUNDNo such exchange code. /v3/exchanges lists them.
404EXCHANGE_NOT_LIVEThe exchange is in the registry but has no data yet.
404SYMBOL_NOT_FOUNDNo such symbol on that exchange. Try /v3/search.
429RATE_LIMIT_BURSTOver the per second admission. Retry-After is set.
429RATE_LIMIT_SUSTAINEDOver the per minute admission. Retry-After is set.

Rate limits

PlanAdmissionSymbols per request
Explorer1 req/sec3
Quant25 req/sec · 1,000 req/min8
Research50 req/sec · 3,000 req/min16
Desk100 req/sec · 6,000 req/min32

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

PlanDaily barsMinute bars
Explorer (free)1 year7 days
QuantBack to listing30 days
ResearchBack to listing90 days
DeskBack to listingFull 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

GET/v3/exchanges

Every 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.

shell
curl -s "https://api.datacedar.com/v3/exchanges?live=true" -H "X-API-Key: $DATACEDAR_KEY"
GET/v3/exchanges/{code}

One exchange, plus a count of its symbols by asset class.

GET/v3/exchanges/{code}/symbols

The exchange's symbols, alphabetical, paged (limit up to 1,000, cursor). Filters: letter, asset_class (us_equity, equity, etf, index), q.

GET/v3/countries

Countries with their exchanges, grouped from the same registry. Filters: region, live.

Symbols & search

GET/v3/search?q=

Find a symbol by ticker or name. Exact ticker first, then ticker prefix, then name. Filters: exchange, country, limit (max 50).

shell
curl -s "https://api.datacedar.com/v3/search?q=apple&country=US" -H "X-API-Key: $DATACEDAR_KEY"
GET/v3/stocks/{sid}

The master record for one symbol: name, exchange, asset class, status, bars_url, page.

GET/v3/stocks/assets

The whole master, paged 1,000 at a time. Filters: exchange, country, asset_class, status, q.

GET/v3/stocks/{sid}/actions

Cash dividends and splits, oldest first. Filters: type (dividend, split, all), from, to as YYYY-MM-DD.

Bars

GET/v3/stocks/{sid}/bars

Bars for one symbol. timeframe, from, to, adjustment, order, limit, cursor.

GET/v3/stocks/{sid}/bars/range

What 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.

GET/v3/stocks/bars

Bars 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.

python
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")
Minute bars exist from the day capture began for an exchange (US: 2026-07-13). A minute range before that is simply empty. Intraday bars are served unadjusted.

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

python
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())
javascript
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.

shell
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, exchange and country filters, 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.

Start with any symbol.