Two fields on a fractional share trade from the Massive trades endpoint do not mean what their names suggest, and both catch people out. size is an integer, so a trade for a quarter of a share reports zero there; the number you want is the string in decimal_size. The odd-lot sale condition on these trades is the second surprise, and it is what keeps them out of a bar's OHLC.
Applies to
- Plans: a Stocks subscription.
- Endpoints: /v3/trades/{ticker} and the flat-file trade datasets; the T channel on the /stocks WebSocket cluster, where the decimal size is ds.
- Asset classes: US stocks and ETFs, where brokers offer fractional investing.
What a fractional trade looks like
One fractional trade, pulled from an ordinary session:
curl -X GET "https://api.massive.com/v3/trades/AAPL?timestamp=2026-09-04&limit=1000&apiKey=YOUR_API_KEY"
Response
{
"results": [
{ "price": 320.0017, "size": 0, "decimal_size": "0.250624",
"conditions": [12, 37], "exchange": 4 }
],
"status": "OK"
}
A quarter of a share, at a price carried to four decimal places, reported off-exchange. In that page of 1,000 AAPL trades, 106 were fractional and 104 of those reported size: 0.
The three fields to get right
Three fields decide whether your numbers come out right:
| Field | What it holds | The trap |
|---|---|---|
| size | The size rounded to a whole number | Zero on almost every fractional trade, so summing it undercounts |
| decimal_size | The real size, as a string | Parse it as a decimal, not a float, if you are reconciling exactly |
| conditions | Includes 37, Odd Lot Trade | Decides what the trade may update |
Sum decimal_size rather than size whenever you build your own bars, and do not filter out trades with size: 0. They are real executions for less than a share.
Why they move volume but not price
Every fractional trade in that sample carried condition 37, the odd-lot condition, and the conditions endpoint reports its consolidated rules as updates_volume: true with updates_high_low: false and updates_open_close: false. So a fractional trade adds its size to the bar and can never set the bar's price.
That is the mechanism behind two things that otherwise look like bugs. Aggregate volume comes back as a decimal, because the bar sums real sizes including the fractions. And a bar can carry volume at a price its own high and low do not span, because the trades that contributed the volume were not eligible to move the range.
Why fractional trades exist at all
Brokers offering fractional investing buy whole shares on the exchange and allocate parts of them to customers, and the resulting executions are reported off-exchange through a FINRA facility rather than matched on a lit venue. That is why the example above carries exchange 4. The market's reporting rules treat them as odd lots, which is where the price-eligibility rule comes from: an odd lot is not considered representative of the market's price.
If you see an error
Volume that does not match your own reconstruction is almost always size against decimal_size.
Trades with size: 0 are not empty records to discard. Read decimal_size.
A bar whose volume looks inconsistent with its high and low is odd lots contributing volume without price. Check the conditions on the trades in that window.

