La API de Tradovate /product/find devuelve 404
Envió una solicitud a product/find y recibió un 404 seco. El endpoint no falta, la solicitud tiene el formato incorrecto; aquí está la solución exacta con GET y cadena de consulta.
Envió una solicitud a product/find, y en lugar de un JSON ordenado, el servidor devolvió un 404 seco. Aquí no hay nada, dice. Pero el endpoint no falta. En la práctica, ese 404 casi siempre significa que la solicitud tiene un formato incorrecto, no que la ruta no exista. Nueve de cada diez veces se reduce a uno de dos errores: envió sus parámetros en un cuerpo JSON en lugar de en la URL, o está apuntando al host o la ruta incorrectos. Corrija el formato de la llamada y product/find (junto con su primo cercano contract/find) volverá a entregar datos.
Aquí va la versión corta, después el porqué y el cómo.
Solución rápida: llame a
product/findcomo GET con el símbolo en la cadena de consulta,GET https://demo.tradovateapi.com/v1/product/find?name=ES, no como POST con un cuerpo JSON. Para obtener el contrato realmente negociable, usecontract/find?name=ESU6. Ambos aceptan los mismos parámetros.
Por qué ocurre el 404
Un 404 en esta llamada es engañoso porque estamos entrenados para leerlo como “esta URL no existe”. Sin embargo, en la API REST de Tradovate, el mismo estado aparece cuando el enrutador no puede hacer coincidir la solicitud que realmente envió con una operación real. Un puñado de errores concretos lo provoca.
Envió un cuerpo JSON en lugar de una cadena de consulta. Este es el gran error. product/find es una operación de lectura, y Tradovate espera que las operaciones de lectura sean solicitudes GET con parámetros añadidos a la URL. Si envía algo como {"name":"es","isAutomated":true} como cuerpo JSON mediante POST, la solicitud nunca se resuelve como la operación find y obtiene un 404. Ahí hay dos cosas incorrectas a la vez: el formato de cuerpo frente a cadena de consulta, y el campo adicional isAutomated que find no acepta en primer lugar. Elimine ambos.
Omitió el prefijo de versión o escribió mal el host. Toda llamada REST vive bajo /v1/. La base es https://demo.tradovateapi.com/v1 para simulación y https://live.tradovateapi.com/v1 para real. Si omite el /v1, apunta a api.tradovate.com (ese es el sitio de documentación, no la API) o se equivoca al escribir el subdominio, no hay una ruta coincidente, 404.
Cambió las mayúsculas/minúsculas o la ortografía de la ruta. La ruta tiene dos partes: una entidad y una operación, unidas por una barra, como product/find o contract/find. Escriba Product/Find, products/find o product/search y ninguna se resolverá.
Está llamando a una operación que no está implementada en ese transporte. Algunas operaciones existen a través de WebSocket pero no en la ruta REST simple, y viceversa. Si copia una llamada pensada para una y la envía a la otra, verá un 404 con un cuerpo que nombra literalmente la operación faltante, como "Not found: md/getChart". Esa es su pista de que la ruta está bien, pero el transporte es incorrecto.
Una cosa que un 404 no es: un problema de autenticación. Si su token de acceso falta o expiró, obtiene un 401, no un 404. Así que si está viendo un 404, no pierda tiempo regenerando tokens; revise primero el formato de la solicitud y la URL.
La solución: GET con cadena de consulta
Reconstruya la llamada como GET y mueva el símbolo a la cadena de consulta. Ese único cambio resuelve la abrumadora mayoría de estos 404.
GET https://demo.tradovateapi.com/v1/product/find?name=ES
Authorization: Bearer <your-access-token>
Accept: application/json
Sustituya ES por la raíz de producto que busque, MES, NQ, MNQ, CL, y así sucesivamente. La respuesta es el registro del producto para ese instrumento: su id, nombre, tipo de producto, bolsa, tamaño de tick y valor por punto. Note que no hay cuerpo de solicitud alguno. Nada que serializar, nada que salga mal.
Si estaba usando una librería cliente o un puente que construye la solicitud por usted y sigue viendo 404, revise qué está enviando realmente en la conexión. Sorprendentemente, muchos momentos de “la API está rota” resultan ser un asistente que envuelve silenciosamente sus parámetros en un cuerpo POST. Apúntelo a GET, y la misma búsqueda de símbolo que fallaba hace un momento vuelve a funcionar sin problemas.

