Skip to main content
Every request is the same shape:
  • Assets are identified by symbol (aave, hype, kalshi, eq-coin). Discover them via GET /asset/.
  • Metrics are uppercase names (LENDING_DEPOSITS, PERP_VOLUME). Discover them per asset via GET /supported-metrics/.
  • Date range is startDate and endDate, always YYYY-MM-DD. granularity rolls the result up to WEEK, MONTH, QUARTER or YEAR.
  • Cuts split a series by dimensionType: by chain, protocol version, or market category.

Five things worth knowing

1. Use symbol as the lookup key

/asset/ returns both an artemis_id and a symbol for every asset. symbol is the lookup key for symbols= on /v2/data/ and for symbol= on /supported-metrics/.
The two differ for many assets, so take symbol from /asset/ rather than assuming:

2. Know the aggregation type

Each metric aggregates differently, and it decides what granularity gives you:
Never sum open interest. It is an end-of-day snapshot of outstanding positions, not a flow. Summing 30 days of OI produces a number with no meaning. Volume sums; OI does not.
Every metric’s type is in the aggregation_type field from /supported-metrics/. When a rolled-up figure is going into a model, it’s worth checking it once against the daily series so you know exactly what the period value represents.

3. Errors arrive in the value position, with HTTP 200

When something about your request can’t be served, you get a string where the array would be. The metric may be unavailable for that asset, or the dimensionType you asked for may not apply to it:
Three distinct messages, three distinct meanings: Type-check before iterating:

4. null is not the same as missing

The current period is normally present with a null value because it hasn’t closed:
Captured 2026-08-06, when that day had not yet closed. data[-1] is therefore null. Filter before taking a latest value. Every symbol you request comes back, even one that doesn’t exist. It just arrives carrying an error string instead of an array. So the response length always matches your request, and the thing to check is the type of each data field, not whether a symbol is missing.

5. series_columns tells you the tuple shape

Read series_columns instead of assuming position 0 is a date. With summarize=true you also get an extra <METRIC>_PCT_CHG series per metric.

Optional parameters

granularity

Rolls up according to each metric’s aggregation_type: SUM metrics are summed, LAST metrics take the period’s final value, AVERAGE metrics are averaged. Each metric is labelled on its own calendar:
  • Time series (on-chain, stablecoins, equity PRICE) label by period start. A monthly series reads 2026-04-01, 2026-05-01.
  • Equity fundamentals (TOTAL_REVENUE, NET_INCOME, EBITDA) label by fiscal-period end, matching how companies report. Coinbase’s Q3 2025 revenue is dated 2025-09-30.
  • Fundamentals always resolve to fiscal periods, so MONTH on TOTAL_REVENUE returns fiscal quarters.
When combining the two, align on the period rather than the timestamp: Coinbase’s 2025-09-30 and Hyperliquid’s 2025-07-01 are both Q3 2025.

summarize

Returns the endDate value for each metric, plus a <METRIC>_PCT_CHG series giving the change from startDate to endDate. The date range is a comparison window, not an aggregation window: you get the latest value and how far it moved. That’s what makes it ideal for leaderboards (see Sector leaderboards). For a period total, use granularity.

dimensionType

Splits one series into many. asset becomes <dimension>-<symbol>:
  • Most used: CHAIN, VERSION, CATEGORY, TOKEN, TOKEN_TYPE, SYMBOL (23 in total)
  • Per metric: the cuts array in /supported-metrics/ lists the dimensions that metric supports
  • Unsupported value: HTTP 422, listing every valid one