Tradovate API

L'API Tradovate /product/find renvoie une 404

Vous avez envoyé une requête à product/find et reçu une 404 sèche. L'endpoint n'est pas manquant, la requête est mal formée ; voici la correction exacte avec GET et chaîne de requête.

Vérifié par l'équipe Trading Systems de PickMyTrade Dernière mise à jour
· Lecture de 7 minutes
Client de l'API Tradovate affichant une réponse 404 Not Found après l'envoi d'un corps JSON à l'endpoint product/find

Vous avez envoyé une requête à product/find, et au lieu d'une charge utile JSON bien formée, le serveur a renvoyé une 404 sèche. Rien ici, dit-il. Mais l'endpoint n'est pas manquant. En pratique, cette 404 signifie presque toujours que la requête est mal formée, pas que la route n'existe pas. Neuf fois sur dix, cela se résume à l'une de ces deux erreurs : vous avez envoyé vos paramètres dans un corps JSON au lieu de l'URL, ou vous visez le mauvais hôte ou le mauvais chemin. Corrigez la forme de l'appel, et product/find (ainsi que son proche cousin contract/find) recommence à vous fournir des données.

Voici la version courte, puis le pourquoi et le comment.

Correctif rapide : appelez product/find en GET avec le symbole dans la chaîne de requête, GET https://demo.tradovateapi.com/v1/product/find?name=ES, pas en POST avec un corps JSON. Pour obtenir le contrat réellement négociable, utilisez contract/find?name=ESU6. Les deux prennent les mêmes paramètres.

Pourquoi la 404 se produit

Une 404 sur cet appel est trompeuse, car nous sommes formés à la lire comme «cette URL n'existe pas». Sur l'API REST de Tradovate, pourtant, le même statut apparaît lorsque le routeur ne parvient pas à faire correspondre la requête réellement envoyée à une opération réelle. Une poignée d'erreurs précises en est la cause.

Vous avez envoyé un corps JSON au lieu d'une chaîne de requête. C'est l'erreur la plus courante. product/find est une opération de lecture, et Tradovate attend que les opérations de lecture soient des requêtes GET avec des paramètres ajoutés à l'URL. Si vous envoyez en POST quelque chose comme {"name":"es","isAutomated":true} comme corps JSON, la requête ne se résout jamais en opération find et vous obtenez une 404. Deux choses sont fausses à la fois : la forme corps contre chaîne de requête, et le champ supplémentaire isAutomated que find n'accepte pas du tout. Retirez les deux.

Vous avez omis le préfixe de version ou mal orthographié l'hôte. Tout appel REST se trouve sous /v1/. La base est https://demo.tradovateapi.com/v1 pour la simulation et https://live.tradovateapi.com/v1 pour le réel. Omettez le /v1, visez api.tradovate.com (c'est le site de documentation, pas l'API), ou faites une faute de frappe dans le sous-domaine, et il n'y a aucune route correspondante, 404.

Vous avez modifié la casse ou l'orthographe du chemin. Le chemin comporte deux parties : une entité et une opération, jointes par une barre oblique, comme product/find ou contract/find. Écrivez Product/Find, products/find ou product/search, et aucun ne se résout.

Vous appelez une opération non implémentée sur ce transport. Certaines opérations existent via WebSocket mais pas sur la route REST simple, et inversement. Si vous copiez un appel destiné à l'un et l'envoyez à l'autre, vous verrez une 404 avec un corps qui nomme littéralement l'opération manquante, comme "Not found: md/getChart". C'est votre indice que la route est correcte, mais que le transport est erroné.

Une chose qu'une 404 n'est pas : un problème d'authentification. Si votre jeton d'accès est manquant ou expiré, vous obtenez une 401, pas une 404. Donc si vous êtes face à une 404, ne perdez pas de temps à régénérer des jetons, examinez d'abord la forme de la requête et l'URL.

La correction : GET avec une chaîne de requête

Reconstruisez l'appel en GET et déplacez le symbole dans la chaîne de requête. Ce seul changement résout l'écrasante majorité de ces 404.

GET https://demo.tradovateapi.com/v1/product/find?name=ES
Authorization: Bearer <your-access-token>
Accept: application/json

