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
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:- Create Portfolio Allocations: allocation_id, allocation_leg_id
- Create Portfolio Net Allocations: allocation_leg_id, netting_id
- Accept Quote: client_order_id
- Create Order: client_order_id
- Create Quote Request: client_quote_id
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 orderdisplay_base_size
anddisplay_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 orderdisplay_base_size
anddisplay_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.
- Add
- If user enters both
base_quantity
andquote_value
, an error will be thrown - If user enters
base_quantity
anddisplay_quote_size
, an error will be thrown - If user enters
quote_value
anddisplay_base_size
, an error will be thrown - If user enters both
display_quote_size
anddisplay_base_size
, an error will be thrown
- Orders Channel now supports:
user_id
which will return the unique user_id in each responsevenue_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
- Execution Report (8)
TimeInForce
which will return the Time in force for the orderStopPrice
for a Stop Limit order displayed in quote currencyMaxShow
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
- You’ll also be able to see your edits via
GET /v1/portfolios/{portfolio_id}/orders/{order_id}
inside theedit_history
field.
FIX Updates
The Order Modification Request message (MsgType=G) is used to amend the replaceable fields. Theorig_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)
Tag | Req | Name | Description |
---|---|---|---|
37 | Y | OrderID | The unique identifier of the order |
41 | Y | OrigClOrdID | An identifier matching the ClOrdID from the NewOrderSingle or OrderCancelReplaceRequest that this request applies to |
11 | Y | ClOrdID | Unique identifier of the replacement order |
55 | Y | Symbol | Must match original symbol |
54 | Y | Side | Must match original side |
40 | Y | OrdType | Must match original order type |
60 | Y | TransactTime | Time this order request was initiated/released by the trader or trading system |
21 | Y | HandlInst | Must be 1 |
38 | N | OrderQty | Total intended order quantity (including the amount already executed on this order) |
152 | N | CashOrderQty | Total intended order quantity in quote units (including the amount already executed on this order. Either this or OrderQty must be supplied. |
44 | N | Price | Limit price |
99 | N | StopPX | Stop price for stop limit |
126 | N | ExpireTime | Represents the time and date of order expiration |
210 | N | MaxShow | Display size |
- In FIX 4.2, if you make an edit (via any of the APIs or UIs) you’ll see message type
8
(Execution Report) withExecType
:E
(Pending Replace) and5
(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 ordersclient_order_id
. And theclient_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:Tag | Req | Name | Description |
---|---|---|---|
8 | Y | BeginString | Must be FIXT.1.1 |
9 | Y | BodyLength | Length of body |
35 | Y | MsgType | Must be A |
34 | Y | MsgSeqNum | Must be 1 |
49 | Y | SenderCompID | The Service Account ID (on messages from the client) |
52 | Y | SendingTime | Must be within 5 seconds of server time in UTC |
56 | Y | TargetCompID | Must be COIN (on messages from the client) |
95 | Y | RawDataLength | Number of bytes in the RawData field |
96 | Y | RawData | Client message signature (see Logon) |
98 | Y | EncryptMethod | Must be 0 (none) |
108 | Y | HeartBtInt | Heartbeat interval is capped at 300s, defaults to 30s |
141 | Y | ResetSeqNumFlag | Resets the sequence number. Can be Y /N |
553 | Y | Username | Client API Key (Replaces tag 9407) |
554 | Y | Password | Client API passphrase |
1137 | Y | DefaultApplVerID | Must be 9 (FIX 5.0 SP2) |
9406 | Y | DropCopyFlag | Must be N |
10 | Y | CheckSum | Checksum |
- 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 requestTag | Req | Name | Description |
---|---|---|---|
262 | Y | MDReqID | Client unique identifier for market data request |
263 | Y | SubscriptionRequestType | 0 = Snapshot only1 = Snapshot+Updates (Subscribe)2 = Disable previous Snapshot+Update (Unsubscribe) |
264 | Y | MarketDepth | 0 = Full depth (L2)1 = Top of bookN >1 = Report best N price tiers of data |
265 | N | MDUpdateType | Required if SubscriptionRequestType <263> = 1 :0 = Snapshot+Updates1 = Updates only |
267 | Y | NoMDEntryTypes | Number of MDEntryType <269> fields requested |
↳269 | Y | MDEntryType | 0 = Bid1 = Offer2 = Trade4 = Open5 = Close7 = High8 = LowB = Volume |
146 | Y | NoRelatedSym | Number of Symbols <55> requested |
↳55 | Y | Symbol | Repeating group of symbols for which the client requests market data |
MarketDataRequestReject (Y)
Sent by the server in case the MarketDataRequest (V) failsTag | Req | Name | Description |
---|---|---|---|
262 | Y | MDReqID | Client unique identifier for market data request |
281 | Y | MDReqRejReason | See MDReqRejReason table |
58 | N | Text | User friendly error message |
MDReqRejReason
Possible values for MDReqRejReason (see MarketDataRequestReject (Y))Value | Description |
---|---|
0 | Unknown symbol |
1 | Duplicate MDReqID |
2 | Insufficient bandwidth |
3 | Insufficient permission |
4 | Invalid SubscriptionRequestType <263> |
5 | Invalid MarketDepth <264> |
6 | Unsupported MDUpdateType <267> |
7 | Other |
8 | Unsupported MDEntryType <269> |
MarketDataSnapshotFullRefresh (W)
Sent by the server to view a new stream of market data informationTag | Req | Name | Description |
---|---|---|---|
262 | Y | MDReqID | Client unique identifier for market data request |
55 | Y | Symbol | The trading pair from MarketDataRequest |
268 | Y | NoMDEntries | Number of market data updates in snapshot |
911 | Y | TotNumReports | Total number of reports being sent in response to a single request |
963 | Y | ReportID | Unique identifier of the report itself |
↳269 | Y | MDEntryType | 0 = Bid1 = Offer2 = Trade4 = Open5 = Close7 = High8 = LowB = Volume |
↳278 | Y | MDEntryID | Unique identifier for this market data entry |
↳83 | Y | RptSeq | Public sequence number for each entry in the snapshot by symbol |
↳270 | N | MDEntryPx | Price of the market data entry (Not present if MDEntryType = B ) |
↳271 | N | MDEntrySize | Volume represented by the market data entry (Not present if MDEntryType = 4 , 5 , 7 , or 8 ) |
↳272 | Y | MDEntryDate | Date of the market data entry |
↳2446 | N | AggressorSide | If MDEntryType = 2 (Trade), the side of the order:1 = Buy2 = Sell |
↳273 | Y | MDEntryTime | Time of the market data entry |
↳453 | N | NoPartyIDs | Only present if MdEntryType = 2 (Trade). Will always be 1 |
↳↳448 | N | PartyID | Market Identifier Code (MIC) for Venue |
↳↳447 | N | PartyIDSource | Will always be G , Market Identifier Code (MIC) |
↳↳452 | N | PartyRole | Will always be 73 , Execution Venue |
MarketDataIncrementalRefresh (X)
Sent by the server to view updates to an existing streamTag | Req | Name | Description |
---|---|---|---|
262 | Y | MDReqID | Client unique identifier for market data request |
55 | Y | Symbol | The trading pair from MarketDataRequest |
268 | Y | NoMDEntries | Number of market data updates in snapshot |
↳279 | Y | MDUpdateAction | Type of entry update:0 = NEW1 = CHANGE2 = DELETE |
↳269 | Y | MDEntryType | 0 = Bid1 = Offer2 = Trade4 = Open5 = Close7 = High8 = LowB = Volume |
↳278 | Y | MDEntryID | Unique identifier for this market data entry |
↳83 | Y | RptSeq | Public sequence number for each entry in the snapshot by symbol |
↳270 | N | MDEntryPx | Price of the market data entry (Not present if MDEntryType = B ) |
↳271 | N | MDEntrySize | Volume represented by the market data entry (Not present if MDEntryType = 4 , 5 , 7 , or 8 ) |
↳272 | Y | MDEntryDate | Date of the market data entry |
↳2446 | N | AggressorSide | If MDEntryType = 2 (Trade), the side of the order:1 =Buy2 =Sell |
↳273 | Y | MDEntryTime | Time of the market data entry |
↳453 | N | NoPartyIDs | Only present if MdEntryType = 2 (Trade). Will always be 1 |
↳↳448 | N | PartyID | Market Identifier Code (MIC) for Venue |
↳↳447 | N | PartyIDSource | Will always be G , Market Identifier Code (MIC) |
↳↳452 | N | PartyRole | Will always be 73 , Execution Venue |
SecurityStatus (f)
Sent by the server once when an existing stream fails, and once when it reconnectsTag | Req | Name | Description |
---|---|---|---|
55 | Y | Symbol | Symbol |
326 | Y | SecurityTradingStatus | 3 =Resume999 =Market data feed temporarily unavailable |
58 | Y | Text | Market 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
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: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 ParametersPrime 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