課金されないもの:エラーコードと課金ルール
HTTP ステータスコード、JSON-RPC エラー、Data API における課金ルールの詳細な内訳と、開発者向けの推奨対応。
BlockVectra はリクエストを Compute Units(CU)単位で計測します。JSON-RPC および Data API の呼び出しは、レスポンスが得られた後にのみ課金されます。このガイドでは、HTTP ステータスコード、JSON-RPC 呼び出し、Data API における課金判定ルールと、開発者向けの推奨される対応をまとめます。
HTTP ステータスコードと課金ルール
HTTP レベルのレスポンスに対する課金判定および処理ルールは以下のとおりです:
| HTTP ステータス | レスポンスボディ | シナリオ | 課金の有無 | 推奨される対応 |
|---|---|---|---|---|
| 200 | JSON-RPC レスポンス(単一またはバッチ) | 正常なレスポンス。JSON-RPC レイヤーのすべてのエラー(パースエラー、メソッド拒否、アップストリームの障害、ノードエラー)も 200 | コールごとに評価 | 各コールの result または error を確認。エラーが返された場合は、下記の JSON-RPC エラー処理を参照 |
| 204 | 空 | リクエスト内のすべてのコールが通知 | 通知は通常どおり課金される | 追加の対応は不要 |
| 400 | 空 | 不正な形式の HTTP メッセージ(リクエスト行やヘッダーを解析できない、無効なチャンクエンコーディング)、またはリクエストボディの 2 回の読み取り間隔が 10 秒を超えた | いいえ | HTTP リクエストの構文、ヘッダー、および送信の連続性を確認 |
| 402 | JSON、-32020 | 残高不足、枠の使い果たし。残高が判明している場合、error.data には balance_units と balance_cu が含まれる | いいえ | コンソールの請求ページまたは GET /v1/topup/deposit-address(MCP get_deposit_address)で残高を確認。アカウントの専用アドレスにオンチェーンでチャージ(Agent チャージガイドを参照) |
| 403 | 空 | /v1/{chain} または /v1/{chain}/{api_key} に対する POST または OPTIONS 以外のメソッド(チェーン名が認識されているかどうかに関係なく) | いいえ | HTTP リクエストメソッドを POST(またはクロスオリジンの OPTIONS プリフライト)に変更 |
| 401 | JSON、-32024(missing_api_key または invalid_api_key) | 既知のチェーンでキーが不足している、キーが不明または無効化されている | いいえ | x-api-key ヘッダーに有効な API key を指定(作成直後またはローテーション後のキーは有効になるまで数秒かかるため、少し待ってから再試行) |
| 404 | JSON、-32600(reason = unknown_chain) | 不明な {chain} への POST | いいえ | URL 内のチェーン名を対応チェーンと照合(完全一致の小文字スラッグである必要があります) |
| 404 | 空のボディ | 一致しないパス(例:POST /v1、/v1/、POST /v1/{chain}/) | いいえ | URL にチェーンを含める(/v1/{chain}) |
| 408 | 空 | リクエストヘッダーの読み取りからレスポンスの返却までに 35 秒を超過 | 可能性あり:ノードにすでに転送された呼び出しは、ノードが応答した時点で通常どおり課金される | 状態を変更する呼び出し(例:eth_sendRawTransaction)を無条件に再試行しないこと。クライアントの切断によって転送済みの呼び出しがキャンセルされるわけではない |
| 413 | 空 | リクエストボディが 2 MiB(2,097,152 バイト)超過 | いいえ | リクエストボディを 2 MiB 未満に維持し、バッチをより小さなリクエストに分割 |
| 414 / 431 | 空 | URI が長すぎる(414)またはリクエストヘッダーが大きすぎる(431) | いいえ | リクエスト URI を短縮するか HTTP リクエストヘッダーを削減 |
| 429 | JSON、-32005 または -32022。レート制限(-32005)の場合は Retry-After を付与。バースト/バッチサイズ制限(-32022)の場合は付与されない | バケット残高枯渇 → -32005、単一リクエストの CU がバースト容量を超過 → -32022、アカウントのコールレート制限枯渇 → -32005、単一リクエスト内のコール数が上限を超過 → -32022 | いいえ | Retry-After 付きの -32005 では指定された秒数待ってから再試行。-32022 ではリクエストを分割するかバッチサイズを削減(そのまま再試行しても成功しない) |
| 503 | JSON、-32021、Retry-After 付き | 請求データが一時的に利用不可。サーバーが一時的にリクエストを拒否(残高の問題ではないためチャージ不要)。新規作成されたキーは請求データが同期されるまで(通常数秒)これを返す | いいえ | 残高の問題ではないためチャージは不要。Retry-After に指定された秒数を待って再試行 |
注記:Cloudflare 経由でアクセスした場合、Cloudflare が 52x や 1015 のエラーページを返すことがありますが、これらは当サービスによって生成されたものではありません。
課金と残高のレスポンスヘッダー:HTTP リクエスト(JSON-RPC と Data API の両方に適用可能)で
x-bv-meter: 1を送信すると、少なくとも 1 回の呼び出しが課金されたレスポンスにおいて、x-bv-cu-charged(このリクエストで課金された Compute Units、またはバッチ内で課金された呼び出しの合計)とx-bv-balance-units(この課金直後のアカウントの残り残高ユニット。過払い時はマイナス。残高が不明な場合は省略)が返されます。x-bv-meter: 1のないリクエスト、課金が発生しなかったレスポンス、402、403、429、503 のエラーレスポンスでは、両ヘッダーとも省略されます。これらのレスポンスヘッダーは CORS 経由でブラウザスクリプトからアクセス可能ですが、WebSocket では使用されません。残高は未決済の総利用量を整数ユニットに 1 回切り上げて差し引きます。毎時の決済では切り捨てられるため、決済後に報告される残高が最大 1 ユニット増加する場合があります。
JSON-RPC エラーコードと課金ルール
同一のエラーコードでもプラットフォームまたはノードのいずれかから発生する可能性があり、課金が異なります:
- プラットフォーム自体によって生成されたエラー:一切課金されません。
- ノードから返されたエラー:そのまま透過され、メソッドの重み付けで課金されます。ただし、以下に記載するノードエラーコードのみが例外となります。
ルールの詳細
- 課金されないノードエラー:ノードの
-32002(バッチタイムアウト)、-32003(バッチレスポンスが大きすぎる)、および-32600(バッチ全体が拒否された)は、ノードが処理を早期に破棄したことを示し、これらおよび同じバッチ内の通知は課金されません。ノードの-32601(公開メソッドが未実装)および-32603(ノード内部障害)は HTTP または WebSocket 経由で課金されず、バッチ内の他のコールや通知には影響しません。さらに、4444(プルーニングされたブロック)および-32000(GET /v1/chainsのstate_window_blocksで定義されるノードの状態履歴ウィンドウ外の過去の状態)は課金されず、バッチ内の他のコールには影響しません。 - 課金されるノードエラー:チェーンの結果を報告するノードからのその他のエラーは、メソッドの重み付けで課金されます。たとえば
execution reverted(-32000またはdata付きの3)、ノード独自の-32602 invalid argumentなどです。 - 残高受付と同期:
-32020はアカウントの残高不足を示し、チャージが必要です。残高が判明している場合、error.data.balance_unitsとerror.data.balance_cuに残り残高(マイナスの場合あり)が含まれます。新規作成されたキーは数秒間-32021(503)を返す場合があります。Retry-Afterを待って再試行してください。 - アップストリーム障害:アップストリームとの通信障害または不正なレスポンス(
upstream unavailable、no response from upstream、malformed upstream response)が原因でプラットフォームが生成した-32603には、data.reason: upstream_unavailableが付与されます。 - 通知の課金:通知(204)は、そのメソッドの重み付けで課金されます。
JSON-RPC エラーコード表
| コード | ソース | HTTP | メッセージ | 理由 | 課金の有無 | 推奨される対応 |
|---|---|---|---|---|---|---|
| -32700 | BlockVectra | 200 | parse error | - | いいえ(レート制限トークンを 1 CU 消費) | リクエストの JSON 構文を修正 |
| -32600 | BlockVectra | 200 | invalid request | invalid_request | いいえ(レート制限トークンを 1 CU 消費) | JSON-RPC リクエストの構文と構造を修正 |
| -32600 | BlockVectra | 200 | batch too large: max <N> calls | batch_too_large (+max) | いいえ | バッチを上限以下のコール数に分割(標準バッチ上限は 100) |
| -32600 | BlockVectra | 200 | invalid request: ambiguous member name | invalid_request | いいえ | JSON オブジェクト内の重複またはあいまいなメンバー名を削除 |
| -32601 | BlockVectra | 200 | method not available: <method> | - | いいえ | そのチェーンで許可されているメソッドのみを呼び出す(対応チェーンを参照) |
| -32600 | BlockVectra | 404 | unknown chain | unknown_chain | いいえ | URL 内のチェーン名を確認 |
| -32602 | BlockVectra | 200 | eth_getLogs block range too large: max <N> blocks | - | いいえ | eth_getLogs のブロック範囲を縮小(チェーンごとに上限が定義、例:1000 ブロック) |
| -32602 | BlockVectra | 200 | tracer not allowed | - | いいえ | 許可されているネイティブトレーサーを使用(callTracer、flatCallTracer、prestateTracer、4byteTracer、noopTracer、または省略) |
| -32602 | BlockVectra | 200 | trace timeout not allowed | - | いいえ | タイムアウト ≤ 30s の有効な Go duration 文字列を設定 |
| -32010 | BlockVectra | 200 | node is syncing; calls are temporarily unavailable | - | いいえ | ノードが同期中のため後で再試行(eth_chainId を除く) |
| -32011 | BlockVectra | 200 | historical state is not available beyond the most recent <N> blocks | - | いいえ | より新しいブロックを照会(対象ブロックは状態ウィンドウ内である必要あり。safe/finalized/earliest タグを回避) |
| -32000 | BlockVectra | 200 | transaction not found | not_found | いいえ | トランザクションハッシュを検証(0x + 64 桁の 16 進数) |
| -32000 | BlockVectra | 200 | block not found | not_found | いいえ | ブロックハッシュまたはブロック番号を検証 |
| -32000 | BlockVectra | 200 | upstream response too large | response_too_large | いいえ | クエリ範囲を絞り込むかリクエストを分割 |
| -32005 | BlockVectra | 200 | - | overloaded | いいえ | サーバーが一時的に過負荷のため後で再試行 |
| -32005 | BlockVectra | 429 | rate limit exceeded | key_rate_limit / free_plan_call_limit / concurrency_limit | いいえ | リクエスト頻度を下げる。Retry-After がある場合はそれに従う |
| -32022 | BlockVectra | 429 | request cost <N> CU exceeds burst capacity <M> CU | request_exceeds_burst | いいえ | 単一リクエストの CU がバースト容量未満になるようにリクエストまたはバッチを分割 |
| -32022 | BlockVectra | 429 | request has <N> calls, exceeding the free-plan limit of <M> calls per second | free_plan_batch_too_large (+max) | いいえ | 1 秒あたりの上限に収まるようにバッチを分割するか、有料プランにアップグレード |
| -32603 | BlockVectra | 200 | upstream unavailable | upstream_unavailable | いいえ | アップストリーム通信障害、後で再試行 |
| -32603 | BlockVectra | 200 | no response from upstream | upstream_unavailable | いいえ | アップストリームが応答しなかったため、後で再試行 |
| -32603 | BlockVectra | 200 | malformed upstream response | upstream_unavailable | いいえ | アップストリームのレスポンスが不正、後で再試行 |
| -32603 | BlockVectra | 200 | - | - | いいえ | まれな内部エラー、後で再試行 |
| -32020 | BlockVectra | 402 | insufficient balance | balance_exhausted / free_grant_exhausted (+topup_url, および残高が判明している場合は +balance_units / balance_cu) | いいえ | コンソールの請求ページまたは GET /v1/topup/deposit-address(MCP get_deposit_address)で残高を確認。アカウントの専用アドレスにオンチェーンでチャージ(Agent チャージガイドを参照) |
| -32021 | BlockVectra | 503 | billing data temporarily unavailable | - | いいえ | 請求データの同期中(残高の問題ではない)。Retry-After 秒待って再試行 |
| 4444 | ノード | 200 | pruned history unavailable | - | いいえ | 要求されたブロックはノードによってプルーニング済み。課金対象外。バッチには影響なし |
| -32000 | ノード | 200 | historical state ... is not available | - | いいえ | ノードの状態履歴ウィンドウ外。課金対象外。バッチには影響なし |
| -32000 | ノード | 200 | old data not available due to pruning... | - | いいえ | ノード履歴ウィンドウ外(ウィンドウは state_window_blocks で決定)。課金対象外。バッチには影響なし |
| -32002 | ノード | 200 | <node message> | - | いいえ | ノードがバッチ処理でタイムアウトしコールを破棄。課金対象外。バッチ内の通知も課金対象外 |
| -32003 | ノード | 200 | <node message> | - | いいえ | ノードのバッチレスポンスが大きすぎて破棄。課金対象外。バッチ内の通知も課金対象外 |
| -32601 | ノード | 200 | <node message> | - | いいえ | 公開メソッドがノードで実装されていない。別のサポートされているメソッドを使用 |
| -32603 | ノード | 200 | <node message> | - | いいえ | ノード内部の障害。バックオフ付きで再試行 |
| -32600 | ノード | 200 | <node message> | - | いいえ | バッチ全体がノードにより拒否された。課金対象外。バッチ内の通知も課金対象外 |
| その他 | ノード | 200 | <node message> | - | はい(メソッドの重み付け) | チェーンの結果(例:execution reverted、ノードの -32602)。コントラクト呼び出しパラメータを確認 |
Data API の課金ルール
Data API は読み取り専用のチェーンデータを REST エンドポイントにラップします。その課金とエラー処理は以下のルールに従います:
ルールの詳細
- 課金されるのは 2xx の成功レスポンスのみです。
- 対応範囲外の利用できない操作(非対応チェーンやトレースカバレッジ外のブロックなど)は HTTP 422
no_coverageを返します。これは課金されませんが、レート制限にはカウントされます。 - HTTP 401、402、404、および 429 のレスポンスは課金されません。レスポンスヘッダー(
x-bv-meter: 1)については、HTTP ステータスコードと課金ルールを参照してください。
Data API ステータスコード表
| HTTP ステータス | エラーコード / シナリオ | 課金の有無 | 推奨される対応 |
|---|---|---|---|
| 200 | 成功したデータレスポンス | はい(Data API 操作の CU 重み付け) | レスポンスエンベロープ内の data、meta、next_cursor をパース |
| 400 | リクエストパラメータが不正、または必須フィールドが不足 | いいえ | クエリまたはボディのパラメータを確認して修正 |
| 402 | 残高枯渇(error.code: "insufficient_balance"、残高が判明している場合は balance_units と balance_cu を含む) | いいえ | コンソールの請求ページまたは GET /v1/topup/deposit-address(MCP get_deposit_address)で残高を確認。アカウントの専用アドレスにオンチェーンでチャージ(Agent チャージガイドを参照) |
| 401 | API key の不足、不明、または無効化(error.code: "missing_api_key" または "invalid_api_key") | いいえ | x-api-key ヘッダーに有効な API key を渡す |
| 404 | 不明または非公開のチェーン(error.code: "not_found")、または要求されたオブジェクトが存在しない | いいえ | URL 内のチェーンスラッグ(完全一致の小文字であること)とリクエストパスを確認 |
| 409 | 要求されたブロックまたはウィンドウが現在のインデックス作成高さを上回っている(error.code: "not_indexed_yet"、indexed_through を含む) | いいえ | indexed_through までのブロックを照会するか、後で再試行 |
| 422 | チェーン固有の操作が利用不可(例:非対応チェーンまたはトレースカバレッジ外、error.code: "no_coverage") | いいえ(レート制限にカウント) | GET /v1/status(無料、キー不要の data_features)で対応機能を確認 |
| 429 | レート制限超過(error.code: "rate_limited")、または単一リクエストがキーのバースト容量を超過(error.code: "cost_exceeds_burst") | いいえ | リクエスト頻度を下げる。サイズが大きすぎるリクエストを分割(バースト容量を超えるリクエストはそのままだと成功しない) |
| 503 | データサービスが一時的に利用不可(error.code: "unavailable")、またはチェーンがビジー(error.code: "gateway_overloaded") | いいえ | 後で再試行し、Retry-After がある場合はそれに従う |
残高の照会(GET /v1/account)
API key の所有者は、課金が発生したり Compute Units(CU)が差し引かれたりすることなく、残高とキーのクォータ詳細を直接確認できます:
curl -H "x-api-key: $BLOCKVECTRA_API_KEY" https://api.blockvectra.com/v1/account- 無料で課金対象外:
GET /v1/accountは無料です。課金されることはなく、CU も差し引かれません。残高がゼロやマイナスの場合でも HTTP 200 で現在の残高を返します(402 を返すことはありません)。 - 認証:キー認証には
x-api-keyヘッダーのみを使用します(パスキーや Bearer トークンは受け付けられません)。ヘッダーがない場合は 401missing_api_keyが返され、無効または失効したキーの場合は 401invalid_api_keyが返されます。(期限切れのキーは 403key_expiredを返し、一時的なサービス利用不可の場合はRetry-After付きの 503auth_unavailableまたはbilling_unavailableを返します。) - レート制限:キー ID ごとに 1 秒あたり 5 リクエストという個別の制限があり、CU の計測や課金とは独立しています。制限を超えると、
Retry-Afterヘッダー付きの HTTP 429rate_limitedが返されます。
レスポンスフィールド:
key_id:API key の識別子文字列。plan:アカウントプランのタイプ(アカウントに無料プランのコールレート枠がある場合はfree、それ以外はpaid)。balance_units:アカウントの残り残高ユニット(ゼロまたはマイナスの可能性あり)。balance_cu:Compute Units(CU)に換算した残り残高。balance_as_of_age_ms:データソースから残高が読み取られてからの経過ミリ秒数。key:キー固有の制限とクォータ詳細:cu_per_sec:1 秒あたりの CU トークンバケット補充レート。burst_cu:CU トークンバケットのバースト容量。cu_cap:このキーの有効期間全体の CU 上限(上限がない場合はnull)。cu_cap_remaining:cu_capの下で残っている CU(上限がない場合はnull、ゼロまたはマイナスの可能性あり)。expires_at:RFC 3339 形式の有効期限タイムスタンプ(キーが無期限の場合はnull)。
レスポンス例:
{
"key_id": "<key_id>",
"plan": "<plan>",
"balance_units": <integer>,
"balance_cu": <integer>,
"balance_as_of_age_ms": <integer>,
"key": {
"cu_per_sec": <integer>,
"burst_cu": <integer>,
"cu_cap": <integer_or_null>,
"cu_cap_remaining": <integer_or_null>,
"expires_at": "<expires_at_or_null>"
}
}料金とアップグレード
課金されるすべての呼び出しの具体的な費用は、公開されている CU 重み付けによって決定されます:
- すべてのメソッドと操作の重み付けを確認するには、メソッド重み付け表および JSON-RPC CU 計測ルールを参照してください。
- プランの料金と決済の詳細については、料金ページを参照してください。
- 有料プランへのアップグレード:有料チャージを行うと無料プランの 1 秒あたりのコール数上限が解除されます。各キーは引き続き CU レートおよびバースト制限の対象となります。
オンチェーンでのチャージ手順
アカウントの残高が不足している場合や、より高いスループットが必要な場合は、コンソールで以下の手順に従ってオンチェーンでチャージしてください:
- コンソールにログイン:BlockVectra コンソールにログインします。
- 請求ページに移動:請求ページに移動します。
- 専用アドレスを取得:オンチェーンチャージカードで、アカウント専用のチャージアドレスをコピーするか、QR コードをスキャンします。
- 資金を送金:ページに記載されている対応ネットワークおよび USDC / USDT / USDG のみを使用して送金してください。対応ネットワークと最低チャージ額はコンソールに表示されます。
- 自動クレジット付与:オンチェーンで検出されるとトランザクションは「処理中」と表示され、入金が確認されるとクレジットが残高に自動的に追加されます。
重要な注意事項:
- コンソールに明示的に記載されているネットワークとトークンのみを使用してください。サポートされていないチェーンや誤ったトークンによる送金は、自動的に反映されません。
- 各送金がコンソールに示されている最低チャージ額を満たしていることを確認してください。
- 初回の有料チャージが反映されると、アカウントは有料アカウントにアップグレードされ、無料プランの 1 秒あたりのコール数上限が解除されます。
エージェントやサーバープログラムは、API key を使用してチャージエンドポイントを直接呼び出すことができます。Agent プログラムによるチャージガイドを参照してください。
Webhook プッシュの課金
Push には、配信済みデータイベント、成功した履歴クエリ、および課金対象のアドレス日に対して個別の重み付けがあります。イベント履歴以外の管理呼び出し、失敗した配信試行、自動再試行、制御イベントは無料です。配信された各イベントは 1 回課金されます。ユーザーによる replay や、reorg(チェーンの再編成)後に再配信された正規チェーンのイベントは、新しい課金対象の配信となります。アドレス課金は、UTC 日内にオンラインだった各購読の最大アドレス数を使用します。アカウントの無料アドレス枠は購読間で共有され、より古い購読が優先して使用します。2 つの購読に含まれるアドレスは 2 回カウントされます。チェーンを追加するとイベント料金が変わりますが、アドレス料金は変わりません。
設定、署名検証、配信復旧については、ブロックチェーン Webhook API ガイドを参照してください。ステーブルコイン決済ガイドでは受領確認とポーリングによるバックフィルを扱っています。WebSocket サブスクリプションは独自の接続と通知の計測を使用します。リクエストエラーはエラーリファレンスに記載されています。以下の重み付けは GET /v1/plans から取得されたものです。
| 利用量 | 課金単位 | CU |
|---|---|---|
push.address_day | 課金対象のアドレス日 | 33 |
push.history | 成功した履歴リクエスト | 25 |
push.log | 配信済みデータイベント | 150 |
push.native_transfer | 配信済みデータイベント | 150 |
push.token_transfer | 配信済みデータイベント | 150 |
アカウントごとの UTC 日あたりの無料アドレス数: 1000
アカウントごとの UTC 日あたりの無料アドレス枠は、プランに関係なくすべてのサブスクリプショングループで共有されます。各グループについて、その日にオンラインだった間の最大アドレス数を数え、グループ ID の昇順に枠を割り当てます。同じアドレスが二つのグループにある場合は二回数えます。グループ内のチェーン数によってアドレス数が倍増することはありません。一日中オフラインまたは削除済みのグループは数えません。各グループの割り当て枠を差し引いた残りの数に、`push.address_day` CU ウェイト(`method_weights` に記載)を掛けます。現在設定されている枠はアドレス日課金と同じ料金ポリシーに基づきます。アカウントの容量制限でも、グループごとの個別枠でもありません。
例:配信済みの native.transfer イベント 10 件、成功した履歴リクエスト 2 回、課金対象のアドレス日 10 件の利用量は、10 × 150 + 2 × 25 + 10 × 33 = 1880 CU です。課金対象のアドレス日は、アカウントの無料アドレス枠を差し引いた後に数えます。
次のステップ
- データセットディレクトリを見ると、BlockVectra がインデックスしているすべてのデータセットを確認できます。
- 無料プランと料金を見ると、アカウントに含まれる内容を確認できます。
- コンソールにログインして、API key を作成してください。
最終更新: