Tradovate API

API de Tradovate: 'Access is denied' al colocar una orden

Sus credenciales funcionan, su token es válido, y /order/placeOrder sigue rechazando cada orden con Access is denied. Casi nunca se trata de una clave rota, sino de uno de cuatro errores comunes y fáciles de corregir.

Revisado por el equipo de Sistemas de Trading de PickMyTrade Última actualización
· Lectura de 8 minutos
Respuesta de error Access is denied de placeOrder de Tradovate mostrada en un cliente REST

Conecta un bot a la API REST de Tradovate, sale la primera orden en vivo, y llega Access is denied. Se siente como un muro. Sus credenciales funcionaron. La autenticación le entregó un token. Incluso puede ver sus posiciones. Sin embargo, /order/placeOrder rechaza cada ejecución con ese mismo mensaje escueto, a veces como un 401, a veces como un HTTP 200 con {"failureReason":"UnknownReason","failureText":"Access is denied"}. La buena noticia: esto casi nunca es un problema de “su clave está rota”. Es uno de cuatro errores comunes y fáciles de corregir: el id de cuenta incorrecto, un permiso de Orders demasiado limitado, el host demo/live equivocado, o un flag isAutomated mal gestionado. A continuación encontrará la checklist completa, qué significa realmente el error, cada causa raíz con una solución paso a paso, y cómo PickMyTrade evita por completo esta clase de problema para que sus alertas de TradingView lleguen a Tradovate sin que usted tenga que depurar JSON en la apertura.

Checklist rápida para "Access is denied"

  • Id de cuenta incorrecto, lea el id numérico desde /account/list, nunca el nombre visible (como “DEMO1235”).
  • Permiso de Orders demasiado bajo, el permiso Orders de la API key debe estar en Full Access, no solo lectura.
  • Host incorrecto, genere el token y envíe la orden en el mismo host: demo.tradovateapi.com para sim, live.tradovateapi.com para live.
  • isAutomated incorrecto, incluya el flag y configúrelo en true para cualquier orden de bot o algorítmica, y preste atención al tipo de dato al usar form-encode.
  • Símbolo obsoleto o incorrecto, use el contrato del mes frontal activo (o su id de contrato), no un símbolo vencido o continuo.
  • Dispositivo no aprobado en live, live exige estrictamente un deviceId conocido y estable; demo es más permisivo al respecto.

Qué significa "Access is denied"

Access is denied es la respuesta genérica de Tradovate que significa “esta solicitud no está autorizada para hacer eso”. La trampa es que no es un error de autenticación en el sentido habitual, puede tener un access token perfectamente válido y sin expirar y aun así recibirlo. Se produce en el punto donde Tradovate verifica si este token tiene permiso para colocar esta orden en esta cuenta. Cualquier rotura en esa cadena, un id de cuenta que el token no posee, una API key a la que nunca se le otorgaron derechos de colocación de órdenes, o un token generado contra el host demo y luego usado contra live, aparece con las mismas tres palabras.

Aquí importan dos formas de respuesta. Un 401 Access Denied puro suele apuntar al token o al host: el token expiró, se solicitó desde la base URL equivocada, o (en live) el dispositivo no está aprobado. Un 200 OK cuyo cuerpo dice {"failureReason":"UnknownReason","failureText":"Access is denied"} significa que la solicitud se autenticó correctamente, pero la orden en sí fue rechazada en la capa de permisos, típicamente por un accountId incorrecto o un permiso de Orders faltante.

Como ambas variantes muestran el mismo mensaje, es fácil perder una hora revisando contraseñas cuando el verdadero fallo está en un solo campo del cuerpo de la solicitud. Revise primero el estado HTTP y luego trabaje las causas siguientes en orden.

Principales causas de "Access is denied" al colocar una orden

1. Está enviando el nombre visible en lugar del id de cuenta numérico

Esta es, con diferencia, la causa más común. Su cuenta muestra un nombre como DEMO1235 o TRAD123456, y resulta tentador pasar el número final como accountId. Pero accountId es el id de entidad interno de Tradovate, un valor numérico independiente que no tiene relación con los dígitos del nombre visible. Si pasa el incorrecto, el token no “posee” esa cuenta y la orden se deniega.

La solución es leer ambos identificadores desde /account/list. Cada objeto de cuenta devuelve un id (el id de entidad numérico que va en accountId) y un name (la etiqueta legible que va en accountSpec). En resumen: el id de cuenta no es el número con el que su cuenta resulta estar nombrada. Nunca lo codifique fijo, siempre obténgalo dinámicamente.

