> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cdp.coinbase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Coinbase Derivatives: Predictions FIX Drop Copy Messages

The Coinbase Derivatives: Predictions FIX Drop Copy API sends you a read-only copy of execution reports and market settlement reports for every order in your firm or FCM over FIX 5.0 SP2.

## Drop Copy Message Types

The Coinbase Derivatives: Predictions Drop Copy FIX API supports the following message and execution types. For Logon, heartbeats, sequence recovery, and fill recovery, see [Session](/derivatives-predictions/fix/session).

> **Client Message Types**
>
> * [LastExecIDRequest (35=F1)](/derivatives-predictions/fix/session#lastexecidrequest-35f1): Requests the last ExecID sent for your scope.
> * [EventResendRequest (35=F3)](/derivatives-predictions/fix/session#eventresendrequest-35f3): Requests a resend of fills in an ExecID range.

> **System Message Types**
>
> * [ExecutionReport (35=8)](#executionreport-358): Order and trade events.
>   * [PendingNew (150=A)](#pendingnew-150a): Order accepted and held before it is submitted to the book.
>   * [New (150=0)](#new-1500): Order submitted to the book.
>   * [Trade (150=F)](#trade-150f): Complete and partial fills.
>   * [Canceled (150=4)](#canceled-1504): Order canceled by request or by the exchange.
>   * [Expired (150=C)](#expired-150c): Order expired, including unfilled Fill or Kill orders.
>   * [Rejected (150=8)](#rejected-1508): Order rejected.
> * [MarketSettlementReport (35=UMS)](#marketsettlementreport-35ums): Firm position settlement for an instrument.
> * [LastExecID (35=F2)](/derivatives-predictions/fix/session#lastexecid-35f2): Response to `LastExecIDRequest`.
> * [EventResendComplete (35=F4)](/derivatives-predictions/fix/session#eventresendcomplete-35f4): Sent after the last resent fill.
> * [EventResendReject (35=F5)](/derivatives-predictions/fix/session#eventresendreject-35f5): Rejection of an `EventResendRequest`.
> * [BusinessMessageReject (35=j)](#businessmessagereject-35j): Rejection of a malformed or unsupported application message.

> **Session Message Types**
>
> Logon (35=A), Logout (35=5), Heartbeat (35=0), TestRequest (35=1), ResendRequest (35=2), Reject (35=3), and SequenceReset (35=4). See [Session](/derivatives-predictions/fix/session).

The fill recovery messages (35=F1 to 35=F5) are shared with order entry and documented on [Session](/derivatives-predictions/fix/session#fill-recovery).

## Connection

Connect with `TargetCompID (56) = CBPMDC` and your API key in `SenderCompID (49)`. The API key must have the `DROP_COPY` permission. Host and port are listed on the [Coinbase Derivatives: Predictions Connectivity](/derivatives-predictions/connectivity) page. Header fields are on [Header/Trailer](/derivatives-predictions/fix/header-trailer). Logon, the Logon signature, heartbeats, and sequence recovery are on [Session](/derivatives-predictions/fix/session).

TransactTime (60) is a UTC timestamp with microsecond precision.

### Subscription scope

Each session receives reports for one scope, set by the level of its API key:

| API key level | Reports you receive |
| :- | :- |
| Firm | Orders, fills, and settlements of your firm. |
| FCM | Orders, fills, and settlements of every firm that clears through your FCM. |

* Every connected session in a scope receives the same reports.
* Each fill produces separate aggressor and resting reports. You receive each side that belongs to your scope; a trade between two orders in your scope sends you both reports.
* Recovery requests ([LastExecIDRequest](/derivatives-predictions/fix/session#lastexecidrequest-35f1) and [EventResendRequest](/derivatives-predictions/fix/session#eventresendrequest-35f3)) are answered from your scope, not from your session.

> [!NOTE]
>
> The gateway ends a live session when its authorization no longer holds: the API key is disabled or deleted, it loses the `DROP_COPY` permission, or its firm or FCM is deactivated, deleted, or reassigned. The gateway also ends the session if it sends any message after its authorization is revoked.

## Parties repeating group (453)

Every execution report carries five Parties entries, in this order.

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 453 | NoPartyIDs | NumInGroup | Y | `453=5` on every execution report. |
| → 448 | PartyID | String | Y | Party identifier for the role in `452`. `unknown` if the value cannot be resolved. |
| → 452 | PartyRole | Int | Y | `4` = Clearing firm: FCM code. `1` = Executing firm: firm code. `24` = Customer account: sub-account of the order. `11` = Order origination trader: user name of the API key that placed the order. `55` = Session ID: API key that placed the order. |

PartyIDSource (447) is not sent.

## ExecutionReport (35=8)

Reject reasons map to `OrdRejReason (103)` and `Text (58)` the same way as on [order entry](/derivatives-predictions/fix/order-entry) execution reports.

* **ExecID (17)** is a decimal integer that increases over time across all reports in a scope. Values are not contiguous. The aggressor report of a fill has an even ExecID and the resting report has the next odd value; every other report has an even ExecID.
* **Prices** have 3 decimal places, **quantities** 2, and **fee and payout amounts** 6. Insignificant trailing zeroes may be omitted, so `0.55` and `0.550` are the same price.

### PendingNew (150=A)

Sent when the exchange accepts an order and holds it before submitting it to the book.

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 37 | OrderID | String | Y | Exchange order ID. |
| 17 | ExecID | String | Y | Unique report ID. See [ExecutionReport (35=8)](#executionreport-358). |
| 11 | ClOrdID | String | Y | Client order ID of the order. Up to 36 characters. |
| 150 | ExecType | Char | Y | `A` = Pending new. |
| 39 | OrdStatus | Char | Y | `A` = Pending new. |
| 55 | Symbol | String | Y | Instrument ticker. `deleted_instrument` if the instrument cannot be resolved. |
| 54 | Side | Char | Y | `1` = Buy. `2` = Sell. |
| 40 | OrdType | Char | N | `1` = Market. `2` = Limit. |
| 44 | Price | Price | C | Order price. Sent when the order has a price. |
| 38 | OrderQty | Qty | C | Order quantity. |
| 151 | LeavesQty | Qty | Y | Equal to `OrderQty (38)`. |
| 14 | CumQty | Qty | Y | `0` |
| 6 | AvgPx | Price | N | `0` |
| 59 | TimeInForce | Char | N | `1` = Good Till Cancel. `3` = Immediate or Cancel. `4` = Fill or Kill. |
| 18 | ExecInst | MultipleCharValue | C | `6` = Post only. `A` = Post only reject. Sent only when set on the order. |
| 7928 | SelfMatchPreventionId | Int | C | Self-match prevention ID submitted on the order. Not sent when absent. `0` is a valid value. |
| 8000 | SelfMatchPreventionStrategy | Char | C | Effective self-match prevention mode of the order. `N` = Cancel aggressing. `O` = Cancel resting. `Q` = Cancel both. Not sent when the order has no mode. |
| 1028 | ManualOrderIndicator | Boolean | Y | `Y` = Manual order. `N` = Automated order, or the flag is unavailable. |
| 60 | TransactTime | UTCTimestamp | Y | UTC time of the event, in microseconds. |
| 453 | NoPartyIDs | NumInGroup | Y | See [Parties repeating group (453)](#parties-repeating-group-453). |

### New (150=0)

Sent when an order is submitted to the book. Carries the same fields as [PendingNew (150=A)](#pendingnew-150a), with these values:

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 150 | ExecType | Char | Y | `0` = New. |
| 39 | OrdStatus | Char | Y | `0` = New. |

### Trade (150=F)

Sent for each fill. Each fill produces one report for the aggressor order and one for the resting order, which share `TrdMatchID (880)`.

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 37 | OrderID | String | Y | Exchange order ID. |
| 17 | ExecID | String | Y | Unique report ID. Even for the aggressor report, odd for the resting report. |
| 11 | ClOrdID | String | Y | Client order ID of the order. Up to 36 characters. |
| 150 | ExecType | Char | Y | `F` = Trade. |
| 39 | OrdStatus | Char | Y | `1` = Partially filled. `2` = Filled. |
| 55 | Symbol | String | Y | Instrument ticker. `deleted_instrument` if the instrument cannot be resolved. |
| 54 | Side | Char | Y | `1` = Buy. `2` = Sell. |
| 40 | OrdType | Char | N | `1` = Market. `2` = Limit. |
| 44 | Price | Price | C | Order price. Sent when the order has a price. |
| 38 | OrderQty | Qty | C | Order quantity. |
| 31 | LastPx | Price | C | Fill price. |
| 32 | LastQty | Qty | C | Fill quantity. |
| 151 | LeavesQty | Qty | Y | Quantity remaining after this fill. |
| 14 | CumQty | Qty | Y | Total quantity filled on the order, including this fill. |
| 6 | AvgPx | Price | N | Volume-weighted average fill price of the order, including this fill. |
| 880 | TrdMatchID | String | C | Trade ID. Same on the aggressor and resting reports of one fill. |
| 1057 | AggressorIndicator | Boolean | C | `Y` = Aggressor (taker). `N` = Resting (maker). |
| 59 | TimeInForce | Char | N | `1` = Good Till Cancel. `3` = Immediate or Cancel. `4` = Fill or Kill. |
| 18 | ExecInst | MultipleCharValue | C | `6` = Post only. `A` = Post only reject. Sent only when set on the order. |
| 7928 | SelfMatchPreventionId | Int | C | Self-match prevention ID of this report's order. Not sent when absent. |
| 8000 | SelfMatchPreventionStrategy | Char | C | Effective self-match prevention mode of this report's order. `N` = Cancel aggressing. `O` = Cancel resting. `Q` = Cancel both. |
| 1028 | ManualOrderIndicator | Boolean | Y | `Y` = Manual order. `N` = Automated order, or the flag is unavailable. |
| 136 | NoMiscFees | NumInGroup | C | `1` when the fill carries a fee, including a zero fee. |
| → 137 | MiscFeeAmt | Amt | C | Fee in USDC, 6 decimal places. Negative values are maker rebates. |
| → 138 | MiscFeeCurr | Currency | C | `USDC` |
| → 139 | MiscFeeType | Int | C | `4` = Exchange fees. |
| 60 | TransactTime | UTCTimestamp | Y | UTC time of the fill, in microseconds. |
| 453 | NoPartyIDs | NumInGroup | Y | See [Parties repeating group (453)](#parties-repeating-group-453). |

### Canceled (150=4)

Sent when an order is canceled by a cancel request, a mass cancel, or the exchange. Most fields match [PendingNew (150=A)](#pendingnew-150a); these differ:

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 150 | ExecType | Char | Y | `4` = Canceled. |
| 39 | OrdStatus | Char | Y | `4` = Canceled. |
| 11 | ClOrdID | String | Y | For a single `OrderCancelRequest`: the ClOrdID of the cancel request. Otherwise: the ClOrdID of the order. |
| 41 | OrigClOrdID | String | C | ClOrdID of the canceled order. Sent only for a single `OrderCancelRequest`; mass-cancel reports omit it. |
| 38 | OrderQty | Qty | C | Canceled quantity plus filled quantity. |
| 151 | LeavesQty | Qty | Y | `0` |
| 14 | CumQty | Qty | Y | Total quantity filled before the cancel. |
| 6 | AvgPx | Price | C | `0` when the order had no fills. Not sent when the order had fills. |
| 378 | ExecRestatementReason | Int | C | Sent for exchange-initiated cancels. See [Cancel reasons](#cancel-reasons). |
| 58 | Text | String | Y | Cancel reason name. See [Cancel reasons](#cancel-reasons). |

#### Cancel reasons

| Text (58) | ExecType (150) / OrdStatus (39) | ExecRestatementReason (378) |
| :- | :- | :- |
| `USER_REQUEST`, `USER_MASS_CANCEL`, `CANCEL_PENDING_IOC` | `4` = Canceled | Not sent |
| `TIME_IN_FORCE` | `C` = Expired | Not sent |
| `SELF_MATCH_PREVENTION` | `4` = Canceled | `7` = Self-match prevention |
| `ADMIN_CANCEL` | `4` = Canceled | `105` = Canceled by the exchange |
| `INSTRUMENT_DETERMINED`, `INSTRUMENT_CLOSED`, `INSTRUMENT_PAUSED` | `4` = Canceled | `2` = Market option |
| `CLIENT_DISCONNECT` | `4` = Canceled | `1` = Cancel on disconnect |

### Expired (150=C)

Sent in two cases, both with `ExecType (150) = C` and `OrdStatus (39) = C`:

* **Time in force expiry.** Same fields as [Canceled (150=4)](#canceled-1504), with `Text (58) = TIME_IN_FORCE`.
* **Fill or Kill not filled.** Same fields as [Rejected (150=8)](#rejected-1508), except `OrdRejReason (103)` is not sent and `Text (58)` is `FOK_NOT_FILLED`, optionally followed by `-` and details.

### Rejected (150=8)

Sent when an order is rejected. Most fields match [PendingNew (150=A)](#pendingnew-150a); these differ:

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 150 | ExecType | Char | Y | `8` = Rejected. |
| 39 | OrdStatus | Char | Y | `8` = Rejected. |
| 151 | LeavesQty | Qty | Y | `0` |
| 14 | CumQty | Qty | Y | `0` |
| 6 | AvgPx | Price | N | `0` |
| 103 | OrdRejReason | Int | Y | See [OrdRejReason values](#ordrejreason-values). |
| 58 | Text | String | Y | Reject reason name, optionally followed by `-` and details. Example: `MAX_EXECUTION_COST_EXCEEDED - insufficient liquidity`. `UNKNOWN` if no reason is available. |

#### OrdRejReason values

| Text (58) reason | OrdRejReason (103) |
| :- | :- |
| `INVALID_INSTRUMENT` | `1` = Unknown symbol |
| `MAX_ACTIVE_ORDERS_EXCEEDED`, `MAX_ORDER_SIZE_EXCEEDED`, `MAX_EXECUTION_COST_EXCEEDED` | `3` = Order exceeds limit |
| `DUPLICATE_CLIENT_ORDER_ID` | `6` = Duplicate order |
| `POST_ONLY_WOULD_CROSS`, `INVALID_TIME_IN_FORCE` | `11` = Unsupported order characteristic |
| `INVALID_QUANTITY` | `13` = Incorrect quantity |
| `INVALID_SUBACCOUNT` | `15` = Unknown account |
| `INVALID_PRICE` | `16` = Price exceeds band |
| `INVALID_PRICE_TICK` | `18` = Invalid price increment |
| `INSUFFICIENT_BALANCE` | `25` = Insufficient credit limit |
| `POSITION_LIMIT_PER_INSTRUMENT_EXCEEDED` | `41` = Exceeded position limit |
| `INVALID_USER` | `42` = Invalid client |
| `USER_TRADING_LOCKED` | `43` = Client permission error |
| `INSTRUMENT_NOT_ACTIVE` | `44` = Not allowed by market state |
| `REDUCE_ONLY_VIOLATION` | `48` = Reduce only |
| `SELF_MATCH_PREVENTION`, `SPEED_BUMP_QUEUE_FULL`, `INVALID_FIELD_VALUE`, `UNKNOWN`, any other | `99` = Other |

## MarketSettlementReport (35=UMS)

Sent for each firm-level instrument settlement in your [scope](#subscription-scope). If the instrument ticker, firm, or FCM cannot be resolved, the report is not sent.

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 20105 | MarketSettlementReportID | String | Y | Unique report ID, from the same sequence as ExecID (17). Always even. |
| 55 | Symbol | String | Y | Ticker of the settled instrument. |
| 453 | NoPartyIDs | NumInGroup | Y | `2` |
| → 448 | PartyID | String | Y | Party identifier for the role in `452`. |
| → 452 | PartyRole | Int | Y | `4` = Clearing firm: FCM code. `1` = Executing firm: firm code. |
| 21052 | SettlementOutcome | Char | Y | `Y` = YES. `N` = NO. `S` = Scalar. |
| 730 | SettlementPrice | Price | Y | 3 decimal places. `1` = YES, `0` = NO. Any value in between is a scalar outcome. |
| 21053 | PositionAggregationMode | Char | Y | Position aggregation mode of the firm. `N` = Net. `G` = Gross. |
| 21054 | LongQty | Qty | Y | Firm long quantity settled. |
| 21055 | ShortQty | Qty | Y | Firm short quantity settled. |
| 21056 | PayoutAmount | Amt | Y | Gross settlement payout in USDC, 6 decimal places: `SettlementPrice × LongQty + (1 − SettlementPrice) × ShortQty`. Never negative. Does not net out what you paid to open the position. |
| 60 | TransactTime | UTCTimestamp | Y | UTC time of the settlement, in microseconds. |

> [!NOTE]
>
> MarketSettlementReports are not resent. An [EventResendRequest](/derivatives-predictions/fix/session#eventresendrequest-35f3) returns fills only.

## BusinessMessageReject (35=j)

Sent when an application message cannot be processed:

* A `LastExecIDRequest` or `EventResendRequest` that is structurally malformed, for example a missing required tag or an invalid value format.
* A `LastExecIDRequest` or `EventResendRequest` sent above the message rate limit. `Text (58) = rate throttle`.
* Any application message type other than `LastExecIDRequest (35=F1)` and `EventResendRequest (35=F3)`. `Text (58) = unsupported drop-copy msgType`.

| Tag | Name | FIX Type | Req | Description |
| :- | :- | :- | :- | :- |
| 45 | RefSeqNum | SeqNum | N | MsgSeqNum (34) of the rejected message. |
| 372 | RefMsgType | String | Y | MsgType (35) of the rejected message. |
| 380 | BusinessRejectReason | Int | Y | `0` = Other. Sent for every BusinessMessageReject. |
| 58 | Text | String | N | Human-readable reason, for example the invalid tag. |

## Values specific to Coinbase Derivatives: Predictions

The gateway uses standard FIX 5.0 SP2 tags. The following messages and values are specific to Coinbase Derivatives: Predictions.

| Tag or message | Value | Description |
| :- | :- | :- |
| MsgType (35) | `UMS`, `F1`, `F2`, `F3`, `F4`, `F5` | [MarketSettlementReport](#marketsettlementreport-35ums) and the event resend messages. |
| ExecInst (18) | `A` = Post only reject | Post-only order that is rejected instead of crossing. |
| SelfMatchPreventionStrategy (8000) | `N`, `O`, `Q` | Self-match prevention mode of the order. |
| Tags 20105, 21052 to 21056 | See [MarketSettlementReport](#marketsettlementreport-35ums) | Settlement report fields. |
| Tags 22003 to 22006 | See [EventResendRequest](/derivatives-predictions/fix/session#eventresendrequest-35f3) | Event resend fields. |
