EncodedLegSecurityDesc (FIX tag 622)

dataFIX 4.4

EncodedLegSecurityDesc (tag 622) is a data field defined in FIX 4.4. It appears in 50 message types, always optionally. It is length-prefixed — tag 621 carries the byte count, so the value may contain the SOH separator without breaking the message.

At a glance

Tag
622
Name
EncodedLegSecurityDesc
Datatype
data
Dialects
FIX 4.4
Messages
50
Length field
tag 621

What the specification says

Multileg instrument's individual security’s EncodedSecurityDesc. See EncodedSecurityDesc (35) field for description

Descriptions are quoted from the FIX Orchestra sources under the Apache 2.0 licence.

A real message using tag 622

ExecutionReport · FIX 4.4
TagFieldWire valueMeaning
8BeginStringFIX.4.4
9BodyLength199
35MsgType8Execution Report
49SenderCompIDBOARTEAM
56TargetCompIDCOUNTERPARTY
34MsgSeqNum2
52SendingTime20240101-12:00:00.000
37OrderIDORD-10042
17ExecIDEXEC-88117
150ExecType0New
39OrdStatus0New
54Side1Buy
151LeavesQty0
14CumQty1000000
6AvgPx1.09215
555NoLegs2 entries2repeating group
600LegSymbolEXAMPLE
621EncodedLegSecurityDescLen7
622EncodedLegSecurityDescEXAMPLE
600LegSymbolEXAMPLE
621EncodedLegSecurityDescLen7
622EncodedLegSecurityDescEXAMPLE
10CheckSum216
Edit and decode it yourself

Shown with | separators for readability. On the wire FIX uses SOH (0x01), an invisible control byte — and because BodyLength and CheckSum are computed over the actual bytes, the two forms have different checksums. Both are valid and both decode here.

Open in the full decoder →

Generated from the FIX 4.4 dictionary and verified at build time: it parses and validates with no issues. Open the decoder to try your own message.

Where tag 622 appears

Requiredness is a property of the message, not of the field: the same tag can be optional in one message and conditionally required in another.

MessageMsgTypeRequirednessWhere in the message
Advertisement7Conditionalinside InstrmtLegGrp › InstrumentLeg
AllocationInstructionJConditionalinside InstrmtLegGrp › InstrumentLeg
AllocationReportASConditionalinside InstrmtLegGrp › InstrumentLeg
AssignmentReportAWConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralAssignmentAYConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralInquiryBBConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralInquiryAckBGConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralReportBAConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralRequestAXConditionalinside InstrmtLegGrp › InstrumentLeg
CollateralResponseAZConditionalinside InstrmtLegGrp › InstrumentLeg
ConfirmationAKConditionalinside InstrmtLegGrp › InstrumentLeg
CrossOrderCancelReplaceRequesttConditionalinside InstrmtLegGrp › InstrumentLeg
CrossOrderCancelRequestuConditionalinside InstrmtLegGrp › InstrumentLeg
DerivativeSecurityListAAConditionalinside RelSymDerivSecGrp › InstrmtLegGrp › InstrumentLeg
DontKnowTradeQConditionalinside InstrmtLegGrp › InstrumentLeg
EmailCConditionalinside InstrmtLegGrp › InstrumentLeg
ExecutionReport8Conditionalinside InstrmtLegExecGrp › InstrumentLeg
IOI6Conditionalinside InstrmtLegIOIGrp › InstrumentLeg
MarketDataIncrementalRefreshXConditionalinside MDIncGrp › InstrmtLegGrp › InstrumentLeg
MarketDataRequestVConditionalinside InstrmtMDReqGrp › InstrmtLegGrp › InstrumentLeg
MarketDataSnapshotFullRefreshWConditionalinside InstrmtLegGrp › InstrumentLeg
MassQuoteiConditionalinside QuotSetGrp › QuotEntryGrp › InstrmtLegGrp › InstrumentLeg
MassQuoteAcknowledgementbConditionalinside QuotSetAckGrp › QuotEntryAckGrp › InstrmtLegGrp › InstrumentLeg
MultilegOrderCancelReplaceACConditionalinside LegOrdGrp › InstrumentLeg
NewOrderCrosssConditionalinside InstrmtLegGrp › InstrumentLeg
NewOrderMultilegABConditionalinside LegOrdGrp › InstrumentLeg
NewsBConditionalinside InstrmtLegGrp › InstrumentLeg
PositionMaintenanceReportAMConditionalinside InstrmtLegGrp › InstrumentLeg
PositionMaintenanceRequestALConditionalinside InstrmtLegGrp › InstrumentLeg
PositionReportAPConditionalinside InstrmtLegGrp › InstrumentLeg
QuoteSConditionalinside LegQuotGrp › InstrumentLeg
QuoteCancelZConditionalinside QuotCxlEntriesGrp › InstrmtLegGrp › InstrumentLeg
QuoteRequestRConditionalinside QuotReqGrp › QuotReqLegsGrp › InstrumentLeg
QuoteRequestRejectAGConditionalinside QuotReqRjctGrp › QuotReqLegsGrp › InstrumentLeg
QuoteResponseAJConditionalinside LegQuotGrp › InstrumentLeg
QuoteStatusReportAIConditionalinside LegQuotStatGrp › InstrumentLeg
QuoteStatusRequestaConditionalinside InstrmtLegGrp › InstrumentLeg
RFQRequestAHConditionalinside RFQReqGrp › InstrmtLegGrp › InstrumentLeg
RequestForPositionsANConditionalinside InstrmtLegGrp › InstrumentLeg
RequestForPositionsAckAOConditionalinside InstrmtLegGrp › InstrumentLeg
SecurityDefinitiondConditionalinside InstrmtLegGrp › InstrumentLeg
SecurityDefinitionRequestcConditionalinside InstrmtLegGrp › InstrumentLeg
SecurityListyConditionalinside SecListGrp › InstrmtLegSecListGrp › InstrumentLeg
SecurityListRequestxConditionalinside InstrmtLegGrp › InstrumentLeg
SecurityStatusfConditionalinside InstrmtLegGrp › InstrumentLeg
SecurityStatusRequesteConditionalinside InstrmtLegGrp › InstrumentLeg
TradeCaptureReportAEConditionalinside TrdInstrmtLegGrp › InstrumentLeg
TradeCaptureReportAckARConditionalinside TrdInstrmtLegGrp › InstrumentLeg
TradeCaptureReportRequestADConditionalinside InstrmtLegGrp › InstrumentLeg
TradeCaptureReportRequestAckAQConditionalinside InstrmtLegGrp › InstrumentLeg

Wire format

Raw bytes, length-prefixed by a partner field. The value may legally contain the SOH separator, which is why the length matters. @boarteam/fix reads the partner length field first and takes exactly that many bytes, so an embedded separator does not truncate the value.

Read tag 622 in TypeScript

decode.tsts
import { createFixEngine } from "@boarteam/fix";import { dictionary } from "@boarteam/fix-dict-fix44";const fix = createFixEngine(dictionary);const { message, issues } = fix.parse(raw);// Length-prefixed: tag 621 carries the byte count, so the// value may contain the SOH separator without breaking the message.const length = message.fields[621]?.value;const encodedLegSecurityDesc = message.fields[622]?.raw;

Other data fields

Decode this in your own code

The same engine that produced the decoded example above is an Apache-2.0 npm package with zero runtime dependencies. It runs in Node and in the browser, and parse() returns problems as data instead of throwing.

npm i @boarteam/fix @boarteam/fix-dict-fix44