Remplacez ES par la racine de produit recherchée, MES, NQ, MNQ, CL, et ainsi de suite. La réponse est l'enregistrement produit de cet instrument : son id, son nom, son type de produit, sa bourse, la taille de tick et la valeur par point. Notez qu'il n'y a aucun corps de requête. Rien à sérialiser, rien à mal faire.

Si vous utilisiez une bibliothèque cliente ou un pont qui construit la requête pour vous et que vous voyez toujours des 404, vérifiez ce qu'il envoie réellement sur le réseau. Un nombre surprenant de moments «l'API est cassée» se révèlent être un assistant qui enveloppe silencieusement vos paramètres dans un corps POST. Pointez-le vers GET, et la même recherche de symbole qui échouait il y a un instant fonctionne à nouveau proprement.

Réponse 200 réussie d'une requête GET vers product/find avec name=ES dans la chaîne de requête

Obtenir le contrat négociable avec contract/find

product/find vous renseigne sur la famille d'instruments. Il ne vous dit pas vers quel contrat router réellement un ordre, car un produit n'expire pas, un contrat oui. Pour cela, utilisez contract/find, qui prend exactement les mêmes paramètres de requête :

GET https://demo.tradovateapi.com/v1/contract/find?name=ESU6

Le name ici est le symbole de contrat complet, pas seulement la racine. Tradovate le construit à partir de trois éléments sans espaces : la racine du produit, un code de mois unique, et le dernier chiffre de l'année. Ainsi, ESU6 est l'E-mini S&P 500 pour U (septembre) 6 (2026). Changez la lettre du mois et le chiffre de l'année à mesure que les contrats roulent ; les mois trimestriels des indices actions sont H, M, U et Z (mars, juin, septembre, décembre). Le mois avant tourne au fil de l'année, confirmez donc le contrat actif actuel plutôt que de coder en dur un contrat sur le point d'expirer.

Fournissez à contract/find un symbole qui n'existe pas ou qui a déjà expiré, et vous pourriez obtenir un résultat vide plutôt qu'un contrat propre, une raison de plus de résoudre d'abord le mois avant en direct plutôt que de deviner. Une fois que vous avez récupéré l'id du contrat, c'est la valeur que vous transmettez au passage d'ordres, aux consultations de positions et aux abonnements de données de marché.

Réponse contract/find de Tradovate renvoyant l'enregistrement du contrat ESU6 avec son id numérique et son échéance

Quand vous ne connaissez pas le symbole exact

Que faire si vous n'avez pas le code de contrat précis et voulez simplement chercher ? D'abord, ajustez vos attentes : il n'existe aucun endpoint public «donnez-moi chaque symbole». L'API est conçue autour de recherches ciblées, et elle attend que vous mettiez en cache ce que vous récupérez plutôt que de récupérer une liste géante à chaque exécution.

Deux pistes pratiques :

  • Suggestion de saisie semi-automatique. Tradovate dispose d'un endpoint de suggestion de contrats qui se comporte comme le champ de recherche de la plateforme, vous transmettez une chaîne de texte partielle et une limite de résultats, et il renvoie les contrats correspondants. C'est le moyen le plus propre de transformer «l'utilisateur a tapé MNQ» en un contrat réel et actuel. Confirmez les noms exacts des paramètres dans la référence API actuelle avant de l'intégrer, car les endpoints de suggestion utilisent des clés courtes à une lettre.
  • D'abord le produit, puis le contrat. Recherchez le produit avec product/find?name=NQ, puis résolvez le contrat actif correspondant. Cette approche en deux étapes vous maintient sur des opérations documentées et stables.

Vous pourriez rencontrer une route contract/list sur le terrain. Elle existe, mais n'est pas documentée et n'est pas recommandée, ce n'est pas un appel «tout lister» pris en charge, et s'appuyer dessus invite à des problèmes. Restez sur contract/find et l'endpoint de suggestion, mettez les résultats en cache et actualisez votre cache à chaque roulement de contrat.

Une checklist de 90 secondes

Avant de déposer un rapport de bug, parcourez cette liste. Elle résout presque toutes les 404 de product/find.

