# Cboe Titanium U.S. Options Lite Feed Specification

Version 1.0.3 · February 10, 2026

## Overview

The Cboe Options Lite feed is a data solution designed to deliver a real-time stream of U.S. options data. The feed consists of "TrueSize" Quote which is the sum of the sizes from each participant at the NBBO (National Best Bid and Offer) price, Trade, Summary, and Reference messages and is serialized using Avro and distributed via Kafka.

## Kafka Distribution

The following sample code demonstrates how a Kafka client consumes messages from a topic and decodes multiple AVRO-encoded Cboe Options Lite messages, such as Trade, Quote, and Refresh, using a binary decoder and message-type dispatch logic.

```
template <class T>
T from_payload(avro::Decoder& decoder, const std::vector<std::uint8_t>& payload) {
    // returns a decoded AVRO object of type T from the given payload
    auto stream = avro::memoryInputStream(
        reinterpret_cast<const std::uint8_t*>(payload.data()), payload.size());
    decoder.init(*stream);
    T result;
    avro::decode(decoder, result);
    return result;
}

void kafka_consumer_loop(rd_kafka_t* rk, std::atomic<bool>& running) {
    auto header_decoder = avro::binaryDecoder();
    auto payload_decoder = avro::binaryDecoder();
    CboeGlobalCloud::msg_payload payload;

    while(running) {
        // grab a message from Kafka
        auto m = rd_kafka_consumer_poll(rk, 100);
        if(m && !m->err) {
            // frame header has a frame sequence number
            // (per topic/partition) and version number
            CboeGlobalCloud::frame_header frame_header;
            auto frame_buffer = avro::memoryInputStream(
                reinterpret_cast<const std::uint8_t*>(m->payload), m->len);
            header_decoder->init(*frame_buffer);
            avro::decode(*header_decoder, frame_header);
            header_decoder->drain();

            // use frame_header.sequence to detect gaps per topic/partition.
            // sequence numbers are monotonically increasing integers starting at 1.
            // 1 indicates a reset of the stream
            // A Kafka message can contain more than one AVRO message...
            while(frame_buffer->byteCount() < m->len) {
                avro::decode(*header_decoder, payload);
                switch(payload.message_type) {
                    case vod::client::VodDictionary::MID_NBBO: {
                        auto qte = from_payload<CboeGlobalCloud::truesize>(
                            *payload_decoder, payload.payload);
                        // process quote message (qte)
                        break;
                    }
                    case vod::client::VodDictionary::MID_TRADE: {
                        auto trd = from_payload<CboeGlobalCloud::trade>(
                            *payload_decoder, payload.payload);
                        // process trade message (trd)
                        break;
                    }
                    case vod::client::VodDictionary::MID_SECURITY_DEFINITION: {
                        auto r = from_payload<CboeGlobalCloud::refresh>(
                            *payload_decoder, payload.payload);
                        // process refresh message (r)
                        break;
                    }
                    case vod::client::VodDictionary::MID_OPTION_CHAIN: {
                        auto r = from_payload<CboeGlobalCloud::reference>(
                            *payload_decoder, payload.payload);
                        // process reference message (r)
                        break;
                    }
                    case vod::client::VodDictionary::MID_DELETE: {
                        auto del = from_payload<std::string>(
                            *payload_decoder, payload.payload);
                        // process delete message (del)
                        break;
                    }
                    default:
                        // LOG, unknown message type
                        break;
                }
                // return any non-decoded bytes to the AVRO decoder
                header_decoder->drain();
            }
            rd_kafka_message_destroy(m);
        }
    }
}
    
```

## Message Format

All data received from the Kafka broker on the Cboe Options Lite feed is formatted with Avro.

Each Kafka message starts with a Frame Header, which includes a monotonically increasing sequence number unique to the topic/partition as well as a protocol version number. The protocol version number only changes if the binary encoding differs in a new release.

Immediately succeeding this frame header are one or more message payloads. The message payload contains the message type and the contents of the message.

Each individual message contains a SEQUENCE_NUMBER field unique per symbol which handles sequencing and delivery integrity.

Cboe reserves the right to add message types and grow the length of any message without notice.

Cboe Options Lite users should develop their decoders to deal with unknown message types and messages that grow beyond the expected length. Messages will only be grown to add additional data to the end of a message.

