Look the trade's conditions up. A US stock trade lists its sale condition codes in a conditions array, a regular trade has no such field at all, and /v3/reference/conditions holds the rules for each code. Support answers this question the same way. Pre-market and after-hours minute bars are the case to watch: they take their prices from Form T (12) trades, which the endpoint lists as not updating them. If you want the model rather than one trade's verdict, read How does Massive create aggregate bars?.
Applies to
- Plans: any Stocks subscription. The conditions endpoint is reference data.
- Endpoints: /v3/reference/conditions for the rules and /v3/trades/{ticker} for the trade's condition codes.
- Asset classes: US stocks. Options and futures carry their own condition sets.
How to check one trade
- Pull the trade and read its conditions array.
- Look each code up, filtering with data_type=trade, singular, so you do not get the quote condition that shares the number.
- Read update_rules. For a regular-hours minute bar, from 09:30 to 16:00 ET, or for a daily bar, if every code says false for a field, that trade did not set it. Pre-market and after-hours minute bars also take their open, high, low and close from Form T (12) trades, unless the trade carries another code that says false, such as Odd Lot Trade (37), as Does a Form T trade update a pre-market minute bar's high, low, open and close? explains.
curl -X GET "https://api.massive.com/v3/reference/conditions?asset_class=stocks&data_type=trade&id=2&apiKey=YOUR_API_KEY"
Response
{
"results": [
{
"id": 2,
"type": "sale_condition",
"name": "Average Price Trade",
"sip_mapping": { "CTA": "B", "UTP": "W", "FINRA_TDDS": "W" },
"update_rules": {
"consolidated": { "updates_high_low": false, "updates_open_close": false, "updates_volume": true },
"market_center": { "updates_high_low": false, "updates_open_close": false, "updates_volume": true }
}
}
],
"status": "OK"
}
So condition 2 adds to volume and never touches price. A minute containing only average-price trades has volume but no open, high, low or close, and therefore no bar.
What the fields mean
The fields that mean something here are four, and three of them do the work:
| Field | What it tells you |
|---|---|
| update_rules.consolidated | Whether the trade updates the consolidated tape's bar, which is what /v2/aggs returns |
| update_rules.market_center | Whether it updates that single venue's own bar. The two can differ |
| sip_mapping | The letter each plan uses for this condition, for reconciling against a CTA, UTP or FINRA feed |
| type | Whether this is a sale_condition for a trade or a quote_condition. Filter on data_type=trade |
Why filter on data types
Filter on data_type=trade because the id space is shared. Asking for id=2 without the filter returns two records: sale condition 2, "Average Price Trade", and quote condition 2, "Regular One-Sided Open". Reading the wrong one gives a confident wrong answer, and there are 94 stock conditions in total across eight types.
If you see an error
Two results for one id means you did not filter by data type. Add &data_type=trade. The parameter is singular; a plural data_types is ignored and you get both records back.
A trade with no conditions field is an ordinary trade with no special handling: it updates everything. REST leaves the field out rather than sending an empty array, and the flat files leave the column blank.
A high or low you cannot find among the trades usually means you excluded a trade that is eligible, rather than that the bar is wrong. Check the conditions of the trades nearest the extreme.