Obtenga el contrato negociable con contract/find
product/find le informa sobre la familia de instrumentos. No le dice a qué contrato enrutar realmente una orden, porque un producto no expira, un contrato sí. Para eso, recurra a contract/find, que toma exactamente los mismos parámetros de consulta:
GET https://demo.tradovateapi.com/v1/contract/find?name=ESU6
El name aquí es el símbolo de contrato completo, no solo la raíz. Tradovate lo construye a partir de tres piezas sin espacios: la raíz del producto, un único código de mes y el último dígito del año. Así, ESU6 es el E-mini S&P 500 para U (septiembre) 6 (2026). Cambie la letra del mes y el dígito del año a medida que los contratos rotan; los meses trimestrales de índices bursátiles son H, M, U y Z (marzo, junio, septiembre, diciembre). El mes frontal rota a lo largo del año, así que confirme el contrato activo actual en lugar de fijar uno que está a punto de expirar.
Si alimenta contract/find con un símbolo que no existe o que ya expiró, puede obtener un resultado vacío en lugar de un contrato limpio, otra razón para resolver primero el mes frontal en vivo en lugar de adivinar. Una vez que tenga de vuelta el id del contrato, ese es el valor que entrega a la colocación de órdenes, las consultas de posiciones y las suscripciones de datos de mercado.

Cuando no conoce el símbolo exacto
¿Qué pasa si no tiene el código de contrato preciso y solo quiere buscar? Primero, ajuste sus expectativas: no existe un endpoint público de “deme cada símbolo”. La API está construida en torno a búsquedas específicas y espera que almacene en caché lo que obtiene en lugar de traer una lista enorme en cada ejecución.
Dos rutas prácticas:
- Sugerencias tipo autocompletar. Tradovate tiene un endpoint de sugerencia de contratos que se comporta como el cuadro de búsqueda de la plataforma; usted envía una cadena de texto parcial y un límite de resultados, y devuelve contratos coincidentes. Es la forma más limpia de convertir “el usuario escribió
MNQ” en un contrato real y actual. Confirme los nombres exactos de los parámetros en la referencia actual de la API antes de integrarlo, ya que los endpoints de sugerencia usan claves cortas de una sola letra. - Primero el producto, luego el contrato. Busque el producto con
product/find?name=NQ, y luego resuelva el contrato activo correspondiente. Este proceso de dos pasos le mantiene trabajando con operaciones documentadas y estables.
Puede encontrarse con una ruta contract/list en el mundo real. Existe, pero no está documentada ni se recomienda; no es una llamada compatible de “listar todo”, y construir sobre ella invita a fallos. Utilice contract/find y el endpoint de sugerencia, guarde los resultados en caché y actualícela en cada rotación de contrato.
Una lista de verificación de 90 segundos
Antes de presentar un informe de error, recorra esta lista. Resuelve casi todos los 404 de product/find.
| Verificación | Cómo se ve “correcto” |
|---|---|
| Método HTTP | GET, no POST |
| Parámetros | En la cadena de consulta (?name=ES), no en un cuerpo JSON |
| Campos adicionales | Sin isAutomated ni otros campos exclusivos de órdenes en una llamada find |
| URL base | demo.tradovateapi.com/v1 o live.tradovateapi.com/v1, con el /v1 |
| Ortografía de la ruta | Exactamente product/find / contract/find, en minúsculas |
| Host | No api.tradovate.com (ese es el sitio de documentación) |
| Transporte | Ruta REST sobre HTTPS, no una operación exclusiva de WebSocket |
Si todo lo anterior está correcto y aun así obtiene un 404 específicamente en product/find mientras otras llamadas GET funcionan, capture la solicitud y la respuesta en bruto y llévelas al soporte de la API de Tradovate, pero eso es poco frecuente. Casi siempre, el problema es una de las filas anteriores.
Vale la pena saber qué errores no son este: un 401 significa que su token está caducado o falta (renuévelo antes de que expire), y un “symbol is inaccessible” o 403 en una solicitud de cotización significa un problema de derechos de datos de mercado, no un problema de búsqueda. Las propias búsquedas de contratos y productos solo necesitan un token válido, sin suscripción de datos requerida.