Respuesta de la API account/list de Tradovate destacando el id de cuenta numérico frente al nombre visible

2. El permiso Orders de la API key no está en Full Access

Tradovate permite delimitar una API key por capacidad. Una key puede leer posiciones, leer información de cuenta y leer la biblioteca de contratos mientras Orders sigue configurado por debajo de Full Access, lo cual basta exactamente para autenticarse, listar cuentas y parecer saludable, pero se bloquea en el instante en que intenta colocar una orden. La solución es directa: otorgue a la key Orders → Full Access en su configuración de aplicación/API de Tradovate, y luego reemita el token para que el nuevo permiso quede incorporado.

Pantalla de configuración de la API key de Tradovate mostrando el permiso Orders en Full Access

3. Generó el token en un host y está ordenando en otro

Tradovate opera dos entornos completamente separados con dos base URLs:

  • Demo / simulación: https://demo.tradovateapi.com/v1
  • Live: https://live.tradovateapi.com/v1

Un token solicitado desde el host demo solo es válido contra el host demo. Si apunta ese token al /order/placeOrder de live (o al revés), obtiene Access is denied. El error clásico es llamar a auth/accessTokenRequest con una base URL malformada o inconsistente, y luego preguntarse por qué falla cada orden posterior. Confirme que su llamada de auth y su llamada de orden usan la misma cadena de host, carácter por carácter, y que el host corresponde a la cuenta con la que realmente pretende operar.

4. isAutomated falta o tiene el tipo incorrecto

Si un bot, algoritmo o cualquier proceso impersonal dispara la orden, las reglas de CME exigen isAutomated: true; un humano haciendo clic en un botón de la interfaz es false. Más allá de simplemente incluir el flag, preste atención al tipo de dato. Cuando envía JSON por POST, isAutomated es un booleano (true). Pero si codifica el cuerpo como formulario (data= en lugar de json= en requests de Python), todo se serializa como cadenas, así que debe enviarse como el string "true". Un booleano que cae silenciosamente a False, o un tipo que el servidor no puede parsear, lo devuelve directo a Access is denied.

5. Formato de símbolo y (en live) un dispositivo no aprobado

Dos causas menos frecuentes completan la lista. Primero, el formato de símbolo: pasar un contrato vencido o mal formado, un código de expiración antiguo, o un símbolo continuo/de rollover que la API no puede enrutar, puede leerse como una denegación en lugar de un error claro de “símbolo inválido”. Cambiar al contrato del mes frontal activo (o a su id de contrato) lo resuelve. Segundo, el id de dispositivo en live: live exige estrictamente que las órdenes provengan de un deviceId conocido y aprobado, suministrado en auth/accessTokenRequest, mientras que demo en gran medida lo ignora. Si su código coloca órdenes en demo pero es denegado solo en live, esa es la señal.

Cómo resolver "Access is denied": paso a paso

1

Corregir el id de cuenta

Autentíquese y obtenga su access token desde el host correcto. Llame a GET /account/list en ese mismo host. En la respuesta, ubique su objeto de cuenta. Copie el valor de id, ese id de entidad numérico es su accountId. Copie el valor de name (normalmente su nombre de usuario de Tradovate o la etiqueta de la cuenta), eso es su accountSpec. Incluya ambos en el cuerpo de la orden. No reutilice los dígitos del nombre visible.

2

Otorgar Orders Full Access y reemitir el token

Abra la configuración de aplicación/API key de Tradovate donde se listan los permisos por capacidad. Configure el permiso Orders en Full Access (deje los alcances de lectura según sea necesario). Guarde, luego solicite un access token nuevo, los cambios de permisos solo aplican a los tokens emitidos después. Verifique con una llamada de lectura como GET /position/list antes de reintentar la orden.

3

Hacer coincidir el host demo/live

Determine en qué entorno vive la cuenta (sim o live). Use demo.tradovateapi.com/v1 para sim y live.tradovateapi.com/v1 para live, para ambas la llamada de auth y la llamada de orden. Si cambia de entorno, vuelva a autenticarse; nunca lleve un token demo a live. Recuerde que los tokens son de corta duración (aproximadamente 90 minutos). Si un script que antes funcionaba empieza a fallar a mitad de sesión, renueve el token en lugar de volver a diagnosticar permisos.

4

Enviar isAutomated correctamente

Incluya siempre isAutomated en el cuerpo de la orden. Configúrelo en true para órdenes de bot/algorítmicas, y en false solo para acciones genuinas de interfaz activadas por un humano. Si envía JSON, manténgalo como booleano. Si usa form-encode, envíe el string "true". Vuelva a enviar la orden y confirme que la respuesta contiene un id de orden real, no un failureText.

