---
title: "On-Chain Indicator"
method: GET
path: "/gateway/v1/market/onchain-indicator"
tags: ["Market"]
---

# On-Chain Indicator

`GET /gateway/v1/market/onchain-indicator`

## Request

- Base URL: `https://api.asksurf.ai`
- URL: `https://api.asksurf.ai/gateway/v1/market/onchain-indicator`
- Auth: HTTP bearer

Returns on-chain indicator time-series for BTC or ETH.

**Available metrics:** `nupl`, `sopr`, `mvrv`, `puell-multiple`, `nvm`, `nvt`, `nvt-golden-cross`, `exchange-flows` (inflow/outflow/netflow/reserve).

**Long ranges:** each response is capped at about 100 data points. When `meta.has_more=true`, split `from`/`to` into smaller windows (about 90 days for daily data) and merge by timestamp client-side. For exchange-flow metrics, `all_exchange`, `spot_exchange`, and `derivative_exchange` are aggregate filters, not sums over the curated individual exchange list.

## Query parameters

- `symbol` 'BTC' | 'ETH', required: Token ticker symbol. Can be `BTC` or `ETH`.
- `metric` 'nupl' | 'sopr' | 'mvrv' | 'puell-multiple' | 'nvm' | 'nvt' | 'nvt-golden-cross' | 'exchange-flows/inflow' | 'exchange-flows/outflow' | 'exchange-flows/netflow' | 'exchange-flows/reserve', required: On-chain metric name. Can be `nupl`, `sopr`, `mvrv`, `puell-multiple`, `nvm`, `nvt`, `nvt-golden-cross`, or `exchange-flows/{inflow,outflow,netflow,reserve}`.
- `granularity` 'day': Aggregation granularity.
- `from` string: Start of time range. Accepts Unix seconds or date string (YYYY-MM-DD). Defaults to 90 days ago when omitted. Maximum range is 365 days. Responses are capped at about 100 data points; when meta.has_more is true, split from/to into smaller windows (about 90 days for daily data).
- `to` string: End of time range. Accepts Unix seconds or date string (YYYY-MM-DD). Defaults to today when omitted. Maximum range is 365 days. Responses are capped at about 100 data points; when meta.has_more is true, split from/to into smaller windows (about 90 days for daily data).
- `exchange` 'all_exchange' | 'spot_exchange' | 'derivative_exchange' | 'coinbase_prime' | 'binance' | 'coinbase_advanced' | 'okx' | 'kraken' | 'bybit' | 'bitstamp' | 'gemini' | 'bitget' | 'kucoin' | 'bitfinex' | 'gate_io' | 'deribit' | 'mexc' | 'htx_global' | 'bitflyer' | 'coinone' | 'bithumb' | 'upbit' | 'hashkey_exchange': Curated exchange filter for exchange-flow metrics. Use /v1/market/exchange-flow/exchanges to list labels.

## Response `200`

OK

- DataResponseMarketMetricPoint
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `data` MarketMetricPoint[], nullable, required
    - `exchange` string: Exchange filter used for exchange-flow metrics. Omitted for non-exchange-flow metrics.
    - `exchange_name` string: Human-readable exchange name for exchange-flow metrics. Omitted for non-exchange-flow metrics.
    - `metric` string: Metric name like `nupl`, `sopr`, or `exchange-flows/inflow`
    - `project_id` string: Surf project UUID this symbol resolved to, for frontend entity linking. Empty when unmapped.
    - `symbol` string: Token symbol this data point belongs to
    - `timestamp` integer, required: Unix timestamp in seconds for this data point
    - `value` number, double, required: Metric value at this timestamp
  - `meta` OffsetMeta, required
    - `cached` boolean, required: Whether this response was served from cache
    - `credits_used` integer, required: Credits deducted for this request
    - `empty_reason` string: Hint explaining why the data array is empty, when applicable
    - `has_more` boolean: Whether more items may exist beyond this response. For offset-paged endpoints, continue with a larger offset. For time-series endpoints without offset/cursor controls, true means the requested time range hit an upstream cap; narrow from/to to continue. Omitted when exhaustion cannot be proven.
    - `limit` integer, required: Maximum number of items returned in this response
    - `offset` integer, required: Number of items skipped (pagination offset)
    - `total` integer: Total number of matching items (before pagination). Omitted when total is unknown.
    - `watermark` integer: Warehouse watermark (Unix seconds) this response was computed at, on warehouse-backed endpoints (e.g. Hyperliquid /trades/aggregate) — rows up to this time come from the warehouse, newer rows from the live tail. Omitted elsewhere.

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api.md) - [All operations](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/revisions/91774fdd5302?raw)
