Skip to content
UDX
2026-08-11

Subscribe to Channels

Send a JSON command with a client-assigned id, cmd, and params. An orderbook or ticker-filtered rfqs or market_lifecycle channel opens one subscription per requested ticker. An rfqs or market_lifecycle channel without tickers opens one all-visible subscription; quotes always opens one all-visible subscription. Each subscription receives its own subscribed response with a server-assigned subscription ID (sid). Its seq starts at 1 and increments once per frame. End a subscription by sending unsubscribe with its sid; the server answers with an unsubscribed response.

RECEIVE/ws
Authorization
Authorization
UDX-Access-KeyAPI key · headerrequired

Opaque API key ID.

UDX-Access-TimestampAPI key · headerrequired

Unix time in milliseconds, within 30 seconds of server time.

UDX-Access-SignatureAPI key · headerrequired

Standard-base64 RSA-PSS/SHA-256 signature with a 32-byte salt. Sign timestamp + "GET" + "/ws"; the upgrade request has no body hash and no idempotency key.

Commands
subscribeSubscribe to one or more channels.
idCommandIdrequired

Client-assigned command correlation identifier, unique among commands in flight on this connection.

min 1 · max 9007199254740991
cmdstringrequired

Selects the subscribe command.

paramsSubscribeCommandParamsrequired

The channels and markets to open.

Show properties
channelsSubscribeChannel[]required

Each entry carries its own ticker filter and channel parameters.

min items 1
Show properties
Array of SubscribeChannel
channelstringrequired

orderbook streams the order book for the market, snapshot first then updates. stats streams the market's complete stats, on subscribe and whenever they change. rfqs streams the requests for quote the caller is authorized to see. quotes streams every quote visible to the caller's member. market_lifecycle streams change-only lifecycle notifications for the ticker, or for every market when tickers are omitted. orders streams the caller's own order lifecycle. fills streams the caller's own executions. trades streams public trades for the ticker, or for every market when tickers are omitted.

Allowed:orderbookrfqsquotesmarket_lifecycleordersfillstradesstats
tickersTickerList

A canonical non-empty list of distinct market tickers.

min items 1 · max items 250
levelOrderbookLevel

L1 streams only the best bid and offer; L2 streams aggregated market-by-price depth; L3 streams anonymous resting orders in price-time priority order.

default: "L2"
Allowed:L1L2L3
depthOrderbookDepth

Visible price levels per side. L1 defaults to and only accepts 1. L2 and L3 default to 25, accept an integer from 1 through 100, or accept full for every visible price level. An L3 level includes every visible order resting at that price.

min 1 · max 100 · default: 25
Show properties
One of:
integer
integer
string
string
Replies
subscribedConfirm that one subscription was committed.
idCommandIdrequired

Client-assigned command correlation identifier, unique among commands in flight on this connection.

min 1 · max 9007199254740991
typestringrequired

Identifies a successful subscribe response.

msgSubscribedPayloadrequired

One opened subscription. The ticker is omitted for an all-visible rfqs, orders, fills, market_lifecycle, or trades subscription and for every quotes subscription.

Show properties
channelstringrequired

The channel this subscription streams.

Allowed:orderbookrfqsquotesmarket_lifecycleordersfillstradesstats
tickerTicker

A human-meaningful natural key naming a single-leg or multi-leg market.

min length 1 · max length 128
sidSubscriptionIdrequired

Exchange-assigned subscription ID whose lifetime is this WebSocket connection.

min 1 · max 9007199254740991
levelOrderbookLevel

L1 streams only the best bid and offer; L2 streams aggregated market-by-price depth; L3 streams anonymous resting orders in price-time priority order.

default: "L2"
Allowed:L1L2L3
depthOrderbookDepth

Visible price levels per side. L1 defaults to and only accepts 1. L2 and L3 default to 25, accept an integer from 1 through 100, or accept full for every visible price level. An L3 level includes every visible order resting at that price.

min 1 · max 100 · default: 25
Show properties
One of:
integer
integer
string
string
rate_limitobject

Present for a newly admitted charged batch. An exact duplicate subscribe response omits it because no tokens were spent.

Show properties
bucketstringrequired

Shared member bucket consulted for this command.

Allowed:readwritecancel
capacityinteger<int64>required

Maximum tokens held by the bucket.

min 1 · max 10000000
refill_tokens_per_minuteinteger<int64>required

Tokens restored per minute.

min 1 · max 10000000
remaininginteger<int64>required

Tokens remaining after th decision.

min 0 · max 10000000
full_after_msinteger<int64>required

Milliseconds until the bucket is full if no more work is admitted.

min 0 · max 86400000
Errors
invalid_messageThe JSON or common command envelope is invalid.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
fieldstring

JSON path to the invalid field when one can be identified.