## Message Type Codes

Each message type corresponds to a unique event on Cboe Options Lite. Each message type is associated with a unique numeric code that identifies its function within the data feed, enabling efficient parsing and interpretation by downstream systems.

**Table 1. Message Type Codes**

| Message Type Name | Message Type Code |
|---|---|
| Delete | 10 |
| True Size | 21 |
| Trade | 22 |
| Refresh | 109 |
| Reference | 30 |

## Data Feed Kafka Topics (by Region)

**Table 1. Hong Kong (ap-east-1)**

| Name | Topic Name |
|---|---|
| Cboe Options Lite | cboe-options-lite-index-01-ape1 cboe-options-lite-listed-01-ape1 cboe-options-lite-listed-02-ape1 cboe-options-lite-listed-03-ape1 cboe-options-lite-listed-04-ape1 cboe-options-lite-listed-select-01-ape1 cboe-options-lite-reference -01-ape1 |

## AVRO Templates

AVRO uses schemas (templates) defined in JSON to describe the structure of the data being serialized. Sample AVRO templates for the "TrueSize" (Quote), Trade, and Refresh messages are provided below to illustrate the structure and field definitions.

- Frame_header

  ```
  { 
   "namespace": "cboe.options_lite", 
   "name": "frame_header", 
   "type": "record", 
   "fields": [ 
    {"name": "sequence", "type": "long" }, 
    {"name": "version", "type": "int" } 
   ] 
  } 
  ```

- Msg_payload

  ```
  { 
   "namespace": "cboe.options_lite", 
   "name": "msg_payload", 
   "type": "record", 
   "fields": [ 
    {"name": "message_type", "type": "long" }, 
    {"name": "payload", "type": "bytes" } 
   ] 
  }
  ```

- TrueSize

  ```
  { 
     "namespace": "Cboe.options_lite", 
     "name": "truesize", 
     "type": "record", 
     "fields": [ 
        { "name": "symbol", "type": "string" }, 
        {"name": "sequence_number", "type": "long" }, 
        {"name": "source_sequence_number", "type": "long" }, 
        {"name": "publish_timestamp", "type": "long" }, 
        {"name": "source_timestamp", "type": "long" }, 
   	 {"name": "message_flags", "type": "int" }, 
        {"name": "bid_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } }, 
        {"name": "bid_size", "type": "int" }, 
        {"name": "ask_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } }, 
        {"name": "ask_size", "type": "int" } 
     ] 
  }  
  ```

- Trade

  ```
  { 
     "namespace": "Cboe.options_lite", 
     "name": "trade", 
     "type": "record", 
     "fields": [ 
        { "name": "symbol", "type": "string" }, 
        {"name": "sequence_number", "type": "long" }, 
        {"name": "source_sequence_number", "type": "long" }, 
        {"name": "publish_timestamp", "type": "long" }, 
        {"name": "source_timestamp", "type": "long" }, 
        {"name": "message_flags", "type": "int" }, 
        {"name": "eligibility_flags", "type": "int" }, 
        {"name": "trade_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "trade_size", "type": "int" }, 
        {"name": "trade_exchange", "type": "string" }, 
        {"name": "trade_condition", "type": "string" } 
     ] 
  } 
  ```

- Refresh / Summary

  ```
  { 
     "namespace": "Cboe.options_lite", 
     "name": "refresh", 
     "type": "record", 
     "fields": [ 
        {"name": "symbol", "type": "string" }, 
        {"name": "sequence_number", "type": "long" }, 
        {"name": "publish_timestamp", "type": "long" }, 
        {"name": "message_flags", "type": "int" }, 
        {"name": "open_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "high_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "low_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "last_sequence_number", "type":"long"}, 
        {"name": "last_timestamp", "type": "long" }, 
        {"name": "last_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "last_size", "type": "int" }, 
        {"name": "last_exchange", "type": "string" }, 
        {"name": "last_condition", "type": "string" }, 
        {"name": "total_volume", "type": "long" }, 
        {"name": "quote_timestamp", "type":"long"}, 
        {"name": "quote_sequence_number", "type":"long"}, 
        {"name": "bid_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "bid_size", "type": "int" }, 
        {"name": "ask_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4 } }, 
        {"name": "ask_size", "type": "int" } 
        {"name": "open_interest", "type": "long" } 
     ] 
  } 
  ```

