FIX Taker API
Logon
FIX 4.4 Client -> Ripple
This message is sent to initiate a FIX session and establishes the communication session, authenticates the connecting client, and initializes the message sequence number.
8=FIX.4.4|9=79|35=A|49=cc11|56=cs1|34=1|52=20221031-07:40:55|98=0|108=20|553=User1|554=123456|10=034|
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=62|35=A|34=1|49=cs1|52=20221031-07:40:55.074|56=cc11|98=0|108=20|10=039|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=58|35=A|49=cc21|56=cs1|34=1|52=20221031-07:41:49|98=0|108=20|10=102|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=62|35=A|34=1|49=cs1|52=20221031-07:41:50.005|56=cc21|98=0|108=20|10=028|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | A |
| 98 | EncryptMethod | Y | Y |
| 108 | HeartBtInt | Y | Y |
| 141 | ResetSeqNumFlag | N | Indicated that both parties of the FIX Session should reset their sequence numbers |
| 553 | Username | Y | Available only in FIX 4.4 |
| 554 | Password | Y | Available only in FIX 4.4 |
Heartbeat
This message is sent during periods of application inactivity to ensure connection validity. The receiving party should always respond with a heartbeat message.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 0 |
| 112 | TestReqID | N | Required only when the heartbeat is in response to a Test Request Message |
Test Request
This message is used to verify connectivity and synchronize sequence numbers. A test request should be responded to with a heartbeat from the recipient
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 1 |
| 112 | TestReqID | Identifier to be returned in Heartbeat response |
Logout
This message signals the normal termination of the trading session. A session terminated without a Logout message will be considered an abnormal condition.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 5 |
| 58 | Text | N |
Market Data Request
Once the logon process is complete, Market Data Requests can be sent to Ripple. Ripple will respond immediately with either a Market Data Full Refresh (35=W) message or a Market Data Request Reject message (35=Y). Only a single product can be requested in each request. The client will receive both bid and ask prices in a single message. Ripple also supports layers (also known elsewhere as price bands or tiers). Quotes containing bid prices and quantities for all layers are always streamed in the same message, as is the case for quotes containing ask prices and quantities.
This message is used to subscribe/unsubscribe to market data rate information.
FIX 4.4 Client -> Ripple subscribe
8=FIX.4.4|9=99|35=V|49=cc12|56=cs1|34=8|52=20221031-07:43:44|262=1|263=1|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=095|
FIX 4.2 Client -> Ripple subscribe
8=FIX.4.2|9=99|35=V|49=cc22|56=cs1|34=3|52=20221031-08:34:43|262=1|263=1|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=089|
FIX 4.4 Client -> Ripple Unsubscribe
8=FIX.4.4|9=99|35=V|49=cc12|56=cs1|34=7|52=20221031-08:35:17|262=1|263=2|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=097|
FIX 4.4 Client -> Ripple Unsubscribe
8=FIX.4.2|9=99|35=V|49=cc22|56=cs1|34=5|52=20221031-08:34:55|262=1|263=2|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=095|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | V |
| 262 | MDReqID | Y | Unique Market Data Request ID. This will be used in responses by Ripple or by the client to cancel a request. To unsubscribe from market data, the same ID must be sent with tag 263 = 2 |
| 263 | SubscriptionRequestType | Y | 1 – Snapshot + Updates (Subscribe) 2 – Disable Snapshot + Updates (Unsubscribe) |
| 264 | MarketDepth | Y | 0 - Full Book 1 = Top of Book |
| 265 | MDUpdateType | N | 0 - Full refresh |
| 266 | AggregatedBook | N | N - Raw prices may or may not include the liquidity provider names. |
| 267 | NoMDEntryTypes | Y | Number of MDEntryType fields being requested. 2 - bid and offer Note – please make sure to request in tag 269 both Bid and Offer. Request for a single side will be rejected!!! |
| -> 269 |
MDEntryType | Y | Market Data entries types list: 0 - Bid 1 - Offer Repeated field: 269=0, 269=1 |
| 146 | NoRelatedSym | Y | 1 ( we allow only a single asset per subscription) |
| -> 55 |
Symbol | Y | Asset - “BTC/USD” |
| -> 64 |
FutSettDate | N | Value date YYYYMMDD. Currently unused, will be used once forward is supported. |
Market Data Request Reject
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=85|35=Y|34=106|49=cs1|52=20221031-09:03:57.488|56=cc12|58=Duplicate MDReqID|262=1|281=1|10=094|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=84|35=Y|34=84|49=cs1|52=20221031-08:58:35.817|56=cc22|58=Duplicate MDReqID|262=1|281=1|10=050|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | Y |
| 262 | MDReqID | Y | The Unique ID of the received market data |
| 281 | MDReqRejReason | N | Reason for rejection 0 - Unknown Symbol 1 - Duplicate MDReqID 2 - Request not supported 3 - Insufficient Permissions |
Market Data Snapshot Full
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=710|35=W|34=8|49=cs1|52=20221031-08:35:11.416|56=cc12|55=BTC/USD|262=1|268=20|269=0|270=202.15|271=0.00000001|269=0|270=202.16|271=0.00000002|269=0|270=202.17|271=0.00000003|269=0|270=202.18|271=0.00000004|269=0|270=202.19|271=0.00000005|269=0|270=202.2|271=0.00000006|269=0|270=202.21|271=0.00000007|269=0|270=202.22|271=0.00000008|269=0|270=202.23|271=0.00000009|269=0|270=202.24|271=0.0000001|269=1|270=202.35|271=0.00000001|269=1|270=202.36|271=0.00000002|269=1|270=202.37|271=0.00000003|269=1|270=202.38|271=0.00000004|269=1|270=202.39|271=0.00000005|269=1|270=202.4|271=0.00000006|269=1|270=202.41|271=0.00000007|269=1|270=202.42|271=0.00000008|269=1|270=202.43|271=0.00000009|269=1|270=202.44|271=0.0000001|10=073|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=710|35=W|34=3|49=cs1|52=20221031-08:34:44.164|56=cc22|55=BTC/USD|262=1|268=20|269=0|270=202.15|271=0.00000001|269=0|270=202.16|271=0.00000002|269=0|270=202.17|271=0.00000003|269=0|270=202.18|271=0.00000004|269=0|270=202.19|271=0.00000005|269=0|270=202.2|271=0.00000006|269=0|270=202.21|271=0.00000007|269=0|270=202.22|271=0.00000008|269=0|270=202.23|271=0.00000009|269=0|270=202.24|271=0.0000001|269=1|270=202.35|271=0.00000001|269=1|270=202.36|271=0.00000002|269=1|270=202.37|271=0.00000003|269=1|270=202.38|271=0.00000004|269=1|270=202.39|271=0.00000005|269=1|270=202.4|271=0.00000006|269=1|270=202.41|271=0.00000007|269=1|270=202.42|271=0.00000008|269=1|270=202.43|271=0.00000009|269=1|270=202.44|271=0.0000001|10=072|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | W |
| 262 | MDReqID | Y | The Unique ID of the received market data request |
| 55 | Symbol | Y | e.g “BTC/USD” |
| 268 | NoMDEntries | Y | No. of market data updates in the message |
| -> 269 |
MDEntryType | Y | ‘0’ (Bid) ‘1’ (Offer) |
| -> 270 |
MDEntryPx | Y | Price of entry |
| -> 271 |
MDEntrySize | Y | Quantity of entry |
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=100|35=W|34=268|49=cs1|52=20230619-09:45:58.883|56=cc12|55=ETH/USD|262=1|268=0|10=184|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=100|35=W|34=268|49=cs1|52=20230619-09:45:58.883|56=cc12|55=ETH/USD|262=1|268=0|10=184|
New Order Single
A new order single message enables the client to send a request for a trade to Ripple. Ripple requires that the ClOrdID <11> be unique.
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=133|35=D|49=cc11|56=cs1|34=113|52=20221031-09:10:46|11=1598950759|21=1|55=BTC/USD|54=1|60=20221031-09:10:46|40=2|44=19123.20|38=100|59=4|10=003|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=133|35=D|49=cc21|56=cs1|34=113|52=20221031-09:11:04|11=1805964193|21=1|55=BTC/USD|54=1|60=20221031-09:11:04|40=2|44=19123.20|38=100|59=4|10=23
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | D |
| 11 | ClOrdID | Y | Client Order ID – must be unique |
| 1 | Account | N | Client Account name |
| 60 | TransactTime | Y | The transaction timestamp of the orde |
| 15 | Currency | N | The currency or coin unit that represents the quantity |
| 54 | Side | Y | 1 (Buy) 2 (Sell) |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g EUR/USD, BTC/USD, ETH/BTC |
| 38 | OrderQty | Y | The order quantity |
| 40 | OrdType | Y | 1 – Market 2 – Limit |
| 44 | Price | N | |
| 59 | TimeInForce | Y | 1 – Good Till Cancel 3 – Immediate or Cancel (Default if no value provided) 4 – Fill or Kill |
| 64 | FutSettDate (FIX 4.2) SettlDate (FIX 4.4) |
N | Value date YYYYMMDD. Required for forward Will be supported in the future. Use FutSettDate if using FIX 4.2 Use SettlDate if using FIX 4.4 |
| 126 | ExpireTime | N | Not supported in phase 1- Required for Good-Till-Date order request. Date and Time of the order expiration specified in YYYYMMDD-HH:MM:SS format. Expressed in GMT. |
Reject
This message is used by Ripple to reject any message. This can happen if the message doesn’t comply with the FIX dictionary, naming issue, or bad input.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 3 |
| 45 | RefSeqNum | Y | Integer value -reference of the rejected order header sequence number MsgSeqNum <34> |
| 371 | RefTagID | N | The tag number of the FIX field being referenced |
| 372 | RefMsgType | N | The message type (35) OF THE Fix message being referenced (e.g “D” for 35=D) |
| 373 | SessionRejectReason | N | Code to identify reason for rejection: 0 = Invalid tag number 1 = Required tag missing 2 = Tag not defined for this message type 3 = Undefined Tag 4 = Tag specified without a value 5 = Value is incorrect (out of range) for this tag 6 = Incorrect data format for value 7 = Decryption problem 8 = Signature <89> problem 9 = CompID problem 10 = SendingTime <52> accuracy problem 11 = Invalid MsgType <35> 12 = XML Validation error 13 = Tag appears more than once 14 = Tag specified out of required order 15 = Repeating group fields out of order 16 = Incorrect NumInGroup count for repeating group 17 = Non "Data" value includes field delimiter ( 99 = Other |
| 58 | Text | N | Error message text |
Execution Report
This message is used to communicate Order Ack, Order Reject, Order Fill and Order Status Responses.
- There are Four possible 35=8 responses to an order
- Ack - 150 =0
- NACK - 150=8
- Fill - partial - 150 =2/F, 39=1
- Fill - full - 150 =2/F, 39=2
For a FOK type order, there are two possible responses – as an example if the order is for 5 BTC/USD
Scenario 1 – FOK – order is not filled - CANCEL
| Sequence | Message |
|---|---|
| Cancel message is provided | Execution report (35=8) ExecType (150=4) OrdStatus (39=4) |
Scenario 2 – FOK – order is fully filled - DONE
| Sequence | Message |
|---|---|
| Full Fill message is provided for 5 BTC | Execution report (35=8) ExecType (150=2/F) OrdStatus (39=2) |
For an IOC type order, there are two additional possible responses in addition to the ones above which may happen in the case of multiple partial fills. We use the OrdStatus tag to indicate if the order is partial or fully complete – as an example if the order is for 5 BTCUSD
Scenario1 – IOC – order is fully filled - DONE
| Sequence | Message |
|---|---|
| Fill message for 2 BTC is provided | Execution report (35=8) ExecType (150=2/F) OrdStatus (39=1) |
| Cancel remaining message is provided for the remaining 3 BTC | Execution report (35=8) ExecType (150=4) OrdStatus (39=1) |
FIX 4.4 Ripple -> Client Ack
8=FIX.4.4|9=197|35=8|34=112|49=cs1|52=20221031-09:10:46.686|56=cc11|11=1598950759|14=0|15=BTC|17=1598950759|32=0|37=A010tlPyxyg|39=0|41=1598950759|44=19123.2|54=1|55=BTC/USD|60=20221031-11:10:46.686|150=0|151=100|10=012|
FIX 4.2 Ripple -> Client Ack
8=FIX.4.2|9=197|35=8|34=113|49=cs1|52=20221031-09:11:04.479|56=cc21|11=1805964193|14=0|15=BTC|17=1805964193|20=0|32=0|37=A010tlPyxyh|39=0|41=1805964193|44=19123.2|54=1|55=BTC/USD|60=20221031-11:11:04.479|150=0|151=100|10=223|
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=228|35=8|34=113|49=cs1|52=20221031-09:10:46.706|56=cc11|6=19123.2|11=1598950759|14=100|15=BTC|17=VuzGNOBG|31=19123.2|32=100|37=A010tlPyxyg|38=100|39=2|41=1598950759|44=19123.2|54=1|55=BTC/USD|60=20221031-11:10:46.706|64=202210304|150=F|151=0|10=153|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=228|35=8|34=114|49=cs1|52=20221031-09:11:04.480|56=cc21|6=19123.2|11=1805964193|14=100|15=BTC|17=CAfoHyfD|20=2|31=19123.2|32=100|37=A010tlPyxyh|38=100|39=2|41=1805964193|44=19123.2|54=1|55=BTC/USD|60=20221031-11:11:04.480|64=202210304|150=2|151=0|10=136|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 8 |
| 1 | Account | N | Counterparty account name, supported only in Direct mode (non prime broker flow) |
| 198 | SecondaryOrderID | N | Counterparty order ID, supported only in Direct mode (non prime broker flow) |
| 527 | SecondaryExecID | N | Counterparty exec ID, supported only in Direct mode (non prime broker flow) |
| 11 | ClOrdID | Y | Client Order ID |
| 37 | OrderID | Y | Ripple unique order ID for the Trade |
| 17 | ExecID | N | Ripple Execution ID. Unique ID in each execution report. case sensitive |
| 20 | ExecTransType | Y - FIX 4.2 N- FIX 4.4 |
Only applicable to Fix 4.2 0= New 1 = Cancel 2 = Correct |
| 150 | ExecType | Y | FIX 4.2 0 = New 1 = Partially Fill 2 = Fill 4 = Canceled 8 = Rejected A = Pending New 9 = Suspended I = Order Status FIX 4.4 0 = New F = Trade (partial fill or fill) 4 = Canceled 8 = Rejected A = Pending New 9 = Suspended I = Order Status |
| 39 | OrdStatus | Y | 0 = New 1 = Partially Fill 2 = Fill 4 = Canceled 8 = Rejected A = Pending New 9 = Suspended |
| 64 | FutSettDate | N | Settlement date for order fills if exists. In YYYYMMDD format (please see comment below regarding the nature of the date) |
| 15 | Currency | N | The currency or coin unit that represents the quantity |
| 40 | OrdType | N | 1 = Market 2 = Limit |
| 54 | Side | Y | 1 (Buy) 2 (Sell) |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g. EUR/USD, BTC/USD, ETH/BTC |
| 38 | OrderQty | N | Order quantity specified by the Client. Not present in Order Reject |
| 14 | CumQty | Y | The amount that has been filled so far |
| 6 | AvgPx | N | Average price of all fills on for the order |
| 31 | LastPx | N | Trade price. |
| 32 | LastQty (For Fix4.4) LastShares (For Fix4.2) |
Y | Amount bought or sold on this fill |
| 44 | Price | Y | Order price |
| 151 | LeavesQty | Y | Quantity remaining of this order |
| 60 | TransactTime | Y | The transaction timestamp of the order |
| 103 | OrdRejReason | N | Error code. Present in Order Reject |
| 58 | Text | N | Error message. Present in Order Reject |
Order Cancel Request
This message is used by the client to cancel any live order they may have. Applicable for orders of type GTC.
In case Ripple is unable to cancel the order a Cancel Rejected (35=9) message will be sent as a response.
In case Ripple was able to cancel the order an Execution Report (35=8) with status cancel for OrdStatus and ExecType (39=4, 150=0) will be sent back.
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=109|35=F|49=cc11|56=cs1|34=15|52=20240326-12:50:52|41=1598950759|11=1598950759|55=BTC/USD|60=20240326-12:50:52|37=A010tlPyxyg|10=232|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=109|35=F|49=cc11|56=cs1|34=15|52=20240326-12:50:52|41=1598950759|11=1598950759|55=BTC/USD|60=20240326-12:50:52|37=A010tlPyxyg|10=232|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | F |
| 1 | Account | N | Client Account name |
| 11 | ClOrderID | Y | Client Order ID |
| 37 | OrderID | Y | The order ID of the order to be canceled |
| 41 | OrigClOrdID | Y | Client Order ID of Order being replaced |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g. BTC/USD |
| 60 | TransactTime | Y | The transaction timestamp of the order cancel request |
Cancel Rejected
This message is used by Ripple to reject a cancel order message. This can happen if the order is already filled or is in the process of getting filled.
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=112|35=9|34=44|49=cs1|52=20240326-12:23:27.864|56=cc21|11=1598950759|37=A010tlPyxyg|39=8|41=1598950759|102=99|434=1|10=134|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=112|35=9|34=44|49=cs1|52=20240326-12:23:27.864|56=cc21|11=1598950759|37=A010tlPyxyg|39=8|41=1598950759|102=99|434=1|10=134|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 9 |
| 11 | ClOrderID | Y | Client Order ID |
| 37 | OrderID | Y | The order ID of the order to be canceled |
| 39 | OrderStatus | Y | 8=Rejected Status of the order cancel request |
| 41 | OrigClOrdID | Y | Client Order ID of Order being rejected |
| 434 | CxlRejResponseTo | Y | 1 – Order Cancel Request 2 – Order Cancel/Replace Request |
| 102 | CxlRejReason | N | 1 – Order Cancel Request 2 – Order Cancel/Replace Request |
| 58 | Text | N | Error message |
| 60 | TransactTime | Y | The transaction timestamp of the order cancel request |
Trade Capture Report
Used to report a trade between counterparties.
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=239|35=AE|34=2|49=cs1|52=20221031-09:43:02.535|56=cc11|17=s1|31=1234.56|32=0.00025|55=BTC/USD|60=20221030-10:10:28.629|75=20190824|150=F|487=0|568=HjdFFY13|571=A010tlPGF9S|748=1|912=Y|552=1|54=1|37=s3|11=123546|453=1|448=1|447=C|452=17|15=BTC|10=031
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | AE |
| 571 | TradeReportID | Y | ID for this message |
| 60 | TransactTime | Y | The transaction timestamp of the order UTC |
| 487 | TradeReportTransType | Y | 0-New |
| 75 | TradeDate | Y | Trade date in YYYYMMDD format. We use the creation date based on Transact time UTC |
| 568 | TradeRequestID | N | Request ID if the Trade Capture Report |
| 748 | TotNumTradeReports | N | Number of trade reports returned - if this report is part of a response to a Trade Capture Report Request |
| 912 | LastRptRequested | N | Indicates if this is the last report in the response to a Trade Capture Report Request |
| 150 | ExecType | N | F - Trade |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g. EUR/USD, BTC/USD, ETH/BTC |
| 31 | LastPx | Y | Price of the last fill. Only present in Fill report |
| 32 | LastQty | Y | Amount bought or sold on this fill |
| 17 | ExecID | N | Ripple Execution ID. Unique ID in each execution report |
| 527 | SecondaryExecID | N | Counterparty exec ID, supported only in Direct mode (non prime broker flow) |
| 552 | NoSides | Y | Number of sides |
| 54 | -> Side |
Y | Trading Party |
| 11 | -> ClOrdID |
Y | Order ID of the Trading party |
| 37 | -> OrderID |
Y | Ripple unique order ID for the Trade |
| 15 | -> Currency/Coin |
N | Identifies currency or coin used for price |
| 1 | -> Account |
N | Counterparty account name, supported only in Direct mode (non prime broker flow) |
| 40 | -> OrdType |
N | 1 = Market 2 = Limit |
| 198 | -> SecondaryOrderID |
N | Counterparty order ID, supported only in Direct mode (non prime broker flow) |
| 453 | -> NoPartyIDs |
N | Number of parties |
| 448 | ->-> PartyID |
N | ID of the counterparty |
| 447 | ->-> PartyIDSource |
N | C – Generally accepted market participant |
| 452 | ->-> PartyRole |
N | The role of the party 17 – Contra Firm (the counterparty) |
Request Trade Capture Report
In the event of a communication breakdown, or any other prerogative the client can send a “Request Trade Capture Report” message and include in it the Order Id for which they want to verify if a trade was created or not using ClOrdID <11>. The system will respond with AE drop copy messages for all created trades. Please note – an Order (if not of type FOK) may result in several trades and may be partially filled. The system will respond with all trades related to an order.
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=76|35=AD|49=cc11|56=cs1|34=3|52=20221031-09:43:02|568=HjdFFY13|569=1|11=123546|10=182|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | AD |
| 568 | TradeRequestID | Y | Identifier of the trade request |
| 569 | TradeRequestType | Y | 1 = Matched trades matching Criteria provided on request (parties, exec id, trade id, order id, instrument, input source, etc.) |
| 11 | ClOrdID | Y | Unique identifier for Order as assigned by the client. |
Trade Capture Report Request Ack
Indicate that no trades were found that matched the selection criteria specified on the Trade Capture Report Request (AQ).
- No Trade - In this case the AQ msg is provided with Tag 750 =1 (Completed).
- In the event that system is unable to provide a response the AQ msg is provided with Tag 750=2 (Rejected) and a reason will be provided in Tag 58
- In the event the order has been “Timed Out” the AQ msg is provided with Tag 750=0 and a reason will be provided in Tag 58 “Time out”. In this case you can continue every 5 seconds to retry the Trade capture request (AD) until a final response is received.
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=88|35=AQ|34=2|49=cs1|52=20221031-09:51:41.171|56=cc11|568=HjdFFY13|569=1|748=0|749=0|750=0|10=230
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | AQ |
| 568 | TradeRequestID | Y | Identifier of the trade request |
| 569 | TradeRequestType | Y | Type of trade capture report: 1 = Matched trades matching Criteria provided on request (parties, exec id, trade id, order id, instrument, input source, etc.) |
| 748 | TotNumTradeReports | N | Number of trade reports returned - if this report is part of a response to a Trade Capture Report Request |
| 749 | TradeRequestResult | Y | Result of trade request. Valid values: 0 = Successful (Default) 1 = Invalid or unknown instrument 2 = Invalid type of trade requested 3 = Invalid parties 4 = Invalid Transport Type requested 5 = Invalid Destination requested 8 = TradeRequestType <569> not supported 9 = Unauthorized for Trade Capture Report Request 99 = Other |
| 750 | TradeRequestStatus | Y | Status of trade request. Valid values 0 = Accepted 1 = Completed 2 = Rejected |
| 58 | Text | N | Free text |
Order Status Request
The Order Status Request message is used by the client to generate an order status message and get details about it.
- If information exists client will receive an Execution Report message with the order status and order information.
- If information is missing client will get a Business Message Reject with the reject reason.
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=90|35=H|49=cc11|56=cs1|34=16|52=20240902-08:40:11|55=BTC/USD|54=1|37=223456OID|11=223456COID|10=168
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=90|35=H|49=cc11|56=cs1|34=16|52=20240902-08:40:11|55=BTC/USD|54=1|37=223456OID|11=223456COID|10=168
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | H |
| 37 | OrderID | Y | Unique identifier for Order as assigned by Ripple on the ER (35=8) ack |
| 11 | ClOrdID | Y | Unique identifier for Order as assigned by Client on the NOS (35=D) |
| 55 | Symbol | Y | |
| 54 | Side | Y |
Error Code
| Text | Comments |
|---|---|
| Market Data Request (35=V) | |
| Unsupported MDEntryType | Unknown side |
| Only Bid and Offer subscription allowed | |
| Unsupported MDEntryType, only two side are allowed | Only Bid and Offer subscription is allowed |
| Unknown symbol | |
| Symbol has an active subscription | Duplicate symbol subscription |
| Duplicate MDReqID | |
| Unsupported SubscriptionRequestType | Tag 263 |
| Order Status Request (35=H) | |
| Was unable to locate data for order ID | |
| Unknown order ID | |
| Server ERROR | |
| New Order Single (35=D) | |
| SetTimeInForce, not supported | |
| SetTimeInForce, is missing | |
| OrderQty must be greater than zero | |
| Missing OrderQty | Amount is missing |
| Price must be greater than zero | |
| Missing Price | |
| Execution Report (35=8) | |
| Term currency allowed only with FOK time in force | For term orders, only TIF FOK is allowed |
| Term currency does not support the instrument | Instrument is not supported for term orders |
| Order rejected due to being received late probably due to network latency | Order latency issue |
| Order throttling exceeded | Order rate limit |
| Possible duplicate orders are not supported (validated by tag 43) | Duplicate order was sent |
| Possible duplicate orders are not supported (validated by tag 122) | Duplicate order was sent |
| Order has exceeded the allowed amount of resting orders per instrument | Exceeded the amount of allowed resting orders (TIF:GTC, GTD) |
| Amount is smaller than instrument defined minimum amount of ... | Order amount it too small |
| Amount increment is out of range. increment value for instrument | Order amount increment is wrong |
FIX Maker API
Logon
This message is sent to initiate a FIX session and establishes the communication session, authenticates the connecting Maker, and initializes the message sequence number.
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=79|35=A|49=cc11|56=cs1|34=1|52=20221031-07:40:55|98=0|108=20|553=User1|554=123456|10=034|
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=62|35=A|34=1|49=cs1|52=20221031-07:40:55.074|56=cc11|98=0|108=20|10=039|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=58|35=A|49=cc21|56=cs1|34=1|52=20221031-07:41:49|98=0|108=20|10=102|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=62|35=A|34=1|49=cs1|52=20221031-07:41:50.005|56=cc21|98=0|108=20|10=028|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | A |
| 98 | EncryptMethod | Y | Y |
| 108 | HeartBtInt | Y | Y |
| 141 | ResetSeqNumFlag | N | Indicated that both parties of the FIX Session should reset their sequence numbers |
| 553 | Username | N | Available only in FIX 4.4 |
| 554 | Password | N | Available only in FIX 4.4 |
Heartbeat
This message is sent during periods of application inactivity to ensure connection validity. The receiving party should always respond with a heartbeat message.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 0 |
| 112 | TestReqID | N | Required only when the heartbeat is in response to a Test Request Message |
Test Request
This message is used to verify connectivity and synchronize sequence numbers. A test request should be responded to with a heartbeat from recipient
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 1 |
| 112 | TestReqID | Y | Identifier to be returned in Heartbeat response |
Logout
This message signals the normal termination of the trading session. A session terminated without a Logout message will be considered an abnormal condition.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 5 |
| 58 | Text | N |
Market Data Request
Once the logon process is complete, Market Data Requests can be sent to the Maker. The Maker will respond immediately with either a Market Data Full Refresh (35=W) message or a Market Data Request Reject message (35=Y). Only a single request will be sent for each market data request. Ripple also supports layers (also known elsewhere as price bands or tiers). Quotes containing bid prices and quantities for all layers are always streamed in the same message, as is the case for quotes containing ask prices and quantities.
This message is used to subscribe/unsubscribe to market data rate information.
FIX 4.4 Ripple -> Client subscribe
8=FIX.4.4|9=99|35=V|49=cc12|56=cs1|34=8|52=20221031-07:43:44|262=1|263=1|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=095|
FIX 4.2 Ripple -> Client subscribe
8=FIX.4.2|9=99|35=V|49=cc22|56=cs1|34=3|52=20221031-08:34:43|262=1|263=1|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=089|
FIX 4.4 Ripple -> Client Unsubscribe
8=FIX.4.4|9=99|35=V|49=cc12|56=cs1|34=7|52=20221031-08:35:17|262=1|263=2|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=097|
FIX 4.4 Ripple -> Client Unsubscribe
8=FIX.4.2|9=99|35=V|49=cc22|56=cs1|34=5|52=20221031-08:34:55|262=1|263=2|264=0|146=1|55=BTC/USD|267=2|269=0|269=1|10=095|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | V |
| 262 | MDReqID | Y | Unique Market Data Request ID. This will be used in responses by Ripple or by the client to cancel a request. To unsubscribe from market data, the same ID must be sent with tag 263 = 2 |
| 263 | SubscriptionRequestType | Y | 1 – Snapshot + Updates (Subscribe) 2 – Disable Snapshot + Updates (Unsubscribe) |
| 264 | MarketDepth | Y | 0 - Full Book |
| 265 | MDUpdateType | N | 0 - Full refresh |
| 266 | AggregatedBook | N | N - Raw prices may or may not include the liquidity provider names. |
| 267 | NoMDEntryTypes | Y | Number of MDEntryType fields being requested. 2 - bid and offer Note – please make sure to request in tag 269 both Bid and Offer. Request for a single side will be rejected!!! |
| -> 269 |
MDEntryType | Y | Market Data entries types list: 0 - Bid 1 - Offer Repeated field: 269=0, 269=1 |
| 146 | NoRelatedSym | Y | 1 ( we allow only a single asset per subscription) |
| -> 55 |
Symbol | Y | Asset - “BTC/USD” |
| -> 64 |
FutSettDate | N | Value date YYYYMMDD. Currently unused, will be used once forward is supported. |
Market Data Request Reject
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=85|35=Y|34=106|49=cs1|52=20221031-09:03:57.488|56=cc12|58=Duplicate MDReqID|262=1|281=1|10=094
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=84|35=Y|34=84|49=cs1|52=20221031-08:58:35.817|56=cc22|58=Duplicate MDReqID|262=1|281=1|10=050|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | Y |
| 262 | MDReqID | Y | The Unique ID of the received market data |
| 281 | MDReqRejReason | N | Reason for rejection 0 - Unknown Symbol 1 - Duplicate MDReqID 2 - Request not supported 3 - Insufficient Permissions |
Market Data Snapshot Full
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=710|35=W|34=8|49=cs1|52=20221031-08:35:11.416|56=cc12|55=BTC/USD|262=1|268=20|269=0|270=202.15|271=0.00000001|269=0|270=202.16|271=0.00000002|269=0|270=202.17|271=0.00000003|269=0|270=202.18|271=0.00000004|269=0|270=202.19|271=0.00000005|269=0|270=202.2|271=0.00000006|269=0|270=202.21|271=0.00000007|269=0|270=202.22|271=0.00000008|269=0|270=202.23|271=0.00000009|269=0|270=202.24|271=0.0000001|269=1|270=202.35|271=0.00000001|269=1|270=202.36|271=0.00000002|269=1|270=202.37|271=0.00000003|269=1|270=202.38|271=0.00000004|269=1|270=202.39|271=0.00000005|269=1|270=202.4|271=0.00000006|269=1|270=202.41|271=0.00000007|269=1|270=202.42|271=0.00000008|269=1|270=202.43|271=0.00000009|269=1|270=202.44|271=0.0000001|10=073|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=710|35=W|34=3|49=cs1|52=20221031-08:34:44.164|56=cc22|55=BTC/USD|262=1|268=20|269=0|270=202.15|271=0.00000001|269=0|270=202.16|271=0.00000002|269=0|270=202.17|271=0.00000003|269=0|270=202.18|271=0.00000004|269=0|270=202.19|271=0.00000005|269=0|270=202.2|271=0.00000006|269=0|270=202.21|271=0.00000007|269=0|270=202.22|271=0.00000008|269=0|270=202.23|271=0.00000009|269=0|270=202.24|271=0.0000001|269=1|270=202.35|271=0.00000001|269=1|270=202.36|271=0.00000002|269=1|270=202.37|271=0.00000003|269=1|270=202.38|271=0.00000004|269=1|270=202.39|271=0.00000005|269=1|270=202.4|271=0.00000006|269=1|270=202.41|271=0.00000007|269=1|270=202.42|271=0.00000008|269=1|270=202.43|271=0.00000009|269=1|270=202.44|271=0.0000001|10=072|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | W |
| 262 | MDReqID | Y | The Unique ID of the received market data request |
| 55 | Symbol | Y | e.g “BTC/USD” |
| 268 | NoMDEntries | Y | No. of market data updates in the message |
| -> 269 |
MDEntryType | Y | ‘0’ (Bid) ‘1’ (Offer) |
| -> 270 |
MDEntryPx | Y | Price of entry |
| -> 271 |
MDEntrySize | Y | Quantity of entry |
New Order Single
A new order single message enables Ripple to send a request for a trade to the Maker. Ripple will provide a unique ClOrdID <11>.
FIX 4.4 Ripple -> Client
8=FIX.4.4|9=133|35=D|49=cc11|56=cs1|34=113|52=20221031-09:10:46|11=1598950759|21=1|55=BTC/USD|54=1|60=20221031-09:10:46|40=2|44=19123.20|38=100|59=4|10=003|
FIX 4.2 Ripple -> Client
8=FIX.4.2|9=133|35=D|49=cc21|56=cs1|34=113|52=20221031-09:11:04|11=1805964193|21=1|55=BTC/USD|54=1|60=20221031-09:11:04|40=2|44=19123.20|38=100|59=4|10=236|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | D |
| 11 | ClOrdID | Y | Client Order ID – must be unique. case sensitive |
| 1 | Account | N | Client Account name |
| 60 | TransactTime | Y | The transaction timestamp of the orde |
| 15 | Currency | N | The currency or coin unit that represents the quantity |
| 54 | Side | Y | 1 (Buy) 2 (Sell) |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g EUR/USD, BTC/USD, ETH/BTC |
| 38 | OrderQty | Y | The order quantity |
| 40 | OrdType | Y | 1 – Market 2 – Limit |
| 44 | Price | Y | Limit price if 40=2 If 40=1 the price is required for pre trade credit check |
| 59 | TimeInForce | Y | 1 – Good Till Cancel 3 – Immediate or Cancel (Default if no value provided) 4 – Fill or Kill Note: OrdType=1 only supports TimeInForce=3 (IOC) OrdType=3 (Stop) only supports TimeInForce=1 (GTC) and 6 (GTD) |
| 64 | FutSettDate (FIX 4.2) SettlDate (FIX 4.4) |
N | Value date YYYYMMDD. Required for forward Will be supported in the future. Use FutSettDate if using FIX 4.2 Use SettlDate if using FIX 4.4 |
| 126 | ExpireTime | N | Not supported in phase 1- Required for Good-Till-Date order request. Date and Time of the order expiration specified in YYYYMMDD-HH:MM:SS format. Expressed in GMT. |
Reject
This message is used by Ripple to reject any message. This can happen if the message doesn’t comply with the FIX dictionary, naming issue, or bad input.
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 3 |
| 45 | RefSeqNum | Y | Integer value -reference of the rejected order header sequence number MsgSeqNum <34> |
| 371 | RefTagID | N | The tag number of the FIX field being referenced |
| 372 | RefMsgType | N | The message type (35) OF THE Fix message being referenced (e.g “D” for 35=D) |
| 373 | SessionRejectReason | N | Code to identify reason for rejection: 0 = Invalid tag number 1 = Required tag missing 2 = Tag not defined for this message type 3 = Undefined Tag 4 = Tag specified without a value 5 = Value is incorrect (out of range) for this tag 6 = Incorrect data format for value 7 = Decryption problem 8 = Signature <89> problem 9 = CompID problem 10 = SendingTime <52> accuracy problem 11 = Invalid MsgType <35> 12 = XML Validation error 13 = Tag appears more than once 14 = Tag specified out of required order 15 = Repeating group fields out of order 16 = Incorrect NumInGroup count for repeating group 17 = Non "Data" value includes field delimiter ( 99 = Other |
| 58 | Text | N | Error message text |
Execution Report
This message is used to communicate Order Ack, Order Reject, Order Fill, Order canceled and Order Status Responses
- There are Four possible 35=8 responses to an order
- Ack - 150 =0
- NACK - 150=8
- Fill - partial - 150 =2/F, 39=1
- Fill - full - 150 =2/F, 39=2
For a FOK type order, there are two possible responses – as an example if the order is for 5 BTC/USD
Scenario 1 – FOK – order is not filled - CANCEL
| Sequence | Message |
|---|---|
| Cancel message is provided | Execution report (35=8) ExecType (150=4) OrdStatus (39=4) |
Scenario 2 – FOK – order is fully filled - DONE
| Sequence | Message |
|---|---|
| Full Fill message is provided for 5 BTC | Execution report (35=8) ExecType (150=2/F) OrdStatus (39=2) |
For an IOC type order, there are two additional possible responses in addition to the ones above which may happen in the case of multiple partial fills. We use the OrdStatus tag to indicate if the order is partial or fully complete – as an example if the order is for 5 BTC/USD
Scenario1 – IOC – order is fully filled - DONE
| Sequence | Message |
|---|---|
| Fill message for 2 BTC is provided | Execution report (35=8) ExecType (150=2/F) OrdStatus (39=1) |
| Cancel remaining message is provided for the remaining 3 BTC | Execution report (35=8) ExecType (150=4) OrdStatus (39=1) |
FIX 4.4 Client -> Ripple Ack
8=FIX.4.4|9=197|35=8|34=112|49=cs1|52=20221031-09:10:46.686|56=cc11|11=1598950759|14=0|15=BTC|17=1598950759|32=0|37=A010tlPyxyg|39=0|41=1598950759|44=19123.2|54=1|55=BTC/USD|60=20221031-11:10:46.686|150=0|151=100|10=012|
FIX 4.2 Client -> Ripple Ack
8=FIX.4.2|9=197|35=8|34=113|49=cs1|52=20221031-09:11:04.479|56=cc21|11=1805964193|14=0|15=BTC|17=1805964193|20=0|32=0|37=A010tlPyxyh|39=0|41=1805964193|44=19123.2|54=1|55=BTC/USD|60=20221031-11:11:04.479|150=0|151=100|10=223|
FIX 4.4 Client -> Ripple
8=FIX.4.4|9=228|35=8|34=113|49=cs1|52=20221031-09:10:46.706|56=cc11|6=19123.2|11=1598950759|14=100|15=BTC|17=VuzGNOBG|31=19123.2|32=100|37=A010tlPyxyg|38=100|39=2|41=1598950759|44=19123.2|54=1|55=BTC/USD|60=20221031-11:10:46.706|64=202210304|150=F|151=0|10=153|
FIX 4.2 Client -> Ripple
8=FIX.4.2|9=228|35=8|34=114|49=cs1|52=20221031-09:11:04.480|56=cc21|6=19123.2|11=1805964193|14=100|15=BTC|17=CAfoHyfD|20=2|31=19123.2|32=100|37=A010tlPyxyh|38=100|39=2|41=1805964193|44=19123.2|54=1|55=BTC/USD|60=20221031-11:11:04.480|64=202210304|150=2|151=0|10=136|
| Tag | Name | Mandatory | Description |
|---|---|---|---|
| 35 | MsgType | Y | 8 |
| 1 | Account | N | Client Account Name |
| 11 | ClOrdID | Y | Client Order ID |
| 37 | OrderID | Y | Ripple unique order ID for the Trade |
| 17 | ExecID | Y | Ripple Execution ID. Unique ID in each execution report |
| 20 | ExecTransType | Y - FIX 4.2 N- FIX 4.4 |
Only applicable to Fix 4.2 0= New 1 = Cancel 2 = Correct |
| 150 | ExecType | Y | FIX 4.2 0 = New 1 = Partially Fill 2 = Fill 4 = Canceled 8 = Rejected FIX 4.4 0 = New F = Trade (partial fill or fill) 4 = Canceled 8 = Rejected |
| 39 | OrdStatus | Y | 0 = New 1 = Partially Fill 2 = Fill 4 = Canceled 8 = Rejected |
| 64 | FutSettDate | N | Settlement date for order fills if exists. In YYYYMMDD format |
| 15 | Currency | N | The currency or coin unit that represents the quantity |
| 54 | Side | Y | 1 (Buy) 2 (Sell) |
| 55 | Symbol | Y | The Asset - Coin and currency combination, e.g. EUR/USD, BTC/USD, ETH/BTC |
| 38 | OrderQty | N | Order quantity specified by the Client. Not present in Order Reject |
| 14 | CumQty | Y | The amount that has been filled so far |
| 6 | AvgPx | N | Average price of all fills on for the order |
| 31 | LastPx | N | Trade price. |
| 32 | LastQty (For Fix4.4) LastShares (For Fix4.2) |
Y | Amount bought or sold on this fill |
| 44 | Price | Y | Order price |
| 151 | LeavesQty | Y | Quantity remaining of this order |
| 60 | TransactTime | Y | The transaction timestamp of the order |
| 103 | OrdRejReason | N | Error code. Present in Order Reject |
| 58 | Text | N | Error message. Present in Order Reject |
Websocket API Signature
Signature needs to be generated at the time of login request. It can be generated using the following steps:
- Generate a string by concatenating password and constant string "/verify"
- Signature would be Base64 encoded hash of the above string generates using HMAC SHA256 algorithm.
Java code sample
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class SignatureDemo {
public static String getSign(String passPhrase, long timeStamp) {
try {
String stringToHashAndEncode = timeStamp + "/verify";
Mac sha256HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(passPhrase.getBytes(), "HmacSHA256");
sha256HMAC.init(secretKeySpec);
String hash = Base64.getEncoder().encodeToString(sha256HMAC.doFinal(stringToHashAndEncode.getBytes()));
return hash;
} catch (Throwable t) {
return null;
}
}
public static void main(String[] args) {
String signature = getSign("UfawYizemLAHMyAezkYQqLtQ3uJ9UQaXXJg6vrvL", System.currentTimeMillis());
System.out.println("Signature : " + signature);
}
}
Python Example
import hashlib
import hmac
import base64
string_to_hash_and_encode = timeStamp + "/verify"
hash_obj = hmac.new(secret_key, message, hashlib.sha256)
hash_value = base64.b64encode(hash_obj.digest()).decode("utf-8")
shell Example
getSign() {
local passPhrase=$1
local timeStamp=$2
local stringToHashAndEncode="${timeStamp}/verify"
local hash
hash=$(echo -n "$stringToHashAndEncode" | openssl dgst -sha256 -hmac "$passPhrase" -binary | base64)
}
# Example usage:
passPhrase="UfawYizemLAHMyAezkYQqLtQ3uJ9UQaXXJg6vrvL"
timeStamp="1695616595908"
result=$(getSign "$passPhrase" "$timeStamp")
echo "Result: $result"
Websocket Maker API
Login
Client -> Ripple.
Both market and trade session needs to be authenticated before any requests can be made.
Request parameters
Request
{
"op": "logon",
"arg": {
"apiKey": "User1",
"sign": "7L+zFQ+CEgGu5rzCj4+BdV2/uUHGqddA9pI6ztsRRPs=",
"server": "cs1",
"client": "cc11"
},
"ts": 1667835722651
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation logon |
| arg | Object | Yes | Login details |
| -> apiKey |
String | Yes | API Key |
| -> sign |
String | Yes | |
| -> server |
String | Yes | Server id |
| -> client |
String | Yes | Client id |
| ts | Long | Yes | Unix epoch time |
Response
Success Response
{
"op": "logon",
"arg": {
"code": 0
},
"ts": 1682346263287
}
Error response
{
"op": "logon",
"arg": {
"code": 50104,
"errMsg": "Invalid credentials"
},
"ts": 1682346263287
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation logon |
| arg | Object | Yes | Login details |
| -> code |
Integer | Yes | 0 - success non zero for failure |
| -> errMsg |
String | no | Error message, populated only in case of error |
| ts | Long | Yes | Unix epoch time |
Ping
Client -> Ripple.
To keep the connection alive client needs to send a heartbeat message ping once every 30 seconds. If no heartbeat message is received for 30 seconds connection will be dropped.
Request
{
"op": "ping"
}
Response
{
"op": "ping"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation ping |
Subscription
Ripple -> Client.
Subscription request sent from Ripple to Maker. this message will be used for both subscribe and unsubscribe instrument.
Request parameter
Request subscribe
{
"op": "subscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0,
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"aggBook": "0"
},
"ts": 1667835722651
}
Request subscribe RFQ
{
"op": "rfqsubscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0.1,
"subscriptionRequestType": "rfqsnapshot",
"typeBook": "SPOT",
"aggBook": "0"
},
"ts": 1667835722651
}
Request unsubscribe
{
"op": "unsubscribe",
"arg": {
"instrument": "ETH/USD",
"subscriptionId": "123456",
"quantity" : 0,
"typeBook": "SPOT"
},
"ts": 1667835722651
}
Request unsubscribe RFQ
{
"op": "rfqunsubscribe",
"arg": {
"instrument": "ETH/USD",
"subscriptionId": "123456",
"quantity" : 0.1,
"typeBook": "SPOT"
},
"ts": 1667835722651
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe subscription values: subscribe, rfqsubscribe |
| arg | Object | Yes | Operation subscribe |
| -> |
String | Yes | Instrument name |
| -> |
String | Yes | side, possible value: BOTH |
| -> |
String | Yes | Unique Market Data Request ID |
| -> |
String | Yes | Subscription type, values: snapshot, rfqsnapshot |
| -> quantity |
double | Yes | For RFQ subscription (see rfqsubscribe under op) a quantity is expected, otherwise value should be 0 |
| -> |
String | Yes | Type of book, values: SPOT |
| -> |
int | Yes | always No (0) |
| ts | Long | Yes | Unix epoch time |
Response parameter
Acknowledgement success response
{
"op": "subscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0,
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"code" : 0
},
"ts": 1667835722651
}
Acknowledgement failure response
{
"op": "subscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0,
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"code" : 50202,
"errMsg" : "Unknown symbol"
},
"ts": 1667835722651
}
Acknowledgement failure response RFQ
{
"op": "rfqsubscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0.1,
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"code" : 50202,
"errMsg" : "Unknown symbol"
},
"ts": 1667835722651
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe subscription values: subscribe, rfqsubscribe |
| arg | Object | Yes | subscription details |
| -> instrument |
String | Yes | Instrument name |
| -> side |
String | Yes | side, possible value: BOTH |
| -> subscriptionId |
String | Yes | Unique Market Data Request ID, echoed back from subscribe |
| -> subscriptionRequestType |
String | Yes | Subscription type echoed back from subscribe, values: snapshot |
| -> typeBook |
String | Yes | Type of book echoed back from subscribe, values: SPOT |
| -> quantity |
double | No | For RFQ subscription (see rfqsubscribe under op) a quantity is expected, otherwise value should be 0 |
| -> code |
Integer | Yes | Zero for success, non-zero in case of failure, refer error codes table for standard error. In case of a missing error code, any-non zero value is accepted |
| -> errMsg |
String | No | To be populate in case of failure only. Standard error defined in the table. In case of missing error code custom error message is accepted |
| ts | Long | Yes | Unix epoch time |
Market Data
Client -> Ripple.
For snapshot message, Ripple won’t send an acknowledgement.
snapshot
{
"op": "snapshot",
"arg": {
"instrument": "BTC/USD",
"subscriptionId": "123456",
"ttl": "0"
},
"data": [
{
"bids": [
[191235,1],
[191234,2],
[191233,3],
[191232,4],
[191231,5]
],
"asks": [
[201231,1],
[201232,2],
[201233,3],
[201234,4],
[201235,5]
]
}
],
"ts": "1667835722653"
}
RFQ snapshot
{
"op": "rfqsnapshot",
"arg": {
"instrument": "BTC/USD",
"subscriptionId": "123456",
"ttl": "600"
},
"data": [
{
"bids": [
[191235,1]
],
"asks": [
[201231,1]
]
}
],
"ts": 1667835722653
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation values: snapshot, rfqsnapshot |
| arg | Object | Yes | snapshot details |
| -> instrument |
String | Yes | Instrument name |
| -> subscriptionId |
String | Yes | Subscription Id as configured on subscribe |
| -> ttl |
String | Yes | time to live in milliseconds, only for RFQ, otherwise 0 |
| data | Array | Yes | List of items |
| --> bids |
Array of double | Yes | List of double, first parameter is price, second quantity |
| --> asks |
Array of double | Yes | List of double, first parameter is price, second quantity |
| ts | Long | Yes | Unix epoch time |
Order
Ripple -> Client.
Request
Order create request sent from Ripple
{
"op": "order",
"arg": {
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "VeYQxMUFGdtljI",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 2.0,
"price": 201232.0
},
"ts": 1682422430612
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation order |
| arg | Object | Yes | Order details |
| -> instrument |
String | Yes | Instrument name |
| -> side |
String | Yes | Side of the order. Values: BUY SELL |
| -> clOrderId |
String | Yes | Order id |
| -> orderType |
String | Yes | Type of order. Values: LIMIT MARKET |
| -> tif |
String | Yes | Time in force. Values: FOK IOC |
| -> account |
String | No | Counterparty account name, supported only in Direct mode (non-prime broker flow) could be null |
| -> quantity |
Double | Yes | Order quantity |
| -> price |
Double | Yes | Order price |
| ts | Long | Yes | Unix epoch time |
Response (Acknowledgement)
Order acknowledgement success response
{
"op": "order",
"arg": {
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "VeYQxMUFGdtljI",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 2.0,
"price": 201232.0,
"code" : 0
},
"ts": 1682422430612
}
Order Single acknowledgement failure response
{
"op": "order",
"arg": {
"instrument": "BT/USD",
"side": "BUY",
"clOrderId": "VeYQxMUFGdtljI",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 2.0,
"price": 201232.0,
"code" : 50202,
"errMsg": "Unknown symbol"
},
"ts": 1682422430612
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation order |
| arg | Object | Yes | Order details |
| -> instrument |
String | Yes | Instrument name |
| -> side |
String | Yes | Side of the order. Values: BUY SELL |
| -> clOrderId |
String | Yes | Order id, Echoed back |
| -> orderType |
String | Yes | Type of order. Values: LIMIT MARKET |
| -> tif |
String | Yes | Time in force. Values: FOK IOC |
| -> account |
String | No | Counterparty account name, supported only in Direct mode (non-prime broker flow) could be null |
| -> quantity |
Double | Yes | Order quantity |
| -> price |
Double | Yes | Order price |
| -> code |
Integer | Yes | Zero for success, non zero in case of failure, refer error codes table for standard error. In case of a missing error code, any-non zero value is accepted |
| -> errMsg |
String | No | To be populate in case of failure only. Standard error defined in the table. In case of missing error code custom error message is accepted |
| ts | Long | Yes | Unix epoch time |
Trade
Client -> Ripple
{
"op": "trade",
"arg": {
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "uNQMAdtbxnVGJi",
"orderId": "DF34rfswe32",
"tradeId": "sada24DSGF",
"orderType": "FOK",
"state": "FILLED",
"account": "tag1",
"quantity": 2,
"cumQty": 1,
"lastQty": 1,
"leaveQty": 0,
"price": 201232
},
"ts": 1667835722653
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation trade |
| arg | Object | Yes | Trade details |
| -> instrument |
String | Yes | Instrument name |
| -> side |
String | Yes | Side of the order. Values : BUY SELL |
| -> clOrderId |
String | Yes | client order id, Echoed back from order |
| -> orderId |
String | Yes | Order id |
| -> tradeId |
String | Yes | Trade id |
| -> orderType |
String | Yes | Type of order. Values: LIMIT MARKET |
| -> tif |
String | Yes | Time in force. Values: FOK IOC |
| -> state |
String | Yes | Order status. Values: FILLED PARTIALLY_FILLED REJECTED CANCELED |
| -> quantity |
Double | Yes | Quantity |
| -> cumQty |
Double | Yes | Cumulative quantity |
| -> lastQty |
Double | Yes | Last quantity |
| -> leaveQty |
Double | Yes | Leaves quantity |
| -> price |
Double | Yes | Price |
| -> account |
String | No | Counterparty account name, supported only in Direct mode (non-prime broker flow) could be null |
| ts | Long |
Websocket Taker API
Login
Client -> Ripple.
Both market and trade session needs to be authenticated before any requests can be made.
Request parameters
Request
{
"op": "logon",
"arg": {
"apiKey": "User1",
"sign": "7L+zFQ+CEgGu5rzCj4+BdV2/uUHGqddA9pI6ztsRRPs=",
"server": "cs1",
"client": "cc11"
},
"ts": 1667835722651
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation logon |
| arg | Object | Yes | Login details |
| -> apiKey |
String | Yes | API Key |
| -> sign |
String | Yes | |
| -> server |
String | Yes | Server id |
| -> client |
String | Yes | Client id |
| ts | Long | Yes | Unix epoch time |
Response
Success Response
{
"op": "logon",
"arg": {
"code": 0
},
"ts": 1682346263287
}
Error response
{
"op": "logon",
"arg": {
"code": 50104,
"errMsg": "Invalid credentials"
},
"ts": 1682346263287
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation logon |
| arg | Object | Yes | Login details |
| -> code |
Integer | Yes | 0 - success non zero for failure |
| -> errMsg |
String | no | Error message, populated only in case of error |
| ts | Long | Yes | Unix epoch time |
Ping
Client -> Ripple.
To keep the connection alive client needs to send a heartbeat message ping once every 30 seconds. If no heartbeat message is received for 30 seconds connection will be dropped.
Rate limit : 1 request per 15 seconds Connection dropped in case of rate limit breach.
Request
{
"op": "ping"
}
Response
{
"op": "ping"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation ping |
Subscribe
Client -> Ripple.
Client will subscribe to desired instruments to be able to retrieve a stream of market data.
Request Example
{
"op": "subscribe",
"arg": {
"instrument": "BTC/USD",
"side": "BOTH",
"subscriptionId": "FhervfD",
"quantity" : 0,
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"aggBook": 0,
"marketDepth":0
},
"ts": 1667835722651
}
Request subscribe RFQ
{
"op": "rfqsubscribe",
"arg": {
"instrument": "ETH/USD",
"side": "BOTH",
"subscriptionId": "123456",
"quantity" : 0.1,
"subscriptionRequestType": "rfqsnapshot",
"typeBook": "SPOT",
"aggBook": "0",
"marketDepth":0
},
"ts": 1667835722651
}
Success Response Example
{
"op": "subscribe",
"arg":
{
"instrument": "BTC/USD",
"side": "BOTH",
"subscriptionId": "FhervfD",
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"aggBook": 0,
"marketDepth": 0,
"code": 0
},
"ts": 1667835722651
}
Error response Example
{
"op": "subscribe",
"arg":
{
"instrument": "BTC/USD",
"side": "BOTH",
"subscriptionId": "FhervfD",
"subscriptionRequestType": "snapshot",
"typeBook": "SPOT",
"aggBook": 0,
"marketDepth": 0,
"errMsg": "Duplicate market data request symbol",
"code": 50206
},
"ts": 1667835722651
}
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe |
| arg | Object | Yes | Subscription details |
| -> instrument |
String | Yes | Instrument id |
| -> side |
String | Yes | Side for subscription. Values BOTH |
| -> subscriptionId |
String | Yes | Unique subscription id |
| -> subscriptionRequestType |
String | Yes | Subscription type. Values: snapshot |
| -> quantity |
double | Yes | For RFQ subscription (see rfqsubscribe under op) a quantity is expected, otherwise value should be 0 |
| -> typeBook |
String | Yes | Type of book. Values: Spot |
| -> aggBook |
Integer | Yes | Aggregate book. Values: 0 for false 1 for true |
| -> marketDepth |
Integer | Yes | Market Depth. Values: 0 1 |
| ts | Long | Yes | Unix epoch time |
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe |
| arg | Object | Yes | Subscription details |
| -> instrument |
String | Yes | Instrument id |
| -> side |
String | Yes | Side for subscription. Values BOTH |
| -> subscriptionId |
String | Yes | Unique subscription id |
| -> subscriptionRequestType |
String | Yes | Subscription type. Values: snapshot |
| -> typeBook |
String | Yes | Type of book. Values: Spot |
| -> aggBook |
Integer | Yes | Aggregate book. Values: 0 for false 1 for true |
| -> marketDepth |
Integer | Yes | Market Depth. Values: 0 1 |
| -> code |
Integer | Yes | Zero for success, non zero for failure |
| -> errMsg |
String | No | Error message, populated only in case of error |
| ts | Long | Yes | Unix epoch time |
Unsubscribe
Client -> Ripple.
To stop receiving market data unsubscribe call for the product needs to be made. Taker sends the below request to Ripple.
Request Example
{
"op": "unsubscribe",
"arg": {
"subscriptionId": "FhervfD",
"instrument": "BTC/USD",
"typeBook": "SPOT"
},
"timestamp": 1667835722653
}
Success Response Example
{
"op": "unsubscribe",
"arg":
{
"subscriptionId": "FhervfD",
"instrument": "BTC/USD",
"typeBook": "SPOT",
"code": "0"
},
"ts": 1706601058528
}
Error response Example
{
"ts": 1667835722653,
"op": "unsubscribe",
"arg":
{
"subscriptionId": "FhervfD",
"instrument": "BTC/USD",
"typeBook": "SPOT",
"errMsg": "Invalid subscription id",
"code": 50251
}
}
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe |
| arg | Object | Yes | Subscription details |
| -> instrument |
String | Yes | Instrument id |
| -> subscriptionId |
String | Yes | Unique subscription id |
| -> typeBook |
String | Yes | Type of book. Values: Spot |
| ts | Long | Yes | Unix epoch time |
Response
| Parameter | Type | Description |
|---|---|---|
| op | String | Operation subscribe |
| arg | Object | Subscription details |
| -> instrument |
String | Instrument id |
| -> subscriptionId |
String | Unique subscription id |
| -> typeBook |
String | Type of book. Values: Spot |
| -> code |
Integer | Zero for success, non zero for failure |
| -> errMsg |
String | Error message, populated only in case of error |
| ts | Long | Unix epoch time |
Market data snapshot
Ripple -> Client.
Once client subscribed to desired instrument a stream of market data snapshot will be sent to him.
Snapshot
{
"op": "snapshot",
"arg":
{
"instrument": "BTC/USD",
"subscriptionId": "FhervfD"
},
"data":
[
{
"bids":
[
[42732.79,0.1],
[42732.78,0.2],
[42732.77,0.3],
[42732.76,0.4],
[42732.75,0.5],
[42732.74,0.6],
[42732.73,0.6],
[42732.72,0.7],
[42732.71,0.8],
[42732.70,0.9]
],
"asks":
[
[42733.70,0.1],
[42733.71,0.2],
[42733.72,0.3],
[42733.73,0.4],
[42733.74,0.5],
[42733.75,0.6],
[42733.76,0.6],
[42733.77,0.7],
[42733.78,0.8],
[42733.79,0.9]
]
}
]
}
Request parameters
| Parameter | Type | Description |
|---|---|---|
| op | String | Operation subscribe |
| arg | Object | Subscription details |
| -> instrument |
String | Instrument name |
| -> subscriptionId |
String | Unique identifier for subscription |
| data | Array | Array containing of object of bids and asks |
| -> bids |
Array | List of bids. First item is price, second item is quantity. |
| -> asks |
Array | List of asks. First item is price, second item is quantity. |
Order
Client -> Ripple.
To place an order taker sends request to Ripple.
Order
{
"op": "order",
"arg": {
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "SDfcsef35",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 100,
"price": 19123
},
"ts": 1667835722653
}
Order acknowledgement success
{
"op": "order",
"arg":
{
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "SDfcsef35",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 100.0,
"price": 19123.0,
"code": 0
},
"ts": 1706601667000
}
Order acknowledgement failure
{
"ts": 1667835722653,
"op": "order",
"arg":
{
"instrument": "BTC/USD",
"side": "B",
"clOrderId": "SDfcsef35",
"orderType": "LIMIT",
"tif": "FOK",
"account": "tag1",
"quantity": 100,
"price": 19123,
"errMsg": "Unsupported side, only BUY or SELL allowed",
"code": 50301
}
}
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation subscribe |
| arg | Object | Yes | Subscription details |
| -> instrument |
String | Yes | Instrument name |
| -> side |
String | Yes | Side of order. Values : Buy, Sell |
| -> clOrderId |
String | Yes | Unique identifier for order. |
| -> orderType |
String | Yes | Order type. Values : MARKET, LIMIT |
| -> tif |
String | Yes | Time in force for order. Values : FOK, IOC, GOOD_TILL_CANCEL |
| -> account |
String | No | Name of account |
| -> quantity |
Double | Yes | Quantity of order |
| -> price |
Double | Yes | Price |
Response
| Parameter | Type | Description |
|---|---|---|
| op | String | Operation subscribe |
| arg | Object | Subscription details |
| -> instrument |
String | Instrument name |
| -> side |
String | Side of order. Values : Buy, Sell |
| -> clOrderId |
String | Unique identifier for order. |
| -> orderId |
String | Order id generated by Ripple for the placed order. |
| -> orderType |
String | Order type. Values : MARKET, LIMIT |
| -> tif |
String | Time in force for order. Values : FOK, IOC, GOOD_TILL_CANCEL |
| -> account |
String | Name of account |
| -> quantity |
Double | Quantity of order |
| -> price |
Double | Price |
| -> code |
Integer | Zero for success, non zero for failure |
| -> errMsg |
String | Error message, populated only in case of error |
Order
Active GTC orders can be canceled by sending a cancel request to Ripple either using client order id or order id. If order cancellation succeeds a trade with canceled state will be sent to the client. If order cancellation fails order cancellation failure message will be sent to client.
Order Cancellation using client order id
{
"op": "cancel_order",
"arg":
{
"clOrderId": "f8e065c2-087e-4f22-b5b9-748ba2fed2fb",
"instrument": "BTC/USD"
},
"ts": 1667835722653
}
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation cancel_order |
| arg | Object | Yes | Order cancellation details |
| -> clOrderId |
String | Yes | Client Order id |
| -> instrument |
String | Yes | Instrument name |
Order Cancellation using order id
{
"op": "cancel_order",
"arg":
{
"orderId": "A010uoqUy4S",
"instrument": "BTC/USD"
},
"ts": 1726392007830
}
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| op | String | Yes | Operation cancel_order |
| arg | Object | Yes | Order cancellation details |
| -> orderId |
String | Yes | Order id generated by Ripple |
| -> instrument |
String | Yes | Instrument name |
Order Cancellation failure
{
"op": "cancel_order",
"arg":
{
"clOrderId": "cee79af3-8dac-4a2c-be7f-d73793f93b5d",
"orderId": "A010uoqWW5g",
"instrument": "BTC/USD",
"code": 1,
"errMsg": "Order cancellation failed for clientOrderId [cee79af3-8dac-4a2c-be7f-d73793f93b5d] error [error message]"
},
"ts": 1726392515132
}
Response parameters
| Parameter | Type | Description |
|---|---|---|
| op | String | Operation cancel_order |
| arg | Object | Order cancellation details |
| -> orderId |
String | Order id generated by Ripple |
| -> clOrderId |
String | Client Order id |
| -> instrument |
String | Instrument name |
| -> code |
String | Error code |
| -> errMsg |
String | Error message containing reason for cancellation failure |
Trade
Ripple -> Client.
As a response for an order Ripple will reply with a trade.
Request Example
{
"ts": 1706601667037,
"op": "trade",
"arg":
{
"instrument": "BTC/USD",
"side": "BUY",
"clOrderId": "SDfcsef35",
"orderId": "A010u2PAFQD",
"tradeId": "OGdjCsRA",
"orderType": "LIMIT",
"state": "FILLED",
"quantity": 100.0,
"cumQty": 100.0,
"account": "tag1",
"lastQty": 100.0,
"leaveQty": 0.0,
"lastPrice": 19123.2,
"price": 19123.2,
"avgPrice": 19123.2
}
}
Request parameters
| Parameter | Type | Description |
|---|---|---|
| op | String | Operation subscribe |
| arg | Object | Subscription details |
| -> instrument |
String | Instrument name |
| -> side |
String | Side of order. Values: Buy Sell |
| -> clOrderId |
String | Unique identifier for order. |
| -> orderId |
String | Order Id |
| -> tradeId |
String | Trade id |
| -> orderType |
String | Order type. Values: : MARKET LIMIT |
| -> state |
String | State of the order. Values: FILLED CANCELED PARTIALLY_FILLED REJECTED |
| -> quantity |
Double | Quantity of order |
| -> cumQuantity |
Double | Cumulative quantity |
| -> account |
String | Counterparty account name, supported only in Direct mode (non-prime broker flow) could be null |
| -> lastQuantity |
Double | Last quantity |
| -> leaveQuantity |
Double | Leave Quantity |
| -> lastPrice |
Double | Last Price |
| -> price |
Double | price |
| -> avgPrice |
Double | average price |
Websocket API Error Codes
| Error Code | Description |
|---|---|
| 50100 | Invalid authorization |
| 50101 | Already logged in |
| 50102 | Invalid login message |
| 50103 | Invalid credentials |
| 50201 | Invalid market data message |
| 50202 | Unknown symbol |
| 50203 | Unsupported subscription type |
| 50204 | Unsupported type book |
| 50205 | Duplicated market data request id |
| 50206 | Duplicate market data symbol |
| 50250 | Invalid market data unsubscribe message |
| 50251 | Invalid subscription id |
| 50300 | Invalid new order single message |
| 50301 | Unsupported side |
| 50302 | Invalid quantity |
| 50303 | Invalid order type |
| 50304 | Invalid time in force |
| 50305 | Missing time in force |
| 50306 | Invalid price |
| 50307 | Order throttling exceeded |
| 50308 | Invalid time stamp |
| 50400 | Invalid request |