min length 1 · max length 255
invalid_paramsCommand params fail schema or semantic validation.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
fieldstring

JSON path to the invalid param when one can be identified.

min length 1 · max length 255
command_id_in_useAnother command with the supplied identifier is still in flight.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
subscription_conflictThe ticker already belongs to the identified subscription.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
tickerTickerrequired

A human-meaningful natural key naming a single-leg or multi-leg market.

min length 1 · max length 128
market_not_foundThe market is absent from the caller-visible market catalog.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
tickerTickerrequired

A human-meaningful natural key naming a single-leg or multi-leg market.

min length 1 · max length 128
capacity_exceededA standing-resource limit prevents command admission.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
scopestringrequired

Boundary at which the standing-resource limit applies.

Allowed:connectionmemberprocess
resourcestringrequired

Retained or concurrent resource that reached its limit.

Allowed:in_flight_commandsactive_subscriptionsmarket_data_streams
limitinteger<int64>required

Enforced maximum for the identified scope and resource.

min 1 · max 10000000
channel_unavailableThe channel's upstream source cannot serve the operation right now. Retry with backoff; the connection stays usable.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
rate_limit_exceededA command rate limit was exceeded.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
retry_after_msinteger<int64>required

Minimum delay in milliseconds before another attempt.

min 1 · max 86400000
admission_unavailableShared admission policy or state is temporarily unavailable.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
internal_errorAn unexpected failure left connection state safe to continue.
codestringrequired

Stable machine-readable error code.

detailErrorDetailrequired

Human-readable occurrence detail that clients must not parse.

min length 1 · max length 500
instanceErrorInstancerequired

Request identifier for troubleshooting with exchange support.

max length 100 · matches ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
Channel Bindings
Channel Bindings
ws
methodGET
headers
UDX-Access-Keystringrequired

Opaque API key ID.

min length 1 · max length 255
UDX-Access-Timestampstringrequired

Unix time in milliseconds, within 30 seconds of server time.

max length 13 · matches ^[0-9]{13}$
UDX-Access-Signaturestringrequired

Standard-base64 RSA-PSS/SHA-256 signature with a 32-byte salt. Sign timestamp + "GET" + "/ws"; the upgrade request has no body hash and no idempotency key.

min length 1 · max length 1024
Sec-WebSocket-Protocolstringrequired

Negotiated dated WebSocket API version.

Examples
subscribe
{
  "id": 1,
  "cmd": "subscribe",
  "params": {
    "channels": [
      {
        "channel": "orderbook",
        "level": "L1",
        "tickers": [
          "UDX-EXAMPLE-MARKET-A"
        ]
      }
    ]
  }
}
subscribed
{
  "id": 1,
  "type": "subscribed",
  "msg": {
    "channel": "orderbook",
    "ticker": "UDX-EXAMPLE-MARKET-A",
    "sid": 7,
    "level": "L2",
    "depth": 10
  },
  "rate_limit": {
    "bucket": "read",
    "capacity": 30,
    "refill_tokens_per_minute": 900,
    "remaining": 27,
    "full_after_ms": 200
  }
}
invalid_message
{
  "type": "error",
  "msg": {
    "code": "invalid_message",
    "detail": "WebSocket command is not a valid JSON object",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
invalid_params
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "invalid_params",
    "detail": "the orderbook channel requires tickers",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef",
    "field": "params.channels"
  }
}
command_id_in_use
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "command_id_in_use",
    "detail": "WebSocket command ID is already in flight",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
subscription_conflict
{
  "id": 4,
  "type": "error",
  "sid": 7,
  "msg": {
    "code": "subscription_conflict",
    "detail": "UDX-EXAMPLE-MARKET-A is already subscribed on sid 7",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef",
    "ticker": "UDX-EXAMPLE-MARKET-A"
  }
}
market_not_found
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "market_not_found",
    "detail": "market was not found in the public catalog",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef",
    "ticker": "UDX-EXAMPLE-MARKET-Z"
  }
}
capacity_exceeded
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "capacity_exceeded",
    "detail": "WebSocket connection command capacity is exhausted",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef",
    "scope": "connection",
    "resource": "in_flight_commands",
    "limit": 32
  }
}
channel_unavailable
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "channel_unavailable",
    "detail": "current market data is unavailable",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
rate_limit_exceeded
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "rate_limit_exceeded",
    "detail": "member read rate limit is exhausted",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef",
    "retry_after_ms": 1200
  },
  "rate_limit": {
    "bucket": "read",
    "capacity": 30,
    "refill_tokens_per_minute": 900,
    "remaining": 0,
    "full_after_ms": 2000
  }
}
admission_unavailable
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "admission_unavailable",
    "detail": "shared WebSocket admission is temporarily unavailable",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
internal_error
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "internal_error",
    "detail": "WebSocket command failed",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}