Cuerpo de solicitud placeOrder de Tradovate con los campos accountId numérico, accountSpec e isAutomated correctos

Tabla de resolución de problemas

Error Significado Solución
401 Access DeniedToken inválido, expirado, o generado en el host equivocadoVuelva a autenticarse en el host demo/live correspondiente; renueve antes de la expiración de ~90 minutos
200 + {"failureText":"Access is denied"}Autenticado, pero la orden fue rechazada en la capa de permisosUse el accountId numérico de /account/list y otorgue Orders Full Access
Access is denied tras otorgar el permiso OrdersaccountId es el número del nombre visible, no el id de entidadLea el campo id desde /account/list
Funciona en demo, denegado en liveId de dispositivo no aprobado en liveEnvíe un deviceId estable en la autenticación y apruebe el dispositivo
Access is denied con una cuenta correctaisAutomated falta o tiene el tipo de dato incorrectoIncluya isAutomated; true para bots; tipo correcto según JSON o form-encoded
Denegado en un símbolo aparentemente válidoContrato vencido, continuo o mal formadoUse el contrato del mes frontal activo o su id de contrato

Dónde encaja PickMyTrade

La mayoría de los tickets de “Access is denied” provienen de construir manualmente la lógica de auth y órdenes. PickMyTrade elimina por completo esa superficie de riesgo al intermediar la conexión con Tradovate por usted:

  • Auth gestionada y enrutamiento de host, el host demo/live correcto y un token nuevo y vigente se gestionan automáticamente, de modo que una sesión caducada nunca se disfraza de error de permisos.
  • Resolución de cuenta y permisos, el id de cuenta numérico correcto y el permiso de Orders se resuelven a partir de su cuenta vinculada, no se adivinan a partir de un nombre visible.
  • Manejo conforme de isAutomated, las órdenes automatizadas se marcan correctamente según las reglas del exchange en todo momento, sin trampas de booleano vs. string.
  • Validación de símbolo y contrato, las alertas se asignan a un contrato válido y activo antes de que se envíe cualquier orden, eliminando la clase de fallo de “denegado por símbolo inválido”.

Opere sin rechazos

Inicie su prueba gratuita de 5 días, vincule sus alertas hoy mismo y opere sin rechazos.

Inicie su prueba gratuita de 5 días

Preguntas frecuentes

El permiso es solo la mitad de la verificación. La causa restante más común es un accountId incorrecto, está enviando el número del nombre visible en lugar del id de entidad numérico de /account/list. Un host incorrecto, como usar un token demo contra live, produce el mismo mensaje.

Llame a GET /account/list en el mismo host contra el que se autenticó. Use el campo id del objeto (el id de entidad numérico) para accountId, y su campo name para accountSpec. Nunca derive el id a partir del nombre visible de la cuenta.

accountSpec es la cadena de texto legible (normalmente su nombre de usuario o la etiqueta de la cuenta). accountId es el id numérico interno. Ambos son obligatorios en el cuerpo de la orden y ambos provienen de /account/list.

No. Es una denegación genérica. Verifique primero Orders → Full Access, pero si ya está configurado, continúe con el id de cuenta, el host y el tipo de isAutomated antes de asumir que la clave en sí está rota.

Live exige estrictamente un deviceId aprobado y su propio host, mientras que demo es más permisivo. Proporcione un id de dispositivo estable durante la autenticación y apruebe el dispositivo para resolverlo.

true para cualquier orden colocada por un bot, script o algoritmo (un requisito del exchange); false solo cuando un humano la activa físicamente a través de una interfaz.

Sí. Tradovate a veces devuelve 200 OK con {"failureReason":"UnknownReason","failureText":"Access is denied"} en el cuerpo. Inspeccione siempre el cuerpo, no solo el código de estado.

Puede ser. Algunas prop firms restringen o prohíben la automatización directa mediante API en cuentas de evaluación, y el estado de datos/permisos varía según la firma y el tamaño de la cuenta, verifique las reglas actuales de su firma antes de automatizar.

Esta guía tiene fines exclusivamente educativos e informativos 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 todo inversor. PickMyTrade es una plataforma de automatización independiente de terceros y no está afiliada, respaldada ni patrocinada por Tradovate, Inc. Todos los nombres, logotipos y marcas relacionados son propiedad de sus respectivos titulares. Las funciones y los pasos de la plataforma cambian con el tiempo, por lo que siempre debe confirmar el proceso actual en la plataforma y documentación oficiales de Tradovate antes de actuar.