Daily on-chain metrics for tokenized stocks with the Data API
Learn how to query daily tokenized stock leaderboards and historical metrics with the Data API, covering fields, encoding conventions, pagination, and usage estimates.
Data is derived from public on-chain records and is for informational purposes only. It does not constitute investment advice.
What is the tokenized stocks dataset
The BlockVectra Data API provides daily on-chain metrics and metadata for tokenized stocks. This dataset aggregates daily transfers, mints, burns, net supply changes, holder distributions, and decentralized exchange (DEX) trading metrics, enabling developers to track public activity for tokenized stocks.
For chains that offer this dataset, see the Supported Chains page.
- Base URL:
https://dev-api.blockvectra.network/v1/data— except forGET /chains, all Data API routes are prefixed with a chain identifier (e.g.https://dev-api.blockvectra.network/v1/data/{chain}/…) - Example chain:
robinhood_mainnet(used as an example path parameter; check Supported Chains for all chains offering this dataset) - Authentication: Provide your API key in the
x-api-key: <your_api_key>request header - Billing and coverage: Metered transparently in Compute Units (CU); only 2xx successful responses are billed. If a chain lacks stock coverage, the endpoint returns HTTP
422 no_coverage(not billed)
Daily leaderboard (GET /{chain}/stocks)
The GET /{chain}/stocks endpoint returns a daily activity leaderboard of tokenized stocks for a specified UTC date, including display metadata (symbol, name, etc.), ordered by transfer activity descending (most active tokens first).
Request parameters
{chain}(path parameter, required): Chain identifier (for example,robinhood_mainnet).day(query parameter, optional): UTC calendar date inYYYY-MM-DDformat. When omitted, defaults to the latest recorded day (if no activity is recorded, returns200withdata: []). If provided but not a validYYYY-MM-DDcalendar date, returns HTTP400(error.code = "bad_request").limit(query parameter, optional): Caps the number of records returned. Defaults to 50; values above 500 are clamped to 500; passing0or a non-integer returns HTTP400(error.code = "bad_request").
Pagination behavior
This endpoint is not paginated. The limit parameter caps the maximum number of records returned. In the enclosing StockDailyListEnvelope (data and meta), stock endpoints do not return next_cursor (the key is absent entirely, never null).
Code examples
curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/stocks?day=2026-09-29&limit=10" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"Response structure
The response envelope is StockDailyListEnvelope, containing data and meta:
data(array): A list of daily leaderboard records (StockDaily), ordered by transfer activity descending (most active tokens first). Each item includes token identifiers (token,symbol,name), transfer activity (transfers,unique_senders,unique_receivers), supply metrics (mint_raw_amount,burn_raw_amount,net_supply_change), distribution metrics (holder_count,top10_holder_share_bps), DEX trading metrics (dex_swap_count,dex_raw_volume), and refresh timestamp (refreshed_at).meta(object): Chain metadata (chain,chain_slug,chain_external_id,as_of_block,finalized_block,coverage,refreshed_at). Stock endpoints do not returnnext_cursor.
Get one tokenized stock (GET /{chain}/stocks/{token})
The GET /{chain}/stocks/{token} endpoint fetches metadata and up to 30 days of recent daily metrics for a specific tokenized stock by its token address.
Request parameters
{chain}(path parameter, required): Chain identifier (for example,robinhood_mainnet).{token}(path parameter, required): 20-byte token contract address;0xprefix is optional and either case is accepted (returned addresses are normalized to0xfollowed by 40 lowercase hex digits). An invalid address format returns HTTP400(error.code = "bad_request").- If
{token}is not a known tokenized stock, returns HTTP404(error.code = "not_found"). If{chain}is an unknown chain, returns HTTP404(error.code = "unknown_chain").
Code examples
curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/stocks/0x1111111111111111111111111111111111111111" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"Response structure
The response envelope is StockTokenEnvelope, containing data and meta:
data(object): AStockTokenobject containing token contract metadata (address,symbol,name,decimals,created_block,created_tx_hash,factory,creator,mint_address,burn_address,refreshed_at) and recent daily metrics arraydaily.daily(array): An array of recent daily metrics (StockDailyMetric), up to 30 days, ordered by date descending (newest first). Each daily item shares the same metrics schema as the leaderboard above (without the redundanttoken,symbol, andnamefields).
meta(object): Chain metadata object consistent with the leaderboard response; stock endpoints do not returnnext_cursor.
Key return fields explained
Daily metric fields (StockDaily and StockDailyMetric)
Both the leaderboard and single-token historical daily items include the following core fields:
| Field | Type | Description |
|---|---|---|
day | string (date) | UTC aggregation date formatted as YYYY-MM-DD. |
token | string (address) | Token contract address (present only in leaderboard StockDaily), 40 lowercase hex characters with 0x prefix. |
symbol | string | Token symbol (for example, "EXMPL"). |
name | string | Token display name; empty string "" when matching name metadata is unavailable. |
transfers | integer (int64) | Total number of on-chain transfers on this UTC day. |
unique_senders | integer (int64) | Number of unique sender addresses that initiated transfers on this day. |
unique_receivers | integer (int64) | Number of unique recipient addresses that received transfers on this day. |
mint_raw_amount | string (decimal) | Total raw token amount minted on this day. |
burn_raw_amount | string (decimal) | Total raw token amount burned on this day. |
net_supply_change | string (decimal) | Net supply change on this day (signed decimal string, may be negative). |
holder_count | integer (int64) | Total holder address count. |
top10_holder_share_bps | integer | Share of the top 10 holders in basis points (0–10000, 1 bps = 0.01%). |
dex_swap_count | integer (int64) | Number of DEX swaps involving this token on this day. |
dex_raw_volume | string (decimal) | Total DEX raw trading volume on this day. |
refreshed_at | string (timestamp) | ISO-8601 UTC timestamp of when this daily record was last refreshed. |
Token metadata fields (StockToken)
When querying a single token, the outer data object contains contract metadata and recent daily metrics:
| Field | Type | Description |
|---|---|---|
address | string (address) | Token contract address. |
symbol | string | Token symbol. |
name | string | Full token name. |
decimals | integer or null | Token decimals (0–255), or null if unavailable. |
created_block | integer (int64) | Block number in which the token contract was created. |
created_tx_hash | string (hash) | Contract creation transaction hash, 64 lowercase hex characters with 0x prefix. |
factory | string (address) | Factory contract address. |
creator | string (address) or null | Creator address, or null if unavailable. |
mint_address | string (address) or null | Mint address, or null if unavailable. |
burn_address | string (address) or null | Burn address, or null if unavailable. |
daily | array | Array of recent daily metrics (StockDailyMetric), up to 30 days, ordered by date descending (newest first). |
refreshed_at | string (timestamp) | ISO-8601 UTC timestamp of when token metadata was last refreshed. |
Encoding conventions
The API adheres to strict encoding rules across all endpoints to preserve numerical precision and consistency:
- Money-safety: Any value that can exceed
2^53(256-bit integers such asmint_raw_amount,burn_raw_amount,net_supply_change, anddex_raw_volume) is serialized as a decimal string, never a JSON number and never scientific or hex notation. This prevents precision loss in runtimes like JavaScript. In JavaScript/TypeScript, parse withBigInt(str)(e.g.const net = BigInt(body.data.daily[0].net_supply_change)); in Python, parse withint(str). Counters staying well below2^53(transfers,unique_senders,unique_receivers,holder_count,top10_holder_share_bps,dex_swap_count,created_block) are plain JSON numbers. - Binary and hex values: Addresses are
0xfollowed by 40 lowercase hexadecimal characters; hashes are0xfollowed by 64 lowercase hexadecimal characters. All returned hex values are strictly lowercase. - Timestamps and dates: Timestamps such as
refreshed_atuseYYYY-MM-DDTHH:MM:SSZ(ISO-8601 UTC with second precision). Daily aggregates (day) use plain calendar dates (YYYY-MM-DD).
Pagination notes
Stock endpoints do not return next_cursor (these endpoints are not paginated; other Data API endpoints that support pagination pass next_cursor back via the cursor parameter). GET /{chain}/stocks uses the limit parameter to cap the maximum number of records returned (up to 500); GET /{chain}/stocks/{token} returns up to 30 days of recent daily metrics in the daily array, ordered by date descending (newest first).
Usage estimate (refreshing 50 tokens daily)
Data API queries consume Compute Units (CU) based on platform method weights. The estimate below evaluates a scenario where 50 tokens each call GET /{chain}/stocks/{token} once daily, evaluated dynamically at build time against active method weights without hardcoded figures in prose:
- Method weight per call: Each
data.stockcall consumes 15 CU (list price $1.5 per 1M calls). - Refreshing 50 tokens daily (one
GET /{chain}/stocks/{token}call per token, 50 calls/day): Daily consumption is 750 CU; over a 30-day cycle, this totals 1,500 calls consuming 22,500 CU, which uses approximately 0.07% of the free quota (30,000,000 CU). If exceeding the free allowance or on a paid plan, total usage at list price is about $0.00225/month.
Getting started and upgrading
The free quota is ideal for development, testing, and lightweight workloads. When your traffic expands and requires higher concurrency or more compute units, make a paid top-up in the Console to upgrade to a paid account. After topping up, you are no longer constrained by the Free Plan's per-second call limit; each key remains subject to CU rate and burst limits, as described in the JSON-RPC documentation. Any unused Free Credits stay in your Credits and can still be used. For current rates and billing units, please see the Pricing page.
What the Free Plan Covers: Method Weights and Usage
Understand what the Free Plan covers based on real method weights, with task-based calculations and upgrade paths.
Daily DEX OHLC and VWAP for a token, with exact fractions
Query daily DEX OHLC prices and VWAP from the Data API, handle exact rational fractions in TypeScript and Python, and backfill historical data efficiently.