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.
/wsAuthorization
UDX-Access-KeyAPI key · headerrequiredOpaque API key ID.
UDX-Access-TimestampAPI key · headerrequiredUnix time in milliseconds, within 30 seconds of server time.
UDX-Access-SignatureAPI key · headerrequiredStandard-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.
subscribeSubscribe to one or more channels.
idCommandIdrequiredClient-assigned command correlation identifier, unique among commands in flight on this connection.
cmdstringrequiredSelects the subscribe command.
paramsSubscribeCommandParamsrequiredThe channels and markets to open.
Show propertiesHide properties
channelsSubscribeChannel[]requiredEach entry carries its own ticker filter and channel parameters.
Show propertiesHide properties
SubscribeChannelchannelstringrequiredorderbook 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.
orderbookrfqsquotesmarket_lifecycleordersfillstradesstatstickersTickerListA canonical non-empty list of distinct market tickers.
levelOrderbookLevelL1 streams only the best bid and offer; L2 streams aggregated market-by-price depth; L3 streams anonymous resting orders in price-time priority order.
L1L2L3depthOrderbookDepthVisible 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.
Show propertiesHide properties
integerstringsubscribedConfirm that one subscription was committed.
idCommandIdrequiredClient-assigned command correlation identifier, unique among commands in flight on this connection.
typestringrequiredIdentifies a successful subscribe response.
msgSubscribedPayloadrequiredOne opened subscription. The ticker is omitted for an all-visible rfqs, orders, fills, market_lifecycle, or trades subscription and for every quotes subscription.
Show propertiesHide properties
channelstringrequiredThe channel this subscription streams.
orderbookrfqsquotesmarket_lifecycleordersfillstradesstatstickerTickerA human-meaningful natural key naming a single-leg or multi-leg market.
sidSubscriptionIdrequiredExchange-assigned subscription ID whose lifetime is this WebSocket connection.
levelOrderbookLevelL1 streams only the best bid and offer; L2 streams aggregated market-by-price depth; L3 streams anonymous resting orders in price-time priority order.
L1L2L3depthOrderbookDepthVisible 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.
Show propertiesHide properties
integerstringrate_limitobjectPresent for a newly admitted charged batch. An exact duplicate subscribe response omits it because no tokens were spent.
Show propertiesHide properties
bucketstringrequiredShared member bucket consulted for this command.
readwritecancelcapacityinteger<int64>requiredMaximum tokens held by the bucket.
refill_tokens_per_minuteinteger<int64>requiredTokens restored per minute.
remaininginteger<int64>requiredTokens remaining after th decision.
full_after_msinteger<int64>requiredMilliseconds until the bucket is full if no more work is admitted.
invalid_messageThe JSON or common command envelope is invalid.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
fieldstringJSON path to the invalid field when one can be identified.
invalid_paramsCommand params fail schema or semantic validation.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
fieldstringJSON path to the invalid param when one can be identified.
command_id_in_useAnother command with the supplied identifier is still in flight.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
subscription_conflictThe ticker already belongs to the identified subscription.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
tickerTickerrequiredA human-meaningful natural key naming a single-leg or multi-leg market.
market_not_foundThe market is absent from the caller-visible market catalog.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
tickerTickerrequiredA human-meaningful natural key naming a single-leg or multi-leg market.
capacity_exceededA standing-resource limit prevents command admission.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
scopestringrequiredBoundary at which the standing-resource limit applies.
connectionmemberprocessresourcestringrequiredRetained or concurrent resource that reached its limit.
in_flight_commandsactive_subscriptionsmarket_data_streamslimitinteger<int64>requiredEnforced maximum for the identified scope and resource.
channel_unavailableThe channel's upstream source cannot serve the operation right now. Retry with backoff; the connection stays usable.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
rate_limit_exceededA command rate limit was exceeded.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
retry_after_msinteger<int64>requiredMinimum delay in milliseconds before another attempt.
admission_unavailableShared admission policy or state is temporarily unavailable.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
internal_errorAn unexpected failure left connection state safe to continue.
codestringrequiredStable machine-readable error code.
detailErrorDetailrequiredHuman-readable occurrence detail that clients must not parse.
instanceErrorInstancerequiredRequest identifier for troubleshooting with exchange support.
Channel Bindings
wsmethodGETheadersUDX-Access-KeystringrequiredOpaque API key ID.
UDX-Access-TimestampstringrequiredUnix time in milliseconds, within 30 seconds of server time.
UDX-Access-SignaturestringrequiredStandard-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.
Sec-WebSocket-ProtocolstringrequiredNegotiated dated WebSocket API version.
subscribe
{
"id": 1,
"cmd": "subscribe",
"params": {
"channels": [
{
"channel": "orderbook",
"level": "L1",
"tickers": [
"UDX-EXAMPLE-MARKET-A"
]
}
]
}
}{
"id": 2,
"cmd": "subscribe",
"params": {
"channels": [
{
"channel": "orderbook",
"level": "L2",
"depth": 10,
"tickers": [
"UDX-EXAMPLE-MARKET-A",
"UDX-EXAMPLE-MARKET-B"
]
},
{
"channel": "rfqs",
"tickers": [
"UDX-EXAMPLE-MARKET-A",
"UDX-EXAMPLE-MARKET-B"
]
}
]
}
}{
"id": 3,
"cmd": "subscribe",
"params": {
"channels": [
{
"channel": "orderbook",
"level": "L3",
"depth": 10,
"tickers": [
"UDX-EXAMPLE-MARKET-A"
]
}
]
}
}{
"id": 4,
"cmd": "subscribe",
"params": {
"channels": [
{
"channel": "quotes"
}
]
}
}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
}
}{
"id": 1,
"type": "subscribed",
"msg": {
"channel": "rfqs",
"ticker": "UDX-EXAMPLE-MARKET-A",
"sid": 8
},
"rate_limit": {
"bucket": "read",
"capacity": 30,
"refill_tokens_per_minute": 900,
"remaining": 27,
"full_after_ms": 200
}
}{
"id": 2,
"type": "subscribed",
"msg": {
"channel": "quotes",
"sid": 11
},
"rate_limit": {
"bucket": "read",
"capacity": 30,
"refill_tokens_per_minute": 900,
"remaining": 26,
"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"
}
}