Один ключ, багато мереж: перемикання прикладу на іншу мережу

Один і той самий API key працює в усіх підтримуваних мережах. Дізнайтеся, як структуровані URL, як програмно знаходити мережі та як об'єднуються баланси й ліміти.

1. Один ключ для всіх підтримуваних мереж

Один і той самий API key працює в усіх підтримуваних мережах для JSON-RPC, а також для Data API в тих мережах, де він доступний. Ключі належать вашому акаунту й не прив'язані до конкретної мережі; немає потреби створювати окремі API key для кожної мережі.

Кредити та обмеження швидкості є спільними для всіх мереж, а також для JSON-RPC API та Data API; вони не розділяються за мережами. Детальні правила тарифікації див. на сторінці цін.

  • Об'єднаний баланс: платні поповнення та безкоштовні кредити діють у всіх мережах. Виклики в будь-якій мережі списуються з одного балансу акаунта.
  • Об'єднані ліміти швидкості: швидкість поповнення обчислювальних одиниць (CU) та пікова місткість діють у всіх мережах для даного ключа. Ліміти викликів на секунду в безкоштовному плані об'єднуються для всіх підтримуваних мереж, а не розділяються для кожної окремо.
  • Шлях оновлення: після поповнення балансу ви більше не обмежені лімітом викликів на секунду безкоштовного плану; кожен ключ залишається підпорядкованим лімітам швидкості CU та пікової місткості, як описано в документації JSON-RPC.

2. Структура URL та параметр {chain}

Кожен запит у межах мережі вказує свою цільову мережу в шляху URL за допомогою {chain}. Параметр {chain} — це ідентифікатор-слаг мережі малими літерами (наприклад, robinhood_mainnet).

СервісАвтентифікаціяШаблон URLОпис
JSON-RPCКлюч у шляху URLPOST /v1/{chain}/{api_key}Найпростіша форма, зручна для curl та HTTP-клієнтів
JSON-RPCКлюч у заголовку запитуPOST /v1/{chain}Передавайте ключ через заголовок запиту x-api-key: {api_key}
Data APIМаршрути RESTGET /v1/data/{chain}/…Передавайте ключ через заголовок запиту x-api-key: {api_key}
Публічний список мережБез автентифікаціїGET /v1/chainsПублічний список мереж та статичні дані (не тарифікується)
Публічний статусБез автентифікаціїGET /v1/statusПоточний статус сервісу та голови ланцюгів (не тарифікується)

GET /v1/chains повертає прапорці jsonrpc та data для кожної мережі. Звертайтеся до мережі за URL-адресами JSON-RPC, коли вона підтримує JSON-RPC, і за GET /v1/data/{chain}/…, коли її прапорець data має значення true (Data API обслуговує лише ці мережі).

Порада: під час передачі ключа через заголовки запиту формуйте URL так, щоб він закінчувався назвою мережі без завершального слеша. JSON-RPC обслуговується виключно за адресами /v1/{chain} та /v1/{chain}/{api_key}. Запити із завершальним слешем (наприклад, /v1/{chain}/) або з відсутнім сегментом мережі повертають HTTP 404 з порожнім тілом. Запити до невідомої мережі {chain} повертають HTTP 404 з error.data.reason: "unknown_chain" (не тарифікується).

3. Програмне виявлення мереж та їхніх можливостей

Підтримувані мережі та їхні можливості надаються динамічно. Не хардкодьте статичний список мереж у вашому застосунку. Натомість виявляйте доступні мережі та їхні можливості під час виконання:

Отримання статичних даних через GET /v1/chains

Цей публічний ендпоінт не потребує автентифікації та не тарифікується, повертаючи всі загальнодоступні мережі:

GET /v1/chains

Приклад відповіді:

{
  "chains": [
    {
      "chain": "robinhood_mainnet", "name": "Robinhood Chain", "chain_id": 4663,
      "jsonrpc": true,
      "data": true,
      "methods": {
        "allow": ["eth_blockNumber", "eth_call", "eth_chainId", "debug_traceTransaction"],
        "deny": ["eth_newFilter", "eth_newBlockFilter", "eth_newPendingTransactionFilter", "eth_getFilterLogs", "eth_getFilterChanges", "eth_uninstallFilter", "eth_subscribe", "eth_unsubscribe"]
      },
      "max_logs_block_range": 1000,
      "state_window_blocks": 900
    }
  ]
}

Опис полів:

  • chain: слаг-ідентифікатор мережі (використовується для {chain} в URL)
  • name: зрозуміла для людини назва, що відображається
  • chain_id: ID ланцюга за EIP-155 (десяткове ціле число)
  • jsonrpc: чи ввімкнено JSON-RPC
  • data: чи ввімкнено Data API
  • methods: політика методів JSON-RPC для цієї мережі, включаючи allow (дозволені методи) та deny (явно заборонені методи)
  • max_logs_block_range: максимальний діапазон блоків, дозволений в одному запиті eth_getLogs
  • state_window_blocks: розмір вікна історичного стану в блоках; null, якщо без обмежень

