Introduction: Why “Real” Level 3 Data Matters
If you’ve ever tried to build a serious trading engine or market microstructure model, you’ve probably hit the same wall: “Is this really Level 3 data, or just dressed-up Level 2?”
In crypto, the difference matters. A lot. Level 3 (Market-By-Order) is the raw material for queue position modeling, order flow analysis, and realistic execution simulations. But not every “order book stream” is actually L3.
This article clarifies exactly how CoinAPI delivers Level 3 data, when it’s available, and which WebSocket feed you need to use.
Level 2 vs Level 3: The Difference That Actually Matters
Before talking about APIs, it’s worth being precise about definitions.
Level 2 (Market-By-Price) is aggregated.
You see total size at each price level. You don’t see individual orders.
Typical fields look like:
- price
- size
- side
That’s fine for many use cases. It’s also what most “normalized” order book feeds provide.
Level 3 (Market-By-Order) is different.
You see every order, tracked individually.
Each update corresponds to an actual order being added, matched, reduced, or removed — and it comes with an order_id.
Typical fields include:
- order_id
- price
- size
- update_type (ADD, SUB, MATCH, DELETE)
- side
No order_id means no Level 3. It’s that simple.
Further reading:
- If you want a deeper walkthrough of how Level 1, Level 2, and Level 3 data differ in practice, see this breakdown of how to read different levels of crypto order book data.
- Beyond definitions, it’s worth understanding what traders actually use Level 3 data for in live and simulated trading systems.
The Short Version: Yes, CoinAPI Streams True L3, But Not Everywhere
CoinAPI has more than one real-time streaming interface. Most confusion starts here.
Market Data WebSocket (v1) and FIX
These are normalized, multi-venue feeds.
What you get:
- Consistent schemas across hundreds of exchanges
- Level 2 order books (price-level)
- Trades, quotes, depth updates
What you don’t get:
- Continuous order-by-order semantics
- Exchange-native order lifecycle events
These feeds are great for:
- Cross-exchange analytics
- Arbitrage detection
- Market depth monitoring
They are not designed for true Market-By-Order consumption.
WebSocket DS (Direct Stream)
This is where Level 3 actually lives.
WebSocket DS connects directly to individual exchanges. When an exchange publishes native L3 data, CoinAPI can stream it as-is, without collapsing it into Level 2.
One important constraint:
Level 3 only exists where the exchange itself exposes it.
CoinAPI doesn’t invent L3. It passes it through when it’s real.
Further reading:
- This distinction becomes especially important when choosing between WebSocket DS and standard WebSocket feeds for a trading system.
Which Exchanges Actually Support L3 via CoinAPI?
Right now, true Level 3 (Market-By-Order) streaming via CoinAPI WebSocket DS is available for:
- Coinbase
- Bitso
For these venues:
- Messages include order_id
- Updates follow ADD / SUB / MATCH / DELETE semantics
- You’re seeing the exchange’s real order lifecycle
This is not reconstructed data. It’s not inferred. It’s a direct stream.
For other exchanges:
- If the venue doesn’t publish L3, CoinAPI can’t synthesize it
- WebSocket DS still gives you the best possible L2 feed
That’s an honest constraint, not a limitation hidden in the fine print.
Further reading:
- For readers asking where to get full Level 3 order book data in crypto, availability depends entirely on whether the exchange publishes native Market-By-Order feeds.
How to Tell If You’re Actually Getting Level 3 (In 10 Seconds)
Don’t rely on documentation alone. Check a message.
Ask three questions:
- Is there an order_id field?
- Are updates expressed as ADD, SUB, MATCH, DELETE?
- Does volume change per order, not just per price?
Example (simplified):
time_exchange: 2025-02-14T13:30:03.585Z
is_buy: true
update_type: ADD
entry_px: 43125.50
entry_sx: 0.75
order_id: a8f3c91d
If order_id is present → Level 3.
If it’s missing or empty → Level 2.
No ambiguity here.
Why CoinAPI Doesn’t “Normalize” Level 3 Across Exchanges
This question comes up a lot, and the answer is mostly physics.
- Order ID formats differ
- Matching engines behave differently
- Queue priority rules aren’t portable
- Some venues only partially expose L3
Normalizing Level 3 would mean stripping away the very details that make it useful. At that point, you’re back to Level 2 with extra steps.
That’s why CoinAPI keeps L3 exchange-native and exposes it only through WebSocket DS.
Further reading:
When You Should Use WebSocket DS (And When You Shouldn’t)
Use WebSocket DS if:
- You need true Market-By-Order data
- You care about execution realism
- You model queue position or order flow
- You trade on Coinbase or Bitso and L3 is a requirement
Stick with standard WebSocket if:
- You want consistency across many exchanges
- You’re building analytics, dashboards, or signals
- Level 2 depth is good enough
Different tools. Different jobs.
Common Ways Teams Accidentally Get This Wrong
Assuming “full depth” means Level 3
It doesn’t. Always check for order_id.
Expecting L3 from exchanges that don’t publish it
No data provider can create Market-By-Order data out of thin air.
Mixing normalized and direct feeds
If part of your system assumes L3 semantics and another part doesn’t, bugs will follow.
The Bottom Line
CoinAPI does stream true Level 3 (Market-By-Order) data, but only where it exists, and only through WebSocket DS.
If you need order-by-order updates with real order IDs, WebSocket DS is the right interface, and Coinbase and Bitso are the venues to look at today.
And if you’re ever unsure what you’re receiving, don’t overthink it.
Just check for order_id.












