This page provides information about upcoming changes to Coinbase Prime Broker.

Ethereum Pectra Upgrade - Staking API Changes

Update: This will be live in early-October 2025 We are introducing significant enhancements to ETH staking APIs to support the Ethereum Pectra upgrade. These changes enable more flexible staking amounts, introduce a new claim rewards feature, and improve the overall staking experience.

1. Flexible Staking Amounts

  • Minimum stake amount: 32 ETH (unchanged)
  • Maximum stake amount per wallet: 180,000 ETH (100 validators × 1,800 ETH target size)
  • NEW: Ability to stake any amount between 32 ETH and 180,000 ETH (not restricted to multiples of 32 ETH)

2. Enhanced Unstaking Capabilities

  • Minimum unstake amount: 1 ETH (reduced from 32 ETH)
  • Partial unstaking: Supports flexible amounts (not restricted to multiples of 32 ETH)
  • Automatic unstaking: Validators with a balance less than 32 ETH will be automatically fully unstaked

3. New Claim Rewards API

After the Pectra upgrade, validator rewards automatically compound and are claimed when you fully unstake. If you want to withdraw rewards without unstaking, you can use this endpoint. REST Path: POST /v1/portfolios/{portfolio_id}/wallets/{wallet_id}/staking/claim_rewards
// Request parameters
{
  "idempotency_key": "string", // Required: Client-generated idempotency key
  "inputs": {
    "amount": "string" // Optional: Amount to claim (ETH only). If omitted, claims maximum available
  }
}
Response:
{
  "wallet_id": "string",
  "transaction_id": "string",
  "activity_id": "string"
}

User generated IDs maximum length requirement

Update: This will be live mid-October 2025 A maximum length requirement of 128 characters will be enforced for client generated IDs. Invalid argument errors will be raised if the IDs are longer than this limit. The affected fields currently are:

Prime API Upcoming Changes

Update: This will be live in Q3 Added following fields to Prime Rest API:
  • Get Order By Order ID and List Portfolio Orders now supports:
    • raise_exact which will return a boolean indicating if an order is a raise exact order
    • display_base_size and display_quote_size which will return the display size in the order currency. If the order does not have a display size, the response will be empty.
  • Get Order Preview now supports:
    • raise_exact which will return a boolean indicating if an order is a raise exact order
    • display_base_size and display_quote_size which will return the display size in the order currency. If the order does not have a display size, the response will be empty.
    • stop_price for a Stop Limit order displayed in quote currency
  • List Order Fills and List Portfolio Fills now supports:
    • Add venue_fee which returns the venue fee in quote currency if the entity is enabled for cost-plus pricing.
    • Add CES_commission which will return the Client Execution Services commission of the trade.
Important: When using the above endpoints, please note the new parameter validation rules to avoid invalid argument errors:
  • If user enters both base_quantity and quote_value, an error will be thrown
  • If user enters base_quantity and display_quote_size, an error will be thrown
  • If user enters quote_value and display_base_size, an error will be thrown
  • If user enters both display_quote_size and display_base_size, an error will be thrown
Added following fields to Prime Websocket API:
  • Orders Channel now supports:
    • user_id which will return the unique user_id in each response
    • venue_fee which will return the venue fee in quote currency if entity is enabled for cost-plus pricing.
    • commission which will return the trading fee of the order.
    • CES_commission which will return the Client Execution Services commission of the trade.
  • Products Channel now supports:
    • price_increment
    • permissions which always returns PRODUCT_PERMISSION_READ and if the client can trade the product pair will also return PRODUCT_PERMISSION_TRADE
Added following fields to Prime FIX API:
  • Execution Report (8)
    • TimeInForce which will return the Time in force for the order
    • StopPrice for a Stop Limit order displayed in quote currency
    • MaxShow displays Maximum quantity within an order to be shown to other customers (Display Size). Only present on LIMIT orders.
    • FilledValue presents the sum of fills (inclusive of fees) in quote units of an order

Edit Orders via REST and FIX API

Update: This will be live in Q3 Open LIMIT, STOP-LIMIT, TWAP, and VWAP orders can be edited via REST and FIX APIs. Any valid attribute of an open order (i.e. reduce/increase quantity, change limit price, etc.) can be edited. A single order can be edited up to 25 times. API edited orders retain the same Order ID but require unique client order IDs for each edit. Additionally, to ensure you are updating a specific order’s state, you’ll need to supply the client order ID of the current order. We strongly recommend that clients do not aggressively increase the order amount or dramatically shorten the duration of TWAP orders that are being edited. The TWAP algorithm will take the new instructions and begin executing more aggressively to catch up.

REST Updates

REST Path: PUT /v1/{portfolio_id}/orders/{order_id}/edit
// Request parameters