Vérification À quoi ressemble &laquo;correct&raquo;
Méthode HTTPGET, pas POST
ParamètresDans la chaîne de requête (?name=ES), pas dans un corps JSON
Champs supplémentairesPas de isAutomated ni d'autres champs réservés aux ordres sur un appel find
URL de basedemo.tradovateapi.com/v1 ou live.tradovateapi.com/v1, avec le /v1
Orthographe du cheminExactement product/find / contract/find, en minuscules
HôtePas api.tradovate.com (c'est le site de documentation)
TransportRoute REST via HTTPS, pas une opération réservée au WebSocket

Si tout ce qui précède est vérifié et que vous obtenez toujours une 404 spécifiquement sur product/find alors que d'autres appels GET fonctionnent, capturez la requête et la réponse brutes et adressez-vous au support API de Tradovate, mais c'est rare. Presque à chaque fois, le problème est l'une des lignes ci-dessus.

Il est utile de savoir quelles erreurs ne sont pas celle-ci : une 401 signifie que votre jeton est périmé ou manquant (renouvelez-le avant qu'il n'expire), et un «symbol is inaccessible» ou une 403 sur une requête de cotation signifie un problème de droits sur les données de marché, pas un problème de recherche. Les recherches de contrats et de produits elles-mêmes n'ont besoin que d'un jeton valide, aucun abonnement aux données requis.

Paramètres web de Tradovate montrant où l'accès à l'API est activé et où une clé API est générée

Vous voulez que la recherche de symbole soit gérée pour vous ?

Mettre en place le renouvellement de jeton, la résolution du mois avant et les recherches de contrat par symbole est le genre de plomberie qui engloutit un week-end puis se casse au roulement de contrat suivant. Si votre véritable objectif est de déclencher une alerte TradingView et de la voir aboutir à un ordre réel chez Tradovate, sans surveiller la couche REST, vous pouvez complètement ignorer l'API brute et laisser un pont associer les symboles et router les ordres pour vous.

Automatisez vos ordres Tradovate depuis TradingView sans toucher à l'API brute et laissez PickMyTrade gérer pour vous la recherche de symboles et le routage des ordres.

Passez outre l'API brute

Automatisez vos ordres Tradovate depuis TradingView sans toucher à l'API brute. PickMyTrade gère pour vous la recherche de symboles et le routage des ordres.

Démarrez votre essai gratuit de 5 jours

Questions fréquentes

Presque toujours parce que la requête est mal formée, pas parce que la route est manquante. Le déclencheur le plus courant est l'envoi du symbole dans un corps JSON au lieu de la chaîne de requête de l'URL, ou l'ajout de champs que l'endpoint n'accepte pas. C'est un appel GET, transmettez donc le symbole en chaîne de requête : GET /v1/product/find?name=ES. Un préfixe /v1/ manquant, le mauvais hôte, ou une faute de frappe dans le chemin produiront aussi une 404.

product/find renvoie le produit, la famille d'instruments, comme ES pour l'E-mini S&P 500. contract/find renvoie un contrat négociable spécifique avec une échéance, comme ESU6 pour septembre 2026. Ils prennent les mêmes paramètres de requête. Utilisez product/find pour rechercher l'instrument, puis contract/find pour obtenir le contrat exact que vous négocierez ou auquel vous vous abonnerez.

Non. Il n'existe pas d'endpoint public listant tous les symboles. L'API attend que vous recherchiez ce dont vous avez besoin avec contract/find ou l'endpoint de suggestion, et que vous mettiez les résultats en cache. Une route contract/list existe, mais elle n'est pas documentée ni recommandée, construisez donc plutôt votre flux de travail autour de recherches ciblées.

Non. contract/find et product/find renvoient des données de référence et fonctionnent avec simplement un jeton d'accès valide. Un abonnement aux données de marché n'importe que lorsque vous vous abonnez aux cotations en direct. Si une recherche réussit mais qu'une requête de cotation échoue, c'est un problème de droits sur les données, pas un problème de recherche de contrat.

Ce guide est fourni à des fins éducatives et informatives uniquement et ne constitue pas un conseil financier, d'investissement ou de trading. Le trading de contrats à terme et d'autres produits à effet de levier comporte un risque substantiel de perte et ne convient pas à tous les investisseurs. PickMyTrade est une plateforme d'automatisation tierce indépendante et n'est ni affiliée à, ni approuvée ou parrainée par Tradovate, Inc. ou Bookmap. Tous les noms, logos et marques associés sont la propriété de leurs détenteurs respectifs. Les fonctionnalités et les étapes de la plateforme évoluent avec le temps, confirmez donc toujours le processus actuel dans la documentation officielle de la plateforme avant d'agir.