Skip to main content
Baru mengenal Parsed Streams? Baca model mentalnya terlebih dahulu — bagian tersebut menjelaskan alasan filter memiliki struktur seperti ini.

Panduan Memulai Cepat

1

Get Access

Parsed Streams tersedia pada semua paket dengan biaya 1 kredit per peristiwa yang dikirimkan. Dapatkan kunci API Anda dari Dasbor Helius, lalu hubungkan ke endpoint Gatekeeper di wss://beta.helius-rpc.com, host yang sama dengan lalu lintas RPC dan WebSocket Helius.Lakukan autentikasi dengan kunci API proyek Anda, yang diteruskan sebagai parameter kueri api-key (atau header x-api-key).
2

Connect

wscat
Kunci yang tidak ada atau tidak valid akan ditolak dengan HTTP 401. Proyek yang telah mencapai batas koneksinya akan menerima HTTP 429.
3

Subscribe with a Filter

Kirim parsedTransactionSubscribe dengan filter dan opsi opsional:
result dalam respons adalah bilangan bulat ID langganan:
4

Read a Notification

Setiap transaksi yang cocok diterima sebagai parsedTransactionNotification yang telah didekode, dengan matchedIndexes yang menunjuk ke instruksi yang cocok dengan filter Anda. Lihat Notifikasi untuk struktur lengkapnya.
5

Unsubscribe

Atau cukup tutup koneksi — tindakan ini akan menghapus semua langganannya.

Panduan

Track Jupiter Swaps

Gunakan describeProgram untuk membuat filter yang dapat Anda percayai sebelum berlangganan.

Track Pump.fun Mints

Listener yang aman terhadap koneksi ulang dan mencatat setiap penerapan token Pump.fun baru.

Handling Reconnects

Tangani batas waktu saat tidak aktif dan penerapan, lalu lakukan backfill secara tepat untuk data yang terlewat.

Referensi Protokol

Parsed Streams menggunakan JSON-RPC 2.0 melalui satu koneksi WebSocket. Setiap permintaan menerima respons dengan id yang sama. Langganan kemudian mengirim pesan parsedTransactionNotification hingga Anda berhenti berlangganan atau memutuskan koneksi.

Berlangganan

Kirim parsedTransactionSubscribe dengan filter dan opsi opsional. result dalam respons adalah bilangan bulat ID langganan.
Request
Response

Kolom filter

Setidaknya salah satu dari programs atau accounts.include wajib diisi. Kolom yang Anda tetapkan digabungkan dengan AND: sebuah instruksi harus memenuhi semuanya agar dianggap cocok.
string[]
ID program yang akan dicocokkan (alamat base58, bukan nama). Sebuah instruksi cocok jika programnya ada dalam daftar ini. OR berlaku di dalam daftar.
string[]
Nama instruksi yang telah didekode, seperti route. Nama pertama-tama dicocokkan secara persis, lalu menggunakan pencocokan cadangan yang tidak peka terhadap kapitalisasi dan pemisah. Karena itu, sharedAccountsRoute juga cocok dengan nama wire shared_accounts_route. OR berlaku di dalam daftar. Hanya instruksi yang namanya dapat diidentifikasi oleh katalog yang bisa cocok. Oleh karena itu, ambil nama dari describeProgram.
string[]
Alamat akun. Sebuah instruksi cocok jika salah satu alamat ini muncul dalam daftar akunnya. OR berlaku di dalam daftar. Berlaku untuk setiap instruksi, baik yang didekode maupun tidak. ID program itu sendiri tidak dihitung sebagai akun di sini.
object
Pemetaan nama peran akun yang telah didekode ke alamat, seperti { "user_transfer_authority": "<pubkey>" }. Setiap entri harus terpenuhi (AND di seluruh entri), dan instruksi harus didekode agar aturan ini dapat diterapkan. Nama peran dicocokkan secara persis, tanpa penyeragaman kapitalisasi. Jadi, salin nama dari describeProgram dan jangan menebaknya.
boolean
default:"false"
Sertakan instruksi dari transaksi yang gagal.
boolean
default:"true"
Instruksi internal (CPI) dapat dicocokkan. Tetapkan false untuk hanya mencocokkan instruksi tingkat teratas.
Kolom yang tidak dikenal di mana pun dalam filter atau opsi akan ditolak dengan -32602 dan tidak diabaikan secara diam-diam. Dengan demikian, kesalahan ketik akan langsung menghasilkan kegagalan, bukan filter yang tidak cocok dengan apa pun.

Opsi

Parameter kedua bersifat opsional.
string
default:"confirmed"
Hanya confirmed yang didukung.
string
default:"full"
Data yang dibawa setiap notifikasi. full: seluruh transaksi, setiap instruksi, serta matchedIndexes yang menunjuk ke kecocokan filter. matched: hanya instruksi yang cocok, tanpa daftar indeks. raw: hanya instruksi yang cocok, masing-masing disederhanakan menjadi posisinya, programId, dan blob data base58, tanpa kolom yang didekode dan tanpa larik accountKeys. Gunakan matched ketika bandwidth lebih penting daripada konteks (ukuran payload lengkap rata-rata sekitar tiga kali lebih besar), dan raw ketika Anda mendekode sendiri data instruksi dan hanya memerlukan byte-nya.
Jumlah koneksi serentak per proyek bergantung pada paket Anda: 5 untuk Free, 10 untuk Developer, serta 50 untuk Business dan Professional, yang digunakan bersama oleh semua kunci API proyek. Lihat Batas Laju.

