Skip to main content
Selected spot instruments are matched on Coinbase Exchange (CBE) rather than on the Deribit matching engine. You trade them through the usual Deribit APIs, with the same authentication, the same sessions and the same instrument names, but several features behave differently or are unavailable. Derivatives are never affected, including derivatives on the same currency pair. A routed spot instrument does not change anything about the futures, perpetuals or options quoted in the same currencies. This article covers both the JSON-RPC and WebSocket API and the FIX API. Where the two differ only in spelling, the rule is stated once and the FIX tag values are given alongside it.

Identifying routed instruments

public/get_instrument and public/get_instruments return is_cbe_routed: true, and its alias is_csr: true, for routed spot instruments:
Both fields are omitted entirely for every other instrument, so test for their presence rather than for a false value. Routed spot instruments also omit block_trade_commission, block_trade_tick_size and block_trade_min_trade_amount, because block trading is not available on them. Which pairs are routed is a configuration decision that can change, so read the flag from the instrument metadata instead of maintaining your own list. The instrument.creation.{kind}.{currency} and instrument.state.{kind}.{currency} notifications carry is_csr only; the is_cbe_routed alias is added by the two instrument methods above. On FIX there is no routing flag in the reference data. Security List(y) returns routed instruments as ordinary FXSPOT entries, so identify them through the JSON-RPC methods above.

Order entry

JSON-RPC

The restrictions below apply to private/buy, private/sell, private/edit and private/edit_by_label. Cancelling works normally. private/cancel, private/cancel_all_by_instrument and the other cancel methods accept routed spot orders, including untriggered stop-limit orders.

FIX

The same restrictions apply to New Order Single(D) and Order Cancel/Replace Request(G).

Post-only

Unlike native Deribit post-only, the price of a routed post-only order is never adjusted into the spread. The order is either placed unmodified or rejected, which is why reject_post_only: trueExecInst(18)=6A on FIX — is mandatory whenever post-only is requested. A post-only order without it is rejected with post_only_not_allowed (11055). If the order would match on arrival, it is rejected with post_only_reject (11054), the same as on the native matching engine.

Restrictions shared with all spot instruments

Some of the limitations above are not specific to routing and apply to every spot instrument, routed or not. good_til_day is rejected for all spot orders, as are reduce_only and mmp. On JSON-RPC these come back as Invalid params (-32602) rather than as a routing-specific error code.

Errors and rejections

On JSON-RPC the error is returned in the response to the request. On FIX, rejected orders arrive as an Execution Report(8) with OrdStatus(39)=8 and the reason in Text(58). See Error codes for the full list. Code 11060 is also returned under its legacy message not_supported_for_csr_spot; treat the two as equivalent.
Fills are asynchronous. private/buy, private/sell, private/edit and private/edit_by_label — and, on FIX, the first Execution Report for the order — acknowledge the order once Coinbase has accepted it, and do not necessarily carry any fills. Subscribe to user.trades.{instrument_name}.{interval} and user.orders.{instrument_name}.{interval}, or track the subsequent Execution Reports on the FIX session, to follow execution.

Market data

Deribit only observes a match on Coinbase when one of your own orders was a party to it, so the public trade tape it could publish for a routed instrument would be incomplete. Rather than serve partial data, trade-derived methods, channels and message types are rejected. Your own fills are always complete: private/get_user_trades_by_instrument, the user.trades.* channels, and on FIX both Execution Reports and Trade Capture Report(AE), report every trade you were a party to.

Methods that return an error

These return not_supported_for_coinbase_routed_spot (11060): Requesting a derivative kind on a currency that happens to have a routed spot pair is unaffected, so kind: "future" still returns trades for that currency.

Subscriptions that are rejected

public/subscribe refuses these channels for routed instruments, reporting them as invalid channels rather than as error 11060: currency: "any" is rejected as well whenever any routed spot pair exists, so subscribe per currency, or per instrument, if you need spot trades for non-routed pairs.

FIX market data

Bid and offer snapshots and incremental updates are fed from the full Coinbase L2 book, and Security List Request(x) and Security Status Request(e) are unaffected.

Responses that omit fields

Two responses drop fields instead of returning an error:
  • public/get_trade_volumes omits spot_volume, and spot_volume_7d and spot_volume_30d under extended, for any currency that has a routed pair. The futures and options volume fields are unaffected.
  • public/ticker and the ticker.{instrument_name}.{interval} channel omit volume_notional and volume_usd from stats for routed spot. The base currency volume field is still returned.

What is unaffected

Order book data works normally, fed from the Coinbase book: public/get_order_book, public/get_order_book_by_instrument_id, public/get_book_summary_by_currency and public/get_book_summary_by_instrument, together with the book.*, quote.* and ticker.* channels.

Getting the data from Coinbase

For the full public trade tape, candles and venue volume, query Coinbase Exchange directly: