Bite Apps/SafeFIX

Bite Apps › SafeFIX › FIX reject codes

FIX reject reason codes — 373, 380, 103 and 102 explained

Every value of SessionRejectReason (373), BusinessRejectReason (380), OrdRejReason (103) and CxlRejReason (102) with what it means, what usually causes it and which message carries it — 35=3, 35=j, 35=8 or 35=9.

Debugging rejects in a FIX log? SafeFIX finds every reject, decodes the reason and points to the offending tag — locally, nothing is uploaded.

Open SafeFIX — free, in your browser

Which reject is it?

MessageLayerReason fieldOther key fields
Reject 35=3Session — the message broke FIX syntax or the dictionary373 SessionRejectReason45 RefSeqNum, 371 RefTagID, 372 RefMsgType, 58 Text
BusinessMessageReject 35=jApplication — valid FIX the business layer can’t process380 BusinessRejectReason45 RefSeqNum, 372 RefMsgType, 379 BusinessRejectRefID, 58 Text
ExecutionReport 35=8 with 150=8, 39=8Order rejected by the broker or venue103 OrdRejReason11 ClOrdID, 58 Text
OrderCancelReject 35=9Cancel or cancel/replace refused102 CxlRejReason434 CxlRejResponseTo (1 = cancel, 2 = cancel/replace), 39 OrdStatus, 41 OrigClOrdID, 58 Text

A session-level Reject still consumes the rejected message’s sequence number — the receiver treats it as processed. Fix the problem and send a new message with the next MsgSeqNum; don’t resend the old one.

SessionRejectReason (373) — session-level Reject, 35=3

ValueMeaningTypical cause
373=0Invalid tag numberTag number is not valid at all — zero, negative, non-numeric, or in a user-defined range the counterparty has not agreed to.
373=1Required tag missingA field the counterparty’s dictionary marks as required is missing, e.g. Side (54) or OrdType (40) on a NewOrderSingle.
373=2Tag not defined for this message typeThe tag exists but is not allowed in this message type. Usually a custom field sent without a matching dictionary on the other side.
373=3Undefined tagThe tag is not in the counterparty’s dictionary at all — typical for venue-specific or user-defined tags (5000+).
373=4Tag specified without a valueThe field is present with an empty value, e.g. 58=.
373=5Value is incorrectThe value is not one of the allowed enumerations, e.g. an OrdType (40) the venue does not support.
373=6Incorrect data format for valueWrong format for the data type: letters in an INT, a malformed UTCTimestamp, a comma instead of a dot in a PRICE.
373=7Decryption problemDecryption failed (EncryptMethod / SecureData). Rare in practice.
373=8Signature problemSignature check failed (SignatureLength / Signature). Rare in practice.
373=9Comp ID problemSenderCompID (49) or TargetCompID (56) does not match the session configuration.
373=10Sending time accuracy problemSendingTime (52) is outside the accepted window — the sender’s clock is off. QuickFIX’s default MaxLatency is 120 seconds; sync with NTP.
373=11Invalid msg typeMsgType (35) is unknown to the counterparty or not supported on this session.
373=12Xml validation errorFIXML message failed XML schema validation.
373=13Tag appears more than onceA non-group tag appears twice — often a repeating group that the receiver’s dictionary does not define.
373=14Tag specified out of required orderFields out of order: 8, 9 and 35 must be the first three fields and 10 the last; some engines also enforce header-before-body ordering.
373=15Repeating group fields out of orderInside a repeating group the delimiter (first) field must start each entry and fields must follow the dictionary order.
373=16Incorrect num in group count for repeating groupThe NoXXX count does not match the number of group entries actually sent.
373=17Non-data value includes field delimiter (SOH character)An SOH character appears inside a non-data field value.
373=99OtherAnything else — the explanation is in Text (58).

FIX 5.0 / FIXT.1.1 sessions add 373=18 Invalid or unsupported application version. When RefTagID (371) is present, it names the offending tag — SafeFIX shows the tag name and the exact field in the rejected message.

BusinessRejectReason (380) — BusinessMessageReject, 35=j

ValueMeaningTypical cause
380=0OtherAnything else — see Text (58).
380=1Unknown IDAn identifier in the message (e.g. a referenced order or request ID) is unknown.
380=2Unknown securityThe instrument (Symbol, SecurityID) is not known or not tradable on this session.
380=3Unsupported message typeThe message type is valid FIX but the counterparty does not support it on this session.
380=4Application not availableThe application behind the FIX engine is down or not accepting requests.
380=5Conditionally required field missingA field required only in certain cases is missing, e.g. Price (44) on a limit order or StopPx (99) on a stop order.
380=6Not authorizedThe session or account is not permitted to send this message or trade this instrument.
380=7Deliver to firm not available at this timeThe firm in DeliverToCompID (128) is not available.

OrdRejReason (103) — rejected orders, 35=8

ValueMeaning
103=0Broker / exchange option
103=1Unknown symbol
103=2Exchange closed
103=3Order exceeds limit
103=4Too late to enter
103=5Unknown order
103=6Duplicate order
103=7Duplicate of a verbally communicated order
103=8Stale order
103=9Trade along required
103=10Invalid investor ID
103=11Unsupported order characteristic
103=12Surveillance option
103=13Incorrect quantity
103=14Incorrect allocated quantity
103=15Unknown account
103=99Other

Many venues send 103=0 or 103=99 for almost everything and put the real reason in Text (58) or a custom tag — read both.

CxlRejReason (102) — OrderCancelReject, 35=9

ValueMeaning
102=0Too late to cancel
102=1Unknown order
102=2Broker / exchange option
102=3Order already in Pending Cancel or Pending Replace status
102=4Unable to process order mass cancel request
102=5OrigOrdModTime (586) did not match the last TransactTime (60) of the order
102=6Duplicate ClOrdID (11) received
102=99Other

Garbled messages are not rejected

If BodyLength (9) or CheckSum (10) is wrong, or BeginString (8) is not the first field, the message is garbled: the receiver discards it silently without a Reject and without consuming the sequence number. The next good message then triggers a sequence gap and a ResendRequest (35=2). If you see resend loops with no 35=3 in the log, check the lengths and checksums — SafeFIX recomputes both for every message.

FAQ

What does 373=1 mean in a FIX reject?

SessionRejectReason 1 = Required tag missing. RefTagID (371) names the field the counterparty expected; add it to the message, or align your data dictionary with the counterparty’s.

What does 373=5 mean?

Value is incorrect (out of range) for this tag — the field is valid but its value is not one the counterparty accepts, typically an enumeration such as OrdType (40) or TimeInForce (59) that the venue does not support.

What is the difference between 35=3 and 35=j?

A Reject (35=3) is a session-level rejection: the message broke FIX syntax or the dictionary. A BusinessMessageReject (35=j) means the message was valid FIX but the application could not process it, for example an unsupported message type or a missing conditionally required field.

Why is my order rejected with 39=8 and no 35=3?

The FIX message was fine; the broker or venue rejected the order itself. Look at OrdRejReason (103) and Text (58) in the ExecutionReport.

How can I find the reason for every reject in a log?

Open the log in SafeFIX. Its reject explainer lists every 35=3, 35=j, rejected execution report and cancel reject with the decoded reason, the offending tag and the original message — locally in your browser.

Last updated 2026-11-10. Something wrong or missing? Email support@biteapps.cc.