Что не тарифицируется: коды ошибок и правила списания
Подробный обзор правил тарификации для кодов состояния 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-сообщение (невозможно разобрать строку запроса или заголовки, недействительный chunked encoding) или интервал более 10 с между чтениями тела запроса | Нет | Проверьте синтаксис HTTP-запроса, заголовки и непрерывность передачи данных |
| 402 | JSON, -32020 | Недостаточный баланс, лимит исчерпан; если баланс известен, error.data включает balance_units и balance_cu | Нет | Проверьте баланс в консоли на странице биллинга или через GET /v1/topup/deposit-address (инструмент MCP get_deposit_address); выполните ончейн-пополнение на выделенный адрес аккаунта (см. руководство по пополнению для агентов) |
| 403 | Пусто | Методы, отличные от POST или OPTIONS на /v1/{chain} или /v1/{chain}/{api_key} (независимо от того, известно ли имя сети) | Нет | Измените метод HTTP-запроса на POST (или preflight-запрос cross-origin OPTIONS) |
| 401 | JSON, -32024 (missing_api_key или invalid_api_key) | Отсутствует ключ для известной сети, ключ неизвестен или отключен | Нет | Передайте активный API key в заголовке x-api-key (новые или смененные ключи активируются через несколько секунд; подождите немного и повторите попытку) |
| 404 | JSON, -32600 (reason = unknown_chain) | POST к неизвестной {chain} | Нет | Проверьте имя сети в URL по списку поддерживаемых сетей (должен быть точный слаг в нижнем регистре) |
| 404 | Пустое тело | Несоответствующий путь (например, POST /v1, /v1/, POST /v1/{chain}/) | Нет | Укажите сеть в URL (/v1/{chain}) |
| 408 | Пусто | Прошло более 35 с с момента чтения заголовков запроса до возврата ответа | Возможно: вызовы, уже переданные на узел, тарифицируются в обычном порядке после получения ответа от узла | Не повторяйте безусловно вызовы, изменяющие состояние (например, eth_sendRawTransaction); отключение клиента не отменяет уже отправленные на узел вызовы |
| 413 | Пусто | Тело запроса > 2 МиБ (2 097 152 байт) | Нет | Сохраняйте размер тела запроса менее 2 МиБ; разбивайте пакеты на запросы меньшего размера |
| 414 / 431 | Пусто | Слишком длинный URI (414) или слишком большие заголовки запроса (431) | Нет | Сократите URI запроса или уменьшите размер HTTP-заголовков |
| 429 | JSON, -32005 или -32022; содержит Retry-After для ограничений скорости (-32005); лимиты всплесков/размера пакетов (-32022) его не содержат | Баланс корзины исчерпан → -32005; CU одиночного запроса превышает емкость всплеска → -32022; исчерпан лимит частоты вызовов аккаунта → -32005; количество вызовов в одном запросе превышает лимит → -32022 | Нет | При получении -32005 с Retry-After подождите указанное количество секунд перед повторной попыткой; при -32022 разделите запрос или уменьшите размер пакета (повтор в неизменном виде никогда не будет успешным) |
| 503 | JSON, -32021, с Retry-After | Данные биллинга временно недоступны; сервер временно отклоняет запрос (это не проблема баланса, пополнять счет не требуется); вновь созданные ключи возвращают этот ответ до синхронизации данных биллинга (обычно несколько секунд) | Нет | Это не проблема баланса, пополнять счет не требуется; подождите количество секунд, указанное в Retry-After, и повторите попытку |
Примечание: при доступе через Cloudflare могут возвращаться страницы ошибок 52x или 1015; они генерируются не сервисом.
Заголовки ответа со списаниями и балансом: при передаче заголовка
x-bv-meter: 1в HTTP-запросах (применимо как к JSON-RPC, так и к Data API) ответ, в котором был списан хотя бы один вызов, возвращаетx-bv-cu-charged(объем Compute Units, списанных за этот запрос, или сумму по тарифицируемым вызовам в пакете) иx-bv-balance-units(остаток расчетных единиц на балансе аккаунта сразу после этого списания; отрицательный при перерасходе; опускается, если баланс неизвестен). В запросах безx-bv-meter: 1, ответах без списаний, а также в ответах с ошибками 402, 403, 429 или 503 оба заголовка опускаются. Эти заголовки ответов доступны скриптам браузера через CORS, тогда как WebSocket их не использует. Из баланса вычитается общий объем еще не списанного использования, однократно округленный вверх до целых единиц; ежечасный расчет округляется вниз, поэтому отображаемый баланс после списания может увеличиться максимум на одну единицу.
Коды ошибок JSON-RPC и правила тарификации
Один и тот же код ошибки может исходить как от платформы, так и от узла, и тарификация различается:
- Ошибки, сгенерированные самой платформой: никогда не тарифицируются;
- Ошибки, возвращенные узлом: передаются без изменений и тарифицируются по весу метода, за исключением лишь перечисленных ниже кодов ошибок узла.
Детали правил
- Ошибки узла, которые не тарифицируются: ошибки узла
-32002(таймаут пакета),-32003(слишком большой ответ на пакет) и-32600(пакет отклонен целиком) указывают на то, что узел досрочно прервал обработку вызова; они и любые уведомления в том же пакете не тарифицируются. Ошибки узла-32601(доступный метод не реализован) и-32603(внутренний сбой узла) не тарифицируются по HTTP или WebSocket и не влияют на другие вызовы или уведомления в пакете. Кроме того, ошибки4444(удаленный/pruned блок) и-32000(историческое состояние вне окна истории состояния узла, заданного параметромstate_window_blocksвGET /v1/chains) не тарифицируются и не влияют на другие вызовы в пакете. - Ошибки узла, которые тарифицируются: другие ошибки, возвращаемые узлом, тарифицируются по весу метода, когда они отражают результат выполнения в сети, например
execution reverted(-32000или3сdata), собственная ошибка узла-32602 invalid argument. - Допуск по балансу и синхронизация: код
-32020указывает на недостаточный баланс аккаунта и требует пополнения; когда баланс известен, поляerror.data.balance_unitsиerror.data.balance_cuсодержат остаток (он может быть отрицательным). Вновь созданный ключ может в течение нескольких секунд возвращать-32021(503); подождите время изRetry-Afterи повторите попытку. - Сбои апстрима: ошибка
-32603, сгенерированная платформой из-за сбоя связи с апстримом или некорректного ответа (upstream unavailable,no response from upstream,malformed upstream response), содержит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 | - | Нет | Укажите корректную строку длительности Go с таймаутом ≤ 30s |
| -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 шестнадцатеричных символа) |
| -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) | Нет | Разделите пакет, чтобы уложиться в посекундный лимит, или перейдите на платный тариф |
| -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); выполните ончейн-пополнение на выделенный адрес аккаунта (см. руководство по пополнению для агентов) |
| -32021 | BlockVectra | 503 | billing data temporarily unavailable | - | Нет | Данные биллинга синхронизируются (это не проблема баланса); подождите Retry-After секунд и повторите попытку |
| 4444 | Узел | 200 | pruned history unavailable | - | Нет | Запрошенный блок был удален узлом (pruned); не тарифицируется; не влияет на пакет |
| -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> | - | Нет | Внутренний сбой узла; повторите попытку с задержкой (backoff) |
| -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); выполните ончейн-пополнение на выделенный адрес аккаунта (см. руководство по пополнению для агентов) |
| 401 | API key отсутствует, неизвестен или отключен (error.code: "missing_api_key" или "invalid_api_key") | Нет | Передайте активный API key в заголовке x-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(ключи в пути URL и токены Bearer не принимаются). Отсутствие заголовка возвращает 401missing_api_key; недействительные или отозванные ключи возвращают 401invalid_api_key. (Истекшие ключи возвращают 403key_expired; временная недоступность сервиса возвращает 503auth_unavailableилиbilling_unavailableсRetry-After.) - Ограничение частоты: действует независимый лимит в 5 запросов в секунду на ID ключа, не зависящий от учета CU и биллинга. Превышение лимита возвращает HTTP 429
rate_limitedс заголовкомRetry-After.
Поля ответа:
key_id: строка идентификатора API key.plan: тип плана аккаунта (free, если у аккаунта есть лимит частоты вызовов бесплатного плана; иначеpaid).balance_units: оставшийся баланс аккаунта в расчетных единицах (может быть нулевым или отрицательным).balance_cu: оставшийся баланс, пересчитанный в Compute Units (CU).balance_as_of_age_ms: количество миллисекунд, прошедших с момента считывания баланса из источника данных.key: специфичные для ключа лимиты и сведения о квотах:cu_per_sec: скорость пополнения токен-бакета в CU в секунду.burst_cu: емкость всплеска токен-бакета в CU.cu_cap: общий лимит CU за все время жизни для этого ключа илиnull, если лимит не установлен.cu_cap_remaining: остаток CU в рамкахcu_capили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:
- Чтобы ознакомиться с весами всех методов и операций, см. таблицу весов методов и правила учета CU в JSON-RPC.
- Цены планов и детали списаний см. на странице Цены.
- Переход на платный тариф: платное пополнение снимает посекундное ограничение вызовов бесплатного плана; для каждого ключа продолжают действовать лимиты скорости CU и лимиты всплесков.
Процесс ончейн-пополнения
Когда баланса аккаунта недостаточно или вам требуется более высокая пропускная способность, выполните ончейн-пополнение в консоли, следуя этим шагам:
- Войдите в консоль: выполните вход в консоль BlockVectra.
- Перейдите на страницу биллинга: откройте страницу биллинга.
- Получите выделенный адрес: в карточке ончейн-пополнения скопируйте выделенный адрес пополнения вашего аккаунта или отсканируйте QR-код.
- Переведите средства: выполняйте перевод только в поддерживаемых сетях и в USDC / USDT / USDG, указанных на странице. Поддерживаемые сети и минимальные суммы пополнения отображаются в консоли.
- Автоматическое зачисление: после обнаружения в сети транзакции отображаются в статусе "В обработке"; после подтверждения кредиты автоматически зачисляются на ваш баланс.
Важные примечания:
- Используйте только те сети и токены, которые явно указаны в консоли. Переводы в неподдерживаемых сетях или с неправильными токенами не могут быть зачислены автоматически.
- Убедитесь, что каждый перевод соответствует минимальной сумме пополнения, указанной в консоли.
- После зачисления первого платного пополнения ваш аккаунт переводится на платный тариф, что снимает посекундный лимит вызовов бесплатного плана.
Агенты или серверные программы могут напрямую вызывать эндпоинты пополнения с помощью API key; см. руководство по программному пополнению для агентов.
Тарификация Webhook push
Для Push действуют отдельные веса для доставленных событий данных, успешных запросов истории и тарифицируемых адресо-дней. Вызовы управления, кроме истории событий, неудачные попытки доставки, автоматические повторы и служебные события бесплатны. Каждое доставленное событие тарифицируется один раз; повторная отправка клиентом и канонические события, доставленные повторно после реорганизации блоков, являются новыми тарифицируемыми доставками. Плата за адреса рассчитывается по максимальному количеству адресов каждой подписки во время ее нахождения онлайн в течение суток UTC; бесплатная квота адресов аккаунта распределяется между подписками, причем более старые подписки используют ее первыми. Адрес, присутствующий в двух подписках, учитывается дважды; добавление сетей изменяет плату за события, но не за адреса.
См. руководство по Blockchain 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 группы. Один и тот же адрес в двух группах учитывается дважды; количество сетей в группе не умножает количество адресов. Группа, находившаяся офлайн или удаленная в течение всего дня, ничего не добавляет. Для каждой группы остаток после вычета ее доли бесплатного лимита умножается на вес CU `push.address_day` в `method_weights`. Текущий настроенный лимит исходит из той же ценовой политики, что и плата за адрес-день; это не лимит емкости аккаунта и не отдельный лимит на каждую группу.
Пример: 10 доставленных событий native.transfer, 2 успешных запроса истории и 10 тарифицируемых адрес-дней стоят 10 × 150 + 2 × 25 + 10 × 33 = 1880 CU. Тарифицируемые адрес-дни учитываются после исчерпания бесплатного лимита адресов аккаунта.
Следующие шаги
- Изучите каталог наборов данных, чтобы увидеть все наборы данных, индексируемые BlockVectra.
- Ознакомьтесь с бесплатным тарифом и ценами, чтобы узнать, что включено в ваш аккаунт.
- Войдите в консоль, чтобы создать API key.
Последнее обновление:
Base
Подключайтесь к Base mainnet с помощью публичного RPC URL или API key. Примеры для curl и viem, поддерживаемые методы, лимиты и статус Data API.
Сравнение с Chainstack
Используйте BlockVectra для чтения поддерживаемых EVM-сетей с оплатой по методам, без ежемесячной RPC-подписки, и сравнивайте затраты после исчерпания включенных единиц запросов.