Stock token holders and transfers API on Robinhood Chain
Stock token holders, transfers and wallet balances on Robinhood Chain with one API key: /tokens/{token}/holders, /transfers, /balances. Not stock quotes.
Query stock token transfers, holders and balances on Robinhood Chain (chain ID 4663) with one API key.
GET /v1/data/robinhood_mainnet/tokens/{token}/transfers?standard=erc20 — lists a token's transfers
/tokens/{token}/holders — lists its holders
/addresses/{address}/balances — lists a wallet's balances/stocks ranks tokens by daily transfers and holder_count. Chain name and ID come from GET /v1/chains. Checked
export BLOCKVECTRA_API_KEY='replace-with-your-key'
curl -sS "https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks?limit=5" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"| Question | Endpoint | Fields to read |
|---|---|---|
| Which stock tokens were most active, and how many holders do they have? | GET /{chain}/stocks | transfers, holder_count |
| What are one token's daily metrics for the last 30 days? | GET /{chain}/stocks/{token} | daily[] |
| What transfers did one token have? | GET /{chain}/tokens/{token}/transfers?standard=erc20 | from, to, amount, block_number, tx_hash |
| Who holds one token? | GET /{chain}/tokens/{token}/holders | holder, balance |
| What does one wallet hold? | GET /{chain}/addresses/{address}/balances | token, balance, symbol, decimals |
| What did one wallet send or receive of a token? | GET /{chain}/addresses/{address}/transfers?standard=erc20&token=…&from_block=…&to_block=… | from, to, amount, block_number |
Stock tokens are ERC-20 contracts, so use standard=erc20. Amounts are decimal strings of the raw token amount; see the multiplier guide to convert them to share counts.
Data is derived from public on-chain records and is for informational purposes only. It does not constitute investment advice.
For contract deployment and event listening on Robinhood Chain, follow the RPC and WebSocket guide.
- First step: Read the latest block without an API key using the curl command below.
- Done when: The authenticated stocks query returns
dataandmeta; available records includeday,token,transfersandholder_count, whiledata: []means no activity records are available.
Mainnet parameters and datasets.
Three-step task: query stock activity on Robinhood Chain
Find the most active tokenized stocks on the latest recorded UTC day, then read their transfer counts and holder counts.
Use one API key to query mainnet stock-token activity and holders for an activity dashboard. These are on-chain activity metrics, not stock quotes.
1. Read the latest block without an API key
curl -sS "https://api.blockvectra.com/v1/robinhood_mainnet/public" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'The JSON-RPC result is the latest block number in hexadecimal. This public RPC call requires no key; the Data API query in step 3 requires one.
2. Create a key for the same chain
Log in to the console and open API Keys. Create a key and save the secret shown in the dialog. The same key works for JSON-RPC and the Data API on robinhood_mainnet.
For an AI Agent using HTTP without a browser, follow the Programmatic sign-up guide to sign up with an Ethereum wallet signature and create a key; do not ask the user to paste the key into chat.
3. Query stock activity with your key
Replace replace-with-your-key below with your saved key, then run the command on your server or in a local terminal. Omitting day selects the latest recorded day; limit=5 returns up to five stocks ordered by transfer activity descending.
export BLOCKVECTRA_API_KEY='replace-with-your-key'
curl -sS "https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks?limit=5" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"Read these fields in the response:
| Field | Meaning |
|---|---|
data[].day | UTC date of the daily metrics. |
data[].token | Stock token contract address returned by the query. |
data[].symbol | Token symbol. |
data[].transfers | Number of on-chain transfers on that day. |
data[].holder_count | Total holder address count. |
meta.as_of_block | Current indexed head, rather than the block height of the daily metrics snapshot. |
meta.refreshed_at | Snapshot update time; treat the data as stale when this is null. |
An empty data array means no activity records are available. To inspect a stock from the result, use its token value with GET /robinhood_mainnet/stocks/{token} as described below.
Transfers, holders and balances per token and wallet
Set TOKEN to a token value from the /stocks response and WALLET to the address you track, then run:
TOKEN='0x1111111111111111111111111111111111111111'
WALLET='0x2222222222222222222222222222222222222222'
# Transfers of one token, newest first
curl -sS "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/$TOKEN/transfers?standard=erc20&limit=20" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"
# Holders of one token, largest balance first
curl -sS "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/$TOKEN/holders?limit=20" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"
# Non-zero ERC-20 balances of one wallet
curl -sS "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/$WALLET/balances" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"limitdefaults to 50 and is clamped to 500; passnext_cursorback unchanged ascursorto read the next page.- Token transfers accept optional
from_blockandto_block. Wallet transfers require both, and a window wider than 100,000 blocks returns409 window_too_largeunlessclamp=true. - Holders and balances come from a snapshot refreshed every 6 hours, so rows can be about 6.5 hours old. Read the snapshot time from
meta.refreshed_at;nullmeans treat the data as stale. - An address without balances returns
200withdata: [].
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://api.blockvectra.com/v1/data— except forGET /chains, all Data API routes are prefixed with a chain identifier (e.g.https://api.blockvectra.com/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: $BLOCKVECTRA_API_KEYrequest header - Billing and coverage: Metered 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
Complete starter template on Robinhood Chain: blockvectra/robinhood-stock-tokens
curl -s "https://api.blockvectra.com/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,safe_block,finalized_block,coverage,refreshed_at).meta.refreshed_atmay benull:nullmeans the update time of this data is unknown and it should be treated as stale; block-based endpoints always return a value.
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").- An unknown or not-public
{chain}returns HTTP404(error.code = "not_found",error.data.reason = "unknown_chain") before token validation. On a served chain, an unknown tokenized stock still returns HTTP404(error.code = "not_found").
Code examples
curl -s "https://api.blockvectra.com/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.
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).
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 against active method weights:
- Method weight per call: Each
data.stockcall consumes 15 CU (list price $1.50 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.1% 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.01/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, top up on-chain on the console Billing page; once confirmed on-chain and credited, the account-wide calls-per-second cap is removed. 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.
Frequently asked questions
Does the API return stock prices or quotes? No. The stocks endpoints return on-chain activity: transfers, mints, burns, holder counts and DEX swap counts and volume. They are not stock quotes.
Do I need an API key? Yes. The Data API requires one. The keyless public endpoint serves JSON-RPC reads only.
Are holders and balances live?
No. They come from a snapshot refreshed every 6 hours, and the /stocks leaderboard from a daily table refreshed once a day, so the latest day can be missing or partial. Check meta.refreshed_at.
Is the /stocks leaderboard paginated?
No. limit caps the page at 500 and no next_cursor is returned. Transfers, holders and balances are cursor-paginated.
Is the balance a share count?
No. balance and amount are raw token amounts. Apply the multiplier from the multiplier guide to get underlying shares.
What happens on a chain without stock coverage?
The stocks endpoints return HTTP 422 no_coverage, which is not billed.
Next steps
- Browse the datasets directory to see every dataset BlockVectra indexes.
- See the free plan and pricing to check what your account includes.
- Log in to the console to create an API key.
Last updated:
Stock token multiplier
Understand the Robinhood Chain stock token multiplier, convert balances to shares, read uiMultiplier via eth_call, and track holders and daily activity via the Data API.
Free plan
Free RPC credits: 30,000,000 CU per 30-day window, about 2,000,000 eth_call requests, 25 calls per second per account, no credit card.