Tradovate API

Tradovate WS Subscribes But No Quotes (No Data)

Your md/subscribeQuote call returns a clean 200, and still nothing streams but heartbeats. Check the account's hasMarketData flag, that's almost always the real story.

Revisado por el equipo de Sistemas de Trading de PickMyTrade Última actualización
· 7 min read
Tradovate account settings showing hasMarketData false and no live market-data subscription

You wired up the Tradovate WebSocket, authorized cleanly, fired off md/subscribeQuote, and got back a tidy {"s":200,"i":1}, success. Then nothing. Just an endless run of h heartbeat frames and not a single a data frame carrying a bid or ask. Inspect the account and one line explains the whole thing: "hasMarketData": false. The socket is doing exactly what you told it to; the account simply isn't entitled to receive live quotes. This is one of the more confusing Tradovate API snags precisely because every log line reads “OK” while your price feed stays dead silent. Here's the full breakdown, what the flag means, why it happens, and how to turn the quotes back on.

Quick Checklist for No Real-Time Quotes

  • "hasMarketData": false on the account, the account has no live market-data entitlement. Enable or subscribe to market data before you expect any a data frames.
  • Wrong socket, quotes come from the market-data WebSocket (md.tradovateapi.com), not the trading socket (live.tradovateapi.com). Subscribe on the wrong one and you get heartbeats only.
  • Wrong token, the market-data socket must be authorized with the mdAccessToken, not the trading accessToken.
  • Demo/simulated feed, a demo or eval account may serve delayed or simulated data instead of exchange real-time. Confirm the account's data plan.
  • Bad symbol, subscribe to a valid front-month contract (e.g. MNQU5), not a continuous alias, or you may get "Symbol is inaccessible."
  • Prop/funded account, on evaluation accounts, only the prop firm can enable live data. You can't self-subscribe.

What "hasMarketData": false Means

hasMarketData is an account-level flag Tradovate returns in your account settings. When it's true, the account holds an active market-data entitlement, so the exchange's real-time quote stream is cleared to flow to it. When it's false, the account has no live market-data agreement or subscription attached, and that single flag overrides everything downstream.

The key thing to grasp is that entitlement and subscription are two separate layers. md/subscribeQuote returning {"s":200} only confirms the subscription request was well-formed and accepted by the socket. It says nothing about whether the account is entitled to receive the data behind that subscription. So you land in the exact trap the flag describes: a valid, “successful” subscription that produces zero a frames because the account was never cleared to receive live prices in the first place.

Put plainly: the pipe is connected and open, but the tap upstream is shut. Opening it is an account and entitlement action, not a code fix, no amount of re-subscribing will flip a false flag.

Top Causes of No Quotes Over the WebSocket

1. The account has no live market-data entitlement (hasMarketData: false)

This is the root cause the flag is literally reporting. Real-time futures quotes are exchange-licensed data. To receive them, the account needs an active market-data subscription plus the matching exchange data agreement on file, for CME products, that's the CME non-professional or professional agreement. Until that entitlement exists, the exchange won't release live ticks to the account, so the socket has nothing to forward.

2. Subscribing on the trading socket instead of the market-data socket

