Що не тарифікується: коди помилок та правила тарифікації

Детальний розбір правил тарифікації для кодів стану 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ПорожнєУсі виклики в запиті є сповіщеннями (notifications)Сповіщення тарифікуються у звичайному порядкуДодаткових дій не потрібно
400ПорожнєНекоректне повідомлення HTTP (неможливо розпарсити рядок запиту або заголовки, недійсне кодування chunked), або понад 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 (або попередній запит OPTIONS для CORS)
401JSON, -32024 (missing_api_key або invalid_api_key)Відсутній ключ для відомої мережі, ключ невідомий або вимкненийНіПередайте активний API key у заголовку x-api-key (щойно створені або змінені ключі починають діяти за кілька секунд; зачекайте трохи й повторіть)
404JSON, -32600 (reason = unknown_chain)POST до невідомої {chain}НіПеревірте назву мережі в URL за списком Підтримувані мережі (має бути точний ідентифікатор малими літерами)
404Порожнє тіло (empty body)Невідповідний шлях (наприклад, 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-заголовки
429JSON, -32005 або -32022; містить Retry-After для обмежень швидкості (-32005); для лімітів burst/розміру пакета (-32022) не містить йогоБаланс накопичувача вичерпано → -32005; вартість одного запиту в CU перевищує ємність burst → -32022; ліміт частоти викликів акаунта вичерпано → -32005; кількість викликів в одному запиті перевищує ліміт → -32022НіДля -32005 із Retry-After зачекайте зазначену кількість секунд перед повтором; для -32022 розділіть запит або зменшіть розмір пакета (повторна спроба без змін ніколи не буде успішною)
503JSON, -32021, із Retry-AfterДані білінгу тимчасово недоступні; сервер тимчасово відхиляє запит (це не проблема з балансом, поповнювати рахунок не потрібно); новостворені ключі повертають цю помилку до завершення синхронізації даних білінгу (зазвичай кілька секунд)НіЦе не проблема з балансом, поповнення не потрібне; зачекайте вказану в Retry-After кількість секунд і повторіть спробу

Примітка: під час доступу через Cloudflare сервіс 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 (очищений блок) та -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 токен rate-limit у CU)Виправте синтаксис JSON у запиті
-32600BlockVectra200invalid requestinvalid_requestНі (коштує 1 токен rate-limit у 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 hex-символи)
-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 були нижчими за ємність burst
-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 секунд і повторіть
4444Node200pruned history unavailable-НіЗапитаний блок було очищено (pruned) вузлом; не тарифікується; не впливає на пакет
-32000Node200historical state ... is not available-НіЗа межами вікна історії стану вузла; не тарифікується; не впливає на пакет
-32000Node200old data not available due to pruning...-НіЗа межами вікна історії вузла (вікно визначається state_window_blocks); не тарифікується; не впливає на пакет
-32002Node200<node message>-НіВузол перевищив таймаут для пакета та скасував виклик; не тарифікується; сповіщення в пакеті також не тарифікуються
-32003Node200<node message>-НіВідповідь пакета вузла занадто велика, виклик скасовано; не тарифікується; сповіщення в пакеті також не тарифікуються
-32601Node200<node message>-НіНаданий метод не реалізовано вузлом; використовуйте інший підтримуваний метод
-32603Node200<node message>-НіВнутрішній збій вузла; повторіть спробу з експоненціальною затримкою
-32600Node200<node message>-НіВесь пакет відхилено вузлом; не тарифікується; сповіщення в пакеті також не тарифікуються
ІншеNode200<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")Ні (враховується в rate limits)Перевірте підтримувані функції через GET /v1/status (безкоштовний параметр без ключа data_features)
429Перевищено ліміт швидкості (error.code: "rate_limited"), або вартість одного запиту перевищує ємність burst для ключа (error.code: "cost_exceeds_burst")НіЗменшіть частоту запитів; розділіть завеликі запити (запит, що перевищує ємність 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 не приймаються). Відсутній заголовок повертає 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: ємність burst накопичувача токенів у 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.
  • Інформацію про ціни планів та деталі розрахунків див. на Сторінці цін.
  • Перехід на платний план: здійснення платного поповнення знімає обмеження кількості викликів на секунду безкоштовного плану (Free Plan); для кожного ключа продовжують діяти ліміти швидкості та burst у CU.

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

Якщо балансу вашого акаунта недостатньо або вам потрібна вища пропускна здатність, поповніть рахунок ончейн у консолі за такими кроками:

  1. Увійдіть до Консолі: авторизуйтеся в Консолі BlockVectra.
  2. Перейдіть на сторінку Billing: відкрийте сторінку Billing.
  3. Отримайте виділену адресу: у блоці ончейн-поповнення скопіюйте виділену адресу поповнення для вашого акаунта або відскануйте QR-код.
  4. Перекажіть кошти: переказуйте кошти лише за допомогою підтримуваних мереж та USDC / USDT / USDG, перелічених на сторінці. Підтримувані мережі та мінімальні суми поповнення наведені в консолі.
  5. Автоматичне зарахування: після виявлення ончейн транзакції відображаються як «Processing»; після зарахування кредити автоматично додаються до вашого балансу.

Важливі примітки:

  • Використовуйте лише ті мережі та токени, які явно вказані в консолі. Перекази в непідтримуваних мережах або з неправильними токенами не можуть бути зараховані автоматично.
  • Переконайтеся, що кожен переказ відповідає мінімальній сумі поповнення, вказаній у консолі.
  • Після зарахування першого платного депозиту ваш акаунт оновлюється до платного, що знімає ліміт викликів на секунду безкоштовного плану.

Програми агентів або серверів можуть викликати ендпоінти поповнення безпосередньо за допомогою API key; див. Посібник з програмного поповнення для агентів.

Тарифікація Push через Webhook

Push має окрему вагу для доставлених подій даних, успішних запитів історії та платних адресо-днів. Виклики керування, окрім історії подій, невдалі спроби доставки, автоматичні повтори та керуючі події є безкоштовними. Кожна доставлена подія тарифікується один раз; повторне відтворення користувачем та канонічні події, надіслані повторно після реорганізації (reorg), є новими тарифікованими доставками. Плата за адреси розраховується за максимальною кількістю адрес у кожній підписці під час її активності впродовж доби 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. Оплачувані адреси-дні враховуються після вичерпання ліміту безкоштовних адрес акаунта.

Наступні кроки

Востаннє оновлено:

На цій сторінці