Перевірка працездатності через GET /v1/status

Цей публічний ендпоінт не потребує автентифікації та не тарифікується, повертаючи інформацію про готовність сервісу та голови ланцюгів:

GET /v1/status

Приклад відповіді:

{
  "checked_at": "2026-09-28T12:00:00Z",
  "gateway": {
    "status": "ok"
  },
  "chains": [
    {
      "chain": "robinhood_mainnet", "name": "Robinhood Chain", "chain_id": 4663,
      "jsonrpc": true,
      "data": true,
      "data_features": ["blocks", "transactions", "address_transactions", "transfers", "token_metadata", "freshness"],
      "status": "ok",
      "head": {
        "block": 73017329,
        "time": "2026-09-28T11:59:58Z",
        "lag_seconds": 2
      }
    }
  ]
}

Опис полів:

  • gateway.status: статус сервісу (ok або degraded)
  • chains[].data_features: можливості, що надаються Data API для цієї мережі
  • chains[].status: робочий статус вузла (ok або unavailable)
  • chains[].head: остання голова блоку (block, time, lag_seconds)

4. Відмінності між мережами, про які слід пам'ятати

Під час перемикання між мережами переглядайте поля, надані в GET /v1/chains:

  1. Дозвіл та політика методів (methods.allow / methods.deny): доступні методи JSON-RPC відрізняються залежно від мережі відповідно до їхньої політики методів. Запит забороненого методу повертає HTTP 200 із кодом помилки JSON-RPC -32601 (method not available, не тарифікується).
  2. Діапазон блоків журналів (max_logs_block_range): максимальні діапазони блоків для запитів eth_getLogs відрізняються залежно від мережі. Перевищення ліміту мережі повертає HTTP 200 із кодом помилки JSON-RPC -32602 (eth_getLogs block range too large, не тарифікується).
  3. Вікно збереження стану (state_window_blocks): мережі з повною історією повертають null. У мережах із прунінгом стану запити історичного стану за межами вікна повертають HTTP 200 із кодом помилки JSON-RPC -32011 (historical state is not available beyond the most recent <N> blocks, не тарифікується).
  4. Можливості та покриття Data API (data / data_features): мережі, які надають датасет, перелічені на сторінці Підтримувані мережі. Запит датасету, який мережа не підтримує, або блоку до початку її індексованого покриття, повертає HTTP 422 (error.code no_coverage, не тарифікується). Коли сервіс тимчасово недоступний — наприклад, коли мережа перевантажена — запити повертають HTTP 503 із заголовком Retry-After (не тарифікується).

5. Приклади коду

Повний стартовий шаблон: blockvectra/multichain-viem

Один і той самий код працює в різних мережах шляхом оновлення змінної мережі (або зчитування її з GET /v1/chains), надсилання запиту eth_blockNumber через JSON-RPC та перевірки свіжості датасету через Data API:

export BLOCKVECTRA_API_KEY="rgw_your_api_key"

# Change the chain variable to target another chain from Supported Chains
CHAIN="robinhood_mainnet"

# 1. JSON-RPC: Query eth_blockNumber (POST /v1/{chain}, key in the x-api-key header).
RPC_URL="https://api.blockvectra.com/v1/$CHAIN"
curl -s "$RPC_URL" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

# 2. Data API: Query dataset freshness (GET /v1/data/{chain}/status/freshness)
curl -s "https://api.blockvectra.com/v1/data/$CHAIN/status/freshness" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"

Приклади відповідей

Успішна відповідь JSON-RPC eth_blockNumber (тарифікується за вагою CU цього методу):

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x45a27f1"
}

Успішна відповідь Data API GET /v1/data/{chain}/status/freshness (тарифікується в CU, тарифікуються лише успішні відповіді 2xx):

{
  "data": [
    {
      "dataset": "blocks",
      "category": "raw",
      "max_block_number": 72313256,
      "max_day": null,
      "max_time": "2026-09-28T03:41:07Z",
      "seconds_behind": 0,
      "blocks_behind": null,
      "days_behind": null,
      "checked_at": "2026-09-28T03:41:10Z"
    },
    {
      "dataset": "traces",
      "category": "raw",
      "max_block_number": 72313256,
      "max_day": null,
      "max_time": "2026-09-28T03:41:07Z",
      "seconds_behind": 0,
      "blocks_behind": null,
      "days_behind": null,
      "coverage_from_block": 72050949,
      "coverage_to_block": 72313256,
      "coverage_complete": true,
      "checked_at": "2026-09-28T03:41:10Z"
    },
    {
      "dataset": "dex_prices",
      "category": "derived",
      "max_block_number": null,
      "max_day": "2026-09-27",
      "max_time": "2026-09-27T00:00:00Z",
      "seconds_behind": 99667,
      "blocks_behind": null,
      "days_behind": 1,
      "checked_at": "2026-09-28T03:41:10Z"
    }
  ],
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72313256,
    "safe_block": 72313100,
    "finalized_block": 72313000,
    "coverage": "full",
    "refreshed_at": "2026-09-28T03:41:10Z"
  }
}

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

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

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