API Key Enhancements
This change will be published in mid-October 2025 We’re introducing new security and permission features for API keys:- API Key Scopes – Set fine-grained permissions:
- Endpoint-specific access (e.g., allow Get Wallet Balance but not Get Portfolio Balances)
- Category-level READ/WRITE access (e.g., all READ order endpoints only)
- Broad ALL READ / ALL WRITE access across categories
Client Order ID Idempotency
We are introducing Client Order ID (ClOrdID) idempotency across all prime trading surfaces (FIX, REST, & UI). Going forward prime trading will enforce that ClOrdIDs are unique for 24hrs, for both open and closed orders. This change will be scoped at the portfolio level. Consider the following scenario:- Client places a
NewOrderSingle (D)
withClOrdID (11) = "test-clordID-1"
- The order,
"test-clordID-1"
fills - Client places another
NewOrderSingle (D)
with the sameclordID (11) "test-clordID-1"
- This second order will be rejected with the error message:
"duplicate client order ID"
ClOrdID (11)
idempotency will continue to be enforced for open orders, scoped at the portfolio level. Financing API Upgrade
The API will be published in early-October 2025New Cross Margin Overview API
Financing is rolling out a new API to get the detailed overview for the Cross Margin product. REST Path:GET /v1/entities/<prime_entity_id>/cross_margin
Example Response Structure:
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) by default. You can request for the target validator size to be customized for your Prime Investment vehicle between 32 ETH and 2,048 ETH
- 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
Additional Fields for REST, FIX, and Websocket APIs
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
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