Skip to main content
Nouveau dans les Flux Analysés ? Lisez d’abord le modèle mental — il explique pourquoi les filtres sont comme ils sont.

Démarrage rapide

1

Obtenir l'accès

Les Flux Analysés sont en bêta ouverte, disponibles sur les plans payants. Obtenez votre clé API depuis le Tableau de bord Helius et connectez-vous au point de terminaison bêta à wss://fs-beta.helius-rpc.com.Authentifiez-vous avec la clé API de votre projet, passée en tant que paramètre de requête api-key (ou en tant qu’en-tête x-api-key).
2

Connectez-vous

wscat
Une clé manquante ou invalide est rejetée avec HTTP 401. Un projet à sa limite de connexion obtient HTTP 429.
3

S'abonner avec un filtre

Envoyez parsedTransactionSubscribe avec un filtre et des options facultatives :
La réponse result est un ID d’abonnement entier :
4

Lire une notification

Chaque transaction correspondante arrive comme un parsedTransactionNotification, déjà décodé, avec matchedIndexes pointant vers les instructions que votre filtre a trouvées. Voir Notifications pour la forme complète.
5

Se désabonner

Ou fermez simplement la connexion — cela supprime tous ses abonnements.

Guides

Suivre les échanges Jupiter

Utilisez describeProgram pour construire un filtre fiable avant de vous abonner.

Suivre les Mints Pump.fun

Un écouteur sûr pour la reconnexion qui enregistre chaque nouveau déploiement de token Pump.fun.

Gérer les reconnexions

Survivez aux timeouts et déploiements inactifs, puis comblez précisément ce que vous avez manqué.

Référence du protocole

Les Flux Analysés utilisent JSON-RPC 2.0 sur une connexion WebSocket unique. Chaque requête reçoit une réponse avec le même id. Un abonnement pousse ensuite des messages parsedTransactionNotification jusqu’à ce que vous vous désabonniez ou déconnectiez.

S’abonner

Envoyez parsedTransactionSubscribe avec un filtre et des options facultatives. La réponse result est un ID d’abonnement entier.
Request
Response

Champs du filtre

Au moins l’un des programs ou accounts.include est requis. Les champs que vous définissez se combinent avec ET : une instruction doit remplir toutes les conditions pour correspondre.
string[]
IDs de programme à correspondre (adresses base58, pas des noms). Une instruction correspond si son programme est dans cette liste. OU dans la liste.
string[]
Noms d’instruction décodés, tels que route. Correspondance exacte d’abord, puis insensible à la casse et au séparateur, donc sharedAccountsRoute correspond également au nom sur le fil shared_accounts_route. OU dans la liste. Seules les instructions dont le nom a été identifié dans le catalogue peuvent correspondre, donc prenez les noms de describeProgram.
string[]
Adresses des comptes. Une instruction correspond si l’une d’elles apparaît dans sa liste de comptes. OU dans la liste. Fonctionne pour chaque instruction, décodée ou non. L’ID du programme lui-même ne compte pas ici comme un compte.
object
Une carte du nom de rôle de compte décodé à l’adresse, tel que { "user_transfer_authority": "<pubkey>" }. Chaque entrée doit être tenue (ET entre les entrées), et l’instruction doit être décodée pour que cela s’applique. Les noms de rôle correspondent exactement, sans conversion de casse, donc copiez-les de describeProgram plutôt que de deviner.
boolean
défaut:"false"
Inclure les instructions des transactions échouées.
boolean
défaut:"true"
Les instructions internes (CPI) peuvent correspondre. Réglez false pour correspondre uniquement aux instructions de premier niveau.
Les champs inconnus n’importe où dans le filtre ou les options sont rejetés avec -32602 plutôt que silencieusement ignorés, donc les fautes de frappe échouent bruyamment au lieu de ne rien correspondre.

Options

Le second paramètre est facultatif.
string
défaut:"confirmed"
Seul confirmed est pris en charge.
string
défaut:"full"
Ce que chaque notification contient. full : l’ensemble de la transaction, chaque instruction, plus matchedIndexes pointant vers les correspondances du filtre. matched : seulement les instructions qui ont correspondu, sans liste d’index. raw : instructions correspondantes uniquement, réduites à leur position, programId, et blob data en base58, sans champs décodés et sans tableau accountKeys. Utilisez matched quand la bande passante compte plus que le contexte (les charges utiles complètes sont en moyenne environ trois fois plus grandes), et raw lorsque vous décodez les données d’instruction vous-même et que vous avez seulement besoin des octets.
Un projet peut détenir jusqu’à 100 connexions concurrentes, partagées entre toutes ses clés API.

