Что не тарифицируется: коды ошибок и правила списания

Подробный обзор правил тарификации для кодов состояния 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-запроса, заголовки и непрерывность передачи данных
402JSON, -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)
401JSON, -32024 (missing_api_key или invalid_api_key)Отсутствует ключ для известной сети, ключ неизвестен или отключенНетПередайте активный API key в заголовке x-api-key (новые или смененные ключи активируются через несколько секунд; подождите немного и повторите попытку)
404JSON, -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-заголовков
429JSON, -32005 или -32022; содержит Retry-After для ограничений скорости (-32005); лимиты всплесков/размера пакетов (-32022) его не содержатБаланс корзины исчерпан → -32005; CU одиночного запроса превышает емкость всплеска → -32022; исчерпан лимит частоты вызовов аккаунта → -32005; количество вызовов в одном запросе превышает лимит → -32022НетПри получении -32005 с Retry-After подождите указанное количество секунд перед повторной попыткой; при -32022 разделите запрос или уменьшите размер пакета (повтор в неизменном виде никогда не будет успешным)
503JSON, -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СообщениеПричинаТарифицируется?Рекомендуемое действие
-32700BlockVectra200parse error-Нет (расходует 1 токен лимита скорости CU)Исправьте синтаксис JSON в запросе
-32600BlockVectra200invalid requestinvalid_requestНет (расходует 1 токен лимита скорости CU)Исправьте синтаксис и структуру запроса JSON-RPC
-32600BlockVectra200batch too large: max <N> callsbatch_too_large (+max)НетРазделите пакет на части в пределах лимита (стандартный лимит пакета — 100 вызовов)
-32600BlockVectra200invalid request: ambiguous member nameinvalid_requestНетУдалите дублирующиеся или неоднозначные имена полей в объектах JSON
-32601BlockVectra200method not available: <method>-НетВызывайте только методы, разрешенные для этой сети (см. Поддерживаемые сети)
-32600BlockVectra404unknown chainunknown_chainНетПроверьте имя сети в URL
-32602BlockVectra200eth_getLogs block range too large: max <N> blocks-НетСузьте диапазон блоков для eth_getLogs (лимит определяется для каждой сети, например 1000 блоков)
-32602BlockVectra200tracer not allowed-НетИспользуйте разрешенный нативный трассировщик (callTracer, flatCallTracer, prestateTracer, 4byteTracer, noopTracer или опустите параметр)
-32602BlockVectra200trace timeout not allowed-НетУкажите корректную строку длительности Go с таймаутом ≤ 30s
-32010BlockVectra200node is syncing; calls are temporarily unavailable-НетУзел синхронизируется, повторите попытку позже (кроме eth_chainId)
-32011BlockVectra200historical state is not available beyond the most recent <N> blocks-НетЗапросите более поздний блок (целевой блок должен находиться в пределах окна состояния; избегайте тегов safe/finalized/earliest)
-32000BlockVectra200transaction not foundnot_foundНетПроверьте хеш транзакции (0x + 64 шестнадцатеричных символа)
-32000BlockVectra200block not foundnot_foundНетПроверьте хеш или номер блока
-32000BlockVectra200upstream response too largeresponse_too_largeНетСузьте область запроса или разделите запросы
-32005BlockVectra200-overloadedНетСервер временно перегружен, повторите попытку позже
-32005BlockVectra429rate limit exceededkey_rate_limit / free_plan_call_limit / concurrency_limitНетУменьшите частоту запросов; учитывайте Retry-After при его наличии
-32022BlockVectra429request cost <N> CU exceeds burst capacity <M> CUrequest_exceeds_burstНетРазделите запрос или пакет, чтобы объем CU одиночного запроса был ниже емкости всплеска
-32022BlockVectra429request has <N> calls, exceeding the free-plan limit of <M> calls per secondfree_plan_batch_too_large (+max)НетРазделите пакет, чтобы уложиться в посекундный лимит, или перейдите на платный тариф
-32603BlockVectra200upstream unavailableupstream_unavailableНетСбой связи с апстримом, повторите попытку позже
-32603BlockVectra200no response from upstreamupstream_unavailableНетАпстрим не ответил, повторите попытку позже
-32603BlockVectra200malformed upstream responseupstream_unavailableНетНекорректный ответ апстрима, повторите попытку позже
-32603BlockVectra200--НетРедкая внутренняя ошибка, повторите попытку позже
-32020BlockVectra402insufficient balancebalance_exhausted / free_grant_exhausted (+topup_url, и +balance_units / balance_cu, когда баланс известен)НетПроверьте баланс в консоли на странице биллинга или через GET /v1/topup/deposit-address (инструмент MCP get_deposit_address); выполните ончейн-пополнение на выделенный адрес аккаунта (см. руководство по пополнению для агентов)
-32021BlockVectra503billing data temporarily unavailable-НетДанные биллинга синхронизируются (это не проблема баланса); подождите Retry-After секунд и повторите попытку
4444Узел200pruned history unavailable-НетЗапрошенный блок был удален узлом (pruned); не тарифицируется; не влияет на пакет
-32000Узел200historical state ... is not available-НетВне окна истории состояния узла; не тарифицируется; не влияет на пакет
-32000Узел200old 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); выполните ончейн-пополнение на выделенный адрес аккаунта (см. руководство по пополнению для агентов)
401API 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 не принимаются). Отсутствие заголовка возвращает 401 missing_api_key; недействительные или отозванные ключи возвращают 401 invalid_api_key. (Истекшие ключи возвращают 403 key_expired; временная недоступность сервиса возвращает 503 auth_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 и лимиты всплесков.

Процесс ончейн-пополнения

Когда баланса аккаунта недостаточно или вам требуется более высокая пропускная способность, выполните ончейн-пополнение в консоли, следуя этим шагам:

  1. Войдите в консоль: выполните вход в консоль BlockVectra.
  2. Перейдите на страницу биллинга: откройте страницу биллинга.
  3. Получите выделенный адрес: в карточке ончейн-пополнения скопируйте выделенный адрес пополнения вашего аккаунта или отсканируйте QR-код.
  4. Переведите средства: выполняйте перевод только в поддерживаемых сетях и в USDC / USDT / USDG, указанных на странице. Поддерживаемые сети и минимальные суммы пополнения отображаются в консоли.
  5. Автоматическое зачисление: после обнаружения в сети транзакции отображаются в статусе "В обработке"; после подтверждения кредиты автоматически зачисляются на ваш баланс.

Важные примечания:

  • Используйте только те сети и токены, которые явно указаны в консоли. Переводы в неподдерживаемых сетях или с неправильными токенами не могут быть зачислены автоматически.
  • Убедитесь, что каждый перевод соответствует минимальной сумме пополнения, указанной в консоли.
  • После зачисления первого платного пополнения ваш аккаунт переводится на платный тариф, что снимает посекундный лимит вызовов бесплатного плана.

Агенты или серверные программы могут напрямую вызывать эндпоинты пополнения с помощью 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. Тарифицируемые адрес-дни учитываются после исчерпания бесплатного лимита адресов аккаунта.

Следующие шаги

Последнее обновление:

На этой странице