快速上手

用 API key 调用 JSON-RPC 与 Data API。

本页只讲最少够用的内容:怎么拿到 API key、怎么选择链、怎么调用 JSON-RPC、Data API 请求长什么样。

迁移提示

BlockVectra 现已支持多链。所有链相关请求都会在 URL 中带上链名 {chain}(JSON-RPC 形如 /v1/{chain}/{api_key},Data API 形如 /v1/data/{chain}/…)。旧路径 /v1/{api_key} 返回 HTTP 404 与 error.data.reason: "unknown_chain" 错误,而不带链段的请求(如 /v1 或 /v1/)返回 HTTP 404 且响应体为空。同一个 API key 适用于所有支持的链。

1. 获取 API key

前往控制台,用 GitHub、Google 或以太坊钱包登录(首次登录自动开户,新账户自带免费额度,具体以控制台与定价页为准),然后创建 API key。创建后可以直接在控制台里发一次测试请求,确认 key 可用。创建时 secret 只显示一次,请立即妥善保存。新建、轮换或吊销 key 后,约几秒钟才在所有接口生效;刚创建的 key 立即调用若返回 404,请稍等片刻再试。

key 的样子是 rgw_ 加 64 位十六进制字符,例如 rgw_1f2e...(已截断)。请保管好, 拿到 key 的任何人都能消耗你的余额。

余额不足时网关返回 HTTP 402(JSON-RPC 错误码为 -32020;Data API 为 error.code insufficient_balance),去控制台账单页查看余额与充值方式。

选择链

BlockVectra 的每个端点都按链区分:JSON-RPC 请求在 URL 路径中带上链名 {chain},Data API 请求则在路由前加上链名。当前已开放的链及对应链名见支持的链。

本页所有示例均使用 robinhood_mainnet。

提示:把示例 URL 中的 robinhood_mainnet 换成支持的链里的任一 {chain},即可调用对应链。同一个 API key 适用于所有支持的链。

2. 调用 JSON-RPC

JSON-RPC 端点按链区分:POST /v1/{chain}/{api_key}(key 放在路径中),或 POST /v1/{chain}(key 放在 x-api-key 请求头中)。{chain} 是链名,与 Data API 使用的链名相同;Robinhood Chain 的链名是 robinhood_mainnet,所以本页示例使用的端点是 https://dev-api.blockvectra.network/v1/robinhood_mainnet。同一个 API key 可用于所有已支持的链。暂不支持 WebSocket。虽然 API 返回了 Access-Control-Allow-Origin: *,但请妥善保管 API key,端点设计为由后端服务调用,而非在浏览器前端代码中直接暴露 key。

key 有两种传法。

key 放在 URL 路径中

export BLOCKVECTRA_API_KEY=rgw_your_api_key

curl -s "https://dev-api.blockvectra.network/v1/robinhood_mainnet/$BLOCKVECTRA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

key 放在请求头中

export BLOCKVECTRA_API_KEY=rgw_your_api_key

curl -s "https://dev-api.blockvectra.network/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

不要加结尾斜杠

用请求头传 key 时,请按上面的写法原样调用 https://dev-api.blockvectra.network/v1/robinhood_mainnet:URL 以链名结尾,不带结尾斜杠。 JSON-RPC 只在 /v1/{chain} 和 /v1/{chain}/{api_key} 两种路径上提供,带结尾斜杠(如 /v1/{chain}/)或不带链段的请求(如 /v1 或 /v1/)返回 404 且响应体为空。 旧路径 /v1/{api_key} 则返回带有 error.data.reason: "unknown_chain" 错误的 404。

Authorization: Bearer <api_key> 请求头同样有效,在 x-api-key 缺失或为空时才会被使用; 两者都存在时,非空的 x-api-key 优先。

批量调用

传一个数组即可在一次请求里发起多个调用(单批最多 100 个)。注意每个 API key 都有一个 CU 令牌桶(cu_per_sec 补充速率、burst_cu 突发容量——默认 100 CU/s、突发 400 CU;在控制台 Keys 表按 key 显示);单个请求(包括整批 JSON-RPC 批量调用)若总 CU 超过该 key 的突发容量,即使未达到 100 个调用的上限也会被拒绝并返回 -32022 request_exceeds_burst;需拆分为较小的批次。下面这个例子在一次往返里 同时读取链 ID 和某个地址的余额:

curl -s "https://dev-api.blockvectra.network/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '[
    {"jsonrpc":"2.0","id":1,"method":"eth_chainId"},
    {"jsonrpc":"2.0","id":2,"method":"eth_getBalance","params":["0x1111111111111111111111111111111111111111","latest"]}
  ]'

