{
  "enums": {
    "MsgType": {
      "0": {
        "label": "Heartbeat",
        "fixCode": "HEARTBEAT"
      },
      "1": {
        "label": "TestRequest",
        "fixCode": "TEST_REQUEST"
      },
      "2": {
        "label": "ResendRequest",
        "fixCode": "RESEND_REQUEST"
      },
      "3": {
        "label": "Reject",
        "fixCode": "REJECT"
      },
      "5": {
        "label": "Logout",
        "fixCode": "LOGOUT"
      },
      "6": {
        "label": "IOI",
        "fixCode": "IOI"
      },
      "8": {
        "label": "ExecutionReport",
        "fixCode": "EXECUTION_REPORT"
      },
      "A": {
        "label": "Logon",
        "fixCode": "LOGON"
      },
      "D": {
        "label": "NewOrderSingle",
        "fixCode": "NEW_ORDER_SINGLE"
      },
      "F": {
        "label": "OrderCancelRequest",
        "fixCode": "ORDER_CANCEL_REQUEST"
      },
      "G": {
        "label": "OrderCancelReplaceRequest",
        "fixCode": "ORDER_CANCEL_REPLACE_REQUEST"
      },
      "R": {
        "label": "QuoteRequest",
        "fixCode": "QUOTE_REQUEST"
      },
      "S": {
        "label": "Quote",
        "fixCode": "QUOTE"
      },
      "W": {
        "label": "MarketDataSnapshotFullRefresh",
        "fixCode": "MARKET_DATA_SNAPSHOT_FULL_REFRESH"
      },
      "X": {
        "label": "MarketDataIncrementalRefresh",
        "fixCode": "MARKET_DATA_INCREMENTAL_REFRESH"
      },
      "Z": {
        "label": "QuoteCancel",
        "fixCode": "QUOTE_CANCEL"
      },
      "h": {
        "label": "TradingSessionStatus",
        "fixCode": "TRADING_SESSION_STATUS"
      },
      "j": {
        "label": "BusinessMessageReject",
        "fixCode": "BUSINESS_MESSAGE_REJECT"
      },
      "x": {
        "label": "SecurityListRequest",
        "fixCode": "SECURITY_LIST_REQUEST"
      },
      "y": {
        "label": "SecurityList",
        "fixCode": "SECURITY_LIST"
      },
      "AI": {
        "label": "QuoteStatusReport",
        "fixCode": "QUOTE_STATUS_REPORT"
      },
      "AJ": {
        "label": "QuoteResponse",
        "fixCode": "QUOTE_RESPONSE"
      }
    },
    "Side": {
      "1": {
        "label": "Buy",
        "fixCode": "BUY"
      },
      "2": {
        "label": "Sell",
        "fixCode": "SELL"
      }
    },
    "OrdType": {
      "1": {
        "label": "Market",
        "fixCode": "MARKET"
      },
      "2": {
        "label": "Limit",
        "fixCode": "LIMIT"
      }
    },
    "TimeInForce": {
      "0": {
        "label": "Day (59=0; good till cancel for the trading day at OpenYield)",
        "fixCode": "DAY"
      },
      "3": {
        "label": "ImmediateOrCancel",
        "fixCode": "IMMEDIATE_OR_CANCEL"
      },
      "4": {
        "label": "FillOrKill",
        "fixCode": "FILL_OR_KILL"
      }
    },
    "ExecInst": {
      "G": {
        "label": "AllOrNone",
        "fixCode": "ALL_OR_NONE"
      },
      "Z": {
        "label": "Single Fill or Cancel (SFC; cancel if not best)",
        "fixCode": "CANCEL_IF_NOT_BEST"
      }
    },
    "OrdStatus": {
      "0": {
        "label": "New",
        "fixCode": "NEW"
      },
      "1": {
        "label": "PartiallyFilled",
        "fixCode": "PARTIALLY_FILLED"
      },
      "2": {
        "label": "Filled",
        "fixCode": "FILLED"
      },
      "4": {
        "label": "Canceled",
        "fixCode": "CANCELED"
      },
      "5": {
        "label": "Replaced",
        "fixCode": "REPLACED"
      },
      "8": {
        "label": "Rejected",
        "fixCode": "REJECTED"
      },
      "A": {
        "label": "PendingNew",
        "fixCode": "PENDING_NEW"
      },
      "B": {
        "label": "Calculated",
        "fixCode": "CALCULATED"
      }
    },
    "ExecType": {
      "0": {
        "label": "New",
        "fixCode": "NEW"
      },
      "4": {
        "label": "Canceled",
        "fixCode": "CANCELED"
      },
      "5": {
        "label": "Replaced",
        "fixCode": "REPLACED"
      },
      "8": {
        "label": "Rejected",
        "fixCode": "REJECTED"
      },
      "F": {
        "label": "Trade",
        "fixCode": "TRADE"
      },
      "G": {
        "label": "TradeCorrect",
        "fixCode": "TRADE_CORRECT"
      },
      "H": {
        "label": "TradeCancel",
        "fixCode": "TRADE_CANCEL"
      }
    },
    "OrdRejReason": {
      "1": {
        "label": "Unknown Symbol",
        "fixCode": "UNKNOWN_SYMBOL"
      },
      "3": {
        "label": "Order Exceeds Limit",
        "fixCode": "ORDER_EXCEEDS_LIMIT"
      },
      "5": {
        "label": "Unknown Order",
        "fixCode": "UNKNOWN_ORDER"
      },
      "6": {
        "label": "Duplicate Order",
        "fixCode": "DUPLICATE_ORDER"
      },
      "8": {
        "label": "Stale Order (Bad Price)",
        "fixCode": "STALE_ORDER"
      },
      "10": {
        "label": "Invalid Investor ID (Bad Feed ID)",
        "fixCode": "INVALID_INVESTOR_ID"
      },
      "13": {
        "label": "Incorrect Quantity",
        "fixCode": "INCORRECT_QUANTITY"
      },
      "15": {
        "label": "Unknown Account",
        "fixCode": "UNKNOWN_ACCOUNT"
      }
    },
    "SessionRejectReason": {
      "0": {
        "label": "Invalid Tag Number",
        "fixCode": "INVALID_TAG_NUMBER"
      },
      "1": {
        "label": "Required Tag Missing",
        "fixCode": "REQUIRED_TAG_MISSING"
      },
      "2": {
        "label": "Tag Not Defined For This Message Type",
        "fixCode": "TAG_NOT_DEFINED_FOR_THIS_MESSAGE_TYPE"
      },
      "3": {
        "label": "Undefined Tag",
        "fixCode": "UNDEFINED_TAG"
      },
      "4": {
        "label": "Tag Specified Without A Value",
        "fixCode": "TAG_SPECIFIED_WITHOUT_A_VALUE"
      },
      "5": {
        "label": "Value Is Incorrect",
        "fixCode": "VALUE_IS_INCORRECT"
      },
      "6": {
        "label": "Incorrect Data Format For Value",
        "fixCode": "INCORRECT_DATA_FORMAT_FOR_VALUE"
      },
      "9": {
        "label": "CompID Problem",
        "fixCode": "COMPID_PROBLEM"
      },
      "10": {
        "label": "SendingTime Accuracy Problem",
        "fixCode": "SENDINGTIME_ACCURACY_PROBLEM"
      },
      "11": {
        "label": "Invalid MsgType",
        "fixCode": "INVALID_MSGTYPE"
      },
      "13": {
        "label": "Tag Appears More Than Once",
        "fixCode": "TAG_APPEARS_MORE_THAN_ONCE"
      },
      "14": {
        "label": "Tag Specified Out Of Required Order",
        "fixCode": "TAG_SPECIFIED_OUT_OF_REQUIRED_ORDER"
      },
      "15": {
        "label": "Repeating Group Fields Out Of Order",
        "fixCode": "REPEATING_GROUP_FIELDS_OUT_OF_ORDER"
      },
      "16": {
        "label": "Incorrect NumInGroup Count For Repeating Group",
        "fixCode": "INCORRECT_NUMINGROUP_COUNT_FOR_REPEATING_GROUP"
      },
      "99": {
        "label": "Other",
        "fixCode": "OTHER"
      }
    },
    "BusinessRejectReason": {
      "0": {
        "label": "Other",
        "fixCode": "OTHER"
      },
      "3": {
        "label": "Unsupported Message Type",
        "fixCode": "UNSUPPORTED_MESSAGE_TYPE"
      },
      "5": {
        "label": "Conditionally Required Field Missing",
        "fixCode": "CONDITIONALLY_REQUIRED_FIELD_MISSING"
      }
    },
    "Product": {
      "1": {
        "label": "Agency",
        "fixCode": "AGENCY"
      },
      "3": {
        "label": "Corporate",
        "fixCode": "CORPORATE"
      },
      "6": {
        "label": "Government",
        "fixCode": "GOVERNMENT"
      },
      "11": {
        "label": "Municipal",
        "fixCode": "MUNICIPAL"
      }
    },
    "SecurityIDSource": {
      "1": {
        "label": "CUSIP",
        "fixCode": "CUSIP"
      },
      "4": {
        "label": "ISIN",
        "fixCode": "ISIN_NUMBER"
      },
      "A": {
        "label": "Bloomberg Symbol (FIGI)",
        "fixCode": "BLOOMBERG_SYMBOL"
      }
    },
    "PriceType": {
      "1": {
        "label": "Percentage (clean percent of face value)",
        "fixCode": "PERCENTAGE"
      }
    },
    "SettlType": {
      "0": {
        "label": "Regular settlement",
        "fixCode": "REGULAR"
      },
      "6": {
        "label": "Future dated settlement",
        "fixCode": "FUTURE"
      }
    },
    "EncryptMethod": {
      "0": {
        "label": "None",
        "fixCode": "NONE"
      }
    },
    "ResetSeqNumFlag": {
      "Y": {
        "label": "Reset sequence numbers",
        "fixCode": "YES"
      }
    },
    "TradSesStatus": {
      "0": {
        "label": "Unknown",
        "fixCode": "UNKNOWN"
      },
      "1": {
        "label": "Halted",
        "fixCode": "HALTED"
      },
      "2": {
        "label": "Open",
        "fixCode": "OPEN"
      },
      "3": {
        "label": "Closed",
        "fixCode": "CLOSED"
      },
      "4": {
        "label": "Pre-Open",
        "fixCode": "PRE_OPEN"
      }
    },
    "SecurityListRequestType": {
      "4": {
        "label": "All Securities",
        "fixCode": "ALL_SECURITIES"
      }
    },
    "SecurityRequestResult": {
      "0": {
        "label": "Valid request",
        "fixCode": "VALID_REQUEST"
      }
    },
    "IOITransType": {
      "N": {
        "label": "New",
        "fixCode": "NEW"
      },
      "C": {
        "label": "Cancel",
        "fixCode": "CANCEL"
      },
      "R": {
        "label": "Replace",
        "fixCode": "REPLACE"
      }
    },
    "IOIQltyInd": {
      "L": {
        "label": "Low — your order",
        "fixCode": "LOW"
      },
      "M": {
        "label": "Medium — possibly your order (shared connections)",
        "fixCode": "MEDIUM"
      },
      "H": {
        "label": "High — not your order",
        "fixCode": "HIGH"
      }
    },
    "IOIQualifier": {
      "V": {
        "label": "Versus — will be intermediated by OpenYield",
        "fixCode": "VERSUS"
      },
      "A": {
        "label": "AllOrNone — order must be fully filled or skipped",
        "fixCode": "ALL_OR_NONE"
      }
    },
    "MDUpdateAction": {
      "0": {
        "label": "New",
        "fixCode": "NEW"
      },
      "1": {
        "label": "Change",
        "fixCode": "CHANGE"
      },
      "2": {
        "label": "Delete",
        "fixCode": "DELETE"
      }
    },
    "MDEntryType": {
      "0": {
        "label": "Bid",
        "fixCode": "BID"
      },
      "1": {
        "label": "Offer",
        "fixCode": "OFFER"
      },
      "2": {
        "label": "Trade",
        "fixCode": "TRADE"
      },
      "3": {
        "label": "Index (change on day from previous close)",
        "fixCode": "INDEX_VALUE"
      },
      "7": {
        "label": "High (daily high price)",
        "fixCode": "TRADING_SESSION_HIGH_PRICE"
      },
      "8": {
        "label": "Low (daily low price)",
        "fixCode": "TRADING_SESSION_LOW_PRICE"
      }
    },
    "QuoteStatus": {
      "0": {
        "label": "Accepted",
        "fixCode": "ACCEPTED"
      },
      "1": {
        "label": "Canceled for Symbol",
        "fixCode": "CANCEL_FOR_SYMBOL"
      },
      "5": {
        "label": "Rejected",
        "fixCode": "REJECTED"
      }
    },
    "QuoteCancelType": {
      "4": {
        "label": "Cancel All Quotes",
        "fixCode": "CANCEL_ALL_QUOTES"
      }
    },
    "QuoteType": {
      "0": {
        "label": "Indicative (Order Book Summon)",
        "fixCode": "INDICATIVE"
      },
      "1": {
        "label": "Tradeable (Firm RFO)",
        "fixCode": "TRADEABLE"
      }
    },
    "QuoteResponseLevel": {
      "2": {
        "label": "Acknowledge All",
        "fixCode": "ACKNOWLEDGE_EACH_QUOTE_MESSAGE"
      }
    },
    "QuoteRespType": {
      "1": {
        "label": "Hit/Lift (accept quote)",
        "fixCode": "HIT"
      },
      "6": {
        "label": "Pass",
        "fixCode": "PASS"
      }
    },
    "QuoteQualifier": {
      "A": {
        "label": "AllOrNone",
        "fixCode": "ALL_OR_NONE"
      }
    },
    "MiscFeeType": {
      "1": {
        "label": "Regulatory (TAF — applicable on bond sells)",
        "fixCode": "REGULATORY"
      },
      "3": {
        "label": "Local Commission (markup included in price)",
        "fixCode": "LOCAL_COMMISSION"
      },
      "8": {
        "label": "Markup (trade fee to the maker)",
        "fixCode": "MARKUP"
      },
      "12": {
        "label": "Agent (clearing cost for intermediated trades)",
        "fixCode": "AGENT"
      }
    },
    "PartyRole": {
      "1": {
        "label": "Executing Firm (OpenYield MPID)",
        "fixCode": "EXECUTING_FIRM"
      },
      "3": {
        "label": "Client ID (your assigned counterparty code)",
        "fixCode": "CLIENT_ID"
      },
      "4": {
        "label": "Clearing Firm (your MPID shown to contra firms)",
        "fixCode": "CLEARING_FIRM"
      },
      "5": {
        "label": "Investor ID (account/sub-account code)",
        "fixCode": "INVESTOR_ID"
      },
      "11": {
        "label": "Order Origination Trader (obfuscated GUI trader code)",
        "fixCode": "ORDER_ORIGINATION_TRADER"
      },
      "17": {
        "label": "Contra Firm (MPID of settlement counterparty)",
        "fixCode": "CONTRA_FIRM"
      },
      "18": {
        "label": "Contra Clearing Firm (DTCC participant number of the contra clearing firm)",
        "fixCode": "CONTRA_CLEARING_FIRM"
      },
      "24": {
        "label": "Customer Code (pass-through tag for subscriber use)",
        "fixCode": "CUSTOMER_ACCOUNT"
      }
    },
    "PartySubIDType": {
      "10": {
        "label": "Securities Account Number",
        "fixCode": "SECURITIES_ACCOUNT_NUMBER"
      }
    },
    "StipulationType": {
      "MINQTY": {
        "label": "Minimum Quantity",
        "fixCode": "MINQTY"
      },
      "MININCR": {
        "label": "Minimum Increment",
        "fixCode": "MININCR"
      },
      "MINDNOM": {
        "label": "Minimum Balance Remaining (MINDNOM; OpenYield usage)",
        "fixCode": "MINDNOM"
      }
    }
  },
  "fields": {
    "6": {
      "name": "AvgPx",
      "type": "Price",
      "description": "Average price from all fills"
    },
    "7": {
      "name": "BeginSeqNo",
      "type": "SeqNum",
      "description": "Beginning sequence number for resend request"
    },
    "11": {
      "name": "ClOrdID",
      "type": "String",
      "description": "Subscriber order ID"
    },
    "14": {
      "name": "CumQty",
      "type": "Qty",
      "description": "Cumulative quantity filled"
    },
    "16": {
      "name": "EndSeqNo",
      "type": "SeqNum",
      "description": "Ending sequence number for resend request (0=infinity)"
    },
    "17": {
      "name": "ExecID",
      "type": "String",
      "description": "OpenYield's Response or Fill ID"
    },
    "18": {
      "name": "ExecInst",
      "type": "MultipleCharValue",
      "enum": "ExecInst",
      "description": "Execution instructions. Set to G (AllOrNone) or Z (Single Fill or Cancel). G and Z are mutually exclusive. When either is set, TimeInForce is ignored. Not applicable to Quotes."
    },
    "19": {
      "name": "ExecRefID",
      "type": "String",
      "description": "Original ExecID (post-trade)"
    },
    "22": {
      "name": "SecurityIDSource",
      "type": "String",
      "enum": "SecurityIDSource",
      "description": "Source of SecurityID"
    },
    "23": {
      "name": "IOIID",
      "type": "String",
      "description": "OpenYield's IOI identifier"
    },
    "25": {
      "name": "IOIQltyInd",
      "type": "Char",
      "enum": "IOIQltyInd",
      "description": "IOI quality indicator"
    },
    "26": {
      "name": "IOIRefID",
      "type": "String",
      "description": "Original IOI ID in Cancel and Replace"
    },
    "27": {
      "name": "IOIQty",
      "type": "String",
      "description": "IOI Quantity; zero for cancel"
    },
    "28": {
      "name": "IOITransType",
      "type": "Char",
      "enum": "IOITransType",
      "description": "IOI transaction type"
    },
    "31": {
      "name": "LastPx",
      "type": "Price",
      "description": "Price of the last fill or correction"
    },
    "32": {
      "name": "LastQty",
      "type": "Qty",
      "description": "Quantity of the last fill"
    },
    "37": {
      "name": "OrderID",
      "type": "String",
      "description": "OpenYield's Order ID"
    },
    "38": {
      "name": "OrderQty",
      "type": "Qty",
      "description": "Order quantity in configured units (bonds by default)"
    },
    "39": {
      "name": "OrdStatus",
      "type": "Char",
      "enum": "OrdStatus",
      "description": "Status of the order"
    },
    "40": {
      "name": "OrdType",
      "type": "Char",
      "enum": "OrdType",
      "description": "Order type"
    },
    "41": {
      "name": "OrigClOrdID",
      "type": "String",
      "description": "Original ClOrdID being replaced or canceled"
    },
    "44": {
      "name": "Price",
      "type": "Price",
      "description": "Clean order price"
    },
    "45": {
      "name": "RefSeqNum",
      "type": "SeqNum",
      "description": "Reference sequence number for session-level rejects"
    },
    "48": {
      "name": "SecurityID",
      "type": "String",
      "description": "Security identifier"
    },
    "54": {
      "name": "Side",
      "type": "Char",
      "enum": "Side",
      "description": "Order side"
    },
    "55": {
      "name": "Symbol",
      "type": "String",
      "description": "Security symbol"
    },
    "58": {
      "name": "Text",
      "type": "String",
      "description": "Human-readable explanation"
    },
    "59": {
      "name": "TimeInForce",
      "type": "Char",
      "enum": "TimeInForce",
      "description": "Order time in force"
    },
    "60": {
      "name": "TransactTime",
      "type": "UTCTimestamp",
      "description": "Transaction timestamp"
    },
    "62": {
      "name": "ValidUntilTime",
      "type": "UTCTimestamp",
      "description": "End of the RFO collection window; responders must submit quotes before this time"
    },
    "63": {
      "name": "SettlType",
      "type": "String",
      "enum": "SettlType",
      "description": "Settlement type"
    },
    "64": {
      "name": "SettlDate",
      "type": "LocalMktDate",
      "description": "Settlement date (YYYYMMDD)"
    },
    "98": {
      "name": "EncryptMethod",
      "type": "Int",
      "enum": "EncryptMethod",
      "description": "Encryption method"
    },
    "103": {
      "name": "OrdRejReason",
      "type": "Int",
      "enum": "OrdRejReason",
      "description": "Rejection reason code"
    },
    "104": {
      "name": "IOIQualifier",
      "type": "Char",
      "enum": "IOIQualifier",
      "description": "IOI qualifier"
    },
    "108": {
      "name": "HeartBtInt",
      "type": "Int",
      "description": "Heartbeat interval in seconds"
    },
    "112": {
      "name": "TestReqID",
      "type": "String",
      "description": "Test request identifier echoed back in the heartbeat reply"
    },
    "117": {
      "name": "QuoteID",
      "type": "String",
      "description": "Quote ID"
    },
    "118": {
      "name": "NetMoney",
      "type": "Amt",
      "description": "Settlement cash amount (principal + accrued interest) for the trade"
    },
    "126": {
      "name": "ExpireTime",
      "type": "UTCTimestamp",
      "description": "End of the RFO firm window; OpenYield will cancel resting orders after this time"
    },
    "131": {
      "name": "QuoteReqID",
      "type": "String",
      "description": "RFO/RFQ request ID"
    },
    "132": {
      "name": "BidPx",
      "type": "Price",
      "description": "Bid price (set when Side=Buy)"
    },
    "133": {
      "name": "OfferPx",
      "type": "Price",
      "description": "Offer/ask price (set when Side=Sell)"
    },
    "134": {
      "name": "BidSize",
      "type": "Qty",
      "description": "Bid quantity in bonds (set when Side=Buy)"
    },
    "135": {
      "name": "OfferSize",
      "type": "Qty",
      "description": "Offer quantity in bonds (set when Side=Sell)"
    },
    "136": {
      "name": "NoMiscFees",
      "type": "NumInGroup",
      "description": "Number of fee entries"
    },
    "137": {
      "name": "MiscFeeAmt",
      "type": "Amt",
      "description": "Fee amount in dollars"
    },
    "139": {
      "name": "MiscFeeType",
      "type": "String",
      "enum": "MiscFeeType",
      "description": "Fee type"
    },
    "141": {
      "name": "ResetSeqNumFlag",
      "type": "Boolean",
      "enum": "ResetSeqNumFlag",
      "description": "Y to reset sequence numbers on logon (used for MD and OB sessions)"
    },
    "146": {
      "name": "NoRelatedSym",
      "type": "NumInGroup",
      "description": "Number of securities in this message (RFO must be 1; SecurityList up to 10)"
    },
    "150": {
      "name": "ExecType",
      "type": "Char",
      "enum": "ExecType",
      "description": "Type of execution report"
    },
    "151": {
      "name": "LeavesQty",
      "type": "Qty",
      "description": "Remaining unfilled quantity"
    },
    "157": {
      "name": "NumDaysInterest",
      "type": "Int",
      "description": "Number of days of accrued interest covered by AccruedInterestAmt (159); set in every message where 159 is set"
    },
    "159": {
      "name": "AccruedInterestAmt",
      "type": "Amt",
      "description": "Dollar amount of accrued interest"
    },
    "199": {
      "name": "NoIOIQualifiers",
      "type": "NumInGroup",
      "description": "Number of IOI qualifier entries"
    },
    "218": {
      "name": "Spread",
      "type": "PriceOffset",
      "description": "Spread to Benchmark, when available"
    },
    "236": {
      "name": "Yield",
      "type": "Percentage",
      "description": "Yield to maturity, when available"
    },
    "268": {
      "name": "NoMDEntries",
      "type": "NumInGroup",
      "description": "Number of market data entries (up to 10 in increments)"
    },
    "269": {
      "name": "MDEntryType",
      "type": "Char",
      "enum": "MDEntryType",
      "description": "Market data entry type"
    },
    "270": {
      "name": "MDEntryPx",
      "type": "Price",
      "description": "Market data entry price"
    },
    "271": {
      "name": "MDEntrySize",
      "type": "Qty",
      "description": "Market data entry size in configured units (bonds by default)"
    },
    "278": {
      "name": "MDEntryID",
      "type": "String",
      "description": "Market data entry ID"
    },
    "279": {
      "name": "MDUpdateAction",
      "type": "Char",
      "enum": "MDUpdateAction",
      "description": "Market data update action"
    },
    "288": {
      "name": "MDEntryBuyer",
      "type": "String",
      "description": "Indicates Taker or Maker role; set on Trade entries only"
    },
    "289": {
      "name": "MDEntrySeller",
      "type": "String",
      "description": "Opposite of MDEntryBuyer; set on Trade entries only"
    },
    "297": {
      "name": "QuoteStatus",
      "type": "Int",
      "enum": "QuoteStatus",
      "description": "Quote status"
    },
    "298": {
      "name": "QuoteCancelType",
      "type": "Int",
      "enum": "QuoteCancelType",
      "description": "Cancel scope"
    },
    "299": {
      "name": "QuoteEntryID",
      "type": "String",
      "description": "Market data entry ID used in snapshot"
    },
    "301": {
      "name": "QuoteResponseLevel",
      "type": "Int",
      "enum": "QuoteResponseLevel",
      "description": "Acknowledgment level requested"
    },
    "320": {
      "name": "SecurityReqID",
      "type": "String",
      "description": "Security list request identifier"
    },
    "322": {
      "name": "SecurityResponseID",
      "type": "String",
      "description": "OpenYield's security list response identifier"
    },
    "336": {
      "name": "TradingSessionID",
      "type": "String",
      "description": "Trading session identifier; always 'Marketplace'"
    },
    "340": {
      "name": "TradSesStatus",
      "type": "Int",
      "enum": "TradSesStatus",
      "description": "Market state"
    },
    "341": {
      "name": "TradSesStartTime",
      "type": "UTCTimestamp",
      "description": "Time at which Pre-Open begins"
    },
    "342": {
      "name": "TradSesOpenTime",
      "type": "UTCTimestamp",
      "description": "Time at which the marketplace fully opens"
    },
    "344": {
      "name": "TradSesCloseTime",
      "type": "UTCTimestamp",
      "description": "Time at which the marketplace closes for the day"
    },
    "371": {
      "name": "RefTagID",
      "type": "Int",
      "description": "Tag number of the field that caused the reject"
    },
    "372": {
      "name": "RefMsgType",
      "type": "String",
      "description": "MsgType of the rejected message"
    },
    "373": {
      "name": "SessionRejectReason",
      "type": "Int",
      "enum": "SessionRejectReason",
      "description": "Reason code for a session-level reject"
    },
    "380": {
      "name": "BusinessRejectReason",
      "type": "Int",
      "enum": "BusinessRejectReason",
      "description": "Reason code for business message rejection"
    },
    "381": {
      "name": "GrossTradeAmt",
      "type": "Amt",
      "description": "Principal cash value (excludes accrued interest)"
    },
    "393": {
      "name": "TotNoRelatedSym",
      "type": "Int",
      "description": "Total number of securities being returned across all SecurityList messages"
    },
    "423": {
      "name": "PriceType",
      "type": "Int",
      "enum": "PriceType",
      "description": "Price type"
    },
    "448": {
      "name": "PartyID",
      "type": "String",
      "description": "Party identifier value"
    },
    "452": {
      "name": "PartyRole",
      "type": "Int",
      "enum": "PartyRole",
      "description": "Party role"
    },
    "453": {
      "name": "NoPartyIDs",
      "type": "NumInGroup",
      "description": "Number of party block entries"
    },
    "460": {
      "name": "Product",
      "type": "Int",
      "enum": "Product",
      "description": "Asset class"
    },
    "523": {
      "name": "PartySubID",
      "type": "String",
      "description": "Sub-identifier for the party"
    },
    "537": {
      "name": "QuoteType",
      "type": "Int",
      "enum": "QuoteType",
      "description": "Quote type"
    },
    "559": {
      "name": "SecurityListRequestType",
      "type": "Int",
      "enum": "SecurityListRequestType",
      "description": "Security list request scope"
    },
    "560": {
      "name": "SecurityRequestResult",
      "type": "Int",
      "enum": "SecurityRequestResult",
      "description": "Security list response type"
    },
    "640": {
      "name": "Price2",
      "type": "Price",
      "description": "Dealer-only tiered price"
    },
    "645": {
      "name": "MktBidPx",
      "type": "Price",
      "description": "Dealer-only tiered bid price; zero for non-dealer orders"
    },
    "646": {
      "name": "MktOfferPx",
      "type": "Price",
      "description": "Dealer-only tiered offer price; zero for non-dealer orders"
    },
    "693": {
      "name": "QuoteRespID",
      "type": "String",
      "description": "OpenYield's identifier for quote response"
    },
    "694": {
      "name": "QuoteRespType",
      "type": "Int",
      "enum": "QuoteRespType",
      "description": "Quote response type"
    },
    "695": {
      "name": "QuoteQualifier",
      "type": "Char",
      "enum": "QuoteQualifier",
      "description": "Quote qualifier"
    },
    "699": {
      "name": "BenchmarkSecurityID",
      "type": "String",
      "description": "Security ID of the benchmark used for Spread (218)"
    },
    "735": {
      "name": "NoQuoteQualifiers",
      "type": "NumInGroup",
      "description": "Number of quote qualifier entries"
    },
    "761": {
      "name": "BenchmarkSecurityIDSource",
      "type": "String",
      "enum": "SecurityIDSource",
      "description": "Source of BenchmarkSecurityID (699)"
    },
    "803": {
      "name": "PartySubIDType",
      "type": "Int",
      "enum": "PartySubIDType",
      "description": "Type of PartySubID value"
    },
    "811": {
      "name": "PriceDelta",
      "type": "Float",
      "description": "Yield to maturity associated with the market data price"
    },
    "232": {
      "name": "NoStipulations",
      "type": "NumInGroup",
      "description": "Number of Minima stipulations in the repeating group"
    },
    "233": {
      "name": "StipulationType",
      "type": "String",
      "enum": "StipulationType",
      "description": "Minima stipulation type: MINQTY (Minimum Quantity), MININCR (Minimum Increment), or MINDNOM (Minimum Balance Remaining)"
    },
    "234": {
      "name": "StipulationValue",
      "type": "String",
      "description": "Numeric value for the stipulation"
    }
  },
  "fieldGroups": {
    "PartyBlock-Inbound": {
      "description": "Party block sent by subscribers on orders, quotes, and RFO requests. Identifies the trading party and optional sub-accounts.",
      "repeatingGroup": {
        "countTag": 453,
        "countName": "NoPartyIDs",
        "required": "Y"
      },
      "fields": [
        {
          "tag": 448,
          "required": "Y"
        },
        {
          "tag": 452,
          "required": "Y",
          "notes": "Role of this party entry"
        }
      ],
      "roles": [
        {
          "role": 3,
          "name": "Client ID",
          "required": "Y",
          "notes": "Your assigned counterparty code (not MPID)"
        },
        {
          "role": 4,
          "name": "Clearing Firm",
          "required": "Y/O",
          "notes": "Your MPID shown to contra firms. Optional if OpenYield can determine it via rules; required if you have multiple MPIDs or are configured to send it."
        },
        {
          "role": 5,
          "name": "Investor ID",
          "required": "O",
          "notes": "Account / sub-account code, if the subscriber is configured for sub-accounts"
        },
        {
          "role": 24,
          "name": "Customer Code",
          "required": "Y/O",
          "notes": "Pass-through tag; OpenYield returns this unchanged on all responses. Use for internal codes, strategy, algo, desk, portfolio, etc."
        },
        {
          "role": 11,
          "name": "Order Origination Trader",
          "required": "Y/O",
          "notes": "Obfuscated trader code for GUI users. OpenYield reflects it on all responses."
        }
      ],
      "notes": "Optionally add a PartySubID block (802/523/803) under role 4 if the subscriber has multiple accounts at the same DTCC clearing firm (set PartySubIDType 803=10, PartySubID 523=clearing account code)."
    },
    "PartyBlock-Fill": {
      "description": "Party block returned by OpenYield on fill execution reports (ExecType=F). Includes contra-party settlement information.",
      "repeatingGroup": {
        "countTag": 453,
        "countName": "NoPartyIDs",
        "required": "Y"
      },
      "fields": [
        {
          "tag": 448,
          "required": "Y"
        },
        {
          "tag": 452,
          "required": "Y",
          "notes": "Role of this party entry"
        }
      ],
      "roles": [
        {
          "role": 3,
          "name": "Client ID",
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "role": 4,
          "name": "Clearing Firm",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 5,
          "name": "Investor ID",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 24,
          "name": "Customer Code",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 11,
          "name": "Order Origination Trader",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 17,
          "name": "Contra Firm",
          "required": "Y",
          "notes": "Bilateral: MPID of settlement counterparty. Intermediated: OpenYield's MPID"
        },
        {
          "role": 18,
          "name": "Contra Clearing Firm",
          "required": "O",
          "notes": "Bilateral: DTCC participant number of the contra clearing firm. Intermediated: OpenYield's clearing DTCC code"
        },
        {
          "role": 1,
          "name": "Executing Firm",
          "required": "Y",
          "notes": "OpenYield MPID"
        }
      ]
    },
    "PartyBlock-Execution": {
      "description": "Party block returned by OpenYield on non-fill execution reports.",
      "repeatingGroup": {
        "countTag": 453,
        "countName": "NoPartyIDs",
        "required": "Y"
      },
      "fields": [
        {
          "tag": 448,
          "required": "Y"
        },
        {
          "tag": 452,
          "required": "Y",
          "notes": "Role of this party entry"
        }
      ],
      "roles": [
        {
          "role": 3,
          "name": "Client ID",
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "role": 4,
          "name": "Clearing Firm",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 5,
          "name": "Investor ID",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 24,
          "name": "Customer Code",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 11,
          "name": "Order Origination Trader",
          "required": "O",
          "notes": "Matches order"
        },
        {
          "role": 1,
          "name": "Executing Firm",
          "required": "Y",
          "notes": "OpenYield MPID"
        }
      ]
    },
    "SecurityBlock": {
      "description": "The security being traded.",
      "fields": [
        {
          "tag": 55,
          "required": "Y",
          "notes": "Same value as SecurityID (48)"
        },
        {
          "tag": 48,
          "required": "Y",
          "notes": "Security identifier (ISIN, CUSIP, or FIGI per configuration)"
        },
        {
          "tag": 22,
          "required": "Y"
        },
        {
          "tag": 460,
          "required": "Y/O",
          "notes": "Required on OpenYield responses; optional on subscriber messages."
        }
      ]
    },
    "FeeBlock": {
      "description": "Fee disclosure block included on fill execution reports. OpenYield discloses all applicable fees.",
      "repeatingGroup": {
        "countTag": 136,
        "countName": "NoMiscFees",
        "required": "C"
      },
      "fields": [
        {
          "tag": 137,
          "required": "O"
        },
        {
          "tag": 139,
          "required": "O"
        }
      ],
      "notes": "The entire fee block is optional. Individual fee entries are included only when applicable. For bilateral trades billed in arrears, this block may be absent."
    },
    "MDEntryGroup": {
      "description": "Repeating market data entry group used in both snapshot and incremental refresh messages.",
      "repeatingGroup": {
        "countTag": 268,
        "countName": "NoMDEntries",
        "required": "Y",
        "notes": "Snapshot (35=W): number of Bid and/or Offer entries. Incremental (35=X): number of update entries, up to 10."
      },
      "fields": [
        {
          "tag": 279,
          "required": "Y",
          "context": "IncrementalOnly",
          "notes": "Only in 35=X incremental messages."
        },
        {
          "tag": 269,
          "required": "Y"
        },
        {
          "tag": 55,
          "required": "O",
          "notes": "Same value as SecurityID (48)"
        },
        {
          "tag": 48,
          "required": "Y",
          "notes": "Security identifier (ISIN, CUSIP, or FIGI per configuration)"
        },
        {
          "tag": 22,
          "required": "Y"
        },
        {
          "tag": 460,
          "required": "Y"
        },
        {
          "tag": 270,
          "required": "Y",
          "notes": "Price; zero on Delete"
        },
        {
          "tag": 271,
          "required": "Y",
          "notes": "Size in bonds; zero on Delete"
        },
        {
          "tag": 299,
          "required": "Y",
          "context": "SnapshotOnly",
          "notes": "Initiates the MDEntryID series used in subsequent incremental messages. Only in 35=W snapshot."
        },
        {
          "tag": 278,
          "required": "Y",
          "context": "IncrementalOnly",
          "notes": "Unique entry ID referenced to update or delete a previous entry. Only in 35=X incremental."
        },
        {
          "tag": 811,
          "required": "O",
          "notes": "Yield to maturity; zero on Delete"
        },
        {
          "tag": 288,
          "required": "O",
          "context": "TradeOnly",
          "notes": "'Taker' or 'Maker'. Set only for MDEntryType=2 (Trade)."
        },
        {
          "tag": 289,
          "required": "O",
          "context": "TradeOnly",
          "notes": "Opposite of MDEntryBuyer. Set only for MDEntryType=2 (Trade)."
        }
      ]
    },
    "IOIQualifiersGroup": {
      "description": "Optional qualifier block on IOI messages indicating special order characteristics.",
      "repeatingGroup": {
        "countTag": 199,
        "countName": "NoIOIQualifiers",
        "required": "O"
      },
      "fields": [
        {
          "tag": 104,
          "required": "O"
        }
      ]
    },
    "QuoteQualifiersGroup": {
      "description": "Optional qualifier block on Quote messages indicating AllOrNone condition.",
      "repeatingGroup": {
        "countTag": 735,
        "countName": "NoQuoteQualifiers",
        "required": "O"
      },
      "fields": [
        {
          "tag": 695,
          "required": "O"
        }
      ]
    },
    "ExecutionReportCore": {
      "description": "Fields common to all order execution reports: ExecType discriminator and optional Yield.",
      "fields": [
        {
          "tag": 150,
          "required": "Y"
        },
        {
          "tag": 236,
          "required": "O",
          "notes": "Set for fixed- and zero-coupon bonds"
        }
      ]
    },
    "StipulationsBlock": {
      "description": "Optional Minima constraints on a resting order or quote. When present, restricts the quantities a taker may fill against this maker order. Encoded as a FIX stipulations repeating group.",
      "optional": true,
      "repeatingGroup": {
        "countTag": 232,
        "countName": "NoStipulations",
        "required": "O"
      },
      "fields": [
        {
          "tag": 233,
          "required": "Y",
          "notes": "MINQTY, MININCR, or MINDNOM"
        },
        {
          "tag": 234,
          "required": "Y",
          "notes": "Numeric value for the stipulation"
        }
      ]
    }
  },
  "sessions": {
    "MD": {
      "name": "Market Data",
      "suffix": "-MD",
      "description": "Streams top-of-book bid/offer, daily high/low, index delta, and real-time trade prints. Sequence numbers reset on each reconnect; no resend supported.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "messages": [
        "MarketDataSnapshot",
        "MarketDataIncrement",
        "Logon",
        "Logout",
        "Heartbeat",
        "TestRequest"
      ]
    },
    "OB": {
      "name": "Order Book",
      "suffix": "-OB",
      "description": "Streams the full depth order book as IOI messages. Sequence numbers reset on each reconnect; no snapshot or resend supported.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "messages": [
        "IOI",
        "Logon",
        "Logout",
        "Heartbeat",
        "TestRequest"
      ]
    },
    "TR": {
      "name": "Trading",
      "suffix": "-TR",
      "description": "Primary trading session for orders, quotes, executions, and session state. Sequences reset daily; missed messages retransmitted same day.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "messages": [
        "NewOrderSingle",
        "OrderCancelReplaceRequest",
        "OrderCancelRequest",
        "Quote",
        "QuoteCancel",
        "OrderAccepted",
        "OrderReplaced",
        "OrderCanceled",
        "OrderRejected",
        "OrderPartiallyFilled",
        "OrderFilled",
        "OrderPartialCanceled",
        "QuoteAccepted",
        "QuoteCanceled",
        "QuoteRejected",
        "FillCancel",
        "FillCorrection",
        "TradingSessionStatus",
        "SecurityListRequest",
        "SecurityList",
        "Logon",
        "Logout",
        "Heartbeat",
        "TestRequest",
        "ResendRequest",
        "Reject",
        "BusinessMessageReject"
      ]
    },
    "DC": {
      "name": "Drop Copy",
      "suffix": "-DC",
      "description": "Secondary delivery of fill execution reports (partial fills and complete fills), plus post-trade fill cancels and fill corrections. Sequences reset daily.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "messages": [
        "DropCopyFill",
        "FillCancel",
        "FillCorrection",
        "Logon",
        "Logout",
        "Heartbeat",
        "TestRequest",
        "ResendRequest",
        "Reject"
      ]
    },
    "RQ": {
      "name": "Request Quote",
      "suffix": "-RQ",
      "description": "RFO (Request for Order) session for initiating requests, responding with quotes, and receiving executions. Both initiators and responders use this session.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "messages": [
        "QuoteRequest",
        "Quote",
        "QuoteResponse",
        "RFOPendingNew",
        "OrderAccepted",
        "OrderFilled",
        "OrderCanceled",
        "QuoteAccepted",
        "QuoteRejected",
        "QuoteCanceled",
        "Logon",
        "Logout",
        "Heartbeat",
        "TestRequest",
        "ResendRequest",
        "Reject",
        "BusinessMessageReject"
      ]
    }
  },
  "messages": {
    "Logon": {
      "msgType": "A",
      "name": "Logon",
      "description": "Initiates a FIX session. Subscriber logs on; OpenYield responds.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["MD", "OB", "TR", "DC", "RQ"],
      "fields": [
        {
          "tag": 98,
          "required": "Y"
        },
        {
          "tag": 108,
          "required": "Y",
          "notes": "Heartbeat interval in seconds; default 30"
        },
        {
          "tag": 141,
          "required": "O",
          "notes": "Y to reset sequence numbers; used on MD and OB sessions"
        }
      ],
      "workflowHidden": true
    },
    "Logout": {
      "msgType": "5",
      "name": "Logout",
      "description": "Terminates the FIX session gracefully.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["MD", "OB", "TR", "DC", "RQ"],
      "fields": [
        {
          "tag": 58,
          "required": "O",
          "notes": "Optional reason for logout"
        }
      ],
      "workflowHidden": true
    },
    "Heartbeat": {
      "msgType": "0",
      "name": "Heartbeat",
      "description": "Sent by both sides to confirm the connection is alive. Also sent in response to a TestRequest.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["MD", "OB", "TR", "DC", "RQ"],
      "fields": [
        {
          "tag": 112,
          "required": "O",
          "notes": "Echoed from a TestRequest; included only when responding to a test"
        }
      ],
      "workflowHidden": true
    },
    "TestRequest": {
      "msgType": "1",
      "name": "TestRequest",
      "description": "Sent by OpenYield when no traffic is detected. Subscriber must respond with a Heartbeat containing the same TestReqID.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["MD", "OB", "TR", "DC", "RQ"],
      "fields": [
        {
          "tag": 112,
          "required": "Y",
          "notes": "Must be echoed in the Heartbeat reply"
        }
      ],
      "workflowHidden": true
    },
    "ResendRequest": {
      "msgType": "2",
      "name": "ResendRequest",
      "description": "Sent on reconnection if sequence numbers do not match. MD and OB sessions ignore this; TR, RQ and DC will retransmit missing messages.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["TR", "DC", "RQ"],
      "fields": [
        {
          "tag": 7,
          "required": "Y",
          "notes": "First sequence number to retransmit"
        },
        {
          "tag": 16,
          "required": "Y",
          "notes": "Last sequence number; 0 means retransmit to current"
        }
      ]
    },
    "Reject": {
      "msgType": "3",
      "name": "Reject",
      "description": "Session-level reject, sent when a message breaks the FIX session rules. Should never appear in production.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["TR", "MD", "OB", "RQ", "DC"],
      "fields": [
        {
          "tag": 45,
          "required": "Y",
          "notes": "Sequence number of the rejected message"
        },
        {
          "tag": 371,
          "required": "O",
          "notes": "Tag that caused the reject, where known"
        },
        {
          "tag": 372,
          "required": "O"
        },
        {
          "tag": 373,
          "required": "O"
        },
        {
          "tag": 58,
          "required": "O",
          "notes": "Description of the error"
        }
      ],
      "workflowHidden": true
    },
    "BusinessMessageReject": {
      "msgType": "j",
      "name": "BusinessMessageReject",
      "description": "Application-level reject, sent when a message passes the session rules but cannot be processed and has no reject of its own. Logged by OpenYield, which never rejects one it receives. High volume may be treated as a DoS.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["TR", "MD", "OB", "RQ", "DC"],
      "fields": [
        {
          "tag": 45,
          "required": "O",
          "notes": "Sequence number of the rejected message. Always sent by OpenYield"
        },
        {
          "tag": 372,
          "required": "Y"
        },
        {
          "tag": 380,
          "required": "Y"
        },
        {
          "tag": 58,
          "required": "O"
        }
      ],
      "workflowHidden": true
    },
    "TradingSessionStatus": {
      "msgType": "h",
      "name": "TradingSessionStatus",
      "description": "Sent by OpenYield on session logon and on every marketplace state change (Halted, Closed, Pre-Open, Open).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR"],
      "fields": [
        {
          "tag": 336,
          "required": "Y",
          "notes": "Always 'Marketplace'"
        },
        {
          "tag": 340,
          "required": "Y"
        },
        {
          "tag": 341,
          "required": "O",
          "notes": "UTC time when Pre-Open begins"
        },
        {
          "tag": 342,
          "required": "O",
          "notes": "UTC time when marketplace opens"
        },
        {
          "tag": 344,
          "required": "O",
          "notes": "UTC time when marketplace closes"
        }
      ]
    },
    "SecurityListRequest": {
      "msgType": "x",
      "name": "SecurityListRequest",
      "description": "Requests the list of tradable securities. Use in test environments only.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR"],
      "fields": [
        {
          "tag": 320,
          "required": "Y",
          "notes": "Client-assigned request ID"
        },
        {
          "tag": 559,
          "required": "Y"
        }
      ]
    },
    "SecurityList": {
      "msgType": "y",
      "name": "SecurityList",
      "description": "Response to SecurityListRequest. OpenYield sends multiple responses, each containing up to 10 securities.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR"],
      "fields": [
        {
          "tag": 320,
          "required": "Y",
          "notes": "Echoes the request ID"
        },
        {
          "tag": 322,
          "required": "Y",
          "notes": "OpenYield internal response ID"
        },
        {
          "tag": 560,
          "required": "Y"
        },
        {
          "tag": 393,
          "required": "Y",
          "notes": "Total securities across all SecurityList messages"
        },
        {
          "tag": 146,
          "required": "Y",
          "notes": "Number of securities in this message (up to 10)"
        }
      ],
      "fieldGroups": ["SecurityBlock"]
    },
    "MarketDataSnapshot": {
      "msgType": "W",
      "name": "MarketDataSnapshotFullRefresh",
      "description": "Full snapshot of top-of-book data for a single security. Sent on MD session connect, one message per security with a bid or offer.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["MD"],
      "fieldGroups": ["MDEntryGroup", "SecurityBlock"],
      "fields": [],
      "notes": "Each message references a single security. MDEntryType values in snapshot: 0=Bid, 1=Offer. Uses QuoteEntryID (299) instead of MDEntryID (278)."
    },
    "MarketDataIncrement": {
      "msgType": "X",
      "name": "MarketDataIncrementalRefresh",
      "description": "Incremental market data updates. Each message may contain up to 10 entries across different securities.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["MD"],
      "fieldGroups": ["MDEntryGroup"],
      "fields": [],
      "notes": "Uses MDEntryID (278) to reference snapshot entries."
    },
    "IOI": {
      "msgType": "6",
      "name": "IOI",
      "description": "Order book entry sent on the OB session. Represents a single resting order or quote. OpenYield sends a Replace or Cancel when the price or size changes.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["OB"],
      "fieldGroups": ["IOIQualifiersGroup", "SecurityBlock", "StipulationsBlock"],
      "fields": [
        {
          "tag": 23,
          "required": "Y",
          "notes": "OpenYield's unique IOI identifier"
        },
        {
          "tag": 28,
          "required": "Y"
        },
        {
          "tag": 26,
          "required": "O",
          "notes": "IOI ID repeated in Cancel and Replace messages"
        },
        {
          "tag": 54,
          "required": "Y"
        },
        {
          "tag": 27,
          "required": "Y",
          "notes": "Quantity in configured units (bonds by default); zero on Cancel"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Price level; zero on Cancel"
        },
        {
          "tag": 25,
          "required": "Y"
        },
        {
          "tag": 236,
          "required": "O",
          "notes": "Yield; zero on Cancel"
        },
        {
          "tag": 218,
          "required": "O",
          "notes": "Spread, when available"
        },
        {
          "tag": 699,
          "required": "O",
          "notes": "Security ID of the benchmark for Spread (218)"
        },
        {
          "tag": 761,
          "required": "O",
          "notes": "Source of BenchmarkSecurityID (699)"
        }
      ]
    },
    "NewOrderSingle": {
      "msgType": "D",
      "name": "NewOrderSingle",
      "description": "Subscriber sends a new order to OpenYield.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR"],
      "fieldGroups": ["PartyBlock-Inbound", "SecurityBlock", "StipulationsBlock"],
      "fields": [
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber order ID"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "G (AllOrNone) or Z (Single Fill or Cancel). Mutually exclusive. If set, TimeInForce is ignored."
        },
        {
          "tag": 54,
          "required": "Y"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time the order was submitted"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Quantity in configured units (bonds by default)"
        },
        {
          "tag": 40,
          "required": "Y"
        },
        {
          "tag": 423,
          "required": "O"
        },
        {
          "tag": 44,
          "required": "C",
          "notes": "Required for Limit orders; ignored for Market orders"
        },
        {
          "tag": 59,
          "required": "O",
          "notes": "Default: Day (Limit), IOC (Market). Ignored if ExecInst is set."
        },
        {
          "tag": 640,
          "required": "O",
          "notes": "Dealer only: tiered price visible to other dealers"
        }
      ]
    },
    "OrderCancelReplaceRequest": {
      "msgType": "G",
      "name": "OrderCancelReplaceRequest",
      "description": "Replaces an existing Limit Order. Only quantity and price may change.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR"],
      "fieldGroups": ["PartyBlock-Inbound", "SecurityBlock"],
      "fields": [
        {
          "tag": 41,
          "required": "Y",
          "notes": "ClOrdID of the order being replaced"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "New subscriber order ID for this replacement"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Must match original"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Must match original"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of the replacement request"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "New quantity"
        },
        {
          "tag": 40,
          "required": "Y",
          "notes": "Must match original"
        },
        {
          "tag": 423,
          "required": "O"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "New price"
        },
        {
          "tag": 59,
          "required": "O",
          "notes": "Must match original"
        },
        {
          "tag": 640,
          "required": "O",
          "notes": "Dealer only: new tiered price"
        }
      ]
    },
    "OrderCancelRequest": {
      "msgType": "F",
      "name": "OrderCancelRequest",
      "description": "Cancels an existing Market or Limit Order. OrderQty must be set to 0.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR"],
      "fieldGroups": ["PartyBlock-Inbound", "SecurityBlock"],
      "fields": [
        {
          "tag": 41,
          "required": "Y",
          "notes": "ClOrdID of the order being canceled"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber order ID for this cancel"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Must match original"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of the cancel request"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Must be 0"
        }
      ]
    },
    "Quote": {
      "msgType": "S",
      "name": "Quote",
      "description": "Fixed income-style passive order (maker).",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR", "RQ"],
      "fieldGroups": [
        "PartyBlock-Inbound",
        "QuoteQualifiersGroup",
        "SecurityBlock",
        "StipulationsBlock"
      ],
      "conditionalGroups": {
        "bid": "Required when Side=Buy (1): BidPx (132) and BidSize (134) must both be set",
        "offer": "Required when Side=Sell (2): OfferPx (133) and OfferSize (135) must both be set"
      },
      "fields": [
        {
          "tag": 131,
          "required": "O",
          "notes": "RFO session only: the QuoteReqID being responded to"
        },
        {
          "tag": 117,
          "required": "Y",
          "notes": "Unique quote ID; same ID used for updates and cancels"
        },
        {
          "tag": 537,
          "required": "O"
        },
        {
          "tag": 301,
          "required": "O"
        },
        {
          "tag": 54,
          "required": "Y"
        },
        {
          "tag": 132,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Price when Side=Buy; zero otherwise"
        },
        {
          "tag": 133,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Price when Side=Sell; zero otherwise"
        },
        {
          "tag": 645,
          "required": "O",
          "notes": "Dealer only: tiered bid price"
        },
        {
          "tag": 646,
          "required": "O",
          "notes": "Dealer only: tiered offer price"
        },
        {
          "tag": 134,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Quantity in bonds when Side=Buy; zero otherwise"
        },
        {
          "tag": 135,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Quantity in bonds when Side=Sell; zero otherwise"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time the quote was submitted"
        }
      ]
    },
    "QuoteRequest": {
      "msgType": "R",
      "name": "QuoteRequest",
      "description": "Sent by an initiator to start, update, or cancel an RFO (Request for Order); OpenYield forwards a sanitized copy to eligible responders.",
      "direction": {
        "source": "both",
        "target": "both"
      },
      "sessions": ["RQ"],
      "fieldGroups": ["PartyBlock-Inbound", "SecurityBlock"],
      "fields": [
        {
          "tag": 131,
          "required": "Y",
          "notes": "Unique request ID. Reuse same ID for updates and cancels."
        },
        {
          "tag": 146,
          "required": "Y",
          "notes": "Must be 1"
        },
        {
          "tag": 537,
          "required": "O",
          "notes": "Defaults to Tradeable."
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Your intent: Buy = request offers (OWIC); Sell = request bids (BWIC)."
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Quantity in configured units (bonds by default). Set to 0 to cancel."
        },
        {
          "tag": 63,
          "required": "O",
          "notes": "Responder-received only: Regular (0) for T+1, Future dated (6) when settlement is later"
        },
        {
          "tag": 64,
          "required": "O",
          "notes": "Responder-received only: settlement date (YYYYMMDD) any resulting trade will carry"
        },
        {
          "tag": 62,
          "required": "O",
          "notes": "Responder-received only: end of collection window"
        },
        {
          "tag": 126,
          "required": "O",
          "notes": "Responder-received only: end of firm window"
        },
        {
          "tag": 423,
          "required": "O"
        },
        {
          "tag": 44,
          "required": "O",
          "notes": "Reserve price as a percentage of face value. When canceling (OrderQty=0), also set to 0."
        }
      ],
      "notes": "Fields 62 (ValidUntilTime), 126 (ExpireTime), 63 (SettlType) and 64 (SettlDate) may be set by the initiator but are ignored. Reserve price (44) and initiator details are stripped before forwarding to responders."
    },
    "QuoteResponse": {
      "msgType": "AJ",
      "name": "QuoteResponse",
      "description": "Traditional RFQ special case only. Initiator accepts a forwarded quote by sending Hit/Lift. OpenYield converts this into a contra limit order on the marketplace.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["RQ"],
      "fieldGroups": ["PartyBlock-Inbound", "SecurityBlock"],
      "fields": [
        {
          "tag": 117,
          "required": "Y",
          "notes": "Quote ID from the forwarded Quote message being accepted"
        },
        {
          "tag": 694,
          "required": "Y"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of acceptance"
        },
        {
          "tag": 131,
          "required": "Y",
          "notes": "The original RFO request ID"
        }
      ],
      "notes": "Available to specially configured subscribers only. Execution happens at the top of book up to the accepted price, not necessarily at the quoted price."
    },
    "QuoteCancel": {
      "msgType": "Z",
      "name": "QuoteCancel",
      "description": "Emergency Cancel All — the \"Big Red Button\". Pulls all of the subscriber's resting orders and quotes (all traders, all customers), optionally scoped to a Client ID or Investor ID via the party block. Warning: sending this during market hours deactivates your access; reactivation is manual.",
      "direction": {
        "source": "Subscriber",
        "target": "OpenYield"
      },
      "sessions": ["TR"],
      "fieldGroups": ["PartyBlock-Inbound"],
      "fields": [
        {
          "tag": 117,
          "required": "Y",
          "notes": "Subscriber-assigned ID for this cancel-all request"
        },
        {
          "tag": 298,
          "required": "Y"
        }
      ],
      "notes": "Party block is optional. Omit to cancel all orders on this connection. Set 452=3 (ClientID) to scope to a counterparty. Set 452=3 and 452=5 (InvestorID) to scope to a specific investor."
    }
  },
  "messageVariants": {
    "OrderAccepted": {
      "msgType": "8",
      "description": "Order accepted onto the marketplace. Sent for new orders (ExecType=0, OrdStatus=0) and in the RFO flow when the staged request is placed on the market (OrdStatus=0 after prior PendingNew).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "0",
        "150": "0"
      },
      "fieldGroups": [
        "PartyBlock-Execution",
        "SecurityBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's internal order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Echoes the subscriber order ID"
        },
        {
          "tag": 41,
          "required": "O",
          "notes": "Set if the original order had one"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Order quantity remaining"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Zero — no fills yet"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Zero — no fills yet"
        }
      ]
    },
    "OrderReplaced": {
      "msgType": "8",
      "description": "Order has been updated (price or quantity changed) and is resting on the marketplace.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "5",
        "150": "5"
      },
      "fieldGroups": [
        "PartyBlock-Execution",
        "SecurityBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "New ClOrdID of the replacement order"
        },
        {
          "tag": 41,
          "required": "Y",
          "notes": "ClOrdID of the order being replaced"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "New order quantity"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "New order price"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity after replacement"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Quantity filled so far (may be non-zero if partially filled before replace)"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Average fill price (zero if no fills)"
        },
        {
          "tag": 381,
          "required": "O",
          "notes": "Principal cash if partially filled"
        },
        {
          "tag": 157,
          "required": "O",
          "notes": "Days of accrued interest, if partially filled"
        },
        {
          "tag": 159,
          "required": "O",
          "notes": "Accrued interest, if partially filled"
        },
        {
          "tag": 118,
          "required": "O",
          "notes": "Settlement cash if partially filled"
        }
      ]
    },
    "OrderCanceled": {
      "msgType": "8",
      "description": "Order (with no fills) has been canceled — either by subscriber request or by OpenYield (e.g. disconnect, end-of-day). ExecType=4, OrdStatus=4.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "4",
        "150": "4"
      },
      "fieldGroups": [
        "PartyBlock-Execution",
        "SecurityBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "ClOrdID of the order being canceled"
        },
        {
          "tag": 41,
          "required": "O",
          "notes": "Original order ClOrdID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "0 on cancel request"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "0 — no fills"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Zero"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of cancellation"
        }
      ]
    },
    "OrderRejected": {
      "msgType": "8",
      "description": "Order failed validation or compliance checks and was not placed on the marketplace. ExecType=8.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "150": "8"
      },
      "fieldGroups": [
        "PartyBlock-Execution",
        "SecurityBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "Set to 0 on rejection"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber order ID"
        },
        {
          "tag": 41,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 39,
          "required": "Y",
          "notes": "Current status at time of rejection"
        },
        {
          "tag": 103,
          "required": "Y"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "Zero"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Zero"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Zero"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of rejection"
        },
        {
          "tag": 58,
          "required": "Y",
          "notes": "Human-readable rejection reason"
        }
      ]
    },
    "OrderPartiallyFilled": {
      "msgType": "8",
      "description": "An order matched and a fill occurred, but quantity remains open on the order. ExecType=F (Trade), OrdStatus=1 (Partially Filled).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "1",
        "150": "F"
      },
      "fieldGroups": [
        "PartyBlock-Fill",
        "SecurityBlock",
        "FeeBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber order ID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's fill ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 63,
          "required": "Y"
        },
        {
          "tag": 64,
          "required": "Y",
          "notes": "Settlement date YYYYMMDD"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order (regular or tiered)"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "This fill quantity"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "This fill price"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity after this fill"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Cumulative filled quantity"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Average fill price so far"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time the fill was booked"
        },
        {
          "tag": 381,
          "required": "Y",
          "notes": "Principal cash for this fill"
        },
        {
          "tag": 157,
          "required": "Y",
          "notes": "Number of days of accrued interest for this fill"
        },
        {
          "tag": 159,
          "required": "Y",
          "notes": "Accrued interest dollar amount"
        },
        {
          "tag": 118,
          "required": "Y",
          "notes": "Settlement cash amount for this fill"
        }
      ]
    },
    "OrderFilled": {
      "msgType": "8",
      "description": "The final fill that completes an order (either a single match or the last of several fills). ExecType=F (Trade), OrdStatus=2 (Filled). This is the final message for the order.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "2",
        "150": "F"
      },
      "fieldGroups": [
        "PartyBlock-Fill",
        "SecurityBlock",
        "FeeBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber order ID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's fill ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 63,
          "required": "Y"
        },
        {
          "tag": 64,
          "required": "Y",
          "notes": "Settlement date YYYYMMDD"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "Final fill quantity"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "Final fill price"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Full order quantity"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Average fill price for the trade"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time the fill was booked"
        },
        {
          "tag": 381,
          "required": "Y",
          "notes": "Principal cash for this trade"
        },
        {
          "tag": 157,
          "required": "Y",
          "notes": "Number of days of accrued interest for this trade"
        },
        {
          "tag": 159,
          "required": "Y",
          "notes": "Accrued interest dollar amount"
        },
        {
          "tag": 118,
          "required": "Y",
          "notes": "Settlement cash amount for this trade"
        }
      ]
    },
    "OrderPartialCanceled": {
      "msgType": "8",
      "description": "A partially filled order has been canceled by the subscriber, or a Market Order exhausted available liquidity. Some quantity was executed (CumQty > 0); the remainder is canceled. ExecType=4, OrdStatus=4. This is the final message for the order.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "39": "4",
        "150": "4"
      },
      "fieldGroups": [
        "PartyBlock-Execution",
        "SecurityBlock",
        "ExecutionReportCore",
        "StipulationsBlock"
      ],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "ClOrdID of the order being canceled"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 63,
          "required": "Y"
        },
        {
          "tag": 64,
          "required": "Y",
          "notes": "Settlement date YYYYMMDD"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 18,
          "required": "O",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "0"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "Final fill price (may be zero)"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "0 (canceled)"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Quantity filled before cancel"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Average price of fills before cancel"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of cancellation"
        },
        {
          "tag": 381,
          "required": "O",
          "notes": "Principal cash of fills so far"
        },
        {
          "tag": 157,
          "required": "O",
          "notes": "Days on filled portion"
        },
        {
          "tag": 159,
          "required": "O",
          "notes": "Accrued on filled portion"
        },
        {
          "tag": 118,
          "required": "O",
          "notes": "Settlement cash on filled portion"
        }
      ]
    },
    "RFOPendingNew": {
      "msgType": "8",
      "description": "Acknowledgment from OpenYield's staging engine that an RFO (QuoteRequest) has been received and is staged for placement during the collection window. ExecType=0, OrdStatus=A (PendingNew).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["RQ"],
      "discriminators": {
        "39": "A",
        "150": "0"
      },
      "fieldGroups": ["PartyBlock-Execution", "SecurityBlock", "StipulationsBlock"],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield staging order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "QuoteReqID from the QuoteRequest"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "OpenYield's response ID for this message"
        },
        {
          "tag": 150,
          "required": "Y"
        },
        {
          "tag": 39,
          "required": "Y",
          "notes": "Staged, not yet on market."
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches request"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches requested quantity"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "0 (reserve price withheld from market display)"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Full quantity"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Zero — no fills yet"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Zero"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time staged by OpenYield"
        },
        {
          "tag": 236,
          "required": "O",
          "notes": "Set for fixed- and zero-coupon bonds"
        }
      ],
      "notes": "After the collection window, OpenYield places the order on the marketplace and sends an OrderAccepted with OrdStatus=0."
    },
    "FillCancel": {
      "msgType": "8",
      "description": "Post-trade cancellation of a previously reported fill. ExecType=H (TradeCancel), OrdStatus=B (Calculated). ExecRefID (19) identifies the fill being canceled.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "DC"],
      "discriminators": {
        "39": "B",
        "150": "H"
      },
      "fieldGroups": ["PartyBlock-Execution", "SecurityBlock"],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber's order ID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "Execution ID for this cancel message"
        },
        {
          "tag": 19,
          "required": "Y",
          "notes": "ExecID of the fill being canceled"
        },
        {
          "tag": 150,
          "required": "Y"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "Quantity of the canceled fill"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "Price of the canceled fill"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity after cancel"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Updated cumulative filled quantity"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Updated average price"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of the post-trade cancel"
        }
      ]
    },
    "FillCorrection": {
      "msgType": "8",
      "description": "Post-trade correction of a previously reported fill (price or quantity amended). ExecType=G (TradeCorrect), OrdStatus=B (Calculated). ExecRefID (19) identifies the fill being corrected.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "DC"],
      "discriminators": {
        "39": "B",
        "150": "G"
      },
      "fieldGroups": ["PartyBlock-Fill", "SecurityBlock", "FeeBlock"],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber's order ID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "Execution ID for this correction"
        },
        {
          "tag": 19,
          "required": "Y",
          "notes": "ExecID of the fill being corrected"
        },
        {
          "tag": 150,
          "required": "Y"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 63,
          "required": "Y"
        },
        {
          "tag": 64,
          "required": "Y",
          "notes": "Settlement date YYYYMMDD"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches original"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "Corrected fill quantity"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "Corrected fill price"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Updated cumulative filled quantity"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Updated average price"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time of the post-trade correction"
        },
        {
          "tag": 381,
          "required": "Y",
          "notes": "Corrected principal cash"
        },
        {
          "tag": 157,
          "required": "Y",
          "notes": "Corrected number of days of accrued interest"
        },
        {
          "tag": 159,
          "required": "Y",
          "notes": "Corrected accrued interest"
        },
        {
          "tag": 118,
          "required": "Y",
          "notes": "Corrected settlement cash"
        }
      ]
    },
    "DropCopyFill": {
      "msgType": "8",
      "description": "Drop Copy delivery of a fill execution report (partial fill OrdStatus=1, or complete fill OrdStatus=2). Same content as the TR fill report. ExecType=F.",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["DC"],
      "discriminators": {
        "150": "F"
      },
      "fieldGroups": ["PartyBlock-Fill", "SecurityBlock", "FeeBlock"],
      "fields": [
        {
          "tag": 37,
          "required": "Y",
          "notes": "OpenYield's order ID"
        },
        {
          "tag": 11,
          "required": "Y",
          "notes": "Subscriber's order ID"
        },
        {
          "tag": 17,
          "required": "Y",
          "notes": "Same ExecID as the fill on the TR session"
        },
        {
          "tag": 150,
          "required": "Y"
        },
        {
          "tag": 39,
          "required": "Y"
        },
        {
          "tag": 63,
          "required": "Y"
        },
        {
          "tag": 64,
          "required": "Y",
          "notes": "Settlement date YYYYMMDD"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 38,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 44,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 59,
          "required": "Y",
          "notes": "Matches order"
        },
        {
          "tag": 32,
          "required": "Y",
          "notes": "Fill quantity"
        },
        {
          "tag": 31,
          "required": "Y",
          "notes": "Fill price"
        },
        {
          "tag": 151,
          "required": "Y",
          "notes": "Remaining quantity after fill"
        },
        {
          "tag": 14,
          "required": "Y",
          "notes": "Cumulative filled quantity"
        },
        {
          "tag": 6,
          "required": "Y",
          "notes": "Average fill price"
        },
        {
          "tag": 60,
          "required": "Y",
          "notes": "Time the fill was booked"
        },
        {
          "tag": 236,
          "required": "O",
          "notes": "Set for fixed- and zero-coupon bonds"
        },
        {
          "tag": 381,
          "required": "Y",
          "notes": "Principal cash for this fill"
        },
        {
          "tag": 157,
          "required": "Y",
          "notes": "Number of days of accrued interest for this fill"
        },
        {
          "tag": 159,
          "required": "Y",
          "notes": "Accrued interest dollar amount"
        },
        {
          "tag": 118,
          "required": "Y",
          "notes": "Settlement cash amount"
        }
      ]
    },
    "QuoteAccepted": {
      "msgType": "AI",
      "description": "OpenYield accepted a Quote (new or updated) and it is resting on the marketplace. QuoteStatus=0 (Accepted).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "297": "0"
      },
      "fieldGroups": ["PartyBlock-Execution", "SecurityBlock", "StipulationsBlock"],
      "conditionalGroups": {
        "bid": "Required when Side=Buy (1): BidSize (134) and BidPx (132) must both be set",
        "offer": "Required when Side=Sell (2): OfferSize (135) and OfferPx (133) must both be set"
      },
      "fields": [
        {
          "tag": 117,
          "required": "Y",
          "notes": "Subscriber's QuoteID"
        },
        {
          "tag": 693,
          "required": "Y",
          "notes": "OpenYield's identifier for this response"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches quote"
        },
        {
          "tag": 132,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Price if Side=Buy, matches quote"
        },
        {
          "tag": 133,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Price if Side=Sell, matches quote"
        },
        {
          "tag": 645,
          "required": "O",
          "notes": "Dealer tiered price if Side=Buy"
        },
        {
          "tag": 646,
          "required": "O",
          "notes": "Dealer tiered price if Side=Sell"
        },
        {
          "tag": 134,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Quantity if Side=Buy, matches quote"
        },
        {
          "tag": 135,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Quantity if Side=Sell, matches quote"
        },
        {
          "tag": 297,
          "required": "Y"
        }
      ]
    },
    "QuoteRejected": {
      "msgType": "AI",
      "description": "OpenYield rejected a Quote due to validation or compliance failure. QuoteStatus=5 (Rejected).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "297": "5"
      },
      "fieldGroups": ["PartyBlock-Execution", "SecurityBlock"],
      "conditionalGroups": {
        "bid": "Required when Side=Buy (1): BidSize (134) and BidPx (132) must both be set",
        "offer": "Required when Side=Sell (2): OfferSize (135) and OfferPx (133) must both be set"
      },
      "fields": [
        {
          "tag": 117,
          "required": "Y",
          "notes": "Subscriber's QuoteID"
        },
        {
          "tag": 693,
          "required": "Y",
          "notes": "OpenYield's identifier for this rejection"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches quote"
        },
        {
          "tag": 132,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Price if Side=Buy, matches quote"
        },
        {
          "tag": 133,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Price if Side=Sell, matches quote"
        },
        {
          "tag": 645,
          "required": "O",
          "notes": "Dealer tiered price if Side=Buy"
        },
        {
          "tag": 646,
          "required": "O",
          "notes": "Dealer tiered price if Side=Sell"
        },
        {
          "tag": 134,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Quantity if Side=Buy, matches quote"
        },
        {
          "tag": 135,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Quantity if Side=Sell, matches quote"
        },
        {
          "tag": 297,
          "required": "Y"
        },
        {
          "tag": 58,
          "required": "Y",
          "notes": "Human-readable rejection reason"
        }
      ]
    },
    "QuoteCanceled": {
      "msgType": "AI",
      "description": "Quote has been canceled (subscriber sent zero price and size). QuoteStatus=1 (Canceled for Symbol).",
      "direction": {
        "source": "OpenYield",
        "target": "Subscriber"
      },
      "sessions": ["TR", "RQ"],
      "discriminators": {
        "297": "1"
      },
      "fieldGroups": ["PartyBlock-Execution", "SecurityBlock"],
      "conditionalGroups": {
        "bid": "Required when Side=Buy (1): BidSize (134) and BidPx (132) must both be set",
        "offer": "Required when Side=Sell (2): OfferSize (135) and OfferPx (133) must both be set"
      },
      "fields": [
        {
          "tag": 117,
          "required": "Y",
          "notes": "Subscriber's QuoteID"
        },
        {
          "tag": 693,
          "required": "Y",
          "notes": "OpenYield's identifier for this cancellation"
        },
        {
          "tag": 54,
          "required": "Y",
          "notes": "Matches quote"
        },
        {
          "tag": 132,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Price if Side=Buy, matches quote"
        },
        {
          "tag": 133,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Price if Side=Sell, matches quote"
        },
        {
          "tag": 645,
          "required": "O",
          "notes": "Dealer tiered price if Side=Buy"
        },
        {
          "tag": 646,
          "required": "O",
          "notes": "Dealer tiered price if Side=Sell"
        },
        {
          "tag": 134,
          "required": "Y",
          "conditionalGroup": "bid",
          "notes": "Quantity if Side=Buy, matches quote"
        },
        {
          "tag": 135,
          "required": "Y",
          "conditionalGroup": "offer",
          "notes": "Quantity if Side=Sell, matches quote"
        },
        {
          "tag": 297,
          "required": "Y"
        }
      ]
    }
  },
  "workflows": {
    "MarketData": {
      "session": "MD",
      "steps": [
        {
          "step": "Subscriber connects and sends Logon",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield responds with Logon",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield sends full market snapshot",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "MarketDataSnapshot",
          "loop": "Per security"
        },
        {
          "step": "OpenYield streams incremental updates",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "MarketDataIncrement",
          "loop": "On change"
        }
      ]
    },
    "OrderBook": {
      "session": "OB",
      "steps": [
        {
          "step": "Subscriber connects and sends Logon",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield responds with Logon",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield streams IOI messages (new, replace, cancel)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "IOI",
          "loop": "On change"
        }
      ]
    },
    "OrderAndFill": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "NewOrderSingle"
        },
        {
          "step": "OpenYield accepts the order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "OpenYield sends partial fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled"
        }
      ]
    },
    "LimitOrderUpdate": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new limit order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "NewOrderSingle"
        },
        {
          "step": "OpenYield accepts the order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "Subscriber updates an order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "OrderCancelReplaceRequest"
        },
        {
          "step": "OpenYield confirms replacement",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderReplaced"
        }
      ]
    },
    "OrderAndCancelNoFills": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "NewOrderSingle"
        },
        {
          "step": "OpenYield accepts the order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "Subscriber sends cancel request",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "OrderCancelRequest"
        },
        {
          "step": "OpenYield confirms cancellation",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderCanceled"
        }
      ]
    },
    "OrderAndCancelPartiallyFilled": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "NewOrderSingle"
        },
        {
          "step": "OpenYield accepts the order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "OpenYield sends partial fill(s)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled"
        },
        {
          "step": "Subscriber sends cancel request",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "OrderCancelRequest"
        },
        {
          "step": "OpenYield confirms partial cancel",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartialCanceled"
        }
      ]
    },
    "OrderRejected": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new order",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "NewOrderSingle"
        },
        {
          "step": "OpenYield rejects the order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderRejected"
        }
      ]
    },
    "DirectMaker": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends new quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote"
        },
        {
          "step": "OpenYield accepts the quote",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted"
        },
        {
          "step": "Subscriber updates an existing quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote",
          "optional": true
        },
        {
          "step": "OpenYield accepts the updated quote",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted",
          "optional": true
        },
        {
          "step": "OpenYield sends fill(s) if quote is matched",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill on full execution",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        },
        {
          "step": "Subscriber cancels quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote",
          "optional": true
        },
        {
          "step": "OpenYield confirms cancel",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteCanceled",
          "optional": true
        }
      ]
    },
    "RFOInitiator": {
      "session": "RQ",
      "steps": [
        {
          "step": "Initiator sends RFO request",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "OpenYield stages the request (collection window)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "RFOPendingNew"
        },
        {
          "step": "Initiator updates the request",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest",
          "optional": true
        },
        {
          "step": "OpenYield acknowledges update",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "RFOPendingNew",
          "optional": true
        },
        {
          "step": "OpenYield places order with reserve on marketplace",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "OpenYield sends fill(s) if RFO crosses",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        },
        {
          "step": "Initiator cancels the RFO",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest",
          "optional": true
        },
        {
          "step": "OpenYield confirms cancellation",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderCanceled",
          "optional": true
        },
        {
          "step": "OpenYield auto-cancels at end of firm window",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderCanceled",
          "optional": true
        }
      ]
    },
    "RFORequestAndFill": {
      "session": "RQ",
      "steps": [
        {
          "step": "Initiator sends RFO",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "OpenYield acknowledges receipt",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "RFOPendingNew"
        },
        {
          "step": "OpenYield places order with reserve on marketplace",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "OpenYield sends partial fill(s)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        }
      ]
    },
    "RFORequestAndCancel": {
      "session": "RQ",
      "steps": [
        {
          "step": "Initiator sends RFO",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "OpenYield acknowledges receipt",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "RFOPendingNew"
        },
        {
          "step": "Initiator cancels the RFO",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "OpenYield acknowledges cancellation",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderCanceled"
        }
      ]
    },
    "RFOResponder": {
      "session": "RQ",
      "steps": [
        {
          "step": "OpenYield sends sanitized QuoteRequest",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "Responder submits a quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote"
        },
        {
          "step": "OpenYield accepts the quote",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted"
        },
        {
          "step": "Responder updates the quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote",
          "optional": true
        },
        {
          "step": "OpenYield confirms quote update",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted",
          "optional": true
        },
        {
          "step": "OpenYield sends fill if RFO crosses",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        },
        {
          "step": "Responder cancels quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote",
          "optional": true
        },
        {
          "step": "OpenYield confirms quote cancel",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteCanceled",
          "optional": true
        },
        {
          "step": "OpenYield auto-cancels quote at end of firm window",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteCanceled",
          "optional": true
        }
      ]
    },
    "RFORespondAndFill": {
      "session": "RQ",
      "steps": [
        {
          "step": "OpenYield sends a request",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "Responder submits a quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote"
        },
        {
          "step": "OpenYield acknowledges the quote",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted"
        },
        {
          "step": "Responder updates the quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote",
          "optional": true,
          "loop": "Update price"
        },
        {
          "step": "OpenYield acknowledges the update",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted",
          "optional": true
        },
        {
          "step": "OpenYield sends partial fill(s)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderPartiallyFilled",
          "optional": true
        },
        {
          "step": "OpenYield sends final fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        }
      ]
    },
    "RFORespondAndCancel": {
      "session": "RQ",
      "steps": [
        {
          "step": "OpenYield sends the request",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "Responder submits a quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote"
        },
        {
          "step": "OpenYield acknowledges the quote",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteAccepted"
        },
        {
          "step": "Responder cancels with a zero price and size quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Quote"
        },
        {
          "step": "OpenYield acknowledges the cancellation",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "QuoteCanceled"
        }
      ]
    },
    "RFOTraditionalRFQ": {
      "session": "RQ",
      "steps": [
        {
          "step": "Initiator sends RFO request",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteRequest"
        },
        {
          "step": "OpenYield stages the request (collection window)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "RFOPendingNew"
        },
        {
          "step": "OpenYield forwards sanitized quotes to initiator",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "Quote"
        },
        {
          "step": "Initiator accepts a quote",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteResponse"
        },
        {
          "step": "OpenYield places the acceptance as a limit order",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderAccepted"
        },
        {
          "step": "OpenYield sends fill (crosses at best available price)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderFilled",
          "optional": true
        }
      ]
    },
    "DropCopy": {
      "session": "DC",
      "steps": [
        {
          "step": "Subscriber connects and sends Logon",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield responds with Logon",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield delivers partial fill(s)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "DropCopyFill",
          "optional": true,
          "loop": "For each partial fill"
        },
        {
          "step": "OpenYield delivers complete fill",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "DropCopyFill"
        },
        {
          "step": "OpenYield delivers fill cancel (post-trade)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "FillCancel",
          "optional": true
        },
        {
          "step": "OpenYield delivers fill correction (post-trade)",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "FillCorrection",
          "optional": true
        }
      ]
    },
    "SessionState": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber connects and sends Logon",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield responds with Logon",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "Logon"
        },
        {
          "step": "OpenYield sends current session state",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "TradingSessionStatus"
        },
        {
          "step": "OpenYield sends updated session state",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "TradingSessionStatus",
          "optional": true,
          "loop": "On state change"
        }
      ]
    },
    "CancelAll": {
      "session": "TR",
      "steps": [
        {
          "step": "Subscriber sends QuoteCancel with Cancel All type",
          "direction": {
            "source": "Subscriber",
            "target": "OpenYield"
          },
          "message": "QuoteCancel"
        },
        {
          "step": "OpenYield cancels each resting order (one report per order) and deactivates access",
          "direction": {
            "source": "OpenYield",
            "target": "Subscriber"
          },
          "message": "OrderCanceled"
        }
      ]
    }
  },
  "messageToSlug": {
    "Logon": "all-sessions/logon-logoff",
    "Logout": "all-sessions/logon-logoff",
    "Heartbeat": "all-sessions/heartbeat",
    "TestRequest": "all-sessions/test-messages",
    "ResendRequest": "all-sessions/resend-request",
    "Reject": "all-sessions/reject",
    "BusinessMessageReject": "all-sessions/reject",
    "SecurityListRequest": "all-sessions/security-list",
    "SecurityList": "all-sessions/security-list",
    "TradingSessionStatus": "all-sessions/session-state",
    "MarketDataSnapshot": "fix-specification/md-market-data-feed/snapshot",
    "MarketDataIncrement": "fix-specification/md-market-data-feed/increment",
    "IOI": "fix-specification/ob-order-book-feed",
    "NewOrderSingle": "fix-specification/tr-trade-feed/order/new-order",
    "OrderCancelReplaceRequest": "fix-specification/tr-trade-feed/order/update-limit-order",
    "OrderCancelRequest": "fix-specification/tr-trade-feed/order/cancel-order",
    "Quote": "fix-specification/tr-trade-feed/quote/new-quote",
    "QuoteCancel": "fix-specification/cancel-all",
    "QuoteRequest": "fix-specification/rq-request-for-order-feed/rfo-initiate/new-rfo",
    "QuoteResponse": "fix-specification/rq-request-for-order-feed/rfo-accept-quote",
    "OrderAccepted": "fix-specification/tr-trade-feed/order/new-order",
    "OrderRejected": "fix-specification/tr-trade-feed/order/ack-rejected",
    "OrderReplaced": "fix-specification/tr-trade-feed/order/update-limit-order",
    "OrderCanceled": "fix-specification/tr-trade-feed/order/cancel-order",
    "OrderPartiallyFilled": "fix-specification/tr-trade-feed/execution/partial-fill",
    "OrderFilled": "fix-specification/tr-trade-feed/execution/complete-fill",
    "QuoteAccepted": "fix-specification/tr-trade-feed/quote/new-quote",
    "QuoteRejected": "fix-specification/tr-trade-feed/quote/rejected",
    "QuoteCanceled": "fix-specification/tr-trade-feed/quote/cancel-quote",
    "DropCopyFill": "fix-specification/post-trade/drop-copy",
    "FillCancel": "fix-specification/post-trade/fill-cancels",
    "FillCorrection": "fix-specification/post-trade/fill-corrections",
    "OrderPartialCanceled": "fix-specification/tr-trade-feed/execution/partial-fill-canceled",
    "RFOPendingNew": "fix-specification/rq-request-for-order-feed/rfo-initiate/new-rfo"
  }
}
