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.
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.

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)
Log in to the web platform
Log in to the Tradovate web platform with the same account you're connecting via the API.
Open the market-data settings
Open the account/market-data settings and find the market-data subscription section.
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.
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.

Fixing the Socket and Token Wiring
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).
Authorize with mdAccessToken
After the o open frame, send an authorize frame using the mdAccessToken from your auth response, not the trading accessToken.
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).
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.

Fixing a Prop / Evaluation Account
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.
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.
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 settings | Account has no live market-data entitlement | Add a real-time market-data subscription and sign the exchange data agreement, then re-login |
| Subscribe returns {"s":200} but only h frames | Subscription accepted but no data authorized/served | Verify entitlement is true, correct socket, and correct token |
| Only heartbeats on live.tradovateapi.com | Subscribed on the trading socket | Open the md.tradovateapi.com market-data socket and subscribe there |
| Quotes fail after authorizing | md socket authorized with trading token | Authorize the md socket with mdAccessToken, not accessToken |
| Symbol is inaccessible | Not entitled for that symbol, or invalid/continuous symbol | Use a licensed front-month contract with the correct month code |
| Live ticks never arrive on demo | Demo/simulated or delayed feed | Confirm the account is meant to carry an entitled real-time feed |
| Prop/eval account shows no data | Only the firm can enable data | Ask 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 TrialFrequently 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.