Notifications

Une notification par transaction correspondante par abonnement. Avec le défaut details: "full" :
Lecture de celle-ci :
  • transaction est le contexte complet. fee est en lamports. accountKeys est la liste complète des clés, y compris les clés chargées à partir de tables de recherche d’adresses, dans le même ordre que la chaîne les rapporte. feePayer est toujours accountKeys[0]. error transporte l’erreur de transaction en JSON structuré, par exemple {"InstructionError": [2, {"Custom": 6001}]}, lorsque status est "error".
  • summary a une forme unique partout où elle apparaît : un type (tel que swap ou transfer), un description lisible, et une charge parsedData structurée lorsque l’analyseur reconnaît l’action — pour un échange : le protocole, les montants et les mints. transaction.summary étiquette l’action principale de la transaction ; chaque instruction reconnue porte son propre summary avec la même forme. Pour collecter chaque échange dans une transaction, itérez instructions et lisez summary.parsedData lorsque summary.type est "swap".
  • nativeTransfers et tokenTransfers lister les mouvements SOL et token extraits par l’analyseur dans la transaction complète, sous la même forme que celle renvoyée par l’API d’Événements Analytiques, afin que les consommateurs de flux et d’API puissent partager le code de traitement. Les deux sont toujours présents, éventuellement vides.
  • instructions est chaque instruction de la transaction dans l’ordre d’exécution : chaque instruction de premier niveau suivie de ses instructions internes. Chaque entrée porte sa propre position : topIndex est celle à laquelle elle appartient (commençant à 0), innerIndex est sa position parmi les appels internes de cette instruction (null signifie qu’il s’agit de l’instruction de premier niveau elle-même), et stackHeight est la profondeur d’appel (1 pour le niveau supérieur). Utilisez ceux-ci, pas la position dans le tableau.
  • matchedIndexes sont les indices dans instructions vous indiquant lesquels votre filtre a effectivement trouvé. Le reste est là pour le contexte. Avec details: "matched" le tableau ne contient que les occurrences et matchedIndexes est absent.
  • Les noms decoded sont en snake_case (in_amount, user_transfer_authority), tels que publiés dans l’IDL du programme. Les arguments entiers sont souvent des chaînes ("1000000") car les valeurs u64 ne rentrent pas dans les nombres JavaScript.
  • blockTime est actuellement toujours null. Ne vous basez pas dessus.
  • Attendez-vous à un mélange d’instructions décodées et non décodées à l’intérieur d’une même transaction : un échange entièrement décodé peut se trouver à côté d’un mémo non reconnu. Branchez-vous sur decoded : quand il est null, l’instruction transporte rawData (octets base58) et rawAccounts (liste de clés publiques simples) à la place, vous avez donc toujours quelque chose à travailler avec.
Avec details: "raw" le value se rétrécit au méta de transaction et aux blobs. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes, et tous les champs décodés disparaissent (la transaction summary est toujours incluse); chaque instruction correspondante est sa position, son programme, et ses octets data en base58, exactement comme ils apparaissent sur la chaîne (présent même pour les instructions que le catalogue aurait pu décoder):

Se désabonner

Retourne true si l’abonnement existait et était le vôtre. Les notifications s’arrêtent immédiatement. La fermeture de la connexion supprime tous ses abonnements.

Découverte

L’échec le plus courant avec ce type d’API est un filtre qui est valide mais ne correspond à rien, généralement un nom d’instruction ou de rôle deviné. describeProgram empêche cela en renvoyant les noms exacts que le comparateur utilise :
Request
Response
Vous pouvez passer une adresse de programme ou un nom de catalogue, mais préférez l’adresse : les noms peuvent être ambigus selon les versions de programme (plus d’une entrée de catalogue est nommée jupiter, et une recherche de nom peut se résoudre à celle plus ancienne). Si vous effectuez une recherche par nom, vérifiez que result.id est le programme auquel vous avez l’intention de vous abonner. Flux recommandé : describeProgram pour obtenir les noms exacts d’instruction et de rôle, construisez le filtre avec ces noms, puis abonnez-vous. Le guide Suivre les échanges Jupiter explique cela de bout en bout.

Limites

Erreurs

Les erreurs suivent JSON-RPC 2.0 : { "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Les messages indiquent exactement ce qui était incorrect et où. Les connexions peuvent également se fermer avec un code de fermeture WebSocket — voir Gestion des reconnexions pour savoir ce que chacun signifie et comment récupérer.

Exemples de Client