Inicio rápido
1
Get Access
Parsed Streams está en beta abierta y disponible en los planes de pago. Obtén tu clave de API en el panel de Helius y conéctate al endpoint beta en
wss://fs-beta.helius-rpc.com.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":
transactioncontiene el contexto completo.feeestá expresado en lamports.accountKeyses la lista completa de claves, incluidas las cargadas desde tablas de consulta de direcciones, en el mismo orden en que las informa la cadena.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 en todos los lugares donde aparece: untype(comoswapotransfer), undescriptionlegible y un payloadparsedDataestructurado cuando el analizador reconoce la acción. Para un swap, incluye el protocolo, las cantidades y los mints.transaction.summaryetiqueta la acción principal de la transacción. Cada instrucción reconocida contiene su propiosummarycon la misma estructura. Para recopilar todos los swaps de una transacción, recorreinstructionsy leesummary.parsedDatacuandosummary.typesea"swap".nativeTransfersytokenTransfersenumeran los movimientos de SOL y tokens que el analizador extrajo de toda la transacción. Tienen la misma estructura que devuelve la API de Parsed Events, por lo que los consumidores del stream y de la API pueden compartir código de procesamiento. Ambos siempre están 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:topIndexindica a qué instrucción de nivel superior pertenece (comenzando en 0),innerIndexindica 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 array.matchedIndexescontiene índices deinstructionsque indican cuáles coincidieron realmente con tu filtro. El resto se incluye como contexto. Condetails: "matched", el array solo contiene las coincidencias ymatchedIndexesno está presente.- Los nombres de
decodedusan snake_case (in_amount,user_transfer_authority), tal como se publican en la IDL del programa. Los argumentos enteros suelen ser strings ("1000000"), ya que los valores u64 no caben en los números de JavaScript. blockTimeactualmente siempre esnull. No dependas de este campo.- En una misma transacción, puede haber una combinación de instrucciones decodificadas y sin decodificar: un swap completamente decodificado puede aparecer junto a un memo no reconocido. Bifurca según
decoded. Cuando seanull, la instrucción contendrárawData(bytes en base58) erawAccounts(lista simple de claves públicas), por lo que siempre tendrás datos con los 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, normalmente porque se adivinó el nombre de una instrucción o de un rol.describeProgram evita ese problema al devolver los nombres exactos que usa el comparador:
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.