Tradovate runs two separate WebSocket connections. Order routing and account data flow over the trading socket (wss://live.tradovateapi.com/v1/websocket, or wss://demo.tradovateapi.com/... on demo). Quotes, DOM, and charts flow over the market-data socket (wss://md.tradovateapi.com/v1/websocket, or wss://md-demo.tradovateapi.com/... on demo). Send md/subscribeQuote to the trading socket and you may still get a 200 acknowledgment plus heartbeats, but the real-time a frames never arrive, because that socket doesn't serve market data.

3. Authorizing the market-data socket with the wrong token

When you authenticate, Tradovate hands back two tokens: accessToken for the trading socket and mdAccessToken for the market-data socket. Each socket has to be authorized with its own token via the authorize frame after you open it. Authorize the md socket with the trading accessToken and the connection behaves as if it were never properly entitled, heartbeats, but no quotes.

Tradovate market-data WebSocket showing heartbeat h frames with no a data frames

4. You're on a demo/simulated or delayed feed

A brand-new or demo environment often delivers simulated or delayed data rather than an exchange real-time feed. That's why testing on the demo endpoint so often shows a clean subscribe followed by no live ticks, the environment simply isn't wired to a paid, entitled real-time stream. Confirm whether the account is meant to have live exchange data at all before you assume a code bug.

5. Invalid symbol or "Symbol is inaccessible"

Even with entitlement in place, subscribing to a symbol your account isn't licensed for, or to a continuous/alias symbol instead of a real front-month contract, can return a Symbol is inaccessible error and no data. Always subscribe to the current front-month contract using the correct CME month code (for example MNQU5), not a generic root or a charting alias.

How to Fix No Quotes Over the WebSocket: Step-by-Step

Fixing the Entitlement (Turning hasMarketData True)

1

Log in to the web platform

Log in to the Tradovate web platform with the same account you're connecting via the API.

2

Open the market-data settings

Open the account/market-data settings and find the market-data subscription section.

3

Add a real-time subscription and sign the agreement

Add a real-time market-data subscription for the exchange(s) you trade (CME for ES, NQ, MNQ, MES, and so on) and complete and sign the required exchange data agreement, non-professional for most retail traders. The correct tier and current fee vary, so check Tradovate's current rates.

4

Log out and back in to propagate

Save, then fully log out and log back in so the entitlement propagates. Re-query the account and confirm "hasMarketData": true.

Tradovate market-data subscription screen where a real-time exchange data plan is added

Fixing the Socket and Token Wiring

1

Open a second WebSocket to the market-data host

Open a second WebSocket to the market-data host: wss://md.tradovateapi.com/v1/websocket (use md-demo.tradovateapi.com for the demo environment).

2

Authorize with mdAccessToken

After the o open frame, send an authorize frame using the mdAccessToken from your auth response, not the trading accessToken.

3

Subscribe to a valid front-month symbol

Wait for the 200 authorize acknowledgment, then send md/subscribeQuote with a valid front-month symbol (e.g. MNQU5).

4

Watch the frames

Watch the frames: heartbeats arrive as h; real quotes now arrive as a data frames containing bid/ask/last. If you still see only h, the entitlement (step above) is your blocker, not the wiring.

Tradovate API auth response showing separate accessToken and mdAccessToken for the two sockets

Fixing a Prop / Evaluation Account

1

Don't self-subscribe

If the account is a prop-firm evaluation or funded account, don't try to self-subscribe, the firm provisions data centrally.

2

Contact the prop firm's support

Contact the prop firm's support and ask them to enable or repair live market data on your account.

3

Re-check after confirmation

Once they confirm, log out and back in and re-check hasMarketData.

API-Specific Note

Programmatic real-time data through the API carries its own exchange licensing on top of platform data. Depending on your usage and the exchange, that can require registered market-data-vendor status and a recurring license fee, the amount varies by exchange and changes over time, so confirm the current CME/Tradovate figure before you budget. If you only need to place orders, you can route them on free delayed data and skip the real-time license entirely.

Troubleshooting Table

Symptom / Error Meaning Fix
"hasMarketData": false in account settingsAccount has no live market-data entitlementAdd a real-time market-data subscription and sign the exchange data agreement, then re-login
Subscribe returns {"s":200} but only h framesSubscription accepted but no data authorized/servedVerify entitlement is true, correct socket, and correct token
Only heartbeats on live.tradovateapi.comSubscribed on the trading socketOpen the md.tradovateapi.com market-data socket and subscribe there
Quotes fail after authorizingmd socket authorized with trading tokenAuthorize the md socket with mdAccessToken, not accessToken
Symbol is inaccessibleNot entitled for that symbol, or invalid/continuous symbolUse a licensed front-month contract with the correct month code
Live ticks never arrive on demoDemo/simulated or delayed feedConfirm the account is meant to carry an entitled real-time feed
Prop/eval account shows no dataOnly the firm can enable dataAsk the prop firm to enable live market data

Prevent This with PickMyTrade

If your goal is to automate Tradovate from TradingView rather than hand-build a raw market-data socket, PickMyTrade sidesteps most of this by routing your TradingView alerts straight to your Tradovate account for execution:

  • No raw market-data socket to wire, PickMyTrade acts on your TradingView signals, so you're not maintaining md/subscribeQuote streams or juggling two sockets and two tokens.
  • Entitlement and data-agreement aware, order routing respects the account's live-data and agreement state, so you're not blindsided by a silent hasMarketData: false.
  • Rate-limit-safe routing, order flow is spaced out so nothing bounces off Tradovate's request limits.
  • Multi-account sync, mirror the same automated order across multiple Tradovate accounts at once.

Automate Without the Raw Socket

Start your free 5-day trial, automate Tradovate from TradingView without hand-building a market-data socket.

Start Your Free 5-Day Trial

Frequently Asked Questions

It means the subscription request was accepted by the socket, not that data is flowing. If hasMarketData is false, you'll still receive only h heartbeat frames and no a data frames.

It's an account-level flag Tradovate returns in account settings. True means the account has an active live market-data entitlement; false means no real-time exchange data is authorized for it.

Heartbeat (h) frames only keep the connection alive. Real quotes arrive as a data frames, and those only stream when the account is entitled and you're subscribed on the correct market-data socket with the correct token.

The dedicated market-data socket, wss://md.tradovateapi.com/v1/websocket (or md-demo.tradovateapi.com on demo). The trading socket at live.tradovateapi.com does not serve quotes.

Use the mdAccessToken to authorize the market-data socket. The plain accessToken is for the trading socket.

Real-time exchange quotes require a market-data subscription and the exchange's data agreement. Programmatic API access can carry an additional exchange license fee. Amounts vary by exchange and change over time, check Tradovate's current rates.

You can't self-subscribe on most prop/eval accounts. Contact the prop firm's support and ask them to enable live market data, then log out and back in.

No. You can submit orders on free delayed data and skip the real-time market-data license entirely, the entitlement mainly gates live quotes and charts.

This guide is for educational and informational purposes only and is not financial, investment, or trading advice. Trading futures and other leveraged products carries a substantial risk of loss and is not suitable for every investor. PickMyTrade is an independent third-party automation platform and is not affiliated with, endorsed by, or sponsored by Tradovate, Inc. "Tradovate" and all related names, logos, and trademarks are the property of their respective owners. Platform features and steps change over time, so always confirm the current process in the official Tradovate platform and documentation before acting.