- Reference

  ```
  { 
      "namespace": "Cboe.options_lite", 
      "name": "reference", 
      "type": "record", 
      "fields": [ 
          {"name": "symbol", "type": "string" }, 
          {"name": "sequence_number", "type": "long" }, 
          {"name": "publish_timestamp", "type": "long" }, 
          {"name": "message_flags", "type": "int" }, 
          {"name": "option_root", "type": "string" }, 
          {"name": "expiration", "type": "long" }, 
          {"name": "strike_price", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } 
  }, 
          {"name": "call_put", "type": "string" }, 
          {"name": "exercise_style", "type": "string" }, 
          {"name": "multiplier", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } 
  }, 
          {"name": "units", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } }, 
          {"name": "cash", "type": { "type": "long", "logicalType": "decimal", "precision": 14, "scale": 4  } }, 
          {"name": "type", "type": "string" }, 
          {"name": "currency", "type": "string" }, 
          {"name": "underlyer_ticker", "type": "string" }, 
          {"name": "underlyer_type", "type": "string" }, 
          {"name": "underlyer_description", "type": "string" }, 
          {"name": "published_topic", "type": "string" } 
      ] 
  } 
  ```

## TrueSize Quote Message Fields

The `Quote`message provides TrueSize which is the sum of the sizes from each participant at the NBBO (National Best Bid and Offer) price.

**Table 1. TrueSize Quote Message Field**

| Field Name | Value/Type | Description |
|---|---|---|
| Symbol | Alphanumeric | OSI Symbol |
| Sequence Number | Integer | Published sequence number from Cboe, monotonically increasing |
| Source Sequence Number | Integer | Sequence number corresponding to the underlying source quote of the bid or ask data present. |
| Publish Timestamp | Integer | Nanoseconds since epoch, corresponding to the time at which the AVRO message was encoded |
| Source Timestamp | Integer | Nanoseconds since epoch corresponding to the underlying source quote of the bid or ask data present |
| Message Flags | Bit Field | 0 - Normal update 1- refresh update (refreshes only) 0x40000000, initial image (quote / trade / refresh) Other values reserved for future use |
| Bid Price | Price | TrueSize determined best bid price |
| Bid Size | Integer | Aggregate bid quantity available across regional exchanges at the TrueSize determined best bid price |
| Ask Price | Price | TrueSize determined best offer price |
| Ask Size | Integer | Aggregate offer quantity available across regional exchanges at the TrueSize determined best offer price |

## Trade Message Fields

The `Trade`message is used to provide trade price and total executed volume across all options exchanges contributing to OPRA. A trade cancel will be published as a trade message with the volume populated to offset the canceled volume, and an appropriate trade cancellation condition.

**Table 1. Trade Message Fields**

| Field Name | Value/Type | Description |
|---|---|---|
| Symbol | Alphanumeric | OSI Symbol |
| Sequence Number | Integer | Published sequence number from Cboe, monotonically increasing |
| Source Sequence Number | Integer | Sequence number corresponding to the underlying source trade of the bid or ask data present. |
| Publish Timestamp | Integer | Nanoseconds since epoch, corresponding to the time at which the AVRO message was encoded |
| Source Timestamp | Integer | Nanoseconds since epoch corresponding to the underlying source trade of the bid or ask data present |
| Message Flags | Bit Field | 0 – Delivered Other values reserved for future use |
| Eligibility Flags | Bit Field | Indicates whether this trade to update open/high/low/last 1 – Last Trade Eligible 4 – Open Eligible 16 – High/Low Eligible |
| Trade Price | Price | Execution price of trade |
| Trade Size | Integer | Execution volume of trade. A negative trade size indicates a cancellation of the trade in question |
| Trade Exchange | Alphanumeric | Execution exchange of trade |
| Trade Condition | Alphanumeric | Provided trading condition of trade passed through from source trade |

## Reference Message Fields

**Table 1. Reference Fields**

