Inicio rápido
1
Get Access
Parsed Streams está disponible en todos los planes a 1 crédito por evento entregado. Obtén tu clave de API en el panel de Helius y conéctate al endpoint de Gatekeeper en
wss://beta.helius-rpc.com, el mismo host que usa el tráfico RPC y WebSocket de Helius.Autentícate con la clave de API de tu proyecto. Pásala como parámetro de consulta api-key o como encabezado x-api-key.2
Connect
wscat
3
Subscribe with a Filter
Envía El campo
parsedTransactionSubscribe con un filtro y opciones opcionales:result de la respuesta es un id de suscripción entero:4
Read a Notification
Cada transacción coincidente llega como
parsedTransactionNotification, ya decodificada, con matchedIndexes apuntando a las instrucciones que coincidieron con tu filtro. Consulta Notificaciones para ver la estructura completa.5
Unsubscribe
Guías
Track Jupiter Swaps
Usa
describeProgram para crear un filtro confiable antes de suscribirte.Track Pump.fun Mints
Un listener seguro frente a reconexiones que registra cada nuevo despliegue de tokens de Pump.fun.
Handling Reconnects
Supera los tiempos de espera por inactividad y los despliegues. Después, recupera exactamente lo que te perdiste.
Referencia del protocolo
Parsed Streams usa JSON-RPC 2.0 mediante una única conexión WebSocket. Cada solicitud recibe una respuesta con el mismoid. Después, una suscripción envía mensajes parsedTransactionNotification hasta que canceles la suscripción o te desconectes.
Suscribirse
EnvíaparsedTransactionSubscribe con un filtro y opciones opcionales. El campo result de la respuesta es un id de suscripción entero.
Request
Response
Campos del filtro
Se requiere al menos uno deprograms o accounts.include. Los campos que configures se combinan con AND: una instrucción debe satisfacerlos todos para coincidir.
string[]
IDs de programa que deben coincidir (direcciones base58, no nombres). Una instrucción coincide si su programa está en esta lista. Se aplica OR dentro de la lista.
string[]
Nombres de instrucciones decodificadas, como
route. Primero se busca una coincidencia exacta y, luego, se usa una alternativa que no distingue mayúsculas, minúsculas ni separadores. Por lo tanto, sharedAccountsRoute también coincide con el nombre en el protocolo shared_accounts_route. Se aplica OR dentro de la lista. Solo pueden coincidir las instrucciones cuyo nombre haya identificado el catálogo. Por eso, obtén los nombres de describeProgram.string[]
Direcciones de cuentas. Una instrucción coincide si alguna de estas aparece en su lista de cuentas. Se aplica OR dentro de la lista. Funciona con todas las instrucciones, estén decodificadas o no. Aquí, el id del programa no cuenta como una cuenta.
object
Un mapa que relaciona el nombre del rol de una cuenta decodificada con una dirección, como
{ "user_transfer_authority": "<pubkey>" }. Cada entrada debe cumplirse (AND entre entradas) y la instrucción debe estar decodificada para que esto se aplique. Los nombres de roles coinciden exactamente, sin normalizar mayúsculas y minúsculas. Cópialos de describeProgram en lugar de adivinarlos.boolean
predeterminado:"false"
Incluye instrucciones de transacciones fallidas.
boolean
predeterminado:"true"
Las instrucciones internas (CPI) pueden coincidir. Configura
false para que solo coincidan las instrucciones de nivel superior.-32602 en lugar de ignorarse silenciosamente. Así, los errores tipográficos generan un error explícito en vez de no producir coincidencias.
Opciones
El segundo parámetro es opcional.string
predeterminado:"confirmed"
Solo se admite
confirmed.string
predeterminado:"full"
Define qué contiene cada notificación.
full: la transacción completa, todas las instrucciones y matchedIndexes, que apunta a las coincidencias del filtro. matched: solo las instrucciones coincidentes, sin lista de índices. raw: solo las instrucciones coincidentes, cada una reducida a su posición, programId y un blob data en base58, sin campos decodificados ni array accountKeys. Usa matched cuando el ancho de banda sea más importante que el contexto (los payloads completos tienen, en promedio, aproximadamente el triple de tamaño). Usa raw cuando decodifiques tú mismo los datos de las instrucciones y solo necesites los bytes.Notificaciones
Se envía una notificación por cada transacción coincidente y por suscripción. Con el valor predeterminadodetails: "full":
transactiones el contexto completo.feeestá en lamports.accountKeyses la lista completa de claves, incluidas las claves cargadas desde tablas de búsqueda de direcciones, en el mismo orden en que la cadena las reporta.feePayersiempre esaccountKeys[0].errorcontiene el error de la transacción como JSON estructurado, por ejemplo,{"InstructionError": [2, {"Custom": 6001}]}, cuandostatuses"error".summarytiene la misma estructura dondequiera que aparece: untype(comoswapotransfer), undescriptionlegible para humanos y una carga útilparsedDataestructurada cuando el analizador reconoce la acción; para un intercambio: el protocolo, los montos y los mints.transaction.summaryidentifica la acción principal de la transacción; cada instrucción reconocida incluye su propiosummarycon la misma estructura. Para recopilar todos los intercambios de una transacción, recorreinstructionsy leesummary.parsedDatadondesummary.typesea"swap".- Los montos de los intercambios son los reportados por la plataforma.
in_amount,actual_out_amounty los montos de intercambios internos enparsedDatason los que reportó la plataforma, no los que la billetera del usuario realmente envió o recibió. No tienen en cuenta las comisiones de transferencia de Token-2022 ni otras deducciones aplicadas fuera del intercambio. Para obtener el monto exacto recibido, compara los saldos de la cuenta de tokens del usuario antes y después de la transacción. nativeTransfersytokenTransfersenumeran los movimientos de SOL y tokens que el analizador extrajo de toda la transacción, con la misma estructura que devuelve la API de eventos analizados, de modo que los consumidores del flujo y de la API puedan compartir el código de procesamiento. Ambos están siempre presentes, aunque pueden estar vacíos.instructionscontiene todas las instrucciones de la transacción en orden de ejecución: cada instrucción de nivel superior seguida de sus instrucciones internas. Cada entrada incluye su propia posición:instructionIndexindica a qué instrucción de nivel superior pertenece (comenzando en 0),innerInstructionIndexindica su posición entre las llamadas internas de esa instrucción (nullsignifica que es la propia instrucción de nivel superior) estackHeightindica la profundidad de la llamada (1 para el nivel superior). Usa estos valores, no la posición en el arreglo.matchedIndexesson índices deinstructionsque indican cuáles coincidieron realmente con tu filtro. El resto está ahí para aportar contexto. Condetails: "matched", el arreglo contiene solo las coincidencias ematchedIndexesno está presente.- Los nombres de
decodedusan snake_case (in_amount,user_transfer_authority), tal como se publican en el IDL del programa. Los argumentos enteros suelen ser cadenas ("1000000") porque los valores u64 no caben en los números de JavaScript. blockTimeactualmente siempre esnull. No dependas de él.- Espera una combinación de instrucciones decodificadas y sin decodificar dentro de una misma transacción: un intercambio completamente decodificado puede aparecer junto a un memo no reconocido. Bifurca según
decoded: cuando seanull, la instrucción incluirá en su lugarrawData(bytes en base58) erawAccounts(lista simple de claves públicas), por lo que siempre tendrás algo con lo que trabajar.
details: "raw", value se reduce a los metadatos y blobs de la transacción. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes y todos los campos decodificados desaparecen (el summary de la transacción sigue incluido). Cada instrucción coincidente contiene su posición, su programa y sus bytes data en base58, exactamente como aparecen en la cadena. Esto también se aplica a las instrucciones que el catálogo podría haber decodificado:
Cancelar la suscripción
true si la suscripción existía y te pertenecía. Las notificaciones se detienen de inmediato. Al cerrar la conexión, se eliminan todas sus suscripciones.
Descubrimiento
El error más común con este tipo de API es usar un filtro válido que no coincide con nada, por lo general debido a un nombre de instrucción o rol elegido por suposición.describeProgram evita esto al devolver los nombres exactos con los que compara el sistema de coincidencias. Actualmente, solo está disponible en wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>, así que envíalo mediante una conexión separada de tus suscripciones:
Request
Response
jupiter y una búsqueda por nombre puede devolver la versión más antigua). Si buscas por nombre, comprueba que result.id sea el programa al que quieres suscribirte.
Flujo recomendado: usa describeProgram para obtener los nombres exactos de las instrucciones y los roles, crea el filtro con esos nombres y, luego, suscríbete. La guía Rastrear swaps de Jupiter explica todo el proceso de principio a fin.
Límites
Errores
Los errores siguen JSON-RPC 2.0:{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Los mensajes indican exactamente qué salió mal y dónde.
Las conexiones también pueden cerrarse con un código de cierre de WebSocket. Consulta Manejo de reconexiones para saber qué significa cada código y cómo recuperarte.