Projection

What projection does

includes and excludes control which fields appear on each row of a paginated response. Default behavior, with both empty or null, returns every projectable field. Either array can be supplied alone to narrow the output, but not both in the same request.

Projection rules
  • includes and excludes are mutually exclusive. The validator rejects requests that pass both with a 400 · validation.
  • Both arrays accept the same field names you use in filterExpression.field: canonical UPPER_SNAKE_CASE plus aliases, matched case-, separator-, and whitespace-insensitively.
  • Names that are not projectable for the endpoint are rejected up-front. See Field Reference for the per-surface inventory.
  • Empty arrays and nullare both equivalent to "no projection set": the response includes every projectable field.

Where it applies

Projection is only accepted by the table-shaped tools: the ones that return rows, one record per result. Aggregation and time-series tools (Net Drift, Heat Map, Gainers / Losers, the exposure endpoints, IV Rank, Volatility Skew, the OHLC endpoints, etc.) have no includes / excludes slot. Their responses always carry every field.

Tools that accept projection
  • /v1/equities/tool/equity-prints: trade-by-trade equity tape.
  • /v1/options/tool/order-flow/consolidated: blocks, splits, sweeps, and their comprising trades.
  • /v1/options/tool/order-flow/unconsolidated: raw option-trade tape.

Includes

includes is the explicit whitelist. Pass exactly the fields you need on the response; everything else is dropped.

Request

POST /v1/equities/tool/equity-prints
// Keep only id, ticker, price, and tradeTime on every row.
{
  "sessionDate": "2026-05-13",
  "filter": { "tickers": ["AAPL"] },
  "includes": ["ID", "TICKER", "PRICE", "TRADE_TIME"]
}

Response (truncated)

200 OK · only id / ticker / price / tradeTime
{
  "nextSearchAfter": ["1747144203000", "9f7f7d52-..."],
  "prints": [
    { "id": "9f7f7d52-...", "ticker": "AAPL", "price": 185.41, "tradeTime": 1747144203000 },
    { "id": "8c2e3f81-...", "ticker": "AAPL", "price": 185.40, "tradeTime": 1747144203000 }
    // every other field is omitted from the response.
  ]
}

Name aliases also work

Equivalent includes arrays
// All four arrays are equivalent: names are matched the same way as filterExpression.field.
{ "includes": ["TICKER", "STRIKE_PRICE", "IMPLIED_VOLATILITY"] }
{ "includes": ["ticker", "strikePrice", "impliedVolatility"] }
{ "includes": ["SYMBOL", "STRIKE", "IV"] }
{ "includes": ["symbol", "strike", "iv"] }

Excludes

excludes is the explicit blacklist. Pass the fields you do not want; everything else comes back. Useful when you want most of the row and just need to drop a handful of heavy or noisy fields.

Request

POST /v1/equities/tool/equity-prints
// Return every projectable field except the heavy notional + side-detail fields.
{
  "sessionDate": "2026-05-13",
  "filter": { "tickers": ["AAPL"] },
  "excludes": ["NOTIONAL_VALUE", "ASK_PRICE", "ASK_SIZE", "BID_PRICE", "BID_SIZE"]
}

Response (truncated)

200 OK · notional + bid/ask details omitted
{
  "nextSearchAfter": ["1747144203000", "9f7f7d52-..."],
  "prints": [
    {
      "id": "9f7f7d52-...",
      "ticker": "AAPL",
      "price": 185.41,
      "size": 100,
      "printType": "LIT_POOL",
      "tradeSide": "A",
      "tradeTime": 1747144203000,
      "isDelayedPrint": false
    }
    // notionalValue, askPrice, askSize, bidPrice, and bidSize are omitted.
  ]
}

Choose between includes and excludes based on which list is shorter. If you need a handful of fields out of 30, includes reads better; if you want to drop two specific fields, excludes reads better.

Projectable vs filterable

Fields have two orthogonal capability flags: filterable (can appear in filterExpression.field and sort.field) and projectable (can appear in includes / excludes). Most fields are both. A few are only filterable or only projectable.

See Field Reference for the per-surface inventory of which fields are filterable, projectable, or both.

Omitted fields on the response

Omitted fields do not appear on the response record at all, so a projected response is literally smaller on the wire.

How omission shows up
  • Projectable fields that are not selected by includes (or are listed in excludes) are omitted from the response record.
  • Omitted fields are dropped from the JSON output entirely. Smaller payload, fewer keys to ignore client-side.
  • Nested objects (greeks, moneyness on Order Flow records) are also dropped when every child field is excluded, so the parent disappears, not just its children.
  • The trade id is projectable: you can exclude it via excludes: ["ID"]. Most callers keep it because it is the row-stable identifier across replay or deduplication.

Narrowing the field set can also speed the query up: the server skips fetching and serializing fields you did not ask for, so smaller projections typically come back faster as well as smaller.

Where to go next