Bullish · AsyncAPI Specification
Anonymous Trades
Version 1.0.0
This allows simultaneous trade subscriptions to multiple markets. Additionally, instead of sending trades one by one, trades are sent in batches. Upon subscribing to a market, the client will first receive a snapshot of the latest 100 trades, followed by batches of trade updates. Anonymous trades from different markets to be subscribed to are controlled by the parameters in the subscription message listed below. ``` /trading-api/v1/market-data/trades ```
View Spec
View on GitHub
Digital AssetsCryptocurrencyExchangeTradingDerivativesCustodyMarket DataFinancial ServicesInstitutionalFIXAsyncAPIWebhooksEvents
Channels
data
Servers
wss
prod-public
Production / Public
wss
prod-registered
Production / Registered
wss
prod-direct
Production / Direct Connect
wss
simnext-public
SimNext / Public
wss
simnext-registered
SimNext / Registered
wss
simnext-direct
SimNext / Direct Connect
AsyncAPI Specification
asyncapi: 3.0.0
info:
title: Anonymous Trades
version: 1.0.0
description: |
This allows simultaneous trade subscriptions to multiple markets. Additionally, instead of sending trades one by one, trades are sent in batches.
Upon subscribing to a market, the client will first receive a snapshot of the latest 100 trades, followed by batches of trade updates.
Anonymous trades from different markets to be subscribed to are controlled by the parameters in the subscription message listed below.
```
/trading-api/v1/market-data/trades
```
servers:
prod-public:
host: api.exchange.bullish.com
protocol: wss
description: Production / Public
prod-registered:
host: registered.api.exchange.bullish.com
protocol: wss
description: Production / Registered
prod-direct:
host: prod.access.bullish.com
protocol: wss
description: Production / Direct Connect
simnext-public:
host: api.simnext.bullish-test.com
protocol: wss
description: SimNext / Public
simnext-registered:
host: registered.api.simnext.bullish-test.com
protocol: wss
description: SimNext / Registered
simnext-direct:
host: simnext.access.bullish.com
protocol: wss
description: SimNext / Direct Connect
channels:
data:
address: /trading-api/v1/market-data/trades
messages:
subscribe:
title: Subscription
summary: Let you subscribe to a given topic
payload:
type: object
required:
- id
- method
- params
properties:
method:
type: string
description: '"subscribe"'
example: subscribe
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
type:
$ref: "#/components/schemas/MarketDataTradesJsonRpcCommandType"
params:
$ref: "#/components/schemas/MarketDataTradesTopicSubscriptionParams"
subscribe-ack:
title: Acknowledgment
summary: Confirm the topic being subscribed
payload:
type: object
properties:
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
result:
type: object
properties:
responseCodeName:
type: string
description: '"OK"'
example: OK
responseCode:
type: string
description: "200"
example: "200"
message:
type: string
description: Confirmation of what has been subscribed
example: Successfully subscribed (anonymousTrades BTCUSD)
subscribe-msg-0:
title: Snapshot
summary: Initial full state of the subscribed trade data
payload:
type: object
properties:
type:
type: string
description: '"snapshot"'
example: snapshot
dataType:
type: string
description: '"V1TAAnonymousTradeUpdate"'
example: V1TAAnonymousTradeUpdate
data:
type: object
properties:
symbol:
type: string
description: Market symbol
createdAtDatetime:
type: string
description: Denotes the time the latest order was ACK'd by the exchange, ISO 8601 with millisecond as string
publishedAtTimestamp:
type: string
description: Denotes the time the update was broadcasted to connected WebSockets
trades:
type: array
items:
$ref: "#/components/schemas/MarketDataTradesAnonymousTrade"
description: List of trades
example:
- tradeId: "100069000000063765"
isTaker: true
price: "23404.8636"
createdAtTimestamp: "1721879160353"
quantity: "0.00029411"
publishedAtTimestamp: "1721879162124"
side: SELL
createdAtDatetime: "2024-07-25T03:46:00.353Z"
symbol: BTCUSDC
otcMatchId: "1"
otcTradeId: "200069000000063765"
clientOtcTradeId: "300069000000063765"
- tradeId: "100069000000063764"
isTaker: false
price: "23104.8636"
createdAtTimestamp: "1721879160355"
quantity: "0.00029412"
publishedAtTimestamp: "1721879162125"
side: BUY
createdAtDatetime: "2024-07-25T03:46:00.355Z"
symbol: ETHUSDC
otcMatchId: "2"
otcTradeId: "200069000000063766"
clientOtcTradeId: "300069000000063766"
subscribe-msg-1:
title: Update
summary: Incremental update to the subscribed trade data
payload:
type: object
properties:
type:
type: string
description: '"update"'
example: update
dataType:
type: string
description: '"V1TAAnonymousTradeUpdate"'
example: V1TAAnonymousTradeUpdate
data:
type: object
properties:
symbol:
type: string
description: Market symbol
createdAtDatetime:
type: string
description: Denotes the time the latest order was ACK'd by the exchange, ISO 8601 with millisecond as string
publishedAtTimestamp:
type: string
description: Denotes the time the update was broadcasted to connected WebSockets
trades:
type: array
items:
$ref: "#/components/schemas/MarketDataTradesAnonymousTrade"
description: Singleton-List of trades
example:
- tradeId: "100069000000063765"
isTaker: true
price: "23404.8636"
createdAtTimestamp: "1721879160353"
quantity: "0.00029411"
publishedAtTimestamp: "1721879162124"
side: SELL
createdAtDatetime: "2024-07-25T03:46:00.353Z"
symbol: BTCUSDC
otcMatchId: "1"
otcTradeId: "200069000000063765"
clientOtcTradeId: "300069000000063765"
subscribe-nack:
title: Rejection
summary: Explain why the topic could not be subscribed
payload:
$ref: "#/components/schemas/MarketDataTradesRejectionPayload"
keepalive-ping:
title: Keepalive Ping
payload:
type: object
required:
- id
- method
- params
properties:
method:
type: string
description: '"keepalivePing"'
example: keepalivePing
params:
type: object
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
type:
$ref: "#/components/schemas/MarketDataTradesJsonRpcCommandType"
keepalive-pong:
title: Keepalive Pong
payload:
type: object
properties:
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
result:
type: object
properties:
responseCodeName:
type: string
description: '"OK"'
example: OK
responseCode:
type: integer
description: "200"
example: 200
message:
type: string
description: '"Keep alive pong"'
example: Keep alive pong
unsubscribe:
title: Unsubscription
summary: Let you unsubscribe to a given index
payload:
type: object
required:
- id
- method
- params
properties:
method:
type: string
description: '"unsubscribe"'
example: unsubscribe
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
type:
$ref: "#/components/schemas/MarketDataTradesJsonRpcCommandType"
params:
$ref: "#/components/schemas/MarketDataTradesTopicSubscriptionParams"
unsubscribe-ack:
title: Acknowledgment
summary: Confirm the topic being unsubscribed
payload:
type: object
properties:
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
result:
type: object
properties:
responseCodeName:
type: string
description: '"OK"'
example: OK
responseCode:
type: string
description: "200"
example: "200"
message:
type: string
description: Confirmation of what has been unsubscribed
example: Successfully unsubscribed (anonymousTrades BTCUSD)
unsubscribe-nack:
title: Rejection
summary: Explain why the topic could not be unsubscribed
payload:
$ref: "#/components/schemas/MarketDataTradesRejectionPayload"
operations:
subscribe:
action: send
channel:
$ref: "#/channels/data"
description: |
## Subscribe
Multiple subscriptions could be opened within the same websocket.
The trades of different markets to be subscribed are controlled by the parameters in
the subscription message listed below.
messages:
- $ref: "#/channels/data/messages/subscribe"
subscribe-ack:
action: receive
channel:
$ref: "#/channels/data"
description: |
After subscribing, the server sends :
- an acknowledgement
- then an initial snapshot with the latest 100 trades upon subscription.
- followed by incremental updates.
messages:
- $ref: "#/channels/data/messages/subscribe-ack"
- $ref: "#/channels/data/messages/subscribe-msg-0"
- $ref: "#/channels/data/messages/subscribe-msg-1"
subscribe-nack:
action: receive
channel:
$ref: "#/channels/data"
description: In case of *invalid* subscription message, an error rejection would be sent.
messages:
- $ref: "#/channels/data/messages/subscribe-nack"
keepalive-ping:
action: send
channel:
$ref: "#/channels/data"
description: |
## Keepalive
In case nothing is subscribed to, keep the websocket connection alive.
messages:
- $ref: "#/channels/data/messages/keepalive-ping"
keepalive-pong:
action: receive
channel:
$ref: "#/channels/data"
description: |
Acknowledgement returned by the server in response to a keepalive-ping.
messages:
- $ref: "#/channels/data/messages/keepalive-pong"
unsubscribe:
action: send
channel:
$ref: "#/channels/data"
description: |
## Unsubscribe
Let you unsubscribe a specific topic while keeping your websocket opened.
messages:
- $ref: "#/channels/data/messages/unsubscribe"
unsubscribe-ack:
action: receive
channel:
$ref: "#/channels/data"
description: After unsubscribing, the server sends an acknowledgement.
messages:
- $ref: "#/channels/data/messages/unsubscribe-ack"
unsubscribe-nack:
action: receive
channel:
$ref: "#/channels/data"
description: In case of *invalid* unsubscription message, an error rejection would be sent.
messages:
- $ref: "#/channels/data/messages/unsubscribe-nack"
components:
schemas:
MarketDataTradesJsonRpcRequestId:
type: string
description: ID returned by server in the acknowledgement
example: "1611082473000"
MarketDataTradesJsonRpcVersion:
description: Version of the Json RPC protocol
example: "2.0"
MarketDataTradesJsonRpcCommandType:
description: '"command"'
example: command
MarketDataTradesAnonymousTrade:
type: object
properties:
tradeId:
type: string
description: Unique trade id
symbol:
type: string
description: Market symbol
price:
type: string
description: Price, see asset value format
quantity:
type: string
description: Quantity, see asset value format
side:
type: string
description: Order side
isTaker:
type: boolean
description: Denotes whether this is a taker's trade
otcMatchId:
type: string
description: Unique OTC match id
otcTradeId:
type: string
description: Unique Bullish OTC trade id
clientOtcTradeId:
type: string
description: Unique client OTC trade id
createdAtTimestamp:
type: string
description: Denotes the time the order was ACK'd by the exchange
createdAtDatetime:
type: string
description: Denotes the time the order was ACK'd by the exchange, ISO 8601 with millisecond as string
publishedAtTimestamp:
type: string
description: Denotes the time the update was broadcasted to connected WebSockets
auctionId:
type: string
description: Unique Bullish auction identifier. Present only for auction trades
MarketDataTradesRejectionPayload:
type: object
properties:
id:
$ref: "#/components/schemas/MarketDataTradesJsonRpcRequestId"
jsonrpc:
$ref: "#/components/schemas/MarketDataTradesJsonRpcVersion"
error:
type: object
properties:
code:
type: string
description: a high-level code for the error
example: "-32602"
errorCode:
type: string
description: a precise typed error code
example: "29013"
errorCodeName:
type: string
description: An explanation of which value was invalid
example: "'abcde' is not a valid topic"
MarketDataTradesTopicSubscriptionParams:
type: object
required:
- topic
- symbol
properties:
topic:
type: string
description: '"anonymousTrades"'
example: anonymousTrades
symbol:
type: string
description: Market symbol, such as BTCUSD or ETHUSDC
example: BTCUSD