Що не тарифікується: коди помилок та правила тарифікації
Детальний розбір правил тарифікації для кодів стану 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-запиту, заголовки та безперервність передачі |
| 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 (або попередній запит OPTIONS для CORS) |
| 401 | JSON, -32024 (missing_api_key або invalid_api_key) | Відсутній ключ для відомої мережі, ключ невідомий або вимкнений | Ні | Передайте активний API key у заголовку x-api-key (щойно створені або змінені ключі починають діяти за кілька секунд; зачекайте трохи й повторіть) |
| 404 | JSON, -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-заголовки |
| 429 | JSON, -32005 або -32022; містить Retry-After для обмежень швидкості (-32005); для лімітів burst/розміру пакета (-32022) не містить його | Баланс накопичувача вичерпано → -32005; вартість одного запиту в CU перевищує ємність burst → -32022; ліміт частоти викликів акаунта вичерпано → -32005; кількість викликів в одному запиті перевищує ліміт → -32022 | Ні | Для -32005 із Retry-After зачекайте зазначену кількість секунд перед повтором; для -32022 розділіть запит або зменшіть розмір пакета (повторна спроба без змін ніколи не буде успішною) |
| 503 | JSON, -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 | Повідомлення | Причина | Тарифікується? | Рекомендована дія |
|---|---|---|---|---|---|---|
| -32700 | BlockVectra | 200 | parse error | - | Ні (коштує 1 токен rate-limit у CU) | Виправте синтаксис JSON у запиті |
| -32600 | BlockVectra | 200 | invalid request | invalid_request | Ні (коштує 1 токен rate-limit у 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 hex-символи) |
| -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 були нижчими за ємність burst |
| -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 | Node | 200 | pruned history unavailable | - | Ні | Запитаний блок було очищено (pruned) вузлом; не тарифікується; не впливає на пакет |
| -32000 | Node | 200 | historical state ... is not available | - | Ні | За межами вікна історії стану вузла; не тарифікується; не впливає на пакет |
| -32000 | Node | 200 | old data not available due to pruning... | - | Ні | За межами вікна історії вузла (вікно визначається state_window_blocks); не тарифікується; не впливає на пакет |
| -32002 | Node | 200 | <node message> | - | Ні | Вузол перевищив таймаут для пакета та скасував виклик; не тарифікується; сповіщення в пакеті також не тарифікуються |
| -32003 | Node | 200 | <node message> | - | Ні | Відповідь пакета вузла занадто велика, виклик скасовано; не тарифікується; сповіщення в пакеті також не тарифікуються |
| -32601 | Node | 200 | <node message> | - | Ні | Наданий метод не реалізовано вузлом; використовуйте інший підтримуваний метод |
| -32603 | Node | 200 | <node message> | - | Ні | Внутрішній збій вузла; повторіть спробу з експоненціальною затримкою |
| -32600 | Node | 200 | <node message> | - | Ні | Весь пакет відхилено вузлом; не тарифікується; сповіщення в пакеті також не тарифікуються |
| Інше | Node | 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") | Ні (враховується в 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 не приймаються). Відсутній заголовок повертає 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: ємність 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.
Процес ончейн-поповнення
Якщо балансу вашого акаунта недостатньо або вам потрібна вища пропускна здатність, поповніть рахунок ончейн у консолі за такими кроками:
- Увійдіть до Консолі: авторизуйтеся в Консолі BlockVectra.
- Перейдіть на сторінку Billing: відкрийте сторінку Billing.
- Отримайте виділену адресу: у блоці ончейн-поповнення скопіюйте виділену адресу поповнення для вашого акаунта або відскануйте QR-код.
- Перекажіть кошти: переказуйте кошти лише за допомогою підтримуваних мереж та USDC / USDT / USDG, перелічених на сторінці. Підтримувані мережі та мінімальні суми поповнення наведені в консолі.
- Автоматичне зарахування: після виявлення ончейн транзакції відображаються як «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. Оплачувані адреси-дні враховуються після вичерпання ліміту безкоштовних адрес акаунта.
Наступні кроки
- Перегляньте каталог наборів даних, щоб побачити кожен набір даних, який індексує BlockVectra.
- Ознайомтеся з безкоштовним планом та цінами, щоб перевірити, що включено у ваш акаунт.
- Увійдіть до консолі, щоб створити API key.
Востаннє оновлено:
Webhook push
Створюйте підписки на адреси через HTTP, перевіряйте підписи сирого тіла запиту, дедуплікуйте ID подій та відновлюйте збережені збіги або пропущені блоки.
Програмне поповнення для агентів
Поповнюйте акаунт RPC та Data API ончейн через HTTP. Розробники та AI-агенти використовують API key для перевірки підтримуваних токенів, отримання виділеної адреси депозиту та опитування статусу зарахування.