> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Batas Laju Helius

> Panduan lengkap tentang batas laju Helius untuk semua paket dan produk.

## Apa itu batas laju?

Batas laju mengontrol jumlah permintaan yang dapat Anda buat per detik. Jika batas laju terlampaui, Anda akan menerima respons HTTP 429. Untuk panduan tentang tindakan yang perlu dilakukan saat menerima 429 atau kegagalan sementara lainnya, lihat [Percobaan ulang dan penanganan kesalahan](#percobaan-ulang-dan-penanganan-kesalahan) di bawah ini.

## Batas Laju Standar

Paket Anda memiliki dua grup batas laju standar: satu untuk permintaan RPC dan satu untuk permintaan DAS API. Berikut adalah batas laju dasar untuk setiap paket Helius:

<table>
  <thead align="left">
    <tr>
      <th width="200">Paket</th>
      <th width="260">Batas Laju RPC</th>
      <th width="260">DAS & API yang Disempurnakan</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td><strong>Gratis</strong></td>
      <td>10 permintaan/dtk</td>
      <td>2 permintaan/dtk</td>
    </tr>

    <tr>
      <td><strong>Pengembang</strong></td>
      <td>50 permintaan/dtk</td>
      <td>10 permintaan/dtk</td>
    </tr>

    <tr>
      <td><strong>Bisnis</strong></td>
      <td>200 permintaan/dtk</td>
      <td>50 permintaan/dtk</td>
    </tr>

    <tr>
      <td><strong>Profesional</strong></td>
      <td>500 permintaan/dtk</td>
      <td>100 permintaan/dtk</td>
    </tr>

    <tr>
      <td><strong>Perusahaan</strong></td>
      <td>Kustom</td>
      <td>Kustom</td>
    </tr>
  </tbody>
</table>

### Meningkatkan Batas Laju

Tim dengan paket Profesional dapat membeli tambahan 100 RPS seharga \$100/bulan.

Jika Anda memerlukan batas laju khusus sebelum peluncuran, [hubungi tim penjualan kami](https://www.helius.dev/contact). Jika Anda menggunakan tingkat Pengembang atau Bisnis, tingkatkan paket Anda untuk menaikkan batas laju.

## Batas Laju Khusus

Beberapa endpoint dan produk khusus Helius memiliki batas laju khusus karena kebutuhan komputasinya.

### Mengirim Transaksi

<table>
  <thead align="left">
    <tr>
      <th width="200">Endpoint</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td><code>Sender</code></td>
      <td>50/dtk</td>
      <td>50/dtk</td>
      <td>50/dtk</td>
      <td>50/dtk</td>
    </tr>

    <tr>
      <td><code>sendTransaction</code></td>
      <td>1/dtk</td>
      <td>5/dtk</td>
      <td>50/dtk</td>
      <td>100/dtk</td>
    </tr>

    <tr>
      <td><code>sendBundle</code></td>
      <td>—</td>
      <td>—</td>
      <td>5/dtk</td>
      <td>5/dtk</td>
    </tr>

    <tr>
      <td><code>simulateBundle</code></td>
      <td>10/dtk</td>
      <td>50/dtk</td>
      <td>200/dtk</td>
      <td>500/dtk</td>
    </tr>
  </tbody>
</table>

Jika Anda menggunakan paket Profesional dan perlu meningkatkan batas laju `sendTransaction`, [hubungi tim penjualan kami](https://www.helius.dev/contact).

Pengguna paket Profesional juga dapat [meminta](https://www.helius.dev/contact) peningkatan batas laju dan pengaturan tip khusus untuk Sender guna mendukung aplikasi perdagangan dengan throughput yang lebih tinggi.

### Panggilan RPC Kompleks

<table>
  <thead align="left">
    <tr>
      <th width="200">Endpoint</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td><code>getProgramAccounts</code></td>
      <td>5/dtk</td>
      <td>25/dtk</td>
      <td>50/dtk</td>
      <td>75/dtk</td>
    </tr>
  </tbody>
</table>

### Data Historis

Saat membuat permintaan batch untuk metode data historis, batas berikut berlaku:

<table>
  <thead align="left">
    <tr>
      <th style={{width: '300px'}}>Metode</th>
      <th style={{width: '300px'}}>Ukuran Batch Maksimum</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td><code>getTransaction</code></td>
      <td>100 item per permintaan</td>
    </tr>

    <tr>
      <td><code>getTransactionsForAddress</code></td>
      <td>Permintaan batch tidak diizinkan</td>
    </tr>

    <tr>
      <td><code>getTransfersByAddress</code></td>
      <td>Permintaan batch tidak diizinkan</td>
    </tr>

    <tr>
      <td>Semua metode historis lainnya</td>
      <td>10 item per permintaan</td>
    </tr>
  </tbody>
</table>

<Warning>
  Melebihi batas batch akan menghasilkan respons kesalahan. Untuk `getTransactionsForAddress` dan `getTransfersByAddress`, setiap alamat harus dikueri dalam permintaan terpisah.
</Warning>

### LaserStream

<table>
  <thead align="left">
    <tr>
      <th width="200">Sumber Daya</th>
      <th width="50">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="150">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Jaringan</td>
      <td>—</td>
      <td>Devnet</td>
      <td>Devnet, Mainnet</td>
      <td>Devnet, Mainnet</td>
    </tr>

    <tr>
      <td>Pubkey Maksimum</td>
      <td>—</td>
      <td>10M</td>
      <td>10M</td>
      <td>10M</td>
    </tr>

    <tr>
      <td>Koneksi Aktif</td>
      <td>—</td>
      <td>—</td>
      <td>10</td>
      <td>100</td>
    </tr>
  </tbody>
</table>

### Wallet API

[Wallet API](/docs/id/api-reference/wallet-api) mengikuti batas laju yang sama dengan DAS & API yang Disempurnakan. Semua endpoint berbagi batas berikut:

<table>
  <thead align="left">
    <tr>
      <th width="200">Endpoint</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Semua Endpoint Wallet API</td>
      <td>2/dtk</td>
      <td>10/dtk</td>
      <td>50/dtk</td>
      <td>100/dtk</td>
    </tr>
  </tbody>
</table>

Ini mencakup pencarian identitas, saldo, riwayat, transfer, dan endpoint sumber pendanaan. Pelajari selengkapnya dalam [dokumentasi Wallet API kami](/docs/id/wallet-api/overview).

### Stream yang Diuraikan

<table>
  <thead align="left">
    <tr>
      <th width="200">Sumber Daya</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Koneksi Bersamaan</td>
      <td>5</td>
      <td>10</td>
      <td>50</td>
      <td>50</td>
    </tr>

    <tr>
      <td>Langganan per Koneksi</td>
      <td>25</td>
      <td>25</td>
      <td>25</td>
      <td>25</td>
    </tr>
  </tbody>
</table>

Koneksi dihitung per proyek di seluruh API key miliknya. Proyek yang mencapai batas koneksi akan menerima HTTP 429. Lihat [batas Parsed Streams](/docs/id/api-reference/parsed-streams/overview#batas) untuk batas per filter dan pesan.

### WebSocket LaserStream

<table>
  <thead align="left">
    <tr>
      <th width="200">Sumber Daya</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Koneksi Bersamaan</td>
      <td>5</td>
      <td>150</td>
      <td>250</td>
      <td>1,000</td>
    </tr>

    <tr>
      <td>Langganan per Koneksi</td>
      <td>1,000</td>
      <td>1,000</td>
      <td>1,000</td>
      <td>1,000</td>
    </tr>

    <tr>
      <td>Jenis WebSocket</td>
      <td>Standar</td>
      <td>Standar, Disempurnakan</td>
      <td>Standar, Disempurnakan</td>
      <td>Standar, Disempurnakan</td>
    </tr>
  </tbody>
</table>

### Webhook

<table>
  <thead align="left">
    <tr>
      <th width="200">Sumber Daya</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Webhook Maksimum</td>
      <td>5</td>
      <td>50</td>
      <td>50</td>
      <td>50</td>
    </tr>

    <tr>
      <td>Alamat per Webhook</td>
      <td>100k</td>
      <td>100k</td>
      <td>100k</td>
      <td>100k</td>
    </tr>
  </tbody>
</table>

### Kompresi ZK

<table>
  <thead align="left">
    <tr>
      <th width="200">Layanan</th>
      <th width="100">Gratis</th>
      <th width="100">Pengembang</th>
      <th width="100">Bisnis</th>
      <th width="100">Profesional</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Photon APIs</td>
      <td>2/dtk</td>
      <td>10/dtk</td>
      <td>50/dtk</td>
      <td>100/dtk</td>
    </tr>

    <tr>
      <td><code>getValidityProof</code></td>
      <td>1/dtk</td>
      <td>5/dtk</td>
      <td>10/dtk</td>
      <td>20/dtk</td>
    </tr>
  </tbody>
</table>

## Percobaan ulang dan penanganan kesalahan

Saat aplikasi Anda menerima respons `429 Too Many Requests`, `503 Service Unavailable`, atau `5xx` sementara, tunggu sebentar lalu coba lagi — jangan langsung mencoba lagi. Percobaan ulang seketika akan menumpuk permintaan dan memperlambat pemulihan batas laju, bukan mempercepatnya.

### Strategi yang disarankan

* Tunggu sekitar **1 detik** sebelum percobaan ulang pertama.
* **Gandakan waktu tunggu** setiap kali Anda mencoba lagi, hingga maksimum **30 detik**.
* Tambahkan sedikit variasi acak sebesar **±25%** pada setiap waktu tunggu agar beberapa aplikasi tidak mencoba lagi pada saat yang sama.
* Hentikan setelah **5 percobaan** dan kembalikan kesalahan ke kode pemanggil.

### Kesalahan yang perlu dicoba ulang

| Status                     | Coba lagi? | Alasan                                                        |
| -------------------------- | ---------- | ------------------------------------------------------------- |
| `400`, `401`, `403`, `404` | Tidak      | Kesalahan klien — mencoba lagi tidak akan mengubah hasilnya.  |
| `408`                      | Ya         | Waktu permintaan habis.                                       |
| `409`                      | Tidak      | Konflik — selesaikan pada pemanggil.                          |
| `422`                      | Tidak      | Kesalahan validasi.                                           |
| `429`                      | Ya         | Batas laju terlampaui — tunggu dan coba lagi dengan backoff.  |
| `500`, `502`               | Ya         | Kesalahan server sementara.                                   |
| `503`                      | Ya         | Layanan tidak tersedia — tunggu dan coba lagi dengan backoff. |
| `504`                      | Ya         | Waktu gateway habis.                                          |
| Kesalahan jaringan         | Ya         | Koneksi direset, kegagalan DNS, atau waktu soket habis.       |

### Contoh

<CodeGroup>
  ```ts TypeScript theme={"system"}
  const RETRYABLE = new Set([408, 429, 500, 502, 503, 504]);

  export async function callWithRetry<T>(
    request: () => Promise<Response>,
    maxAttempts = 5,
  ): Promise<T> {
    let delay = 1000;
    for (let attempt = 1; attempt <= maxAttempts; attempt++) {
      const res = await request();
      if (res.ok) return (await res.json()) as T;

      if (!RETRYABLE.has(res.status) || attempt === maxAttempts) {
        throw new Error(`${res.status} after ${attempt} attempt(s): ${await res.text()}`);
      }

      const jitterMs = delay * (0.75 + Math.random() * 0.5);
      await new Promise((r) => setTimeout(r, jitterMs));
      delay = Math.min(delay * 2, 30_000);
    }
    throw new Error("unreachable");
  }
  ```

  ```python Python theme={"system"}
  import random
  import time

  RETRYABLE = {408, 429, 500, 502, 503, 504}

  def call_with_retry(request, max_attempts: int = 5):
      delay = 1.0
      for attempt in range(1, max_attempts + 1):
          response = request()
          if response.ok:
              return response.json()

          if response.status_code not in RETRYABLE or attempt == max_attempts:
              response.raise_for_status()

          time.sleep(delay * random.uniform(0.75, 1.25))
          delay = min(delay * 2, 30.0)
  ```

  ```bash Shell theme={"system"}
  call_with_retry() {
    local attempt=1 delay=1 body status
    while [ "$attempt" -le 5 ]; do
      response=$(curl -sS -w "\n%{http_code}" "$@")
      body=$(printf '%s\n' "$response" | sed '$d')
      status=$(printf '%s\n' "$response" | tail -n1)
      case "$status" in
        2*) printf '%s\n' "$body"; return 0 ;;
        408|429|500|502|503|504) ;;  # fall through and retry
        *) printf '%s\n' "$body" >&2; return 1 ;;
      esac
      # ~delay seconds with 25% jitter
      sleep "$(awk -v d="$delay" 'BEGIN { srand(); print d * (0.75 + rand() * 0.5) }')"
      delay=$(( delay * 2 > 30 ? 30 : delay * 2 ))
      attempt=$(( attempt + 1 ))
    done
    return 1
  }
  ```
</CodeGroup>

### Format respons kesalahan

Semua Helius API mengembalikan isi JSON terstruktur saat terjadi kesalahan. Endpoint JSON-RPC (Solana RPC, DAS, Sender, Priority Fee, ZK Compression) mengembalikan pembungkus standar JSON-RPC 2.0:

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "error": { "code": -32005, "message": "Too many requests" },
  "id": "1"
}
```

Endpoint REST (Wallet API, Admin API) mengembalikan:

```json theme={"system"}
{
  "error": "RATE_LIMIT_EXCEEDED",
  "code": 429,
  "details": "Too many requests. Retry after 2 seconds."
}
```

Lihat [Kode kesalahan umum](/docs/id/api-reference/common-error-codes) untuk daftar lengkap kode kesalahan dan arti masing-masing.
