Contents
Exchange on-chain flows
On-chain exchange flows: inflow, outflow and net (in − out) per exchange and asset over a window, from every scanned transfer into or out of the exchange’s own proof-of-reserves addresses (all sizes on Ethereum, Arbitrum and Base; large transactions on Bitcoin).
/api/v1/exchange-flowsEvery keyDescription
Internal moves between two addresses of one exchange are left out. coverageFrom = first hour with data (earlier flows are unknown, not zero).
Who can call it
Available with every key and keyless (X-Blockmetric-Access: public). Keys of Free accounts get free-tier data (real-time feeds, 30 days of history, heatmap over time for every coin over the last 24 hours, liquidation levels now for every coin, the same as the free web plan); Pro and Desk keys the data of their plan; API Dev / API Pro raise the limits.
- No key
- 24 h
- Free
- 30 days
- Pro
- 365 days
- Desk
- 1095 days
- API Dev
- 365 days
- API Pro
- 1095 days
History window per plan. Limits: Authentication & limits.
Parameters
| Parameter | Description |
|---|---|
hoursinteger | Window in hours, default 24, clamped to 1–2160 and to the plan history.1–2160 · default 24 |
exchangestring | Only this exchange, e.g. Binance (optional). |
assetstring | Only this asset family, e.g. BTC, ETH, USDT, USDC (optional). |
Response fields
Every success is { data, meta }; these are the fields of data. meta is the same on every endpoint.
| Field | Description |
|---|---|
windowHoursinteger | Window in hours. |
sincestring (ISO 8601) | Start of the window (full hour). |
rows[]array of objects | The rows of this view. |
rows[].exchangestring | Exchange name (as labelled from its own proof-of-reserves addresses). |
rows[].assetstring | Asset symbol (stablecoins, ETH, BTC …). |
rows[].chains[]array of string | Chains involved. |
rows[].inUsdnumber | Inflow (USD). |
rows[].outUsdnumber | Outflow (USD). |
rows[].netUsdnumber | In − out (USD). |
rows[].inAmountnumber | Units of the asset that flowed in (priced and unpriced). |
rows[].outAmountnumber | Units of the asset that flowed out. |
rows[].inCountinteger | Transfers in. |
rows[].outCountinteger | Transfers out. |
rows[].unpricedInCountinteger | Transfers in without a fresh price (not in any USD figure). |
rows[].unpricedOutCountinteger | Transfers out without a fresh price. |
rows[].unpricedInAmountnumber | Units of the unpriced inflows. |
rows[].unpricedOutAmountnumber | Units of the unpriced outflows. |
byExchange[]array of objects | Totals per exchange over all assets (priced transfers only). |
byExchange[].exchangestring | Exchange name (as labelled from its own proof-of-reserves addresses). |
byExchange[].inUsdnumber | Inflow (USD). |
byExchange[].outUsdnumber | Outflow (USD). |
byExchange[].netUsdnumber | In − out (USD). |
coverageFromstring (ISO 8601) · nullable | First hour with data. |
updatedAtstring (ISO 8601) · nullable | Latest hour with data. |
Errors
- 400
invalid_paramInvalid parameter - 401
unauthorizedMissing or invalid API key - 403
plan_requiredPlan does not include this - 403
scope_requiredKey not scoped for this API - 403
ip_not_allowedAddress not on the IP allowlist of the key - 403
origin_not_allowedKey used from a browser origin it does not allow - 403
source_restrictedExchange data not redistributed - 403
https_requiredhttps required - 429
rate_limitedPer-minute limit reachedretry - 429
daily_limit_exceededDaily limit reachedretry - 429
stream_limitToo many open streamsretry - 500
internal_errorInternal errorretry
Code snippets in these docs are licensed under MIT-0: copy them into your own code without attribution. The SDKs, CLI and MCP server will be, once published, Apache-2.0; the name Blockmetric is not licensed (forks must be renamed). Data from the API is governed by the API terms; third-party exchange data by the exchange’s terms.