Market Data API FAQ
1. Why am I receiving an HTTP 403 error (Forbidden)?
A 403 error is returned when:
- The request is missing authentication headers
- The authentication credentials are invalid
- Your account does not have sufficient permissions for the requested data
Make sure your request includes all required headers. See Authentication Overview for details.
2. Do I need to handle signatures when using the Webull SDK?
No. The SDK handles signature generation automatically. You only need to provide your App Key and App Secret when initializing the client.
3. How do I get market data permissions? Are subscriptions from the Webull App valid?
Subscriptions purchased through the Webull mobile app or desktop platform (QT) are independent of OpenAPI. You need a separate subscription specifically enabled for OpenAPI usage. See Subscribe Advanced Quotes for a step-by-step guide.
4. What is the rate limit for Market Data API?
The Data API (HTTP) has a rate limit of 300 requests per 60 seconds. The Data Streaming API (MQTT) does not have a rate limit for subscribe/unsubscribe operations. See Market Data API Overview for more details.
5. Why was my MQTT connection disconnected?
Common causes:
- You used the same
session_idfor multiple connections — the new connection replaces the previous one - You exceeded the maximum of 5 concurrent connections per App Key (error code
105) - Heartbeat timeout — the server didn't receive a response in time
See Data Streaming API for connection rules and error codes.
6. Why am I not receiving data after reconnecting?
MQTT subscriptions are not automatically restored after a disconnection. You must call the Subscribe API again after reconnecting to resume data streaming.
7. Why are MQTT messages in binary format?
Streaming payloads are serialized using Protocol Buffers, not JSON. You need to parse them using the proto definitions provided in the Data Streaming API documentation. The only exception is the notice topic, which uses JSON.
8. Can I access LV1/LV2 data from multiple devices at the same time?
No. Only one device may access Level 1 and Level 2 market data at any given time per subscription.
9. Which MQTT endpoint should I use in the test environment?
For a server-to-server integration in the US test environment, connect to data-api.sandbox.webull.com on TCP port 1883. Use a unique session_id as the MQTT ClientId and enable TLS, as the official SDK does by default.
The test endpoint is separate from the production MQTT endpoint, data-api.webull.com:1883.
10. Which host should I use for the streaming subscribe and unsubscribe HTTP calls?
For a server-to-server integration in the US test environment, send the HTTP requests to https://api.sandbox.webull.com:
- Subscribe:
POST /market-data/streaming/subscribe - Unsubscribe:
POST /market-data/streaming/unsubscribe
Do not send these HTTP requests to the MQTT broker. The HTTP API manages subscriptions, while data-api.sandbox.webull.com:1883 delivers the MQTT stream. The session_id in the HTTP request must match the ClientId of the active MQTT connection.
11. Is real-time Level 2 streaming available in Sandbox or Paper Trading?
The sandbox environment provides 15-minute delayed data by default for market data that requires a paid subscription. It does not include a separate real-time Level 2 entitlement simply because you have a Paper Trading account.
If you have the corresponding real-time OpenAPI market data subscription in the production environment, such as Nasdaq TotalView Level 2, the sandbox environment is also upgraded to provide that real-time data. Therefore, real-time Level 2 streaming is available in sandbox only when the required production OpenAPI entitlement is active.