# Tek anahtar, çok zincir: bir örneği başka bir zincire geçirme

> Source: https://docs.blockvectra.com/tr/guides/one-key-many-chains/

## 1. Desteklenen tüm zincirlerde tek anahtar

Aynı API anahtarı, JSON-RPC için desteklenen tüm zincirlerde ve mevcut olduğu zincirlerde Data API için çalışır. Anahtarlar hesabınıza aittir ve belirli bir zincire bağlı değildir; her ağ için ayrı API anahtarları oluşturmanıza gerek yoktur.

Krediler ve hız sınırları, tüm ağlar genelinde ve JSON-RPC API ile Data API arasında paylaşılır; ağa göre bölünmez. Ayrıntılı faturalandırma kuralları için [Fiyatlandırma sayfasına](https://blockvectra.com/tr/pricing/) bakın.

* **Havuzlanmış bakiye**: Ücretli bakiye yüklemeleri ve ücretsiz krediler tüm zincirlerde geçerlidir. Herhangi bir zincirdeki çağrılar aynı hesap bakiyesinden düşülür.
* **Havuzlanmış hız sınırları**: Belirli bir anahtar için Compute Unit (CU) yenilenme hızları ve burst kapasiteleri tüm zincirlerde geçerlidir. Ücretsiz Plan saniye başına çağrı sınırları, zincir başına bölünmek yerine desteklenen tüm zincirler genelinde havuzlanır.
* **Yükseltme yolu**: Bakiye yüklemesi yaptıktan sonra artık Ücretsiz Plan'ın saniye başına çağrı sınırıyla kısıtlanmazsınız; her anahtar, [JSON-RPC dokümantasyonunda](https://docs.blockvectra.com/tr/api/json-rpc/#method-policy) açıklandığı gibi CU hız ve burst sınırlarına tabi kalmaya devam eder.

## 2. URL yapısı ve `{chain}` parametresi

Zincir kapsamındaki her istek, URL yolunda `{chain}` kullanarak hedef ağını belirtir. `{chain}` parametresi, zincirin küçük harfli slug tanımlayıcısıdır (örneğin `robinhood_mainnet`).

| Hizmet               | Kimlik Doğrulama         | URL şablonu                  | Açıklama                                                         |
| -------------------- | ------------------------ | ---------------------------- | ---------------------------------------------------------------- |
| JSON-RPC             | URL yolunda anahtar      | `POST /v1/{chain}/{api_key}` | En basit biçim, curl ve HTTP istemcileri için uygundur           |
| JSON-RPC             | İstek başlığında anahtar | `POST /v1/{chain}`           | Anahtarı `x-api-key: {api_key}` istek başlığıyla iletin          |
| Data API             | REST rotaları            | `GET /v1/data/{chain}/…`     | Anahtarı `x-api-key: {api_key}` istek başlığıyla iletin          |
| Genel zincir listesi | Kimlik doğrulamasız      | `GET /v1/chains`             | Genel zincir listesi ve statik parametreler (faturalandırılmaz)  |
| Genel durum          | Kimlik doğrulamasız      | `GET /v1/status`             | Mevcut hizmet durumu ve zincir tepe blokları (faturalandırılmaz) |

`GET /v1/chains`, her zincir için bir `jsonrpc` ve bir `data` bayrağı bildirir. Bir zincire JSON-RPC sunduğunda JSON-RPC URL'leri ile, `data` bayrağı `true` olduğunda ise `GET /v1/data/{chain}/…` ile erişin (Data API yalnızca bu zincirlere hizmet verir).

> **İpucu**: Anahtarınızı istek başlıkları aracılığıyla iletirken, URL'yi sonunda eğik çizgi **olmadan** zincir adıyla bitecek şekilde biçimlendirin. JSON-RPC yalnızca `/v1/{chain}` ve `/v1/{chain}/{api_key}` adreslerinde sunulur. Sonunda eğik çizgi olan (örneğin `/v1/{chain}/`) veya zincir segmenti eksik olan istekler, boş bir gövde ile HTTP 404 döndürür. Bilinmeyen bir `{chain}` için yapılan istekler `error.data.reason: "unknown_chain"` ile HTTP 404 döndürür (faturalandırılmaz).

## 3. Programatik zincir keşfi ve yetenekler

Desteklenen zincirler ve yetenekleri dinamik olarak sunulur. Uygulamanızda statik bir zincir listesini sabit kodlamayın. Bunun yerine, çalışma zamanında mevcut ağları ve yeteneklerini keşfedin:

### GET /v1/chains ile statik parametreleri keşfedin

Bu genel uç nokta kimlik doğrulaması gerektirmez ve faturalandırılmaz; herkese açık tüm zincirleri döndürür:

```http
GET /v1/chains
```

Örnek yanıt:

```json
{
  "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
    }
  ]
}
```

Alan referansı:

* `chain`: Zincir tanımlayıcı slug'ı (URL'lerde `{chain}` için kullanılır)
* `name`: İnsan tarafından okunabilir görünen ad
* `chain_id`: EIP-155 zincir kimliği (ondalık tamsayı)
* `jsonrpc`: JSON-RPC'nin etkin olup olmadığı
* `data`: Data API'nin etkin olup olmadığı
* `methods`: `allow` (izin verilen yöntemler) ve `deny` (açıkça reddedilen yöntemler) dahil olmak üzere zincir için JSON-RPC yöntem politikası
* `max_logs_block_range`: Tek bir `eth_getLogs` isteğinde izin verilen maksimum blok aralığı
* `state_window_blocks`: Blok cinsinden geçmiş durum penceresi boyutu; kısıtlama olmadığında `null`