| Field Name | Value/Type | Description |
|---|---|---|
| Symbol | Alphanumeric | OSI Symbol |
| Sequence Number | Integer | Published sequence number from Cboe, monotonically increasing |
| Root | Alphanumeric | Option Root |
| Expiration | Integer | Option Expiration |
| Strike | Price | Option Price |
| CallPut | Alphanumeric | C = Call P = Put |
| ExerciseStyle | Alphanumeric | E = European A = American |
| Multiplier | Price | Option Contract Multiplier |
| Units | Price | Deliverable Units |
| Cash | Price | Deliverable Cash |
| Type | Alphanumeric | Standard vs Flex |
| Currency | Alphanumeric | Currency in which the option is quoted |
| UnderlyerTicker | Alphanumeric | Symbol of underlying tradable asset |
| UnderlyerType | Alphanumeric | Determine if the underlying tradable asset is an equity, or index, or other asset class |
| UnderlyerDescription | Alphanumeric | Free text describing the underlying tradable asset |
| PublishedTopic | Alphanumeric | Name of the MSK Topic that the contract is distributed on |

## Delete Message Fields

The `Delete`message indicates that a contract will no longer be distributed on the feed.

**Table 1. Delete Message Fields**

| Field Name | Value/Type | Description |
|---|---|---|
| Symbol | Alphanumeric | OSI Symbol |

## Feed Status Message Fields

The `Feed Status` message is currently reserved but not disseminated.

**Table 1. Feed Status Message Fields**

| Field Name | Value/Type | Description |
|---|---|---|
| Message Flags | Bit FIeld | 0 - Delivered Other values reserved for future use |
| Text Description | Alphanumeric | Start of Day, End of Day, Failover |

## Summary Message Fields

The `Summary`message provides a periodic snapshot of the order book state for each instrument. It is designed to allow clients to build or rebuild their order books without relying on continuous quote updates. This message is republished every 15 minutes and includes aggregated quote and trade data.

**Table 1. Summary Message Fields**

| Field Name | Value/Type | Description |
|---|---|---|
| Symbol | Alphanumeric | OSI Symbol |
| Sequence Number | Integer | Published sequence number from Cboe, monotonically increasing |
| Publish Timestamp | Integer | Nanoseconds since epoch, corresponding to the time at which the AVRO message was encoded |
| Message Flags | Bit Field | 0 – Delivered Other values reserved for future use |
| Last Sequence Number | Integer | Most recent trade sequence number published or 0 if not set/not available |
| Open Price | Price | Opening price for the session or 0 if not set/not available |
| High Price | Price | High price for the session or 0 if not set/not available |
| Low Price | Price | Low price for the session or 0 if not set/not available |
| Last Price | Price | Last price for the session or 0 if not set/not available |
| Last Size | Integer | Last volume for the session or 0 if not set/not available |
| Last Condition | Alphanumeric | Last condition for the session |
| Last Exchange | Alphanumeric | Last exchange for the session |
| Last Timestamp | Integer | Nanoseconds since epoch corresponding to the source time of the associated trade or 0 if not set/not available |
| Total Volume | Integer | Total volume for the session |
| Quote Timestamp | Integer | Nanoseconds since epoch corresponding to the source time of the associated Quote or 0 if not set/not available |
| Quote Sequence Number | Integer | Most recent TrueSize Quote sequence number published or 0 if not set/not available |
| Bid Price | Price | Most recent TrueSize determined best bid price or 0 if not set/not available |
| Bid Size | Integer | Most recent TrueSize bid volume or 0 if not set/not available |
| Ask Price | Price | Most recent TrueSize determined best offer price or 0 if not set/not available |
| Ask Size | Integer | Most recent TrueSize offer volume or 0 if not set/not available |
| Open Interest | Long | Open Interest |

## Recommended Bandwidth

**Table 1. Recommended Bandwidth**

| Name | Bandwidth |
|---|---|
| Cboe Options Lite | 5,000 Mb (peak), 500 Mb (average) |

## Symbology

Cboe Options Lite uses the OSI (Options Symbology Initiative) for symbology.

## Support

Please direct questions or comments to datavantagesupport@cboe.com.

## Revision History

| Document Version | Date | Description |
|---|---|---|
| 1.0.0 | 10/27/25 | Initial Version. |
| 1.0.1 | 12/01/25 | Added Open Interest. |
| 1.0.2 | 01/14/26 | Added AVRO Templates and Sample Code for Frame Header and Message Payload. |
| 1.0.3 | 02/10/26 | Added Trade Cancel. |
