# Cadenas compatibles

> Source: https://docs.blockvectra.com/es/chains/

BlockVectra es un proveedor de datos de blockchain multicadena: JSON-RPC en todas las cadenas compatibles y Data API donde esté disponible.

## Una API key, todas las cadenas

* **API key universal**: la misma API key funciona en todas las cadenas de blockchain compatibles con BlockVectra — sin claves separadas por cadena.
* **Cadena en la URL**: cada solicitud identifica explícitamente la cadena en el segmento `{chain}` de la ruta.
* **Uso agregado**: el saldo de la cuenta, los depósitos de límite de Compute Units (CU) y los límites de solicitudes por segundo del plan gratuito se comparten entre todas las cadenas.
* **Precios**: consulte [Precios](https://blockvectra.com/en/pricing/).

## Probar sin una API key

Elija un [punto de enlace RPC público gratuito](https://blockvectra.com/en/free/#public-rpc) para usar métodos de billetera sin una API key. Los métodos públicos y los límites por IP se detallan por cadena; consulte el [Inicio rápido](https://docs.blockvectra.com/en/quickstart/) para ver un ejemplo de llamada.

## Plantillas de URL

Estructuras de URL estándar para llamadas JSON-RPC y Data API:

| Servicio | Modo                     | Plantilla de URL             | Notas                                                                                   |
| -------- | ------------------------ | ---------------------------- | --------------------------------------------------------------------------------------- |
| JSON-RPC | API key en la ruta       | `POST /v1/{chain}/{api_key}` | Forma más simple; recomendada para curl y clientes HTTP                                 |
| JSON-RPC | API key en un encabezado | `POST /v1/{chain}`           | Envíe la API key en el encabezado de solicitud `x-api-key: {api_key}`                   |
| Data API | Puntos de enlace REST    | `GET /v1/data/{chain}/…`     | Envíe la API key en el encabezado de solicitud `x-api-key`                              |
| Estado   | Estado público           | `GET /v1/status`             | No requiere API key; devuelve el estado y el bloque más reciente de cada cadena pública |

> **Nota**: una solicitud sin el segmento de la cadena (por ejemplo, `POST /v1` o `POST /v1/`) devuelve HTTP 404 con un cuerpo vacío. Consulte el [Inicio rápido](https://docs.blockvectra.com/en/quickstart/) para ver detalles de configuración.

## Matriz de cadenas compatibles

Las cadenas de blockchain actualmente disponibles en BlockVectra y las funciones de sus servicios:

Puntos de enlace, métodos con API key, suscripciones, envío de transacciones, límites de estado y logs, conjuntos de datos, testnets relacionadas y guías se presentan por cadena. La información desconocida permanece desconocida. Despliegue una cadena debajo de la matriz para ver las solicitudes compatibles con ella.

| Cadena | {chain} | Chain ID | Tracing | Endpoint público | WebSocket | Data API | Métodos con clave API | Notificaciones Webhook | Enviar transacciones | Enviar transacciones (endpoint público sin key) | Ventana de historial de estado | Rango máximo de bloques para eth_getLogs | Conjuntos de datos de Data API | Redes de prueba relacionadas | Guías relacionadas |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| [RPC y Data API de arb_mainnet](https://blockvectra.com/es/chains/arb_mainnet/) | arb_mainnet | 42161 | ✓ | `https://api.blockvectra.com/v1/arb_mainnet/public` | No compatible | Disponible | 43 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 6,000 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | Desconocida |
| [RPC y Data API de base_mainnet](https://blockvectra.com/es/chains/base_mainnet/) | base_mainnet | 8453 | — | `https://api.blockvectra.com/v1/base_mainnet/public` | No compatible | Disponible | 39 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 10,000 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | [Base](https://docs.blockvectra.com/en/guides/base/) |
| [RPC y Data API de bsc_mainnet](https://blockvectra.com/es/chains/bsc_mainnet/) | bsc_mainnet | 56 | — | `https://api.blockvectra.com/v1/bsc_mainnet/public` | No compatible | Disponible | 25 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 100 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | Desconocida |
| [RPC y Data API de Ethereum](https://blockvectra.com/es/chains/eth_mainnet/) | eth_mainnet | 1 | ✓ | `https://api.blockvectra.com/v1/eth_mainnet/public` | No compatible | Disponible | 38 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 250,000 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | Desconocida |
| [RPC y Data API de eth_sepolia](https://blockvectra.com/es/chains/eth_sepolia/) | eth_sepolia | 11155111 | — | `https://api.blockvectra.com/v1/eth_sepolia/public` | No compatible | Disponible | 29 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Desconocida | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | Desconocida |
| [RPC y Data API de HyperEVM](https://blockvectra.com/es/chains/hyperevm_mainnet/) | hyperevm_mainnet | 999 | — | `https://api.blockvectra.com/v1/hyperevm_mainnet/public` | No compatible | Disponible | 24 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | No compatible | No compatible | Desconocida | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Saldos, Titulares, NFT, Frescura de datos | Desconocida | [HyperEVM backfill and polling](https://docs.blockvectra.com/en/guides/hyperevm-backfill/) |
| [RPC y Data API de polygon_mainnet](https://blockvectra.com/es/chains/polygon_mainnet/) | polygon_mainnet | 137 | ✓ | `https://api.blockvectra.com/v1/polygon_mainnet/public` | No compatible | Disponible | 43 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 126 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Frescura de datos | Desconocida | Desconocida |
| [RPC y Data API de Robinhood Chain](https://blockvectra.com/es/chains/robinhood_mainnet/) | robinhood_mainnet | 4663 | ✓ | `https://api.blockvectra.com/v1/robinhood_mainnet/public` | Compatible (newHeads, logs) | Disponible | 43 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 900 bloques más recientes | 1,000 bloques | Bloques, Transacciones, Transacciones de direcciones, Transferencias, Metadatos de tokens, Saldos, Titulares, NFT, Intercambios de DEX, Precios de DEX, Acciones tokenizadas, Trazas, Frescura de datos | Desconocida | [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/) |
| [RPC de robinhood_testnet](https://blockvectra.com/es/chains/robinhood_testnet/) | robinhood_testnet | 46630 | ✓ | `https://api.blockvectra.com/v1/robinhood_testnet/public` | Compatible (newHeads, logs) | Aún no disponible | 43 | [Compatible · Confirmaciones 1–1 (predeterminado 1)](https://blockvectra.com/es/webhooks/), [Guía de notificaciones Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) | Compatible | Compatible | Estado histórico para los 1,023 bloques más recientes | 1,000 bloques | No compatible | Desconocida | [Testnet faucet](https://docs.blockvectra.com/en/guides/robinhood-testnet-faucet/), [Robinhood Chain Testnet starter](https://docs.blockvectra.com/en/guides/robinhood-testnet-starter/) |

## Siguientes pasos con una clave 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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](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/)

[Crear una suscripción Webhook](https://blockvectra.com/es/webhooks/) · [Crear una suscripción Webhook](https://docs.blockvectra.com/en/guides/webhook-push/) · [Uso y CU](https://console.blockvectra.com/usage/) · [Recargar](https://console.blockvectra.com/billing/)

**HyperEVM**
Los bloques de HyperEVM incluyen transacciones del sistema HyperCore (desde la dirección 0x2222…2222 o 0x20…, gasPrice 0).
El envío de transacciones aún no es compatible en esta cadena (`eth_sendRawTransaction` devuelve `-32601` `method_not_allowed`); los métodos de lectura funcionan con normalidad.

[Ver estado en tiempo real →](https://blockvectra.com/es/status/)

## Ethereum

* **Chain ID**: `1`
* **Nombre de la cadena (`{chain}` en las URL)**: `eth_mainnet`, por ejemplo, `POST /v1/eth_mainnet/{api_key}` o `GET /v1/data/eth_mainnet/…`.

### JSON-RPC

* **Métodos**: los métodos disponibles por cadena están definidos por `methods.allow` / `deny` en `GET /v1/chains` (consulte la [Política de métodos](https://docs.blockvectra.com/en/api/json-rpc/#method-policy)); los métodos fuera de ese alcance devuelven `-32601`.
* **Solo datos recientes**: la ventana de estado histórico está definida por `state_window_blocks` en `GET /v1/chains`. Las consultas de estado histórico fuera de la ventana devuelven `-32011` (sin facturación); las consultas de bloques, recibos y logs fuera de la ventana devuelven `-32000 old data not available due to pruning` (sin facturación); una transacción consultada por hash fuera de la ventana devuelve `result: null`.
* **`eth_getLogs`**: el rango máximo de bloques por solicitud es `max_logs_block_range` en `GET /v1/chains`.

### Data API

* **Solo datos recientes**: la cobertura de datos de Ethereum está definida por `coverage.from_block` en `GET /v1/data/chains`. Un número de bloque o una ventana por debajo del inicio devuelve `422 no_coverage`; el hash de una transacción que salió de la ventana devuelve `404`.
* **Cuando `from_block` es `null`**: el inicio es temporalmente desconocido. No lo trate como `0` ni como historial completo y no envíe solicitudes históricas (por número de bloque, ventana o hash) a Ethereum hasta que vuelva a ser un número entero; devuelven `503 unavailable`.
* **`503 gateway_overloaded`**: reintente con backoff (`Retry-After: 1`).
* **Conjuntos de datos**: los conjuntos de datos disponibles para Ethereum se detallan en `features` de `GET /v1/data/chains`; los demás devuelven `422 no_coverage` (sin facturación). Las transacciones y transferencias de direcciones cubren solo la ventana: una respuesta que supera su inicio se marca con `meta.coverage: "partial"`.

## Descubrir cadenas de forma programática

Use estos puntos de enlace públicos para descubrir las cadenas compatibles y su estado:

### 1. Estado del servicio (`GET /v1/status`)

Un punto de enlace público que no requiere API key (CORS `*`). Enumera únicamente las cadenas disponibles públicamente y devuelve su estado y el bloque más reciente indexado:

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

Ejemplo de respuesta:

```json
{
  "checked_at": "2026-09-28T07:40:00Z",
  "gateway": { "status": "ok" },
  "chains": [
    {
      "chain": "robinhood_mainnet",
      "name": "Robinhood Chain",
      "chain_id": 4663,
      "jsonrpc": true,
      "data": true,
      "status": "ok",
      "data_status": "ok",
      "sync": { "stage": "synced", "node_block": 74600000, "target_block": null },
      "head": {
        "block": 74600000,
        "time": "2026-09-28T07:39:58Z",
        "lag_seconds": 3
      }
    },
    {
      "chain": "eth_mainnet",
      "name": "Ethereum",
      "chain_id": 1,
      "jsonrpc": true,
      "data": true,
      "status": "ok",
      "data_status": "ok",
      "sync": { "stage": "synced", "node_block": 26010000, "target_block": null },
      "head": {
        "block": 26010000,
        "time": "2026-09-28T07:39:59Z",
        "lag_seconds": 1
      }
    }
  ]
}
```

El campo `name` de cada entrada es siempre el nombre para mostrar de la cadena en inglés. `jsonrpc` y `data` indican si la cadena está disponible para JSON-RPC y Data API, respectivamente; `status` es `"ok"` o `"unavailable"`. Si una cadena se está sincronizando, las llamadas dirigidas a ella devuelven `-32010`. En `/v1/status`, `status` informa si JSON-RPC funciona y `data_status` informa si la Data API funciona (`"ok"`, `"syncing"` o `"unavailable"`); en `/v1/data/chains`, `coverage.has_data` igual a `false` significa que la cadena aún no tiene datos indexados.

### 2. Cadenas de la Data API (`GET /v1/data/chains`)

Requiere API key en el encabezado `x-api-key` (con facturación). Devuelve las cadenas públicas atendidas por la Data API, cada una con las funciones disponibles (`features`), los bloques cubiertos (`coverage`), los marcadores de consenso `safe`/`finalized` del nodo y su estado (`finality`), y los límites por solicitud (`limits`):

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

Ejemplo de respuesta:

```json
{
  "data": [
    {
      "chain": "robinhood_mainnet",
      "chain_slug": "ROBINHOOD_MAINNET",
      "name": "Robinhood Chain",
      "chain_id": 4663,
      "chain_external_id": "eip155:4663",
      "features": [
        "blocks", "transactions", "address_transactions", "transfers", "token_metadata",
        "balances", "holders", "nfts", "dex_swaps", "dex_prices", "stocks", "traces", "freshness"
      ],
      "coverage": { "from_block": 0, "traces_from_block": 1000000, "has_data": true },
      "finality": { "model": "node_tags", "status": "ok", "safe_block": 74599400, "finalized_block": 74598900 },
      "limits": { "max_page_size": 500, "max_window_blocks": 100000, "max_pools_for_token": 200, "max_batch_addresses": 100 }
    },
    {
      "chain": "eth_mainnet",
      "chain_slug": "ETH_MAINNET",
      "name": "Ethereum",
      "chain_id": 1,
      "chain_external_id": "eip155:1",
      "features": ["blocks", "transactions", "address_transactions", "transfers", "token_metadata", "freshness"],
      "coverage": { "from_block": 1000000, "traces_from_block": null, "has_data": true },
      "finality": { "model": "node_tags", "status": "stale", "safe_block": 26009950, "finalized_block": 26009900 },
      "limits": { "max_page_size": 500, "max_window_blocks": 100000, "max_pools_for_token": 200, "max_batch_addresses": 100 }
    }
  ]
}
```

`finality` informa los marcadores de consenso del nodo (`model` es `"node_tags"`), el estado de los marcadores (`status` es `"ok"`, `"stale"` o `"unavailable"`) y los valores actuales de `safe_block` y `finalized_block` (`safe_block >= finalized_block`, y ambos son `null` únicamente cuando el estado es `"unavailable"`).

`coverage.from_block` es el bloque más bajo indexado, consultado en tiempo real. Es `0` cuando el historial de la cadena llega al bloque génesis. Puede ser `null` únicamente cuando la cadena todavía no tiene ningún bloque indexado (`has_data = false`) o cuando no es posible determinar el inicio: trate `null` como desconocido — no como historial completo ni como `0` — y las solicitudes históricas en ese caso devuelven `503 unavailable`. Consulte siempre este punto de enlace en tiempo de ejecución, en lugar de fijar el valor en el código. `coverage.traces_from_block` es el primer bloque con datos de traza; una solicitud de traza anterior a él o dentro de una brecha devuelve `422 no_coverage` (sin facturación).

Llamar a `/v1/data/{chain}/…` con una cadena desconocida o no pública devuelve HTTP `404` con `error.code` `not_found` (sin facturación; el nombre de la cadena debe ser el slug exacto en minúsculas).