响应是一个数组,顺序与请求一致,按 id 对应。

如果网关直接拒绝整个批量请求——余额不足、限流、突发容量超限,或超过 100 个调用(见下方常见错误)——它会返回一个单独的 JSON-RPC 错误对象而不是数组;此时 viem 的 batch: true 模式只会报出一个不透明的 UnknownRpcError,请改为单独重试一次调用以查看真实错误。

3. 了解 CU 计量

每个被计费的调用都会消耗一定的 CU(Compute Unit):便宜的调用比如 eth_blockNumber、 eth_chainId 只要 1 CU;常见读取比如 eth_getBlockByNumber 是几 CU;较重的调用比如 eth_call、eth_getLogs 更贵;debug_trace* 最贵。 结算按账户、按小时账期汇总扣费,向下取整为整计费单位(1 计费单位 = 1000 CU),未满 1 单位的余数结转到下一期(跨期合计扣费为 floor(累计 CU / 1000));结算在账期结束约 15 分钟后执行。例如:上期结转 508 CU,本期消耗 2557 CU,合计 3065 CU,本期扣除 3 个计费单位,余数 65 CU 继续结转至下一期。当前价格见定价。

完整的方法权重表与错误码见 API 参考 → JSON-RPC; 本页只演示请求的基本形态。

常见错误

你做了什么会收到什么建议操作
未知或暂未开放的链名,或旧路径 /v1/{api_key}HTTP 404,JSON 响应体包含 error.data.reason: "unknown_chain"检查 URL 中的链名
不带链段的请求(如 /v1 或 /v1/),或 API key 缺失、未知或被禁用HTTP 404,空 body在 URL 中补全链名(/v1/{chain}),或使用有效且处于生效中的 API key(刚新建或轮换的 key 约几秒钟生效,请稍等片刻再试)
余额为零或为负HTTP 402,JSON-RPC 错误码 -32020充值或等待免费额度周期补足
请求过于频繁(超出限流或网关临时过载)HTTP 429(或 200),JSON-RPC 错误码 -32005稍后重试(若响应头带 Retry-After 请按其等待)
单个请求或整批调用的 CU 超过 key 突发容量(burst_cu,默认 400 CU;默认速率 100 CU/s),或免费套餐单批调用数超过每秒上限HTTP 429,JSON-RPC 错误码 -32022(request_exceeds_burst)拆分请求或减小批次(即使未达到 100 个调用上限,按原样发送永远不会成功)
上游节点暂时不可用HTTP 200,JSON-RPC 错误码 -32603(upstream unavailable),不计费重试请求
历史状态查询超出该链的状态窗口(以太坊:约最近 250,000 个区块)HTTP 200,JSON-RPC 错误码 -32011,不计费改查较新的区块
交易或区块未找到,或响应过大;以太坊上超出近期窗口的区块 / 收据 / 日志查询亦返回 -32000 "old data not available due to pruning"(不计费,见支持的链 → 以太坊)HTTP 200,JSON-RPC 错误码 -32000修改请求(核对交易哈希或区块号;格式不合法的 trace 哈希同样返回交易未找到)
使用了不支持的 tracer 或超时参数(debug_trace*)HTTP 200,JSON-RPC 错误码 -32602,不计费改用内置原生 tracer(callTracer、flatCallTracer、prestateTracer、4byteTracer、noopTracer,或缺省)且超时时间 ≤ 30s
调用了该链方法表不允许的方法(见支持的链)HTTP 200,JSON-RPC 错误码 -32601,不计费仅调用该链允许的方法
请求体不是合法 JSONHTTP 200,JSON-RPC 错误码 -32700,不计费修正 JSON 请求体语法
单批调用数超过 100HTTP 200,JSON-RPC 错误码 -32600(batch too large),不计费拆分为不超过 100 个调用的批次

以上这些拒绝一律不计费;每个被受理并得到应答的调用按公布的 CU 权重计费,不计费的情况见错误码表的「是否计费」列。对于 debug_trace* 调用,tracer 必须为内置原生 tracer(callTracer、flatCallTracer、prestateTracer、4byteTracer、noopTracer,或缺省)且超时时间 ≤ 30s(-32602)。

4. 调用 Data API

