# Mulai Cepat

> Source: https://docs.blockvectra.com/id/quickstart/

Pengembang dan agen AI dapat mencoba RPC publik tanpa API key, lalu membuat API key untuk melanjutkan.

## 1. Baca tinggi blok tanpa API key

Panggil endpoint JSON-RPC publik dari rantai contoh `robinhood_mainnet` tanpa membuat akun atau memberikan API key:

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet/public" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```

`id: 1` dalam respons sesuai dengan permintaan ini; `result` adalah tinggi blok heksadesimal dan dapat berubah antar panggilan. Jika respons berisi `error`, periksa kode dan alasannya. Lihat [endpoint RPC publik gratis](https://blockvectra.com/en/free/#public-rpc) untuk metode publik, rentang historis, dan batas per IP.

## 2. Buat API key

Buka [konsol](https://console.blockvectra.com/login/?next=%2Fkeys%2F), masuk dengan GitHub, Google, atau dompet Ethereum (akun Anda dibuat pada login pertama), dan buat API key. Rahasia hanya ditampilkan sekali: simpan dengan aman dan tetapkan di variabel lingkungan `BLOCKVECTRA_API_KEY`. Jangan sertakan dalam kode yang berjalan di browser klien. Akun baru mendapatkan 30,000,000 CU saat pendaftaran — tanpa kartu kredit.

> **Belum memiliki API key?**
>
> Jika Anda memiliki dompet Ethereum: ikuti [panduan pendaftaran terprogram](https://docs.blockvectra.com/en/guides/programmatic-signup/) untuk mendaftar dan membuat API key dengan tanda tangan dompet Ethereum, tanpa browser. Jika tidak memiliki dompet: minta pengguna untuk masuk ke [console.blockvectra.com](https://console.blockvectra.com/login/?next=%2Fkeys%2F), buat API key, dan tetapkan di variabel lingkungan `BLOCKVECTRA_API_KEY`. Jangan minta pengguna untuk menempelkan API key dalam obrolan.


## 3. Kirim panggilan terautentikasi pertama Anda

Kueri tinggi blok dari rantai yang sama dengan header `x-api-key`. URL diakhiri dengan nama rantai, tanpa garis miring penutup:

```bash
: "${BLOCKVECTRA_API_KEY:?Set BLOCKVECTRA_API_KEY first}"

curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```

`result` kembali berupa tinggi blok heksadesimal. Permintaan ini mengonsumsi CU; lihat [referensi JSON-RPC](https://docs.blockvectra.com/en/api/json-rpc/) untuk bobot metode dan kode error serta [Harga](https://blockvectra.com/en/pricing/) untuk harga terkini. API key baru berlaku dalam waktu sekitar 5 detik; jika Anda menerima `invalid_api_key`, tunggu sejenak dan coba lagi. Lihat [Error umum](#common-errors) di bawah untuk kegagalan lainnya.

## 4. Lanjutkan dengan tugas bisnis

* [Kueri aktivitas saham tertokenisasi on-chain di Robinhood Chain](https://docs.blockvectra.com/en/guides/stocks/)
* [Ambil log historis HyperEVM secara terbagi](https://docs.blockvectra.com/en/guides/hyperevm-backfill/)
* [Terima aktivitas dompet dan transfer token dengan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/)

## Referensi

### API key dan saldo

Templat awal lengkap: [blockvectra/agent-quickstart](https://github.com/blockvectra/agent-quickstart)

Setiap API key diawali dengan `rgw_` diikuti oleh 64 karakter heksadesimal, misalnya
`rgw_1f2e...` (disingkat). Jaga kerahasiaannya — siapa pun yang memiliki API key dapat menghabiskan saldo Anda.

> Saat saldo Anda tidak mencukupi, server mengembalikan HTTP 402 (kode error JSON-RPC `-32020`; Data API `error.code` `insufficient_balance`). Buka [halaman penagihan](https://console.blockvectra.com/billing/) konsol untuk memeriksa saldo dan metode pengisian ulang Anda.


### Coba tanpa API key

Anda dapat langsung memanggil endpoint JSON-RPC publik tanpa membuat akun atau memberikan API key. Endpoint pada contoh di bawah ini dibatasi lajunya per IP (3 req/s, burst 20, maksimal batch 10). Permintaan yang melebihi batas laju mengembalikan HTTP 429 dengan alasan `public_rate_limit` atau `public_pool_busy` (disertai header `Retry-After`); metode yang tidak didukung mengembalikan error JSON-RPC `-32601` (`method_not_public`).

```bash
# Direct public endpoint:
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet/public" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

# Or using the API key fallback pattern (defaults to public when BLOCKVECTRA_API_KEY is unset):
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet/${BLOCKVECTRA_API_KEY:-public}" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```

#### Endpoint publik berdasarkan rantai

- Arbitrum One: https://api.blockvectra.com/v1/arb_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- Base: https://api.blockvectra.com/v1/base_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- BNB Smart Chain: https://api.blockvectra.com/v1/bsc_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- Ethereum: https://api.blockvectra.com/v1/eth_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- Ethereum Sepolia: https://api.blockvectra.com/v1/eth_sepolia/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- HyperEVM: https://api.blockvectra.com/v1/hyperevm_mainnet/public — Hanya baca
- Polygon: https://api.blockvectra.com/v1/polygon_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- Robinhood Chain: https://api.blockvectra.com/v1/robinhood_mainnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)
- Robinhood Chain Testnet: https://api.blockvectra.com/v1/robinhood_testnet/public — Membaca dan menyiarkan transaksi bertanda tangan (eth_sendRawTransaction)

Dua endpoint metadata publik di bawah ini menunjukkan status layanan dan konfigurasi setiap rantai; tidak memerlukan API key dan tidak ditagih.

### Periksa status kesehatan layanan dan rantai

```bash
curl https://api.blockvectra.com/v1/status
```

Mengembalikan waktu pemeriksaan `checked_at`, status operasional layanan `gateway.status`, dan untuk setiap rantai yang didukung, progres sinkronisasi node `sync`, tinggi blok terkini, serta latensi `head`:

```json
{
  "checked_at": "2026-10-03T13:30:47Z",
  "gateway": {
    "status": "ok"
  },
  "chains": [
    {
      "chain": "bsc_mainnet",
      "name": "BNB Smart Chain",
      "chain_id": 56,
      "jsonrpc": true,
      "data": true,
      "data_features": [
        "blocks",
        "transactions",
        "address_transactions",
        "transfers",
        "token_metadata",
        "freshness"
      ],
      "data_status": "ok",
      "data_head_block": 125492675,
      "data_head_age_seconds": 3,
      "status": "ok",
      "sync": {
        "stage": "synced",
        "node_block": 125492676,
        "target_block": null
      },
      "head": {
        "block": 125492676,
        "time": "2026-10-03T13:30:45Z",
        "lag_seconds": 2
      }
    }
  ]
}
```

### Kueri rantai yang didukung dan kebijakan metode

```bash
curl https://api.blockvectra.com/v1/chains
```

Mengembalikan `chain_id` dari setiap rantai yang didukung, bendera fitur untuk JSON-RPC, Data API, dan WebSocket, kebijakan metode yang diizinkan dan ditolak (`methods.allow` dan `methods.deny`), batas rentang blok kueri log `max_logs_block_range`, dan jendela status historis `state_window_blocks`:

```json
{
  "chains": [
    {
      "chain": "bsc_mainnet",
      "name": "BNB Smart Chain",
      "chain_id": 56,
      "jsonrpc": true,
      "data": true,
      "ws": false,
      "subscriptions": [],
      "methods": {
        "allow": [
          "eth_blockNumber",
          "eth_call",
          "eth_chainId",
          "eth_getLogs"
        ],
        "deny": [
          "eth_newFilter",
          "eth_subscribe",
          "eth_unsubscribe"
        ]
      },
      "max_logs_block_range": 1000,
      "state_window_blocks": 990000,
      "info": {}
    }
  ]
}
```

### Pilih rantai

Setiap endpoint BlockVectra bersifat spesifik untuk suatu rantai: permintaan JSON-RPC menyertakan nama rantai `{chain}` di path URL, dan permintaan Data API menggunakannya sebagai awalan rute. Lihat [Rantai yang Didukung](https://docs.blockvectra.com/en/chains/) untuk rantai yang saat ini tersedia dan pengenalnya.

| Rantai | {chain} | Chain ID | Tracing | Endpoint publik | WebSocket | Data API | Jumlah metode dengan kunci API | Push Webhook | Kirim Transaksi | Kirim Transaksi (Endpoint Publik Tanpa Key) | Jendela riwayat state | Rentang blok maksimum eth_getLogs | Dataset Data API | Testnet terkait | Panduan terkait |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| [arb_mainnet RPC dan Data API](https://blockvectra.com/id/chains/arb_mainnet/) | arb_mainnet | 42161 | ✓ | `https://api.blockvectra.com/v1/arb_mainnet/public` | Tidak didukung | Terbuka | 43 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 6,000 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | Tidak dikenal |
| [base_mainnet RPC dan Data API](https://blockvectra.com/id/chains/base_mainnet/) | base_mainnet | 8453 | — | `https://api.blockvectra.com/v1/base_mainnet/public` | Tidak didukung | Terbuka | 39 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 10,000 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | [Base](https://docs.blockvectra.com/en/guides/base/) |
| [bsc_mainnet RPC dan Data API](https://blockvectra.com/id/chains/bsc_mainnet/) | bsc_mainnet | 56 | — | `https://api.blockvectra.com/v1/bsc_mainnet/public` | Tidak didukung | Terbuka | 25 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 100 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | Tidak dikenal |
| [Ethereum RPC dan Data API](https://blockvectra.com/id/chains/eth_mainnet/) | eth_mainnet | 1 | ✓ | `https://api.blockvectra.com/v1/eth_mainnet/public` | Tidak didukung | Terbuka | 38 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 250,000 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | Tidak dikenal |
| [eth_sepolia RPC dan Data API](https://blockvectra.com/id/chains/eth_sepolia/) | eth_sepolia | 11155111 | — | `https://api.blockvectra.com/v1/eth_sepolia/public` | Tidak didukung | Terbuka | 29 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | Tidak dikenal | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | Tidak dikenal |
| [HyperEVM RPC dan Data API](https://blockvectra.com/id/chains/hyperevm_mainnet/) | hyperevm_mainnet | 999 | — | `https://api.blockvectra.com/v1/hyperevm_mainnet/public` | Tidak didukung | Terbuka | 24 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Tidak didukung | Tidak didukung | Tidak dikenal | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Saldo, Pemegang, NFT, Kesegaran data | Tidak dikenal | [HyperEVM backfill and polling](https://docs.blockvectra.com/en/guides/hyperevm-backfill/) |
| [polygon_mainnet RPC dan Data API](https://blockvectra.com/id/chains/polygon_mainnet/) | polygon_mainnet | 137 | ✓ | `https://api.blockvectra.com/v1/polygon_mainnet/public` | Tidak didukung | Terbuka | 43 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 126 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Kesegaran data | Tidak dikenal | Tidak dikenal |
| [Robinhood Chain RPC dan Data API](https://blockvectra.com/id/chains/robinhood_mainnet/) | robinhood_mainnet | 4663 | ✓ | `https://api.blockvectra.com/v1/robinhood_mainnet/public` | Didukung (newHeads, logs) | Terbuka | 43 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 900 blok terbaru | 1,000 blok | Blok, Transaksi, Transaksi alamat, Transfer, Metadata token, Saldo, Pemegang, NFT, Swap DEX, Harga DEX, Saham tertokenisasi, Trace transaksi, Kesegaran data | Tidak dikenal | [Robinhood Chain](https://docs.blockvectra.com/en/guides/robinhood-chain/), [Stock token multiplier](https://docs.blockvectra.com/en/guides/stock-token-multiplier/), [Tokenized stocks](https://docs.blockvectra.com/en/guides/stocks/) |
| [robinhood_testnet RPC](https://blockvectra.com/id/chains/robinhood_testnet/) | robinhood_testnet | 46630 | ✓ | `https://api.blockvectra.com/v1/robinhood_testnet/public` | Didukung (newHeads, logs) | Belum tersedia | 43 | [Didukung · Konfirmasi 1–1 (default 1)](https://blockvectra.com/id/webhooks/), [Panduan push Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Didukung | Didukung | State historis untuk 1,023 blok terbaru | 1,000 blok | Tidak didukung | Tidak dikenal | [Testnet faucet](https://docs.blockvectra.com/en/guides/robinhood-testnet-faucet/), [Robinhood Chain Testnet starter](https://docs.blockvectra.com/en/guides/robinhood-testnet-starter/) |

## Langkah berikutnya dengan kunci API

### arb_mainnet

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/arb_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/arb_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/arb_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### base_mainnet

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/base_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/base_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/base_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### bsc_mainnet

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/bsc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/bsc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/bsc_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### Ethereum

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/eth_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/eth_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/eth_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### eth_sepolia

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/eth_sepolia' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/eth_sepolia' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/eth_sepolia/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### HyperEVM

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/hyperevm_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/hyperevm_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/hyperevm_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### polygon_mainnet

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/polygon_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/polygon_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/polygon_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### Robinhood Chain

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/robinhood_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### Data API

```bash
curl -fsS 'https://api.blockvectra.com/v1/data/robinhood_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"
```

[Data API](https://docs.blockvectra.com/en/api/data/)

#### WebSocket

```bash
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/robinhood_mainnet'
```

[WebSocket](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

### robinhood_testnet

#### eth_getLogs

```bash
set -eu
MAX_LOGS_BLOCK_RANGE=1000
head=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_testnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(int(json.load(sys.stdin)["result"],16))')
from=$((head >= MAX_LOGS_BLOCK_RANGE ? head - MAX_LOGS_BLOCK_RANGE + 1 : 0))
from_hex=$(printf '0x%x' "$from")
to_hex=$(printf '0x%x' "$head")
curl -fsS 'https://api.blockvectra.com/v1/robinhood_testnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$from_hex\",\"toBlock\":\"$to_hex\"}]}"
```

[eth_getLogs](https://docs.blockvectra.com/en/guides/getlogs-block-range/)

#### WebSocket

```bash
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/robinhood_testnet'
```

[WebSocket](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)

[Buat langganan Webhook](https://blockvectra.com/id/webhooks/) · [Buat langganan Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Penggunaan dan CU](https://console.blockvectra.com/usage/) · [Isi saldo](https://console.blockvectra.com/billing/)

**HyperEVM**
Blok HyperEVM mencakup transaksi sistem HyperCore (dari alamat 0x2222…2222 atau 0x20…, gasPrice 0).
Pengiriman transaksi belum didukung di rantai ini (`eth_sendRawTransaction` mengembalikan `-32601` `method_not_allowed`); metode baca berfungsi normal.

[Lihat status langsung →](https://blockvectra.com/id/status/)

Semua contoh di halaman ini menggunakan `robinhood_mainnet`.

> **Tip**: pilih rantai yang menyediakan layanan, metode, dan jendela historis dari contoh pada matriks di atas, lalu ganti `robinhood_mainnet` dengan `{chain}` rantai tersebut. API key yang sama berfungsi di semua rantai yang didukung.

### Opsi autentikasi lainnya dan contoh bahasa

Endpoint JSON-RPC bersifat spesifik rantai: `POST /v1/{chain}/{api_key}` dengan API key di path atau `POST /v1/{chain}` dengan API key di header `x-api-key`. `{chain}` adalah nama rantai yang juga digunakan oleh Data API; untuk Robinhood Chain, nilainya adalah `robinhood_mainnet`, sehingga endpoint di halaman ini adalah `https://api.blockvectra.com/v1/robinhood_mainnet`. Memanggil `eth_subscribe` melalui HTTP mengembalikan `-32601`; langganan WebSocket tercantum per rantai di [Rantai yang Didukung](https://docs.blockvectra.com/en/chains/). API mengirimkan `Access-Control-Allow-Origin: *`, tetapi Anda harus menjaga kerahasiaan API key dan melakukan permintaan dari layanan backend, bukan dari kode di browser klien.

Anda dapat meneruskan API key dengan tiga cara: di path URL (`POST /v1/{chain}/{api_key}`, yang hanya menggunakan API key di path dan mengabaikan kedua header), di header `x-api-key`, atau di header `Authorization: Bearer <api_key>`.

#### API key di path URL

**cURL**

```bash
: "${BLOCKVECTRA_API_KEY:?Set BLOCKVECTRA_API_KEY first}"

curl -s "https://api.blockvectra.com/v1/robinhood_mainnet/$BLOCKVECTRA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```


  **TypeScript**

```ts
import { createPublicClient, http } from "viem";

const key = process.env.BLOCKVECTRA_API_KEY!;
const client = createPublicClient({
  transport: http(`https://api.blockvectra.com/v1/robinhood_mainnet/${key}`),
});

console.log(await client.getBlockNumber());

// Run with: npx tsx example.mts
```

Templat awal lengkap: [blockvectra/multichain-viem](https://github.com/blockvectra/multichain-viem)


  **Python**

```python
import os

from web3 import Web3

w3 = Web3(Web3.HTTPProvider("https://api.blockvectra.com/v1/robinhood_mainnet/" + os.environ["BLOCKVECTRA_API_KEY"]))
print(w3.eth.block_number)
```


  **Go**

```go
// Run with: go mod init example && go get github.com/ethereum/go-ethereum && go mod tidy && go run .
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/ethereum/go-ethereum/ethclient"
)

func main() {
	client, err := ethclient.Dial("https://api.blockvectra.com/v1/robinhood_mainnet/" + os.Getenv("BLOCKVECTRA_API_KEY"))
	if err != nil {
		log.Fatal(err)
	}
	number, err := client.BlockNumber(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(number)
}
```


  **Rust**

```toml
[dependencies]
alloy = { version = "1", features = ["provider-http", "rpc-types"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
```

```rust
use alloy::providers::{Provider, ProviderBuilder};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key = std::env::var("BLOCKVECTRA_API_KEY")?;
    let url = format!("https://api.blockvectra.com/v1/robinhood_mainnet/{key}");
    let provider = ProviderBuilder::new().connect_http(url.parse()?);
    println!("{}", provider.get_block_number().await?);
    Ok(())
}
```


#### API key di header permintaan

**cURL**

```bash
: "${BLOCKVECTRA_API_KEY:?Set BLOCKVECTRA_API_KEY first}"

curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```


  **TypeScript**

```ts
import { createPublicClient, http } from "viem";

const key = process.env.BLOCKVECTRA_API_KEY!;
const client = createPublicClient({
  transport: http("https://api.blockvectra.com/v1/robinhood_mainnet", {
    fetchOptions: { headers: { "x-api-key": key } },
  }),
});

console.log(await client.getBlockNumber());

// Run with: npx tsx example.mts
```


  **Python**

```python
import os

from web3 import Web3

key = os.environ["BLOCKVECTRA_API_KEY"]
# request_kwargs replaces the provider's default headers entirely, so
# Content-Type must be repeated here or the server can't parse the body.
headers = {"Content-Type": "application/json", "x-api-key": key}
w3 = Web3(Web3.HTTPProvider("https://api.blockvectra.com/v1/robinhood_mainnet", request_kwargs={"headers": headers}))
print(w3.eth.block_number)
```


  **Go**

```go
// Run with: go mod init example && go get github.com/ethereum/go-ethereum && go mod tidy && go run .
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/ethereum/go-ethereum/ethclient"
	"github.com/ethereum/go-ethereum/rpc"
)

func main() {
	ctx := context.Background()
	c, err := rpc.DialOptions(ctx, "https://api.blockvectra.com/v1/robinhood_mainnet", rpc.WithHeader("x-api-key", os.Getenv("BLOCKVECTRA_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	number, err := ethclient.NewClient(c).BlockNumber(ctx)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(number)
}
```


  **Rust**

```toml
[dependencies]
alloy = { version = "1", features = ["provider-http", "rpc-types"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
reqwest = "0.13"
```

```rust
use alloy::providers::{Provider, ProviderBuilder};
use alloy::rpc::client::RpcClient;
use reqwest::header::{HeaderMap, HeaderValue};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key = std::env::var("BLOCKVECTRA_API_KEY")?;

    let mut headers = HeaderMap::new();
    headers.insert("x-api-key", HeaderValue::from_str(&key)?);
    let http_client = reqwest::Client::builder().default_headers(headers).build()?;

    let rpc_client = RpcClient::new_http_with_client(http_client, "https://api.blockvectra.com/v1/robinhood_mainnet".parse()?);
    let provider = ProviderBuilder::new().connect_client(rpc_client);

    println!("{}", provider.get_block_number().await?);
    Ok(())
}
```


> **Tanpa garis miring di akhir**
>
> Saat meneruskan API key dalam header, panggil `https://api.blockvectra.com/v1/robinhood_mainnet` persis seperti yang ditampilkan: URL diakhiri dengan nama rantai, **tanpa** garis miring penutup. JSON-RPC hanya dilayani di `/v1/{chain}` dan `/v1/{chain}/{api_key}`. Garis miring penutup (seperti `/v1/{chain}/`) atau permintaan tanpa segmen rantai (seperti `/v1` atau `/v1/`) mengembalikan `404` dengan body kosong.


Header `Authorization: Bearer <api_key>` juga berfungsi. Pada `POST /v1/{chain}`, header `x-api-key` yang tidak kosong memiliki prioritas lebih tinggi daripada Bearer, dan Bearer hanya digunakan ketika `x-api-key` tidak ada atau kosong. Bentuk API key di path mengabaikan kedua header tersebut.

### Panggilan batch

Kirim sebuah array untuk membuat beberapa panggilan dalam satu permintaan (hingga 100 per batch). Setiap API key memiliki bucket CU (pengisian ulang `cu_per_sec`, kapasitas `burst_cu` — default adalah 400 CU/dtk dan burst 1,600 CU; ditampilkan per kunci di tabel Keys konsol); permintaan tunggal — termasuk seluruh batch JSON-RPC — yang total CU-nya melebihi kapasitas burst API key akan ditolak dengan `-32022 request_exceeds_burst`, bahkan jika di bawah batas 100 panggilan per batch; bagi menjadi beberapa batch yang lebih kecil. Contoh ini mengueri Chain ID dan saldo suatu akun dalam satu kali pulang-pergi:

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '[
    {"jsonrpc":"2.0","id":1,"method":"eth_chainId"},
    {"jsonrpc":"2.0","id":2,"method":"eth_getBalance","params":["0x1111111111111111111111111111111111111111","latest"]}
  ]'
```


  **TypeScript**

```ts
import { createPublicClient, http } from "viem";

const key = process.env.BLOCKVECTRA_API_KEY!;
const client = createPublicClient({
  transport: http("https://api.blockvectra.com/v1/robinhood_mainnet", {
    batch: true,
    fetchOptions: { headers: { "x-api-key": key } },
  }),
});

// viem coalesces concurrent requests into a single JSON-RPC batch.
const [chainId, balance] = await Promise.all([
  client.getChainId(),
  client.getBalance({ address: "0x1111111111111111111111111111111111111111" }),
]);
console.log(chainId, balance);

// Run with: npx tsx example.mts
```


  **Python**

```python
import os

from web3 import Web3

key = os.environ["BLOCKVECTRA_API_KEY"]
headers = {"Content-Type": "application/json", "x-api-key": key}
w3 = Web3(Web3.HTTPProvider("https://api.blockvectra.com/v1/robinhood_mainnet", request_kwargs={"headers": headers}))

with w3.batch_requests() as batch:
    batch.add(w3.eth.chain_id)
    batch.add(w3.eth.get_balance("0x1111111111111111111111111111111111111111"))
    chain_id, balance = batch.execute()

print(chain_id, balance)
```


  **Go**

```go
// Run with: go mod init example && go get github.com/ethereum/go-ethereum && go mod tidy && go run .
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/ethereum/go-ethereum/rpc"
)

func main() {
	ctx := context.Background()
	c, err := rpc.DialOptions(ctx, "https://api.blockvectra.com/v1/robinhood_mainnet", rpc.WithHeader("x-api-key", os.Getenv("BLOCKVECTRA_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}

	var chainID, balance string
	calls := []rpc.BatchElem{
		{Method: "eth_chainId", Result: &chainID},
		{Method: "eth_getBalance", Args: []any{"0x1111111111111111111111111111111111111111", "latest"}, Result: &balance},
	}
	if err := c.BatchCallContext(ctx, calls); err != nil {
		log.Fatal(err)
	}
	for _, call := range calls {
		if call.Error != nil {
			log.Fatal(call.Error)
		}
	}
	fmt.Println(chainID, balance)
}
```


  **Rust**

```toml
[dependencies]
alloy = { version = "1", features = ["provider-http", "rpc-types"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
reqwest = "0.13"
```

```rust
use alloy::primitives::{Address, U256};
use alloy::rpc::client::RpcClient;
use reqwest::header::{HeaderMap, HeaderValue};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key = std::env::var("BLOCKVECTRA_API_KEY")?;

    let mut headers = HeaderMap::new();
    headers.insert("x-api-key", HeaderValue::from_str(&key)?);
    let http_client = reqwest::Client::builder().default_headers(headers).build()?;
    let rpc_client = RpcClient::new_http_with_client(http_client, "https://api.blockvectra.com/v1/robinhood_mainnet".parse()?);

    let address: Address = "0x1111111111111111111111111111111111111111".parse()?;
    let mut batch = rpc_client.new_batch();
    let chain_id = batch.add_call::<_, U256>("eth_chainId", &())?;
    let balance = batch.add_call::<_, U256>("eth_getBalance", &(address, "latest"))?;
    batch.send().await?;

    println!("{} {}", chain_id.await?, balance.await?);
    Ok(())
}
```


Respons tiba sebagai sebuah array, dalam urutan yang sama dengan permintaan, dicocokkan berdasarkan `id`.

Jika server menolak seluruh batch — karena saldo tidak mencukupi, batas laju, kapasitas burst, atau batch terlalu besar (lihat [Error umum](#common-errors) di bawah) — server mengembalikan satu objek error JSON-RPC alih-alih sebuah array; mode `batch: true` viem menampilkan ini sebagai `UnknownRpcError` tanpa detail, jadi ulangi panggilan tunggal untuk melihat error sebenarnya.

### Pahami penagihan CU

Setiap panggilan yang ditagih mengonsumsi **Compute Unit (CU)**: panggilan ringan seperti `eth_blockNumber` atau `eth_chainId` memiliki biaya terendah, pembacaan umum seperti `eth_getBlockByNumber` berbiaya sedikit lebih tinggi, panggilan yang lebih berat seperti `eth_call` atau `eth_getLogs` berbiaya lebih besar, dan metode pelacakan eksekusi (seperti `debug_traceTransaction`) memiliki biaya tertinggi.
Penggunaan ditagih per akun untuk setiap periode satu jam, dibulatkan ke bawah ke unit penagihan utuh (1 unit = 1,000 CU), dengan sisa dipindahkan ke periode berikutnya (jadi di seluruh periode total yang ditagih adalah `floor(total CU / 1,000)`); penyelesaian berjalan sekitar 15 menit setelah periode berakhir. Misalnya: sisa 508 CU + 2557 CU yang dikonsumsi = 3065 CU, menghasilkan 3 unit penagihan yang ditagih dan 65 CU dipindahkan ke periode berikutnya. Lihat [Harga](https://blockvectra.com/en/pricing/) untuk harga terkini.

Tabel lengkap bobot per metode dan kode error ada di [Referensi API → JSON-RPC](https://docs.blockvectra.com/en/api/json-rpc/) — halaman ini hanya menyajikan format permintaan.

#### Error umum

| Tindakan Anda                                                                                                                                                                                                                                                                          | Respons                                                                       | Tindakan                                                                                                                                                                                                                                                                                                                                  |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Rantai tidak dikenal atau belum publik                                                                                                                                                                                                                                                 | HTTP `404` dengan body JSON `error.data.reason: "unknown_chain"`              | Periksa nama rantai di URL                                                                                                                                                                                                                                                                                                                |
| Permintaan tanpa segmen rantai (misalnya `/v1` atau `/v1/`)                                                                                                                                                                                                                            | HTTP `404` dengan body kosong                                                 | Sertakan nama rantai di URL (`/v1/{chain}`)                                                                                                                                                                                                                                                                                               |
| API key hilang, tidak dikenal, atau dinonaktifkan                                                                                                                                                                                                                                      | HTTP `401`, kode JSON-RPC `-32024` (`missing_api_key` atau `invalid_api_key`) | Gunakan API key yang valid dan aktif (API key baru atau yang dirotasi mulai berlaku di semua instans dalam waktu sekitar 5 detik; selama periode tersebut, dapat mengembalikan 401 `invalid_api_key` atau 503 `-32021` (dengan `Retry-After`) saat status penagihan saat ini belum dapat dikonfirmasi, jadi tunggu sejenak dan coba lagi) |
| Saldo nol atau negatif                                                                                                                                                                                                                                                                 | HTTP `402`, kode JSON-RPC `-32020`                                            | Isi ulang saldo Anda atau tunggu pembaruan gratis                                                                                                                                                                                                                                                                                         |
| Permintaan dikirim terlalu cepat (batas laju atau kelebihan beban sementara)                                                                                                                                                                                                           | HTTP `429` (atau `200`), kode JSON-RPC `-32005`                               | Coba lagi nanti (patuhi `Retry-After` jika ada)                                                                                                                                                                                                                                                                                           |
| Permintaan tunggal atau batch melebihi kapasitas burst API key (`burst_cu`, default 1,600 CU; laju default 400 CU/dtk), atau batch paket gratis melebihi panggilan/dtk (25 panggilan/dtk)                                                                                                                                                                               | HTTP `429`, kode JSON-RPC `-32022` (`request_exceeds_burst`)                  | Bagi permintaan menjadi batch yang lebih kecil (tidak akan pernah berhasil sebagaimana dikirimkan)                                                                                                                                                                                                                                        |
| Node upstream sementara tidak tersedia                                                                                                                                                                                                                                                 | HTTP `200`, kode JSON-RPC `-32603` (`upstream unavailable`), tidak ditagih    | Ulangi permintaan                                                                                                                                                                                                                                                                                                                         |
| Status historis di luar jendela status rantai (lihat `state_window_blocks` di `GET /v1/chains`)                                                                                                                                                                                        | HTTP `200`, kode JSON-RPC `-32011`, tidak ditagih                             | Kueri blok yang lebih baru                                                                                                                                                                                                                                                                                                                |
| Transaksi atau blok tidak ditemukan, atau respons terlalu besar; di Ethereum, kueri blok / tanda terima / log di luar jendela terkini juga mengembalikan -32000 "old data not available due to pruning" (tidak ditagih; lihat [Rantai yang Didukung → Ethereum](https://docs.blockvectra.com/en/chains/#ethereum)) | HTTP `200`, kode JSON-RPC `-32000`                                            | Ubah permintaan (periksa hash atau nomor blok; hash trace dengan format yang salah mengembalikan transaksi tidak ditemukan)                                                                                                                                                                                                               |
| Tracer tidak diizinkan atau batas waktu trace tidak diizinkan (panggilan `debug_trace`)                                                                                                                                                                                                | HTTP `200`, kode JSON-RPC `-32602`, tidak ditagih                             | Gunakan tracer bawaan yang diizinkan (`callTracer`, `flatCallTracer`, `prestateTracer`, `4byteTracer`, `noopTracer`, atau abaikan) dan batas waktu ≤ 30 detik                                                                                                                                                                             |
| Metode tidak diizinkan oleh daftar metode rantai (lihat [Rantai yang Didukung](https://docs.blockvectra.com/en/chains/))                                                                                                                                                                                           | HTTP `200`, kode JSON-RPC `-32601`, tidak ditagih                             | Hanya panggil metode yang diizinkan oleh rantai                                                                                                                                                                                                                                                                                           |
| Body JSON tidak valid                                                                                                                                                                                                                                                                  | HTTP `200`, kode JSON-RPC `-32700`, tidak ditagih                             | Perbaiki sintaks JSON permintaan                                                                                                                                                                                                                                                                                                          |
| Lebih dari 100 panggilan dalam satu batch                                                                                                                                                                                                                                              | HTTP `200`, kode JSON-RPC `-32600` (`batch too large`), tidak ditagih         | Bagi batch menjadi maksimal 100 panggilan                                                                                                                                                                                                                                                                                                 |

Penolakan di atas tidak pernah ditagih. Setiap panggilan yang diterima dan mendapatkan respons akan ditagih sesuai bobot CU yang dipublikasikan dari metode tersebut; tabel kode error mencantumkan kasus yang tidak ditagih (lihat kolom Ditagih di [Kode Error](https://docs.blockvectra.com/en/api/json-rpc/#error-codes)).

### Panggil Data API

Data API mengekspos data rantai hanya-baca (blok, transaksi, saldo, pemegang, aktivitas DEX, dan banyak lagi) sebagai REST/JSON. Setiap rute, kecuali `GET https://api.blockvectra.com/v1/data/chains`, memiliki pengenal rantai sebagai awalan: `robinhood_mainnet` adalah pengenal rantai (bidang `chain` yang dikembalikan oleh `/chains` dan di `meta`) yang digunakan di semua path di bawah. `GET https://api.blockvectra.com/v1/data/chains` hanya mencantumkan rantai publik dan hanya mengembalikan `{"data": [...]}` (tanpa `meta`, tanpa `next_cursor`). Permintaan diukur dan ditagih dalam Compute Unit (CU); hanya respons 2xx yang berhasil yang ditagih.

Setiap permintaan memerlukan API key yang sama seperti yang digunakan dalam JSON-RPC — kirimkan di header `x-api-key`. Setiap respons sukses khusus rantai menggunakan struktur respons yang sama: `data` (data), `next_cursor` (string buram, hanya ada jika ada halaman lain — jika tidak, kunci sama sekali tidak ada, tidak pernah `null`), dan `meta` (`chain`, `chain_slug` (bentuk huruf besar dari `chain`), `chain_external_id`, `as_of_block`, `safe_block`, `finalized_block`, `coverage`, `refreshed_at`; `refreshed_at` bisa bernilai `null`, yang menandakan bahwa waktu pembaruan data tidak diketahui dan harus diperlakukan sebagai usang — endpoint berbasis blok selalu mengembalikan nilai). Respons error biasanya berisi `{"error":{"code","message"}}` — `409 not_indexed_yet` menambahkan `indexed_through` (blok terkini yang diindeks). Rantai yang tidak dikenal atau tidak publik mengembalikan HTTP `404` dengan `error.code` `not_found` (tidak ditagih; nama rantai harus berupa slug huruf kecil yang tepat); API key yang hilang, tidak dikenal, atau dinonaktifkan mengembalikan HTTP `401` dengan `error.code` `missing_api_key` atau `invalid_api_key`. Permintaan yang dibatasi laju mengembalikan HTTP `429` (`error.code` `rate_limited`, `data.reason: "key_rate_limit"`), dan saldo habis mengembalikan HTTP `402` (`error.code` `insufficient_balance`); keduanya tidak ditagih. Nilai yang dapat melebihi 2^53 (saldo, jumlah token) berupa string desimal, tidak pernah berupa angka JSON.

**Kueri blok berdasarkan nomor:**

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/72838701" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const res = await fetch("https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/72838701", {
  headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
});
const body = await res.json();
console.log(body);

// Run with: npx tsx example.mts
```


  **Python**

```python
import os, requests

res = requests.get(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/72838701",
    headers={"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]},
)
print(res.json())
```


```json
{
  "data": {
    "number": 72838701,
    "hash": "0x9f2c1e7a4b6d3f805e1c9a72b4d6f1e0a3c8b5d7e2f4a1c6b9d3e7f0a2c4b6d8",
    "parent_hash": "0x1a3c5e7f9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a",
    "timestamp": "2026-09-26T05:41:07Z",
    "miner": "0x00000000000000000000000000000000000a4b05",
    "gas_limit": 32000000,
    "gas_used": 4821932,
    "base_fee_per_gas": "100000000",
    "state_root": "0x2b4d6f8a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d",
    "transactions_root": "0x3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e",
    "receipts_root": "0x4d6f8a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f",
    "tx_count": 239,
    "size": 48213,
    "l1_block_number": null,
    "extra": {}
  },
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "safe_block": 72838800,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:15:03Z"
  }
}
```

Nomor di atas blok terkini yang diindeks (`as_of_block`) mengembalikan `409` (`error.code: "not_indexed_yet"`), dengan `indexed_through` yang menginformasikan blok terkini yang diindeks — data belum tersedia, jadi coba lagi nanti. Nomor blok sebelum seluruh riwayat yang dicakup rantai (`coverage.from_block`) mengembalikan `422` (`error.code: "no_coverage"`). Di dalam cakupan, nomor yang sama dengan atau lebih rendah dari `as_of_block` tanpa catatan aktif (tidak pernah diindeks atau dikembalikan oleh reorg) mengembalikan `404` (`error.code: "not_found"`).

**Periksa kesegaran data** (seberapa jauh setiap dataset yang dilacak tertinggal dari blok terkini rantai — berguna untuk halaman status atau verifikasi sebelum mengandalkan kueri):

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/status/freshness" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const res = await fetch("https://api.blockvectra.com/v1/data/robinhood_mainnet/status/freshness", {
  headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
});
const body = await res.json();
console.log(body);

// Run with: npx tsx example.mts
```


  **Python**

```python
import os, requests

res = requests.get(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/status/freshness",
    headers={"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]},
)
print(res.json())
```


```json
{
  "data": [
    {
      "dataset": "blocks",
      "category": "raw",
      "max_block_number": 72838957,
      "max_day": null,
      "max_time": "2026-09-27T02:15:01Z",
      "seconds_behind": 0,
      "blocks_behind": null,
      "days_behind": null,
      "checked_at": "2026-09-27T02:15:07Z"
    }
  ],
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "safe_block": 72838800,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:15:07Z"
  }
}
```

*(Disingkat: respons memiliki satu baris per dataset; hanya baris `blocks` yang ditampilkan. Baris `traces` juga berisi `coverage_from_block`, `coverage_to_block`, dan `coverage_complete`.)*

Jika data kesegaran sementara tidak tersedia untuk rantai tersebut, responsnya adalah `503` (`error.code: "unavailable"`) alih-alih hasil parsial; respons menyertakan header `Retry-After` (detik) — tunggu setidaknya selama waktu tersebut dan coba lagi.

**Buat daftar saldo ERC-20 dari suatu alamat** (snapshot yang difilter untuk saldo bukan nol, diurutkan berdasarkan token):

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/balances" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const res = await fetch(
  "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/balances",
  { headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! } },
);
const body = await res.json();
console.log(body);

// Run with: npx tsx example.mts
```


  **Python**

```python
import os, requests

res = requests.get(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/balances",
    headers={"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]},
)
print(res.json())
```


```json
{
  "data": [
    { "token": "0x0bd7d308f8e1639fab988df18a8011f41eacad73", "balance": "185371464119396", "symbol": "WETH", "decimals": 18 },
    { "token": "0x2295f15bd4914ae9b4685f01d52f4e6f89bf8b03", "balance": "10000000000000000", "symbol": "WNVDA", "decimals": 18 }
  ],
  "meta": {
    "chain": "robinhood_mainnet",
    "chain_slug": "ROBINHOOD_MAINNET",
    "chain_external_id": "eip155:4663",
    "as_of_block": 72838957,
    "safe_block": 72838800,
    "finalized_block": 72838701,
    "coverage": "full",
    "refreshed_at": "2026-09-27T02:10:00Z"
  }
}
```

Alamat tanpa saldo bukan nol tetap mengembalikan `200` dengan `data: []` — tidak pernah `404`. Kirimkan `?limit=` (default 50, maksimum 500) dan `next_cursor` yang dikembalikan untuk mengueri halaman berikutnya.

Cakupan lengkap endpoint — blok, transaksi, alamat, token, NFT, DEX, dan saham tertokenisasi — ada di [Referensi API → Data API](https://docs.blockvectra.com/en/api/data/).

### Bacaan lebih lanjut

* [Referensi API → JSON-RPC](https://docs.blockvectra.com/en/api/json-rpc/) — metode, bobot CU, dan kode error
* [Referensi Lengkap JSON-RPC](https://docs.blockvectra.com/en/api/json-rpc/reference/) — spesifikasi lengkap, parameter, dan skema kembalian untuk semua metode yang didukung
* [Referensi API → Data API](https://docs.blockvectra.com/en/api/data/) — endpoint REST untuk data rantai
* [Dataset](https://docs.blockvectra.com/en/datasets/) — dataset turunan di seluruh rantai yang didukung
* [Panduan](https://docs.blockvectra.com/en/guides/) — panduan praktis untuk integrasi API, pengelolaan CU, dan alur kerja multichain
* [Rantai yang Didukung](https://docs.blockvectra.com/en/chains/) — pengenal rantai dan URL endpoint

## FAQ

### Rantai mana saja yang didukung?

9 rantai didukung: Arbitrum One, Base, BNB Smart Chain, Ethereum, Ethereum Sepolia, HyperEVM, Polygon, Robinhood Chain, Robinhood Chain Testnet. Daftar ini mengikuti GET /v1/chains dan diperbarui saat rantai baru diluncurkan. Lihat [halaman status](https://blockvectra.com/id/status/) untuk status langsung. [Lihat rantai yang didukung](https://blockvectra.com/id/chains/)

### Apakah WebSocket didukung?

Memanggil eth_subscribe melalui HTTP mengembalikan -32601; pada rantai dengan ws bernilai true di /v1/chains, eth_subscribe tersedia melalui WebSocket. Jika tidak, lakukan polling eth_getLogs. [Lihat rantai yang didukung](https://blockvectra.com/id/chains/)

### Dapatkah saya melakukan kueri state historis dan trace?

Ya, tetapi bervariasi menurut rantai. Jendela state historis adalah kolom state_window_blocks pada /v1/chains (null berarti riwayat penuh); ketersediaan trace bergantung pada apakah methods.allow untuk rantai tersebut mencakup metode debug_trace (seperti debug_traceTransaction); rentang blok maksimum untuk satu permintaan eth_getLogs adalah max_logs_block_range. [Lihat direktori rantai dan parameter per rantai](https://blockvectra.com/id/chains/)

### Bisakah satu kunci API digunakan di semua rantai?

Ya. Satu kunci API berfungsi untuk JSON-RPC di setiap rantai yang didukung dan untuk Data API pada rantai yang menyediakannya; kunci tersebut milik akun, bukan milik rantai tertentu. [Panduan satu kunci multi-rantai](https://docs.blockvectra.com/en/guides/one-key-many-chains/)