{
  "orig_client_order_id": "required",
  "client_order_id": "required",
  "base_quantity": "optional",
  "quote_value": "optional",
  "limit_price": "optional",
  "expiry_time": "optional",
  "display_base_size": "optional",
  "display_quote_size": "optional",
  "stop_price": "optional"
}
Additional details
  • You’ll also be able to see your edits via GET /v1/portfolios/{portfolio_id}/orders/{order_id} inside the edit_history field.

FIX Updates

​​The Order Modification Request message (MsgType=G) is used to amend the replaceable fields. The orig_client_order_id in the edit is to ensure you are editing the version of the order you want to edit. It is the value of the current order’s client_order_id. The client_order_id passed into the edit is the new identifier for your order’s state. These values cannot match. Orders are modified with “in-flight mitigation” meaning any partially filled quantity on the original order is carried over to the edited order and is reflected in the edited order’s remaining quantity LeavesQty(151).

Order Modification Request (G)

TagReqNameDescription
37YOrderIDThe unique identifier of the order
41YOrigClOrdIDAn identifier matching the ClOrdID from the NewOrderSingle or OrderCancelReplaceRequest that this request applies to
11YClOrdIDUnique identifier of the replacement order
55YSymbolMust match original symbol
54YSideMust match original side
40YOrdTypeMust match original order type
60YTransactTimeTime this order request was initiated/released by the trader or trading system
21YHandlInstMust be 1
38NOrderQtyTotal intended order quantity (including the amount already executed on this order)
152NCashOrderQtyTotal intended order quantity in quote units (including the amount already executed on this order. Either this or OrderQty must be supplied.
44NPriceLimit price
99NStopPXStop price for stop limit
126NExpireTimeRepresents the time and date of order expiration
210NMaxShowDisplay size
Additional details:
  • In FIX 4.2, if you make an edit (via any of the APIs or UIs) you’ll see message type 8 (Execution Report) with ExecType: E (Pending Replace) and 5 (Replaced).
  • The orig_client_order_id in the edit is to ensure you are editing the version of the order you want to edit. It is the value of the current orders client_order_id. And the client_order_id passed into the edit is the new identifier for your order’s state. Both values need to be different.
  • See comprehensive example of multiple edits here

FIX Market Data

Update: This will be live in Q3 We will be adding level 2 market data on FIX 5.0 for Prime Trading Spot instruments. This includes OHLCV (Open, High, Low, Close, Volume), bids and offers, and trade history data. This will require a dedicated API key with READ permissions. Logon messages must conform to FIXT 1.1, for example:
TagReqNameDescription
8YBeginStringMust be FIXT.1.1
9YBodyLengthLength of body
35YMsgTypeMust be A
34YMsgSeqNumMust be 1
49YSenderCompIDThe Service Account ID (on messages from the client)
52YSendingTimeMust be within 5 seconds of server time in UTC
56YTargetCompIDMust be COIN (on messages from the client)
95YRawDataLengthNumber of bytes in the RawData field
96YRawDataClient message signature (see Logon)
98YEncryptMethodMust be 0 (none)
108YHeartBtIntHeartbeat interval is capped at 300s, defaults to 30s
141YResetSeqNumFlagResets the sequence number. Can be Y/N
553YUsernameClient API Key (Replaces tag 9407)
554YPasswordClient API passphrase
1137YDefaultApplVerIDMust be 9 (FIX 5.0 SP2)
9406YDropCopyFlagMust be N
10YCheckSumChecksum
Prime FIX API:
  • Server will support a new message type sent by the client: MarketDataRequest <V>
  • Server will send a new message type: MarketDataRequestReject <Y>
  • Server will send a new message type: MarketDataSnapshotFullRefresh <W>
  • Server will send a new message type: MarketDataIncrementalRefresh <X>
  • Server will send a new message type: SecurityStatus <f>

MarketDataRequest (V)

Sent by the client when placing a market data request
TagReqNameDescription
262YMDReqIDClient unique identifier for market data request
263YSubscriptionRequestType0 = Snapshot only
1 = Snapshot+Updates (Subscribe)
2 = Disable previous Snapshot+Update (Unsubscribe)
264YMarketDepth0 = Full depth (L2)
1 = Top of book
N>1 = Report best N price tiers of data
265NMDUpdateTypeRequired if SubscriptionRequestType <263> = 1:
0 = Snapshot+Updates
1 = Updates only
267YNoMDEntryTypesNumber of MDEntryType <269> fields requested
↳269YMDEntryType0 = Bid
1 = Offer
2 = Trade
4 = Open
5 = Close
7 = High
8 = Low
B = Volume
146YNoRelatedSymNumber of Symbols <55> requested
↳55YSymbolRepeating group of symbols for which the client requests market data

MarketDataRequestReject (Y)

Sent by the server in case the MarketDataRequest (V) fails
TagReqNameDescription
262YMDReqIDClient unique identifier for market data request
281YMDReqRejReasonSee MDReqRejReason table
58NTextUser friendly error message

MDReqRejReason

Possible values for MDReqRejReason (see MarketDataRequestReject (Y))
ValueDescription
0Unknown symbol
1Duplicate MDReqID
2Insufficient bandwidth
3Insufficient permission
4Invalid SubscriptionRequestType <263>
5Invalid MarketDepth <264>
6Unsupported MDUpdateType <267>
7Other
8Unsupported MDEntryType <269>

MarketDataSnapshotFullRefresh (W)

Sent by the server to view a new stream of market data information
TagReqNameDescription
262YMDReqIDClient unique identifier for market data request
55YSymbolThe trading pair from MarketDataRequest
268YNoMDEntriesNumber of market data updates in snapshot
911YTotNumReportsTotal number of reports being sent in response to a single request
963YReportIDUnique identifier of the report itself
↳269YMDEntryType0 = Bid
1 = Offer
2 = Trade
4 = Open
5 = Close
7 = High
8 = Low
B = Volume
↳278YMDEntryIDUnique identifier for this market data entry
↳83YRptSeqPublic sequence number for each entry in the snapshot by symbol
↳270NMDEntryPxPrice of the market data entry (Not present if MDEntryType = B)
↳271NMDEntrySizeVolume represented by the market data entry (Not present if MDEntryType = 4, 5, 7, or 8)
↳272YMDEntryDateDate of the market data entry
↳2446NAggressorSideIf MDEntryType = 2 (Trade), the side of the order:
1 = Buy
2 = Sell
↳273YMDEntryTimeTime of the market data entry
↳453NNoPartyIDsOnly present if MdEntryType = 2 (Trade). Will always be 1
↳↳448NPartyIDMarket Identifier Code (MIC) for Venue
↳↳447NPartyIDSourceWill always be G, Market Identifier Code (MIC)
↳↳452NPartyRoleWill always be 73, Execution Venue

MarketDataIncrementalRefresh (X)

Sent by the server to view updates to an existing stream
TagReqNameDescription
262YMDReqIDClient unique identifier for market data request
55YSymbolThe trading pair from MarketDataRequest
268YNoMDEntriesNumber of market data updates in snapshot
↳279YMDUpdateActionType of entry update:
0 = NEW
1 = CHANGE
2 = DELETE
↳269YMDEntryType0 = Bid
1 = Offer
2 = Trade
4 = Open
5 = Close
7 = High
8 = Low
B = Volume
↳278YMDEntryIDUnique identifier for this market data entry
↳83YRptSeqPublic sequence number for each entry in the snapshot by symbol
↳270NMDEntryPxPrice of the market data entry (Not present if MDEntryType = B)
↳271NMDEntrySizeVolume represented by the market data entry (Not present if MDEntryType = 4, 5, 7, or 8)
↳272YMDEntryDateDate of the market data entry
↳2446NAggressorSideIf MDEntryType = 2 (Trade), the side of the order:
1=Buy
2=Sell
↳273YMDEntryTimeTime of the market data entry
↳453NNoPartyIDsOnly present if MdEntryType = 2 (Trade). Will always be 1
↳↳448NPartyIDMarket Identifier Code (MIC) for Venue
↳↳447NPartyIDSourceWill always be G, Market Identifier Code (MIC)
↳↳452NPartyRoleWill always be 73, Execution Venue

SecurityStatus (f)

Sent by the server once when an existing stream fails, and once when it reconnects
TagReqNameDescription
55YSymbolSymbol
326YSecurityTradingStatus3=Resume
999=Market data feed temporarily unavailable
58YTextMarket data feed temporarily unavailable for MDReqID MDReqID for stream type:
bid/offer
trade
OHLCV

REST Candle Data

Update: This will be live in Q3 We will be adding a new GET endpoint to return candles of specified symbols. The request will require the following parameters: REST Path: GET /v1/portfolios/{portfolio_id}/candles
{
  "product_id": "string",
  "start": "string", // ISO 8601 timestamp e.g 2025-01-10T12:00:00
  "end": "string", // ISO 8601 timestamp e.g 2025-01-10T12:00:00
  "granularity": "string"
}
And will have the following fields in the response body:
{
  "candles": [
    {
      "timestamp": "string", // ISO 8601 timestamp format
      "open": "string",
      "high": "string",
      "low": "string",
      "close": "string",
      "volume": "string"
    }
  ]
}

Settlement Currency

Updating: This will be live in September 2025 We are introducing support for specifying a settlement currency for orders. With this update, clients can access USD trading pairs using USDC positions, enabling them to buy with USDC balances and settle trades directly into USDC positions.
  • Updated Create Order with new optional parameter settl_currency.

Create Staking/Unstaking Transaction

Updating: This will be live in Late-April We will be adding new POST endpoints to create staking/unstaking transactions. These upcoming endpoints will initially support ETH only. Staking is a request to stake or delegate funds to a validator, and unstaking is a request to unstake delegated or staked funds in a wallet. The request requires the following parameters:
{
  "portfolio_id": "string",
  "wallet_id": "string",
  "body": {
    "idempotency_key": "string", // The idempotency key associated with this transfer
    "inputs": "object" // String map of inputs for the given action.
  }
}
The response will consist of the following:
{
  "wallet_id": "string",
  "transaction_id": "string",
  "activity_id": "string"
}

Get Portfolio Commission

Updating: This will be live in Mid-April We will be adding an optional query parameter to the REST API Get Portfolio Commission endpoint. This parameter will allow you to request commission rates for a specific product ID. The request will look like the following: Path Parameters
{
  "portfolio_id": "string"
}
Query Parameters
{
  "product_id": "string"
}
The response schema remains unchanged.

Prime Multinetwork Support

Updating: This will be live in Mid-March We will be adding a new “network” field that touches the following resources:
  • Transactions
  • Wallets
  • Deposit instructions
  • Balances
The “network” field will look like the following and will be used as an optional request or response parameter depending on whether the endpoint is a GET or POST:
{
  "id": "string", // The network ID like "ethereum" or "solana"
  "type": "string" // The network type like "mainnet"
}
Additionally, the Get Entity Assets endpoint is updated to return additional information about each network supported by every asset. The response for this endpoint is updated to include `network details”:
{
  "network_details": {
    "network": "object", // The network object as defined above
    "name": "string", // The name of the network like Ethereum or Solana
    "max_decimals": "string", // The maximum number of decimals for the asset on the network
    "default": "boolean", // Whether this is the default network for the asset
    "trading_supported": "boolean", // Whether trading is supported on the network
    "vault_supported": "boolean", // Whether vault is supported on the network
    "prime_custody_supported": "boolean", // Whether prime custody is supported on the network
    "destination_tag_required": "boolean", // Whether destination tag is required on the network
    "network_link": "string" // base url for the recommended block explorer for the network (crypto only)
  }
}
The complete list of endpoints that are updated for this feature can be found under the Changelog.

Update Onchain Address Group

Added: 2025-JAN-18 We will be adding a new endpoint to update a Prime Onchain Wallet address group. This PUT endpoint will replace the existing address group with the new address group. The request requires portfolio ID and address group as shown below:
{
  portfolio_id: string;
  address_group: {
    id;
    name;
    network_type;
    addresses: [{
      name;
      address;
      networks: [string];
    }]
  }
}
The response will consist of the following:
{
  "activity_type": "ACTIVITY_TYPE_ADDRESS_BOOK",
  "num_approvals_remaining": integer,
  "activity_id": string
}

List Onchain Address Groups

Added: 2024-DEC-17 We will be adding a new endpoint to list your onchain address groups. This GET endpoint will list all address groups for a given portfolio ID. The response will consist of the following:
{
  address_groups: [{
    id;
    name;
    network_type;
    added_at;
    addresses: [{
      name;
      address;
      chain_ids: [string]; // This will be empty for solana, * or list of chain IDs for EVM
    }]
  }]
}

Get FCM Risk Limits

Added: 2025-JUN-26 We will be adding a new endpoint to get the risk limits for a given portfolio ID. This GET endpoint will return the risk limits for the specified portfolio. The request requires the following parameters:
{
  "entity_id": "string",
}
The response will consist of the following:
{
  "cfm_risk_limit": "string",
  "cfm_risk_limit_utilization": "string",
  "cfm_total_margin": "string",
  "cfm_delta_ote": "string",
  "cfm_unsettled_realized_pnl": "string",
  "cfm_unsettled_accrued_funding_pnl": "string"
}

Get FCM Margin Call Details

Added: 2025-JUL-02 We will be adding a new endpoint to get the margin call details for a given entity ID. This GET endpoint will return a list of margin calls for the specified entity. The request requires the following parameters:
{
  "entity_id": "string"
}
The response will consist of the following:
{
  "margin_calls": [
    {
      "type": "enum", // "URGENT" or "REGULAR"
      "state": "enum",  // "CLOSED", "ROLLED_OVER", "DEFAULT", "OFFICIAL"
      "initial_amount": "string",
      "remaining_amount": "string",
      "business_date": "string", // UNIX timestamp e.g 1596640920
      "cure_deadline": "string"  // UNIX timestamp e.g 1596650920
    }
  ]
}