Notifikasi

Satu notifikasi per transaksi yang cocok untuk setiap langganan. Dengan details: "full" default:
Cara membacanya:
  • transaction adalah konteks lengkap. fee dinyatakan dalam lamport. accountKeys adalah daftar kunci lengkap, termasuk kunci yang dimuat dari tabel pencarian alamat, dalam urutan yang sama seperti yang dilaporkan oleh chain. feePayer selalu bernilai accountKeys[0]. error memuat kesalahan transaksi sebagai JSON terstruktur, misalnya {"InstructionError": [2, {"Custom": 6001}]}, ketika status bernilai "error".
  • summary memiliki satu struktur yang sama di setiap kemunculannya: type (seperti swap atau transfer), description yang mudah dibaca manusia, serta payload parsedData terstruktur ketika parser mengenali tindakan tersebut — untuk swap: protokol, jumlah, dan mint. transaction.summary menandai tindakan utama transaksi; setiap instruksi yang dikenali memiliki summary sendiri dengan struktur yang sama. Untuk mengumpulkan setiap swap dalam transaksi, iterasikan instructions dan baca summary.parsedData ketika summary.type bernilai "swap".
  • nativeTransfers dan tokenTransfers mencantumkan perpindahan SOL dan token yang diekstrak parser dari seluruh transaksi, dengan struktur yang sama seperti yang dikembalikan API Parsed Events. Dengan demikian, konsumen stream dan API dapat menggunakan kode pemrosesan yang sama. Keduanya selalu ada, tetapi mungkin kosong.
  • instructions berisi setiap instruksi transaksi dalam urutan eksekusi: setiap instruksi tingkat teratas diikuti instruksi internalnya. Setiap entri memiliki posisinya sendiri: instructionIndex menunjukkan instruksi tingkat teratas yang menaunginya (dimulai dari 0), innerInstructionIndex menunjukkan posisinya di antara panggilan internal instruksi tersebut (null berarti entri tersebut adalah instruksi tingkat teratas itu sendiri), dan stackHeight adalah kedalaman panggilan (1 untuk tingkat teratas). Gunakan nilai-nilai ini, bukan posisi lariknya.
  • matchedIndexes adalah indeks ke dalam instructions yang menunjukkan instruksi mana yang benar-benar cocok dengan filter Anda. Instruksi lainnya disertakan sebagai konteks. Dengan details: "matched", larik hanya berisi instruksi yang cocok dan matchedIndexes tidak ada.
  • Nama decoded menggunakan snake_case (in_amount, user_transfer_authority), sebagaimana dipublikasikan dalam IDL program. Argumen bilangan bulat biasanya berupa string ("1000000") karena nilai u64 tidak dapat ditampung dalam angka JavaScript.
  • blockTime saat ini selalu bernilai null. Jangan mengandalkannya.
  • Dalam satu transaksi, Anda dapat menemukan campuran instruksi yang didekode dan tidak didekode: swap yang sepenuhnya didekode dapat muncul di samping memo yang tidak dikenali. Buat percabangan berdasarkan decoded: ketika nilainya null, instruksi tersebut membawa rawData (byte base58) dan rawAccounts (daftar pubkey biasa) sebagai gantinya. Dengan demikian, Anda selalu memiliki data yang dapat diproses.
Dengan details: "raw", value menyusut menjadi metadata transaksi dan blob. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes, dan semua kolom yang didekode dihapus (summary transaksi tetap disertakan); setiap instruksi yang cocok berisi posisinya, programnya, dan byte data dalam base58, persis seperti yang muncul pada chain (tetap ada bahkan untuk instruksi yang sebenarnya dapat didekode oleh katalog):

Berhenti Berlangganan

Mengembalikan true jika langganan tersebut ada dan merupakan milik Anda. Notifikasi langsung berhenti. Menutup koneksi akan menghapus semua langganannya.

Penemuan

Kegagalan paling umum pada API semacam ini adalah filter yang valid tetapi tidak cocok dengan apa pun, biasanya karena nama instruksi atau peran ditebak. describeProgram mencegah hal tersebut dengan mengembalikan nama persis yang dibandingkan oleh pencocok. Saat ini, metode tersebut hanya tersedia pada wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>. Jadi, kirim melalui koneksi terpisah dari langganan Anda:
Request
Response
Anda dapat meneruskan alamat program atau nama katalog, tetapi utamakan alamat: nama dapat ambigu di berbagai versi program (lebih dari satu entri katalog bernama jupiter, dan pencarian berdasarkan nama dapat mengarah ke entri yang lebih lama). Jika Anda melakukan pencarian berdasarkan nama, pastikan result.id adalah program yang ingin Anda langgani. Alur yang disarankan: gunakan describeProgram untuk mendapatkan nama instruksi dan peran yang persis, buat filter dengan nama tersebut, lalu berlangganan. Panduan Melacak Swap Jupiter menjelaskan proses ini dari awal hingga akhir.

Batas

Kesalahan

Kesalahan mengikuti JSON-RPC 2.0: { "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Pesan menjelaskan secara persis apa yang salah dan lokasinya. Koneksi juga dapat ditutup dengan kode penutupan WebSocket — lihat Menangani Koneksi Ulang untuk mengetahui arti setiap kode dan cara memulihkan koneksi.

Contoh Klien