### GET /v1/status ile operasyonel durumu kontrol edin

Bu genel uç nokta kimlik doğrulaması gerektirmez ve faturalandırılmaz; hizmet hazırlığını ve zincir ucu bilgilerini döndürür:

```http
GET /v1/status
```

Örnek yanıt:

```json
{
  "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
      }
    }
  ]
}
```

Alan referansı:

* `gateway.status`: Hizmet durumu (`ok` veya `degraded`)
* `chains[].data_features`: Bu zincir için Data API tarafından sağlanan yetenekler
* `chains[].status`: Düğüm operasyonel durumu (`ok` veya `unavailable`)
* `chains[].head`: En son blok ucu (`block`, `time`, `lag_seconds`)

## 4. Akılda tutulması gereken zincir bazlı farklılıklar

Zincirler arasında geçiş yaparken `GET /v1/chains` tarafından sağlanan alanları inceleyin:

1. **Yöntem izni ve politikası (`methods.allow` / `methods.deny`)**: Kullanılabilir JSON-RPC yöntemleri, yöntem politikalarına göre ağa bağlı olarak değişir. İzin verilmeyen bir yöntemin istenmesi, JSON-RPC hata kodu `-32601` (`method not available`, faturalandırılmaz) ile HTTP 200 döndürür.
2. **Log blok aralığı (`max_logs_block_range`)**: `eth_getLogs` sorguları için maksimum blok aralıkları zincire göre farklılık gösterir. Zincirin sınırını aşmak, JSON-RPC hata kodu `-32602` (`eth_getLogs block range too large`, faturalandırılmaz) ile HTTP 200 döndürür.
3. **Durum saklama penceresi (`state_window_blocks`)**: Tam geçmişe sahip zincirler `null` döndürür. Durum budaması olan zincirlerde, pencerenin dışındaki geçmiş durum sorguları JSON-RPC hata kodu `-32011` (`historical state is not available beyond the most recent <N> blocks`, faturalandırılmaz) ile HTTP 200 döndürür.
4. **Data API özellikleri ve kapsamı (`data` / `data_features`)**: Bir veri kümesi sağlayan zincirler [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/) sayfasında listelenmiştir. Bir zincirin desteklemediği bir veri kümesini veya indekslenmiş kapsamından önceki bir bloğu sorgulamak, HTTP `422` (`error.code` `no_coverage`, faturalandırılmaz) döndürür. Hizmet geçici olarak kullanılamadığında (örneğin bir zincir meşgul olduğunda), istekler bir `Retry-After` başlığı ile HTTP `503` döndürür (faturalandırılmaz).

## 5. Kod örnekleri

