Node state
Blocks, transactions, receipts, logs, balances, and contract calls.
Match node state, indexed entities, market context, and derived signals to the question you need to answer.

Blocks, transactions, receipts, logs, balances, and contract calls.
Decoded transfers, labels, protocol positions, and entity histories.
Prices, liquidity, volume, and exchange metadata for assets.
Flows, cohorts, risk scores, realized metrics, and alert conditions.
For a wallet balance API, verify native assets, fungible tokens, NFTs, pending transactions, spam filtering, fiat valuation, block height, and source timestamp. Transaction history should document internal transactions, traces, fees, status, pagination, and decoded labels.
Token and smart contract APIs need stable contract addresses, token decimals, event signatures, log indexes, transaction hashes, and chain IDs. Holder lists and portfolio views may be indexed or derived rather than direct node responses.
Historical on-chain data requires archive depth, deterministic time boundaries, backfill pagination, and revision handling. Real-time blockchain data may arrive through polling, webhooks, WebSocket subscriptions, or streams; record confirmation policy and duplicate-event behavior.
Active addresses, new addresses, exchange inflow, realized value, holder concentration, and supply in profit are analytics products, not raw chain fields. Their values depend on address clustering, change-address heuristics, contract and bridge filters, exchange-label coverage, price sources, time boundaries, and confirmation policy. Store the metric definition, network, block range, label-set version, price vintage, and calculation version with every observation. An address is not automatically one user, and a token transfer is not automatically an independent economic flow.
Assume confirmed external transfers into a labeled exchange cluster total 100 BTC during one UTC day, while confirmed transfers from the cluster to external entities total 70 BTC. Under the declared formula, net exchange inflow is 100 − 70 = +30 BTC. During the same day, the exchange moves 500 BTC from a labeled hot wallet to a new cold wallet. If the cold wallet is not yet included in the label set, a naive address-based calculation reports an additional 500 BTC outflow and changes the day to 100 − (70 + 500) = −470 BTC. Once both wallets are recognized as the same exchange entity, the internal movement contributes zero to external net flow and the result returns to +30 BTC.
Do not silently rewrite the old series when a label is added. Retain the first-known result, publish the corrected result under a new label-set version, and expose the revision time and reason. Also specify whether bridge contracts, custodians, omnibus wallets, mining pools, mixers, token mints and burns, failed transactions, and reorged blocks are included. For alerts, wait for the chosen confirmation threshold and make corrections reversible; for historical research, query the metric version that was actually available at the study cutoff.
Good for request-response lookups such as an address balance, transaction detail, or paginated transfer history.
Useful when applications need selected fields and related entities from an indexed multi-chain data model.
Provides chain-native methods but often requires decoding, indexing, batching, archive access, and reorg handling in your own stack.
Support near-real-time events; verify delivery guarantees, retry signatures, ordering, confirmation depth, and reconnect behavior.
| Field | Why it matters | Reject when |
|---|---|---|
| chain_id | Prevents same-address ambiguity | Missing or inferred from UI |
| block / time | Makes the result reproducible | Only “latest” is returned |
| address + type | Distinguishes wallet, token, and contract | Checksum or token identity is unclear |
| confirmation policy | Controls reorg exposure | Pending and confirmed data are mixed |
| provenance | Explains decoding and enrichment | Derived fields have no source |
Start from a node or archive provider and keep block number plus chain ID.
Use an indexer and document its decoding and reorg policy.
Use a subgraph or specialist dataset with schema versioning.
Join market data only after token identity and timestamp are stable.
“On-chain data API” covers several products with different tradeoffs. A raw node method, an indexed address-history endpoint, a decoded event API, and an analytics dataset may all describe the same transaction differently. Choose the source model before comparing providers.
| Source model | Returns | Best fit | Work you still own |
|---|---|---|---|
| JSON-RPC | Blocks, receipts, logs, state | Chain-native control | Decoding, indexing, reorgs |
| Indexed REST | Wallet and transaction history | Wallets, tax, portfolio apps | Provider schema mapping |
| GraphQL | Selected entities and relations | Custom indexed queries | Query cost and pagination |
| Streams / webhooks | New blocks, transfers, events | Alerts and live automation | Ordering, dedupe, replay |
Raw logs preserve protocol-level detail but require ABIs and chain-specific logic. Decoded APIs are faster to integrate, yet their labels, token metadata, spam rules, and protocol classifications become part of your application’s data dependency.
An index can answer historical and cross-entity questions efficiently, but it may lag the chain tip. Node state is closer to the network and useful for verification, while deep history may require archive access and many calls.
| Provider | Role | Useful for |
|---|---|---|
| Ethereum JSON-RPC | Canonical protocol interface | Blocks, transactions, receipts, logs |
| Coinbase Data | Managed blockchain data | Application access and normalized delivery |
| The Graph | Queryable indexed schemas | Protocol-specific entities and history |
| CoinGecko in QVeris | Crypto market context | Price and asset-market coverage |
A “free API” can mean an unauthenticated public endpoint, a recurring monthly allowance, promotional credits, or a time-limited trial. These are not interchangeable. Capture the terms on the day you test and avoid designing a production dependency around a quota that is not guaranteed to renew.
Learn whether one HTTP request, each returned record, compute units, or chain-specific credits consume quota. Batch calls may have different weights.
Record requests per second, burst windows, concurrent streams, webhook delivery limits, 429 headers, and reset behavior.
Check archive depth, supported networks, premium-only decoded fields, maximum page size, bulk export, and retention.
Review display, caching, storage, attribution, redistribution, commercial-use, and derived-data conditions.
Free access is not an SLA. A useful prototype limit does not establish uptime, support, notice periods, or recovery guarantees.
Specify chain, entity, fields, time range, finality, maximum staleness, pagination, and allowed empty results before choosing an endpoint.
Test a funded wallet, empty wallet, token contract, failed transaction, long history, latest block, and unsupported network.
Keep raw payloads, version field mappings, validate addresses and numeric units, and store source plus ingestion timestamps separately.
Keep keys server-side, cache by freshness need, bound retries with jitter, handle 429 separately, monitor quotas, and define a fallback.
{
"chainId": "eip155:1",
"blockNumber": 00000000,
"transactionHash": "0x…",
"timestamp": "ISO-8601",
"asset": {"address": "0x…", "decimals": 18},
"valueRaw": "0",
"status": "confirmed",
"sourceRetrievedAt": "ISO-8601"
}Preserve raw integer values instead of accepting floating-point conversions, and store provider payload samples for debugging. Add provider-specific fields outside the normalized core so switching sources does not silently change product behavior.
A token transfer with raw value 123456789 and contract decimals 6 represents 123456789 ÷ 10⁶ = 123.456789 tokens. Keep the raw integer as a string and derive the display amount with decimal-safe arithmetic; changing the token metadata or reading the amount as a binary floating-point number must not rewrite the source event. Identify the log with chain ID + transaction hash + log index, not transaction hash alone, because one transaction can emit several transfers.
Confirmation is a state transition, not a permanent property at first sight. Record the block number and hash, transaction and log indexes, observed time, provider ingestion time, confirmation count, and finality policy. If an event first appears in block N with hash A but a reorganization later makes hash B canonical at the same height, mark the A event removed or reverted and process the canonical replacement idempotently. Do not leave both in balances or alerts. The required confirmation depth is network- and use-case-specific; expose pending, confirmed, finalized, and reverted states rather than presenting the first observation as irreversible.
Cross-check critical samples with a block explorer or chain-native RPC. Repeat identical requests to detect unstable identifiers, missing rows, changing pagination, or inconsistent timestamps. Test around a known chain reorganization or wait for additional confirmations where the network makes that practical.
Monitor source lag, ingestion lag, null spikes, missing block ranges, schema drift, quota consumption, 429s, and provider errors. Backfills should be idempotent by chain, block, transaction, and log index. A fallback needs an explicit reconciliation rule because two providers may normalize the same event differently.
Use QVeris for capability discovery, but keep chain-native and market-data responsibilities explicit. Continue with CoinGecko provider details, then confirm the calling contract in the QVeris REST API reference.
Yes. Providers offer public endpoints, trials, or ongoing free tiers for balances, transactions, transfers, blocks, contracts, and indexed data. Limits and rights vary.
Choose a chain-native JSON-RPC endpoint or an indexed REST, GraphQL, WebSocket, or webhook API, then test its schema, coverage, quota, freshness, and errors.
The best option is the one that matches your networks, data types, history, update speed, quota, license, and operational requirements. There is no universal winner.
Some multi-chain APIs normalize several networks behind one schema. Verify chain-specific fields and feature gaps instead of assuming identical coverage.
Some public endpoints do not; many free tiers require a key for quota and abuse controls. Never expose a privileged key in browser code.
Only when its license, capacity, availability, change policy, monitoring, and fallback meet your application’s risk requirements.
