Skip to main content
On September 9, 2026, Coinbase Advanced is moving international derivatives from INTX onto a Deribit-powered gateway running the next-generation Starbase engine.
For the full API reference — all methods, parameters and schemas — see the Advanced Trade API reference.

HTTP API

  • The new gateway is JSON-RPC 2.0 over HTTP (and WebSocket).
# Current gateway
https://api.coinbase.com/api/v3/brokerage

# New gateway
https://drb.coinbase.com/api/v2
These are the schema changes most likely to break an existing integration.
  • Envelope. Responses follow JSON-RPC: a top-level result or error object plus the request ID, not a bare REST body.
  • Numeric values. Send prices and sizes as JSON numbers, and expect them back as JSON numbers. This differs from the Coinbase spot API, which encodes decimals as decimal strings.
  • Order size. amount is in the base coin of the instrument, or size in contract units with contracts.
  • Client order ID. Carried in the label field, not a dedicated client-order-ID field. Unlike client_order_id today, label is not guaranteed unique, so don’t rely on it as an idempotency key.
  • Instrument names. Instrument names replace the old symbol field and use a new format (see below).

WebSocket API

WebSocket now supports full order entry. Use WebSocket for trading or event-driven flows — live market data and streams of your orders, positions, and portfolio.
Every JSON-RPC HTTP method can be sent over WebSocket in addition to the dedicated streaming methods.
# Current gateway — public
wss://advanced-trade-ws.coinbase.com

# Current gateway — private
wss://advanced-trade-ws-user.coinbase.com

# New gateway — public + private
wss://drb.coinbase.com/ws/api/v2
  • One connection. The same endpoint carries public market data and your authenticated order flow. Authenticate by calling public/auth after connecting; the socket then stays authenticated, and you re-send public/auth on it before the session expires.
  • Subscriptions. Subscribe to channels by name. Market-data channels cover the order book, ticker, trades, and charts; private channels cover your orders, position changes, and portfolio.
  • Cancel on Disconnect (CoD). An opt-in safety mechanism: your orders auto-cancel if the connection drops.
  • Heartbeats. The server sends periodic test requests that your client must answer to keep the connection alive. You set the heartbeat interval from public/set_heartbeat.

Symbology

ProductCurrentNew gatewayExample
Perpetuals{BASE}-PERP-INTX{BASE}_USDC-PERPETUALBTC-PERP-INTXBTC_USDC-PERPETUAL
Options (new){BASE}-{DDMMMYY}-{STRIKE}-{C/P}BTC-25MAR26-100000-C
Dated futures (new){BASE}-{DDMMMYY}BTC-12JUN26
Discover all tradable instruments via public/get_instruments, filtering by kind (future or option).

Authentication

Keep your CDP API key. You do not need to create a separate trading account or key. Your derivatives traffic routes through the Coinbase gateway, and you authenticate with the same CDP API key you use today. What changes is the auth flow. On the new gateway you exchange your key for a short-lived access token, then send that token with each private request.
AspectCurrent APINew gateway
Key managementCDP PortalUnchanged — CDP Portal, as today
Auth flow (HTTP)Sign every requestExchange your credential once via public/auth, then carry the returned access token on each request
Auth flow (WebSocket)Sign every requestAuthenticate once via public/auth; the connection stays authenticated

Auth example

Exchange your CDP key for an access token, then trade:
// public/auth — exchange your CDP key for an access token
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "public/auth",
  "params": { "grant_type": "coinbase_cdp", "token": "<signed_cdp_jwt>" }
}

// To trade, send the returned access token in the Authorization: Bearer <access_token> header
// (for websockets the channel is authenticated, see below)
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "private/buy",
  "params": {
    "instrument_name": "BTC_USDC-PERPETUAL",
    "amount": 0.001,
    "type": "limit",
    "price": 65000.5
  }
}
CDP key authentication over HTTP
  • You create a JWT, no round-trip to Coinbase. See creating a JWT.
  • It lasts only ~120s, use a fresh JWT for every public/auth call.
  • You need to provide the Deribit access token on each private method call.
  • Refresh the Deribit access token every 15 minutes.
Tip: Send public/auth as a POST with the credential in the request body, so it stays out of URLs, browser history, and access logs. The example below shows the calls.

Attaching a Take Profit / Stop Loss (OTOCO)

The combined take-profit / stop-loss order is replaced by an entry order with two attached exit legs. Set linked_order_type to one_triggers_one_cancels_other and supply the legs in otoco_config. When the entry fills it places both exits; whichever fills first cancels the other. Each leg returns its own order ID.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "private/buy",
  "params": {
    "instrument_name": "BTC_USDC-PERPETUAL",
    "amount": 0.1,
    "type": "limit",
    "price": 60000,
    "linked_order_type": "one_triggers_one_cancels_other",
    "otoco_config": [
      { "type": "take_limit",  "direction": "sell", "amount": 0.1, "price": 65000, "trigger": "last_price" },
      { "type": "stop_market", "direction": "sell", "amount": 0.1, "trigger_price": 55000, "trigger": "mark_price" }
    ]
  }
}

Endpoint mapping

The protocol changes from REST to JSON-RPC 2.0. Instead of calling a REST path, you call a method by name with a parameters object. Send one request per frame, with no batching and a 32 KB maximum per frame.
ActionCurrent APINew API
Place order
Side becomes the method
POST /ordersprivate/buy, private/sell
Edit order
Edit by label supported
POST /orders/editprivate/edit, private/edit_by_label
Cancel orders
No cancel-by-ID-list; loop, or cancel all
POST /orders/batch_cancelprivate/cancel, private/cancel_all_*
Close positionPOST /orders/close_positionprivate/close_position
Order preview
No simulated fills
POST /orders/preview
Order historyGET /orders/historical/batchprivate/get_order_history_*
Order statusGET /orders/historical/{id}private/get_order_state
Fills
Deribit calls fills “user trades”
GET /orders/historical/fillsprivate/get_user_trades_*
Positions
Filter by currency and kind
GET /intx/positions/{uuid}private/get_positions
Account summaryGET /intx/portfolio/{uuid}private/get_account_summary
Margin modelPOST /intx/multi_asset_collateralprivate/change_margin_model
Instruments
Filter by currency and kind
GET /productspublic/get_instruments
Order bookGET /product_bookpublic/get_order_book
TickerGET /best_bid_askpublic/ticker
CandlesGET /products/{id}/candlespublic/get_tradingview_chart_data
Method names shown with * denote a family — for example, private/get_order_history_by_currency and private/get_order_history_by_instrument.

FAQ

Expected. A stop-limit order yields two IDs across its lifecycle — one before trigger and one after. Track both; do not assume a stable single ID.
Order-type, time-in-force, and status values are lowercase on the new gateway — for example, status open and filled, not OPEN and FILLED.
Stop and take orders trigger on index_price, mark_price, or last_price — you choose the trigger source per order.