Data API

REST endpoints over indexed blockchain data across supported chains.

Overview

The Data API provides REST endpoints for querying indexed blockchain data — blocks, transactions, addresses, tokens, NFTs, DEX activity, tokenized stocks, and dataset freshness.

  • Base URL: https://dev-api.blockvectra.network/v1/data — every route except /chains is prefixed with a chain identifier (e.g. https://dev-api.blockvectra.network/v1/data/{chain}/…)
  • Protocol: HTTP GET (plus POST for batch token lookups at /{chain}/tokens:batch), JSON responses
  • Authentication: API key required — pass your key in the x-api-key request header. Requests are metered and billed in Compute Units (CU); only 2xx successful responses are billed
  • Ethereum (Beta): roughly the last 30 days of data and a smaller set of datasets — see Supported Chains → Ethereum

Data API CU weights are listed on the Pricing page and returned by GET /v1/plans. See Quickstart → Call the Data API for example requests and response shapes.

Chains

The Data API serves indexed data scoped to each chain: https://dev-api.blockvectra.network/v1/data/{chain}/….

Available datasets and features vary by chain; see Supported Chains for the full capability matrix. GET https://dev-api.blockvectra.network/v1/data/chains reports each chain's features, coverage, finality and limits. Requests outside a dataset's coverage return HTTP 422 no_coverage (not billed); an unknown or not-public chain returns HTTP 404 with error.code not_found (decided before the key check, not billed, and not rate-limited; chain names must be exact lowercase slugs).

Errors

Every error response is {"error":{"code","message"}}; only 409 not_indexed_yet may add indexed_through (the highest indexed block on that chain), and it is absent when the chain has no indexed data yet. Codes customers hit most often:

Statuserror.codeMeaningAction
402insufficient_balancePaid balance or free grant exhausted (not billed)Top up in the console or wait for free grant refill
404not_foundUnknown or not-public {chain}, or the object does not existFix the request
409not_indexed_yetThe block number is above the indexed head (indexed_through says how far the chain has indexed), or the chain has no indexed data at all yet (no indexed_through)With indexed_through, poll until your block is at or below it; without it, wait for the chain to start indexing
409finality_exceededBlock is indexed but above finalized_block (not yet reorg-safe)Wait for finality, or read an older block
422no_coveragePermanent gap: the chain lacks that capability, or the block is before indexed/trace coverageChange the request; retrying will not help
429rate_limitedKey CU rate limit (response includes Retry-After) or account call rate limit (no Retry-After); not billedRetry after Retry-After seconds
429cost_exceeds_burstA single request costs more than the key's burst capacity; no Retry-After (not billed)Split the request; retrying as sent never succeeds
503unavailableTemporarily unavailable; the response carries Retry-After. Also returned for historical requests on a chain whose coverage.from_block is currently nullRetry after Retry-After seconds
503gateway_overloadedThe chain is busy (Ethereum's Data API handles few concurrent requests); Retry-After: 1Retry with backoff

409 not_indexed_yet covers two situations. Block above the indexed head: the requested block is higher than what the chain has indexed, the response includes indexed_through, and the data may arrive later — retry. No indexed data yet: for a chain that has just launched and has no indexed data at all, the response has no indexed_through and GET /v1/data/chains reports that chain's coverage.has_data as false. Wait for the chain to start indexing; /v1/status (data_status) and /v1/data/chains (coverage.has_data) show the current state, and these values change automatically once indexing begins.

Only 2xx responses are billed; errors never are.

Chain

MethodPathSummary
GET/chainsList supported chains
GET/{chain}/blocks/{number}Get a block by number
GET/{chain}/blocks/hash/{hash}Get a block by hash
GET/{chain}/blocks/{number}/transactionsList a block's transactions
GET/{chain}/transactions/{hash}Get a transaction by hash

Status

MethodPathSummary
GET/{chain}/status/freshnessFreshness and lag per dataset

Addresses

MethodPathSummary
GET/{chain}/addresses/{address}/transactionsList an address's transactions
GET/{chain}/addresses/{address}/transfersList an address's token transfers
GET/{chain}/addresses/{address}/balancesList an address's ERC-20 balances

Tokens

MethodPathSummary
GET/{chain}/tokens/{token}/transfersList a token contract's transfers
GET/{chain}/tokens/{token}/holdersList a token's holders
GET/{chain}/tokens/{token}Get token metadata
POST/{chain}/tokens:batchBatch get token metadata

NFTs

MethodPathSummary
GET/{chain}/nfts/{contract}/{token_id}Get one NFT's owner/holders
GET/{chain}/nftsList NFTs owned by an address

DEX

MethodPathSummary
GET/{chain}/dex/swapsList DEX swaps by pool or token
GET/{chain}/dex/pricesDaily DEX token prices

Stocks

MethodPathSummary
GET/{chain}/stocksDaily leaderboard of tokenized stocks
GET/{chain}/stocks/{token}Get one tokenized stock

Traces

MethodPathSummary
GET/{chain}/blocks/{number}/tracesHistorical callTracer trace tree for a whole block
GET/{chain}/transactions/{hash}/traceHistorical callTracer trace tree for one transaction

On this page