¿Quiere que le resuelvan la búsqueda de símbolos?
Configurar la renovación de tokens, la resolución del mes frontal y las búsquedas de contratos por símbolo es el tipo de trabajo de fontanería que consume un fin de semana y luego se rompe en la siguiente rotación de contrato. Si su objetivo real es disparar una alerta de TradingView y que se convierta en una orden real en Tradovate, sin tener que vigilar la capa REST, puede saltarse la API en bruto por completo y dejar que un puente mapee símbolos y enrute órdenes por usted.
Automatice sus órdenes de Tradovate desde TradingView sin tocar la API en bruto y deje que PickMyTrade se encargue de la búsqueda de símbolos y el enrutamiento de órdenes por usted.
Evite la API en bruto
Automatice sus órdenes de Tradovate desde TradingView sin tocar la API en bruto. PickMyTrade se encarga de la búsqueda de símbolos y el enrutamiento de órdenes por usted.
Inicie su prueba gratuita de 5 díasPreguntas frecuentes
Casi siempre porque la solicitud tiene un formato incorrecto, no porque falte la ruta. El desencadenante más común es enviar su símbolo en un cuerpo JSON en lugar de en la cadena de consulta de la URL, o añadir campos que el endpoint no acepta. Es una llamada GET, así que pase el símbolo como cadena de consulta: GET /v1/product/find?name=ES. Un prefijo /v1/ faltante, el host incorrecto o un error tipográfico en la ruta también producirán un 404.
product/find devuelve el producto, la familia de instrumentos, como ES para el E-mini S&P 500. contract/find devuelve un contrato negociable específico con vencimiento, como ESU6 para septiembre de 2026. Ambos aceptan los mismos parámetros de consulta. Use product/find para buscar el instrumento y luego contract/find para obtener el contrato exacto que negociará o al que se suscribirá.
No. No existe un endpoint público que liste todos los símbolos. La API espera que busque lo que necesita con contract/find o el endpoint de sugerencia tipo autocompletar y guarde los resultados en caché. Existe una ruta contract/list, pero no está documentada ni se recomienda, así que construya su flujo de trabajo en torno a búsquedas específicas en su lugar.
No. contract/find y product/find devuelven datos de referencia y funcionan con solo un token de acceso válido. Una suscripción de datos de mercado solo importa cuando se suscribe a cotizaciones en vivo. Si una búsqueda funciona pero una solicitud de cotización falla, eso es un problema de derechos de datos, no un problema de búsqueda de contratos.
Esta guía tiene fines educativos e informativos únicamente y no constituye asesoramiento financiero, de inversión o de trading. Operar con futuros y otros productos apalancados conlleva un riesgo sustancial de pérdida y no es adecuado para todos los inversores. PickMyTrade es una plataforma de automatización independiente de terceros y no está afiliada, respaldada ni patrocinada por Tradovate, Inc. o Bookmap. Todos los nombres, logotipos y marcas relacionados son propiedad de sus respectivos dueños. Las funciones y los pasos de la plataforma cambian con el tiempo, así que confirme siempre el proceso actual en la documentación oficial de la plataforma antes de actuar.