Error Reference

BlockVectra error codes, billing and retry guidance for JSON-RPC, Data API, Push Webhooks, console and faucet, including eth_getLogs block ranges and Webhook replay errors.

This reference documents all error codes and machine-readable reason values across BlockVectra services, including whether a rejected call is billed, retry policies, backoff durations, and recommended actions for AI agents and automated clients.

For machine-readable consumption, fetch the complete catalog as JSON at /errors.json. Every error response carrying a docs_url links directly to a stable anchor on this page: https://docs.blockvectra.com/en/errors/#<reason> (or #-<code-number> for errors without a reason code).

JSON-RPC errors

HTTPCodeReasonMeaningBilledRetryableWait Time (Retry-After)Agent Action
401-32024missing_api_keymissing API key: send it in the request path (/v1/{chain}/<api_key>) or in the x-api-key headerNoNo—For JSON-RPC endpoints (/v1/{chain}), provide API key in request path (/v1/{chain}/<api_key>) or in x-api-key header. For Data API (/v1/data/*) and Top-up API (/v1/topup/*), provide API key only in x-api-key header.
401-32024invalid_api_keyUnknown, disabled, or revoked API key: JSON-RPC and Data API both return HTTP 401 with an invalid_api_key error envelope (JSON-RPC: error.code -32024 and error.data.reason invalid_api_key; Data API: error.code and error.data.reason invalid_api_key).NoNo—Check the API key; if necessary, sign in again in the console or via programmatic sign-up to create a new key (see Lost your session or API key?).
403-32025key_expiredAPI key expired; create a new key in the consoleNoNo—API key expired; create a new key in the console or via programmatic sign-up.
403-32025key_cap_exhaustedAPI key CU cap exhausted; create a new key in the consoleNoNo—API key lifetime CU cap used up; create a new key in the console or via programmatic sign-up.
503-32021auth_unavailableauthentication data temporarily unavailableNoYesHonor Retry-After header (seconds)Server is temporarily unable to verify keys; this is not an issue with your key. Retry after waiting per Retry-After; do not recreate the key.
404-32600unknown_chainunknown chainNoNo—Check available chains via GET /v1/chains or the list_chains tool; verify URL path.
404unknown_endpointunknown_endpointData API method and path do not match a known operationNoNo—Verify method and URL path against Data API documentation.
200-32700parse_errorparse errorNoNo—Verify valid JSON syntax in request body before sending.
200-32600invalid_requestinvalid requestNoNo—Inspect request structure; verify jsonrpc: '2.0', id, and method fields before resending.
200-32602invalid_paramstracer not allowedNoNo—Adjust method params; check supported tracers and timeout limits for the chain.
200-32602logs_range_too_largeeth_getLogs block range too large: max <N> blocksNoNo—Narrow query block range to within max_logs_block_range indicated in GET /v1/chains.
429-32005public_rate_limitpublic request rate limit exceededNoYesHonor Retry-After header (seconds)Wait for the Retry-After header, then retry; or send the request with an API key (get one).
429-32005public_pool_busypublic chain pool is busyNoYesHonor Retry-After header or wait a few seconds and retry with backoffRetry with backoff, or send the request with an API key (get one).
200-32601method_not_publicMethod is not available on the public endpointNoNo—Use a method the public endpoint supports, or send the request with an API key (get one).
200-32601method_not_allowedMethod is not available on this chain or has been disabled by policyNoNo—Check methods.allow and methods.deny in GET /v1/chains for supported methods. Transaction sending support is determined by methods.allow in GET /v1/chains.
200-32601subscription_not_availableWebSocket subscription is not offered on this chainNoNo—Check available subscriptions for this chain via GET /v1/chains.
200-32602logs_filter_requiredlogs subscription requires an address or topic0 (a non-null value in the first topics position)NoNo—Specify an address or a non-null topic0 in the logs filter.
200-32600batch_too_largebatch too large: max <N> callsNoNo—Split batch into smaller batches meeting the max call limit indicated in error data.
413request_too_largerequest_too_largeData API request body exceeds the size limitNoNo—Reduce request body size.
200-32000not_foundtransaction not foundNoNo—If newly submitted or mined, wait for propagation and retry; otherwise check block number or hash.
200-32011state_windowhistorical state is not available beyond the most recent <N> blocksNoNo—Query blocks within state_window_blocks as reported in GET /v1/chains, or use Data API for historical data.
200-32011range_not_indexedrequested history is not completely indexedNoNo—Narrow the requested history to an indexed range; do not retry the same uncovered range unchanged.
200-32011history_not_readyrequested history is not readyNoYesWait for indexing to catch up; honor error.data.retry_after_seconds when presentRetry after indexing catches up, waiting error.data.retry_after_seconds when provided.
429-32005key_rate_limitrate limit exceededNoYesHonor Retry-After header (seconds)Sleep for the duration specified in Retry-After header before retrying, or distribute load.
429rate_limitedrate_limitedRequest rate limit exceeded on API or GET /v1/account (more than 5 requests per second for this key)NoYesHonor Retry-After header (seconds)Sleep for duration in Retry-After before retrying.
429-32005concurrency_limitrate limit exceededNoYesHonor Retry-After header or wait for active calls to completeLimit client concurrency pool size and retry completed slots.
429-32005free_plan_call_limitrate limit exceededNoYesWait 1 second before retryingThrottle request rate or top up to unlock paid tier throughput.
429-32022request_exceeds_burstrequest cost <N> CU exceeds burst capacity <M> CUNoNo—Waiting will not succeed; split batch or lower method parameters to fit within burst capacity.
429-32022free_plan_batch_too_largerequest has <N> calls, exceeding the free-plan limit of <M> calls per secondNoNo—Waiting will not succeed; split batch so call count is within free-plan limit, or top up.
429-32005ws_connection_limitWebSocket connection limit reached for this key or accountNoNo—Close an unused WebSocket connection or reuse an existing connection.
200-32022subscription_limitWebSocket subscription limit reached for this connectionNoNo—Unsubscribe an existing subscription or open another connection.
200-32005ws_filter_capacityWebSocket logs filters are at capacityNoNo—Unsubscribe an existing logs subscription or use a narrower filter.
200-32026ws_push_overloadedWebSocket notification queue is overloadedNoYesRetry later with backoff, or reconnectRetry eth_subscribe with exponential backoff, or reconnect. Existing subscriptions continue receiving notifications.
200-32005overloadedservice overloaded, retry laterNoYesWait a few seconds and retry with exponential backoffBack off with jitter and retry request.
402-32020balance_exhaustedInsufficient balance (when balance is known, error.data includes balance_units and balance_cu)NoNo—Top up on-chain: get your deposit address from the Console or `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); see the agent top-up guide, or use quota reset in console if eligible. When balance is known, error.data carries balance_units (negative when overdrawn) and balance_cu.
402-32020free_grant_exhaustedFree grant exhausted (when balance is known, error.data includes balance_units and balance_cu)NoNo—Top up on-chain: get your deposit address from the Console or `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); see the agent top-up guide, use quota reset if available, or wait for next cycle grant. When balance is known, error.data carries balance_units (negative when overdrawn) and balance_cu.
503-32021billing_unavailablebilling data temporarily unavailableNoYesHonor Retry-After header (seconds)This is not a balance issue; newly created keys sync within seconds. Wait for Retry-After and retry.
200-32010node_syncingnode is syncing; calls are temporarily unavailableNoYesWait a few seconds and retryWait for node synchronization to finish, or check GET /v1/status.
200-32603upstream_unavailableupstream unavailableNoYesWait a few seconds and retryRetry with exponential backoff; check GET /v1/status for node health.
504504upstream_timeoutUpstream service did not answer within the time limitNoYesRetry after a brief delayRetry the request with exponential backoff.
200-32000response_too_largeupstream response too largeNoNo—Narrow query parameters (e.g. reduce block range in eth_getLogs or request smaller traces).
200-32603internal_errorinternal service errorNoNo—Retry request; report persistent failures with timestamp to support.
2004444—pruned history unavailableNoNo—Block is outside the node's pruned history window; query historical blocks via Data API.
200-32000—historical state ... is not available; old data not available due to pruning...; missing trie node ...NoNo—Query blocks within the state window, or use Data API for historical queries.
200-32002—<node message>NoYesWait a few seconds and retry with a smaller batchReduce the number of calls in the batch and retry.
200-32003—<node message>NoNo—Split batch into smaller requests to reduce response payload size.
200-32601—<node message>NoNo—Check methods.allow and methods.deny in GET /v1/chains for supported methods. Transaction sending support is determined by methods.allow in GET /v1/chains.
200-32603—<node message>NoYesRetry after a brief delayRetry request; report persistent failures with timestamp to support.
200-32600—<node message>NoNo—Inspect individual requests in the batch for non-compliant parameters; split and retry.
200*—<node message>YesNo—Node performed computation and was billed. Inspect revert reason/data or call parameters; do not blindly retry.
408408—Request timed out after 35s between request header completion and responsePossibleYesWait a few seconds before retrying read callsCalls may have reached node and could be billed. For read calls, retry with backoff. For write calls (e.g. eth_sendRawTransaction), check transaction status by hash first.

WebSocket Close Codes

WebSocket connection close codes and recommended client actions.

CodeReasonMeaningRetryableWait Time (Retry-After)Agent Action
1001—idleYesReconnect as neededReconnect as needed.
1003—binary frames are not acceptedNo—Do not reconnect automatically; send UTF-8 text frames only.
1009—message too largeNo—Do not reconnect automatically; split large requests to stay under 1 MiB.
1012—service restartYesReconnect with jittered backoffReconnect with jittered backoff, re-subscribe, and backfill missed data.
1013—chain unavailable; overloadedYesReconnect with exponential full-jitter backoffReconnect with exponential full-jitter backoff, re-subscribe, and backfill missed data.
4402—insufficient balanceNo—Do not reconnect automatically; top up on-chain: get your deposit address from the Console or `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); see the agent top-up guide, or use quota reset in console if eligible.
4404—invalid api keyNo—Do not reconnect automatically; verify or rotate API key in console.
4408—The service closes a session whose push queue passes 512 KiB (524,288 bytes) and drops pending notifications; clients may not receive a close frame (browser reports 1006); treat unexpected disconnects like 4408.YesReconnect with backoff; subscribe to less or read fasterClients should treat an unexpected drop (no close frame received, browser reports 1006) like 4408: reconnect with backoff, re-establish subscriptions, and backfill dropped data with eth_getLogs; subscribe to less, or read faster.
4429—push rate exceededYesReconnect with backoff or reduce subscriptionsReduce subscriptions or reconnect with backoff.
4503—billing unavailableYesReconnect with exponential full-jitter backoffReconnect with exponential full-jitter backoff and re-subscribe.

Data API Errors

Errors returned by the Blockchain Data API endpoints under /v1/data/{chain}/.

HTTPCodeReasonMeaningBilledRetryableWait Time (Retry-After)Agent Action
400bad_request—Duplicate query parameter, invalid query string, or malformed requestNoNo—Inspect query parameters; ensure parameters like limit appear at most once and query parameters are valid.
409not_indexed_yet—Requested block number or window is above as_of_block, or hash resolves above as_of_block (carries indexed_through unless chain has no indexed blocks)NoYesWait a few seconds until indexed_through reaches the blockPoll until the requested block or to_block is at or below indexed_through, or wait for the chain to start writing blocks.
409window_too_large—Block window spans more than 100,000 blocks and clamp parameter was not set to trueNoNo—Narrow block range (from_block to to_block) <= 100,000 blocks, or pass clamp=true.
409too_many_pools—Token matches more than 200 liquidity pools; query by pool dimension insteadNoNo—Query by specific pool address rather than querying all pools for the token.
409span_exceeded—Requested date span exceeds the 90-day maximum limitNoNo—Narrow date range between from_time and to_time to within 90 days.
422no_coverage—Capability not supported on this chain, or requested block is before the coverage windowNoNo—Check `features` and `coverage.from_block` in GET /v1/data/chains (or `data_features` in the free GET /v1/status) before querying.
503unavailable—Data service temporarily unavailableNoYesWait a few seconds and retry with exponential backoffRetry after a brief delay with exponential backoff.
402insufficient_balance—Paid balance or free grant exhausted (when balance is known, error.data includes balance_units and balance_cu)NoNo—Top up on-chain: get your deposit address from the Console or `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); see the agent top-up guide, or wait for the free allowance to refill.
429cost_exceeds_burst—A single request costs more than the key's burst capacityNoNo—Split the request into smaller ones; retrying it as sent never succeeds.
503gateway_overloaded—Data API capacity is temporarily unavailableNoYesRetry-After: 1 secondReduce concurrent requests across this account's keys and chains; wait Retry-After before retrying. error.data.reason is null.

Console, Account & Faucet API Errors

Errors returned by the management, key provisioning, authentication, and faucet endpoints under /v1/.

HTTPCodeReasonMeaningBilledRetryableWait Time (Retry-After)Agent Action
409topup_disabled—Top-up paused or no available networks for top-up at this time; new addresses cannot be allocated, but existing allocated addresses remain assigned to the accountNoNo—Check top-up availability via GET /v1/topup/status; retry later when top-up is enabled.
503deposit_unavailable—Unable to allocate a deposit address temporarily; retry per Retry-After headerNoYesHonor Retry-After header (seconds) and use exponential backoffRetry per the Retry-After header with exponential backoff.
400invalid_requestinvalid_usernameUsername exceeds 64 Unicode characters after trimming, or contains a control character (Cc) or lone surrogate (Cs)NoNo—Surrounding whitespace is trimmed, and an empty result is treated as null. Otherwise use at most 64 Unicode characters without control characters (Cc) or lone surrogates (Cs).
400invalid_requestexpires_atKey expiration time is not in the future or exceeds the maximum allowed key validity periodNoNo—Set expires_at to a future RFC 3339 timestamp within the allowed validity period (default 365 days), or use expires_in_secs.
400invalid_requestcu_capThe cu_cap parameter is out of bounds (must be an integer between 1 and 9007199254740991)NoNo—Adjust cu_cap to be an integer between 1 and 9007199254740991 or omit it for unlimited CU.
400siwe_invalidexpiredSign-In with Ethereum (SIWE) message has expired or nonce was already usedNoYesFetch a new challenge immediately and signRequest a fresh challenge from /v1/auth/siwe/challenge and sign the newly issued statement.
400siwe_invalidchain_mismatchSIWE message chainId does not match server settingsNoNo—Use the chainId returned by /v1/auth/siwe/challenge when constructing the SIWE message.
400siwe_invaliddomain_mismatchSIWE message domain does not match server hostNoNo—Ensure domain and uri match the server host returned in challenge.
400siwe_invalidsignatureSIWE cryptographic signature verification failedNoNo—Verify that the message was signed by the private key corresponding to the specified address.
409key_limit_reachedactive_keysUnrevoked, unexpired API keys (including disabled keys) reached maximum account limitNoNo—Revoke an existing unused key before creating a new key.
409no_reset_availablenothing_to_resetBalance is already at or above the reset target; reset opportunity is preservedNoNo—No reset needed currently; use reset opportunity after balance is depleted.
429rate_limiteddaily_creationsAccount 24-hour key creation limit reachedNoYesHonor Retry-After header (seconds)Honor Retry-After and wait for creation quota to become available; rotation uses the same quota.
429signup_rate_limitedper_ipSign-up rate limit reached for the client IP subnetNoYesHonor Retry-After header (seconds)Wait for the Retry-After interval before creating a new account from this network.
429signup_rate_limitedglobalGlobal new user registration rate limit reached across all sourcesNoYesHonor Retry-After header (seconds)Wait for the Retry-After interval before retrying account creation.
400oauth_invalid—OAuth parameter invalid or callback state unknown, expired, or already usedNoYes—Initiate a fresh OAuth login flow from /v1/auth/{provider}/start.
400login_code_invalid—Login code unknown, expired, already consumed, or PKCE verifier mismatchNoNo—Restart login to obtain a fresh login code.
401unauthenticated—Missing session, or session token is invalid, expired, or revoked; on top-up API (/v1/topup/*), this also occurs when Authorization header contains a non-Bearer or invalid token instead of x-api-keyNoNo—Sign in again to acquire a new Bearer session token; on top-up API, use x-api-key request header instead of Authorization header to pass API key.
403user_disabled—Account has been suspended by administrationNoNo—Contact contact@blockvectra.com for account support.
404provider_disabled—OAuth provider is recognized but currently disabledNoNo—Use SIWE or another supported authentication provider.
409identity_in_use—Identity (wallet or OAuth account) is already bound to another userNoNo—Unbind the identity from the previous account or use a different identity.
409identity_limit_reached—Maximum number of linked identities (5) reached for this accountNoNo—Unbind an unnecessary identity before linking a new one.
409last_identity—Cannot unbind the sole remaining identity from the accountNoNo—Bind another identity first before removing this one.
409key_not_active—Attempted to rotate an API key that is disabled, revoked, or expiredNoNo—Create a new key or rotate an active key.
409no_reset_available—No quota reset opportunities remain on this accountNoNo—Top up on-chain: get your deposit address from the Console or `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); see the agent top-up guide, or wait for the next promotion cycle.
413payload_too_large—Request body exceeds the 64 KiB size limitNoNo—Reduce request body size below 64 KiB.
503signup_paused—Global new user registrations are temporarily paused; existing logins unaffectedNoYesRetry registration laterNew user sign-ups temporarily paused; check status and try again later.
503usage_unavailable—Usage reporting service is temporarily unavailableNoYesWait a few seconds and retryOnly affects /usage endpoint; other endpoints work normally. Retry shortly.
500internal—Unexpected server errorNoYesRetry after a brief delayRetry request with exponential backoff.
400invalid_addressinvalid_addressRecipient address format or checksum is invalidNoNo—Use 0x followed by 40 hexadecimal characters, lowercase or EIP-55 checksummed; check data.field (/address).
503faucet_emptyfaucet_emptyThe faucet has insufficient funds for the claim and transaction feeNoYesHonor Retry-After header (seconds)Wait for Retry-After before retrying; do not assume test ETH has been sent without an accepted response.
503service_unavailableservice_unavailableFaucet claim processing is temporarily unavailable, or a previous claim has no receipt yetNoYesHonor Retry-After header (seconds)Wait for Retry-After before retrying; do not assume test ETH has been sent without an accepted response.

Push API Errors

Errors from webhook subscription management and event history under /v1/push/.

HTTPCodeReasonMeaningBilledRetryableWait Time (Retry-After)Agent Action
400invalid_request—Invalid request fields, addresses, pagination or block range.NoNo—Inspect data.field and data.invalid; correct the request.
401missing_api_key—Missing x-api-key.NoNo—Supply your API key in x-api-key.
401invalid_api_key—Unknown, disabled or revoked API key.NoNo—Use an active key from your account.
402insufficient_balance—Balance or free allowance exhausted for event history.NoNo—Inspect data.reason (balance_exhausted or free_grant_exhausted) and data.balance_units / data.balance_cu when present; top up via data.topup_url or data.deposit_address_url.
403key_cap_exhausted—API key CU cap exhausted for event history.NoNo—Inspect data.cu_cap and create a new key in the console.
403key_expired—API key has expired.NoNo—Use an unexpired key from your account.
404not_found—Route, method or subscription not found.NoNo—Check the path, method and subscription ownership.
409limit_reached—Account subscription or address-pair limit reached.NoNo—Inspect data.limit and data.max; reduce subscriptions or addresses.
413request_too_large—Request body exceeds the route limit.NoNo—Split the address batch or reduce the body size.
422chain_not_available—Chain unavailable for push or absent from the subscription.NoNo—Check GET /v1/push/chains and the subscription chains.
422chains_required—At least one chain is required.NoNo—Provide a nonempty chains object; use offline status to stop listening.
422confirmations_out_of_range—Confirmation depth outside the chain range.NoNo—Choose confirmations within data.min and data.max.
422destination_not_allowed—Receiving URL is not allowed.NoNo—Inspect data.rule; use an HTTPS hostname on port 443 without userinfo or fragment.
422block_out_of_range—Block range outside available replay or history coverage.NoNo—Use data.min_block and data.max_block to adjust the range.
429cost_exceeds_burst—History request cost exceeds key burst capacity.NoNo—Inspect data.reason (request_exceeds_burst) and data.max; increase burst capacity before retrying. Retrying unchanged does not help.
429rate_limited—Management or history query rate limit reached.NoYesWait the seconds in Retry-After.For history, inspect data.reason (key_rate_limit or free_plan_call_limit); wait Retry-After seconds and reduce request frequency or concurrency.
500internal_error—Unexpected service error.NoNo—Keep x-bv-request-id and contact support.
503auth_unavailable—API key validation temporarily unavailable.NoYesWait the seconds in Retry-After.Wait Retry-After seconds before retrying.
503billing_unavailable—History billing state temporarily unavailable.NoYesWait the seconds in Retry-After.Wait Retry-After seconds before retrying.
503upstream_unavailable—Push service temporarily unreachable.NoYesWait the seconds in Retry-After.Wait Retry-After seconds before retrying.
503service_unavailable—Push service or address capacity temporarily unavailable.NoYesWait the seconds in Retry-After.Wait Retry-After seconds before retrying.

For Webhook subscription or replay errors, follow the Push delivery recovery guide. Receiver integration starts with raw-body signature verification; the stablecoin payment example adds event deduplication, receipt checks, gap backfill and reorg reconciliation. See billing rules for metering and WebSocket reconnection for connection-based subscriptions.

For logs_range_too_large, check the eth_getLogs method parameters and follow the block range limit and chunked queries guide.

For faucet claims on Robinhood Chain, see the testnet faucet guide for eligibility and handling of shared error codes.

When debugging parameter encoding for eth_estimateGas or eth_call, encode Quantity and Data as described in EIP-1474 value encoding: do not use JavaScript Number for large integers, never catch an encoding failure and default it to zero, and read the actual returned code, reason and HTTP status before classifying it — invalid params is not automatically a slippage or retry/backoff condition.

Last updated: