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?
- SessionRejectReason (373) — 35=3
- BusinessRejectReason (380) — 35=j
- OrdRejReason (103) — 35=8
- CxlRejReason (102) — 35=9
- Garbled messages are not rejected
- FAQ
Which reject is it?
| Message | Layer | Reason field | Other key fields |
|---|---|---|---|
Reject 35=3 | Session — the message broke FIX syntax or the dictionary | 373 SessionRejectReason | 45 RefSeqNum, 371 RefTagID, 372 RefMsgType, 58 Text |
BusinessMessageReject 35=j | Application — valid FIX the business layer can’t process | 380 BusinessRejectReason | 45 RefSeqNum, 372 RefMsgType, 379 BusinessRejectRefID, 58 Text |
ExecutionReport 35=8 with 150=8, 39=8 | Order rejected by the broker or venue | 103 OrdRejReason | 11 ClOrdID, 58 Text |
OrderCancelReject 35=9 | Cancel or cancel/replace refused | 102 CxlRejReason | 434 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
| Value | Meaning | Typical cause |
|---|---|---|
| 373=0 | Invalid tag number | Tag number is not valid at all — zero, negative, non-numeric, or in a user-defined range the counterparty has not agreed to. |
| 373=1 | Required tag missing | A field the counterparty’s dictionary marks as required is missing, e.g. Side (54) or OrdType (40) on a NewOrderSingle. |
| 373=2 | Tag not defined for this message type | The tag exists but is not allowed in this message type. Usually a custom field sent without a matching dictionary on the other side. |
| 373=3 | Undefined tag | The tag is not in the counterparty’s dictionary at all — typical for venue-specific or user-defined tags (5000+). |
| 373=4 | Tag specified without a value | The field is present with an empty value, e.g. 58=. |
| 373=5 | Value is incorrect | The value is not one of the allowed enumerations, e.g. an OrdType (40) the venue does not support. |
| 373=6 | Incorrect data format for value | Wrong format for the data type: letters in an INT, a malformed UTCTimestamp, a comma instead of a dot in a PRICE. |
| 373=7 | Decryption problem | Decryption failed (EncryptMethod / SecureData). Rare in practice. |
| 373=8 | Signature problem | Signature check failed (SignatureLength / Signature). Rare in practice. |
| 373=9 | Comp ID problem | SenderCompID (49) or TargetCompID (56) does not match the session configuration. |
| 373=10 | Sending time accuracy problem | SendingTime (52) is outside the accepted window — the sender’s clock is off. QuickFIX’s default MaxLatency is 120 seconds; sync with NTP. |
| 373=11 | Invalid msg type | MsgType (35) is unknown to the counterparty or not supported on this session. |
| 373=12 | Xml validation error | FIXML message failed XML schema validation. |
| 373=13 | Tag appears more than once | A non-group tag appears twice — often a repeating group that the receiver’s dictionary does not define. |
| 373=14 | Tag specified out of required order | Fields 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=15 | Repeating group fields out of order | Inside a repeating group the delimiter (first) field must start each entry and fields must follow the dictionary order. |
| 373=16 | Incorrect num in group count for repeating group | The NoXXX count does not match the number of group entries actually sent. |
| 373=17 | Non-data value includes field delimiter (SOH character) | An SOH character appears inside a non-data field value. |
| 373=99 | Other | Anything 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
| Value | Meaning | Typical cause |
|---|---|---|
| 380=0 | Other | Anything else — see Text (58). |
| 380=1 | Unknown ID | An identifier in the message (e.g. a referenced order or request ID) is unknown. |
| 380=2 | Unknown security | The instrument (Symbol, SecurityID) is not known or not tradable on this session. |
| 380=3 | Unsupported message type | The message type is valid FIX but the counterparty does not support it on this session. |
| 380=4 | Application not available | The application behind the FIX engine is down or not accepting requests. |
| 380=5 | Conditionally required field missing | A field required only in certain cases is missing, e.g. Price (44) on a limit order or StopPx (99) on a stop order. |
| 380=6 | Not authorized | The session or account is not permitted to send this message or trade this instrument. |
| 380=7 | Deliver to firm not available at this time | The firm in DeliverToCompID (128) is not available. |
OrdRejReason (103) — rejected orders, 35=8
| Value | Meaning |
|---|---|
| 103=0 | Broker / exchange option |
| 103=1 | Unknown symbol |
| 103=2 | Exchange closed |
| 103=3 | Order exceeds limit |
| 103=4 | Too late to enter |
| 103=5 | Unknown order |
| 103=6 | Duplicate order |
| 103=7 | Duplicate of a verbally communicated order |
| 103=8 | Stale order |
| 103=9 | Trade along required |
| 103=10 | Invalid investor ID |
| 103=11 | Unsupported order characteristic |
| 103=12 | Surveillance option |
| 103=13 | Incorrect quantity |
| 103=14 | Incorrect allocated quantity |
| 103=15 | Unknown account |
| 103=99 | Other |
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
| Value | Meaning |
|---|---|
| 102=0 | Too late to cancel |
| 102=1 | Unknown order |
| 102=2 | Broker / exchange option |
| 102=3 | Order already in Pending Cancel or Pending Replace status |
| 102=4 | Unable to process order mass cancel request |
| 102=5 | OrigOrdModTime (586) did not match the last TransactTime (60) of the order |
| 102=6 | Duplicate ClOrdID (11) received |
| 102=99 | Other |
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.