Data API 把只读链数据(区块、交易、余额、持有者、DEX 活动等)包装成 REST/JSON 接口。除 GET https://dev-api.blockvectra.network/v1/data/chains 外,所有路由都带链标识前缀:下面路径中的 robinhood_mainnet 就是链标识(即 /chains 和 meta 中的 chain 字段)。GET https://dev-api.blockvectra.network/v1/data/chains 仅列出已公开的链,只返回 {"data": [...]}(没有 meta,也没有 next_cursor)。请求按 CU 计费(仅对 2xx 成功响应计费)。

每次请求需要带与 JSON-RPC 相同的 API key——通过 x-api-key 请求头传递。每个链相关路由的成功响应都使用同一套信封:data(数据本体)、next_cursor(不透明字符串,只在有下一页时才出现,否则这个字段整个不存在,不是 null)、以及 meta(chain、chain_slug(chain 的大写形式)、chain_external_id、as_of_block、finalized_block、coverage、refreshed_at)。每个错误响应一般是 {"error":{"code","message"}} 两个字段,仅 409 not_indexed_yet 额外带 indexed_through(已索引到的最高区块);如果链未知或暂未公开,网关在检查 key 之前返回HTTP 404,error.code 为 not_found(不计费且不占限流;链名必须为全小写 slug);如果是 API key 缺失、未知或被禁用时,网关返回 HTTP 404 且 body 为空(与 JSON-RPC 相同)。超出限流时返回 HTTP 429(error.code 为 rate_limited,data.reason 为 key_rate_limit),余额耗尽时返回 HTTP 402(error.code 为 insufficient_balance),两者均不计费。超过 2^53 的数值(余额、代币数量)一律是十进制字符串,不是 JSON 数字。

按区块号查区块:

curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/blocks/72838701" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
{
  "data": {
    "number": 72838701,
    "hash": "0x9f2c1e7a4b6d3f805e1c9a72b4d6f1e0a3c8b5d7e2f4a1c6b9d3e7f0a2c4b6d8",
    "parent_hash": "0x1a3c5e7f9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a",
    "timestamp": "2026-09-26T05:41:07Z",
    "miner": "0x00000000000000000000000000000000000a4b05",
    "gas_limit": 32000000,
    "gas_used": 4821932,
    "base_fee_per_gas": "100000000",
    "state_root": "0x2b4d6f8a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d",
    "transactions_root": "0x3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e",
    "receipts_root": "0x4d6f8a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f",
    "tx_count": 239,
    "size": 48213,
    "l1_block_number": null,
    "extra": {}
  },
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:15:03Z"
  }
}

高于已索引链头(as_of_block)的区块号返回 409(error.code: "not_indexed_yet"),indexed_through 会告诉你已索引到的最高区块——数据还没到,稍后重试即可。不高于 as_of_block 但高于 finalized_block 的区块号返回 409(error.code: "finality_exceeded")。不高于 finalized_block 但没有对应行的区块号(从未索引过,或被 reorg 回滚)返回 404(error.code: "not_found")——最终性余量因链而异,见支持的链。

查看数据新鲜度(每个被跟踪的数据集落后链头多少,适合做状态页或调用前的自检):

curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/status/freshness" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
{
  "data": [
    {
      "dataset": "blocks",
      "category": "raw",
      "max_block_number": 72838957,
      "max_day": null,
      "max_time": "2026-09-27T02:15:01Z",
      "seconds_behind": 0,
      "blocks_behind": 0,
      "days_behind": null,
      "checked_at": "2026-09-27T02:15:07Z"
    }
  ],
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:15:07Z"
  }
}

(示例已精简:实际响应每个数据集一行,这里只列出 blocks 这一行;traces 行还会额外带 coverage_from_block、coverage_to_block、coverage_complete。)

如果该链的新鲜度数据暂时不可用,会返回 503(error.code: "unavailable"),而不是返回不完整的结果;响应头带 Retry-After(秒)——请至少等待该时长后重试。

查询某地址的 ERC-20 余额(每 6 小时整体刷新一次的快照,只保留非零余额,按 token 排序):

curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/balances" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
{
  "data": [
    { "token": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", "balance": "500000000", "symbol": "WBTC", "decimals": 8 },
    { "token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "balance": "1250000000", "symbol": "USDC", "decimals": 6 }
  ],
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:10:00Z"
  }
}

没有任何非零余额的地址仍会返回 200 + data: []——不会是 404。可以传 ?limit=(默认 50,最大 500),并用返回的 next_cursor 翻页。

完整的端点覆盖——区块、交易、地址、代币、NFT、DEX、代币化股票——参见 API 参考 → Data API。

接下来看什么

本页目录