Eksiksiz başlangıç şablonu: [blockvectra/multichain-viem](https://github.com/blockvectra/multichain-viem)

Zincir değişkenini güncelleyerek (veya `GET /v1/chains` üzerinden okuyarak), JSON-RPC aracılığıyla `eth_blockNumber` ve Data API aracılığıyla veri kümesi güncelliğini sorgulayarak tamamen aynı kod farklı zincirlerde çalışır:

**cURL**

```bash
export BLOCKVECTRA_API_KEY="rgw_your_api_key"

# Desteklenen Zincirler arasından başka bir zinciri hedeflemek için chain değişkenini değiştirin
CHAIN="robinhood_mainnet"

# 1. JSON-RPC: eth_blockNumber sorgulayın (POST /v1/{chain}, anahtar x-api-key başlığında).
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: Veri kümesi güncelliğini sorgulayın (GET /v1/data/{chain}/status/freshness)
curl -s "https://api.blockvectra.com/v1/data/$CHAIN/status/freshness" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
// Başka bir zinciri hedeflemek için bu değişkeni değiştirin veya GET /v1/chains üzerinden dinamik olarak okuyun
const chain = "robinhood_mainnet";
const apiKey = process.env.BLOCKVECTRA_API_KEY!;

// 1. JSON-RPC: eth_blockNumber çağırın (POST /v1/{chain})
const rpcUrl = `https://api.blockvectra.com/v1/${chain}`;
const rpcResponse = await fetch(rpcUrl, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "eth_blockNumber",
    params: [],
  }),
});
const rpcResult = await rpcResponse.json();
console.log(`[${chain}] JSON-RPC blockNumber:`, rpcResult.result);

// 2. Data API: Güncelliği sorgulayın (GET /v1/data/{chain}/status/freshness)
const dataUrl = `https://api.blockvectra.com/v1/data/${chain}/status/freshness`;
const dataResponse = await fetch(dataUrl, {
  headers: {
    "x-api-key": apiKey,
  },
});
const dataResult = await dataResponse.json();
console.log(`[${chain}] Data API freshness:`, dataResult.data);
```


  **Python**

```python
import os
import requests

# Başka bir zinciri hedeflemek için bu değişkeni değiştirin veya GET /v1/chains üzerinden dinamik olarak okuyun
chain = "robinhood_mainnet"
api_key = os.environ["BLOCKVECTRA_API_KEY"]

# 1. JSON-RPC: eth_blockNumber çağırın (POST /v1/{chain})
rpc_url = f"https://api.blockvectra.com/v1/{chain}"
headers = {
    "Content-Type": "application/json",
    "x-api-key": api_key,
}
rpc_payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_blockNumber",
    "params": [],
}
rpc_resp = requests.post(rpc_url, json=rpc_payload, headers=headers)
print(f"[{chain}] JSON-RPC blockNumber:", rpc_resp.json().get("result"))

# 2. Data API: Güncelliği sorgulayın (GET /v1/data/{chain}/status/freshness)
data_url = f"https://api.blockvectra.com/v1/data/{chain}/status/freshness"
data_resp = requests.get(data_url, headers={"x-api-key": api_key})
print(f"[{chain}] Data API freshness:", data_resp.json().get("data"))
```


### Örnek yanıtlar

JSON-RPC `eth_blockNumber` başarılı yanıtı (yöntemin CU ağırlığından faturalandırılır):

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

Data API `GET /v1/data/{chain}/status/freshness` başarılı yanıtı (CU cinsinden faturalandırılır, yalnızca 2xx başarılı yanıtlar faturalandırılır):

```json
{
  "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"
  }
}
```

## Sonraki adımlar

* [BlockVectra'nın indekslediği her veri setini görmek için veri setleri dizinine göz atın](https://blockvectra.com/tr/data/).
* [Hesabınızın neleri içerdiğini kontrol etmek için ücretsiz planı ve fiyatlandırmayı inceleyin](https://blockvectra.com/tr/pricing/#free).
* [Bir API anahtarı oluşturmak için konsola giriş yapın](https://console.blockvectra.com/login/?next=%2Fkeys%2F).
