Skip to main content

Messages

This section will provide necessary documentation for the WebSocket protocol messages.

The message type is identified by the type property of the JSON object. This document is organized into sections, each per specific message type.

Message typeTriggerDescription
SERVER_INFOOn connection open
Every 1 second
On update
Heartbeat and server information.
ORDER_NEW_SINGLE_REQUESTOn new orderSubmit new order.
ORDER_CANCEL_SINGLE_REQUESTOn order cancelCancel single order.
ORDER_CANCEL_ALL_REQUESTOn order cancelCancel all orders.
ORDER_EXEC_REPORT_SNAPSHOTOn connection openSnapshot of all order execution reports.
ORDER_EXEC_REPORT_UPDATEOn updateUpdate of the order execution report.
BALANCE_SNAPSHOTOn connection openSnapshot of all balances.
BALANCE_UPDATEOn updateUpdate of the balance.
POSITION_SNAPSHOTOn connection openSnapshot of all positions.
POSITION_UPDATEOn updateUpdate of the position.
SYMBOLS_SNAPSHOTOn connection openSnapshot of markets symbols.
MESSAGE_REJECTOn order placing/cancelling rejection.Text message.

SERVER_INFO IN

Example of the SERVER_INFO message.

{
"type": "SERVER_INFO",
"time": "2020-02-07T12:37:46.6967101Z",
"instance_guid": "16bab28c-8c7c-4af7-815b-923ea8ecbf4a",
"exchange_id": "BINANCEJE",
"server_version": "1.3521",
"server_name": "HDC2-ENC-06-BAY-05",
"dns_name": "HDC2-ENC-06-BAY-05.us-east-1.corpintra.net",
"is_running": true,
"time_server_start": "2020-02-07T10:25:22.3022141Z"
}

This message is used internally to measure the real-time latency of the link and acts as a heartbeat.

Delivery triggers:

  • On connection open

  • Every 1 second

  • On update

Properties

NameTypeDescription
typestringMessage type, constant SERVER_INFO.
timedatetimeTime message sent time to measure the link latency.
instance_guidstringThe server process randomly generated GUID. It will change on each software restart.
exchange_idstringExchange identifier.
server_versionstringServer software version.
server_namestringServer name.
dns_namestringDNS name.
is_runningbooleanIs the server on the other side running? Update with the false value will be sent before the shutdown.
time_server_startdatetimeTime of server software start.

ORDER_NEW_SINGLE_REQUEST OUT

Example of the ORDER_NEW_SINGLE_REQUEST message creating order on the KRAKEN exchange by the symbol_id_exchange.

{
"type": "ORDER_NEW_SINGLE_REQUEST",
"exchange_id": "KRAKEN",
"client_order_id": "6ab36bc1-344d-432e-ac6d-0bf44ee64c2b",
"symbol_id_exchange": "XBT/USDT",
"amount_order": 0.045,
"price": 0.0783,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": "2020-01-01T10:45:20.1677709Z",
"exec_inst": ["MAKER_OR_CANCEL"]
}

Another example of the ORDER_NEW_SINGLE_REQUEST message creating order on the same market by the symbol_id_coinapi.

{
"type": "ORDER_NEW_SINGLE_REQUEST",
"exchange_id": "KRAKEN",
"client_order_id": "6ab36bc1-344d-432e-ac6d-0bf44ee64c2b",
"symbol_id_coinapi": "KRAKEN_SPOT_BTC_USDT",
"amount_order": 0.045,
"price": 0.0783,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": "2020-01-01T10:45:20.1677709Z",
"exec_inst": ["MAKER_OR_CANCEL"]
}

This message is used to send a new order to the exchange.

Properties

ParameterTypeRequiredDescription
typestringtrueMessage type, constant ORDER_NEW_SINGLE_REQUEST.
exchange_idstringtrueExchange identifier.
client_order_idstringtrueThe unique identifier of the order assigned by the client.
symbol_id_exchangestringfalseExchange symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
symbol_id_coinapistringfalseCoinAPI symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
amount_ordernumbertrueOrder quantity.
pricenumbertrueOrder price.
sidestringtrueSide of order. Allowed values: BUY or SELL.
order_typestringtrueOrder types are documented in the separate section: EMS / Starter Guide / Order parameters / Order type
time_in_forcestringtrueOrder time in force options are documented in the separate section: EMS / Starter Guide / Order parameters / Time in force
expire_timedatefalseExpiration time. Conditionaly required for orders with time_in_force = GOOD_TILL_TIME_EXCHANGE or GOOD_TILL_TIME_OEML.
exec_inst[string]falseOrder execution instructions are documented in the separate section: EMS / Starter Guide / Order parameters / Execution instructions

ORDER_CANCEL_SINGLE_REQUEST OUT

Example of the ORDER_CANCEL_SINGLE_REQUEST message to cancel a single order identified by the exchange_order_id on the BITSTAMP exchange.

{
"type": "ORDER_CANCEL_SINGLE_REQUEST",
"exchange_id": "BITSTAMP",
"exchange_order_id": "1234567"
}

Another example of the ORDER_CANCEL_SINGLE_REQUEST message to cancel a single order identified by the client_order_id on the BITSTAMP exchange.

{
"type": "ORDER_CANCEL_SINGLE_REQUEST",
"exchange_id": "BITSTAMP",
"client_order_id": "d8574207d9e3b16a4a5511753eeef1751"
}

Request cancel for an existing order. The order can be canceled using the client_order_id or exchange_order_id.

Properties

ParameterTypeRequiredDescription
typestringtrueMessage type, constant ORDER_CANCEL_SINGLE_REQUEST.
exchange_idstringtrueExchange identifier.
exchange_order_idstringfalseUnique identifier of the order assigned by the exchange or executing system. One of the properties (exchange_order_id, client_order_id) is required to identify the order.
client_order_idstringfalseThe unique identifier of the order assigned by the client. One of the properties (exchange_order_id, client_order_id) is required to identify the order.

ORDER_CANCEL_ALL_REQUEST OUT

Example of the ORDER_CANCEL_ALL_REQUEST message to cancel all open orders on the KRAKEN exchange.

{
"type": "ORDER_CANCEL_ALL_REQUEST",
"exchange_id": "KRAKEN"
}

This request cancels all open orders on a single specified exchange.

Properties

ParameterTypeRequiredDescription
typestringtrueMessage type, constant ORDER_CANCEL_ALL_REQUEST.
exchange_idbodystringtrue

ORDER_EXEC_REPORT_SNAPSHOT IN

Example of the ORDER_EXEC_REPORT_SNAPSHOT message delivering all open orders from the KRAKEN exchange.

{
"type": "ORDER_EXEC_REPORT_SNAPSHOT",
"exchange_id": "KRAKEN",
"data":
[
{
"exchange_id": "KRAKEN",
"client_order_id": "KPP-222389382-AQ",
"exchange_order_id": "90832ASASAS89789-1112",
"symbol_id_exchange": "XBT/USDT",
"symbol_id_coinapi": "KRAKEN_SPOT_BTC_USDT",
"amount_order": 0.045,
"amount_filled": 0,
"amount_open": 0.22,
"status": "NEW",
"price": 0.0783,
"avg_px": 0.0783,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": "2020-01-01T10:45:20.1677709Z",
"exec_inst": "MAKER_OR_CANCEL"
"status_history": [
[
"RECEIVED",
"2020-05-27T11:16:20.1677709Z"
],
[
"ROUTING",
"2020-05-27T11:16:20.1677710Z"
],
[
"ROUTED",
"2020-05-27T11:16:20.1677800Z"
],
[
"NEW",
"2020-05-27T11:16:20.1677951Z"
]
],
"fills": [
{
"time": "2020-01-01T10:45:20.1677709Z",
"price": 10799.2,
"amount": 0.002
}
]
}
]
}

This message provides all open orders from the single exchange and will be sent separately for all interconnected exchanges.

When this message is received, then the client must discard all open orders from this exchange and apply the snapshot, which later will be modified by the ORDER_EXEC_REPORT_UPDATE messages.

Delivery triggers:

  • On connection open

Properties

ParameterInTypeRequiredDescription
typestringtrueMessage type, constant ORDER_EXEC_REPORT_SNAPSHOT.
dataarrayobjecttrueNo description
» exchange_idbodystringtrueExchange identifier used to identify the routing destination.
» client_order_idbodystringtrueThe unique identifier of the order assigned by the client.
» client_order_id_format_exchangebodystringtrueThe unique identifier of the order assigned by the client converted to the exchange order tag format for the purpose of tracking it.
» exchange_order_idbodystringtrueUnique identifier of the order assigned by the exchange or executing system.
» symbol_id_exchangebodystringfalseExchange symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
» symbol_id_coinapibodystringfalseCoinAPI symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
» amount_orderbodynumbertrueOrder quantity.
» amount_filledbodynumbertrueTotal quantity filled.
» amount_openbodynumbertrueQuantity open for further execution. amount_open = amount_order - amount_filled
» statusbodystringtrueOrder statuses and the lifecycle are documented in the separate section: EMS / Starter Guide / Order Lifecycle
» status_historybodyarraytrueTimestamped history of order status changes.
» pricebodynumbertrueOrder price.
» avg_pxbodynumbertrueCalculated average price of all fills on this order.
» sidebodystringtrueSide of order.
» order_typebodystringtrueOrder types are documented in the separate section: EMS / Starter Guide / Order parameters / Order type
» time_in_forcebodystringtrueOrder time in force options are documented in the separate section: EMS / Starter Guide / Order parameters / Time in force
» expire_timebodydatefalseExpiration time. Conditionaly required for orders with time_in_force = GOOD_TILL_TIME_EXCHANGE or GOOD_TILL_TIME_OEML.
» exec_instbody[string]falseOrder execution instructions are documented in the separate section: EMS / Starter Guide / Order parameters / Execution instructions
» error_messagebodynumbertrueError message
» fillsbodyarraytrueRelay fill information on working orders

Enumerated Values

ParameterValue
» sideBUY
» sideSELL
» order_typeLIMIT
» time_in_forceGOOD_TILL_CANCEL
» time_in_forceGOOD_TILL_TIME_EXCHANGE
» time_in_forceGOOD_TILL_TIME_OMS
» time_in_forceFILL_OR_KILL
» time_in_forceIMMEDIATE_OR_CANCEL
» exec_instMAKER_OR_CANCEL
» exec_instAUCTION_ONLY
» exec_instINDICATION_OF_INTEREST

ORDER_EXEC_REPORT_UPDATE IN

Example of the ORDER_EXEC_REPORT_UPDATE message notifying that an execution report for the order is changed. In this case, one order changed status, and it's filled.

{
"exchange_id": "KRAKEN",
"client_order_id": "KPP-222389382-AQ",
"client_order_id_format_exchange": "f81211e2-27c4-b86a-8143-01088ba9222c",
"exchange_order_id": "90832ASASAS89789-1112",
"symbol_id_exchange": "XBT/USDT",
"symbol_id_coinapi": "KRAKEN_SPOT_BTC_USDT",
"amount_order": 0.045,
"amount_open": 0,
"amount_filled": 0.045,
"status": "FILLED",
"price": 0.0783,
"avg_px": 0.0783,
"side": "BUY",
"order_type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCEL",
"expire_time": "2020-01-01T10:45:20.1677709Z",
"exec_inst": "MAKER_OR_CANCEL"
"status_history": [
[
"RECEIVED",
"2020-05-27T11:16:20.1677709Z"
],
[
"ROUTING",
"2020-05-27T11:16:20.1677710Z"
],
[
"ROUTED",
"2020-05-27T11:16:20.1677800Z"
],
[
"NEW",
"2020-05-27T11:16:20.1677951Z"
],
[
"FILLED",
"2020-05-27T11:16:30.6456457Z"
]
],
"fills": [
{
"time": "2020-01-01T10:45:20.1677709Z",
"price": 10799.2,
"amount": 0.002
}
]
}

This message is sent to notify the client that the order execution report changed.

When this message is received, then the client must update the execution report in the memory to maintain the current state of execution reports for all open orders.

The initial state of the collection is delivered via the snapshot message ORDER_EXEC_REPORT_SNAPSHOT.

Delivery triggers:

  • On execution report update

Properties

ParameterInTypeRequiredDescription
typestringtrueMessage type, constant ORDER_EXEC_REPORT_UPDATE.
exchange_idbodystringtrueExchange identifier used to identify the routing destination.
client_order_idbodystringtrueThe unique identifier of the order assigned by the client.
client_order_id_format_exchangebodystringtrueThe unique identifier of the order assigned by the client converted to the exchange order tag format for the purpose of tracking it.
exchange_order_idbodystringtrueUnique identifier of the order assigned by the exchange or executing system.
symbol_id_exchangebodystringfalseExchange symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
symbol_id_coinapibodystringfalseCoinAPI symbol. One of the properties (symbol_id_exchange, symbol_id_coinapi) is required to identify the market for the new order.
amount_orderbodynumbertrueOrder quantity.
amount_filledbodynumbertrueTotal quantity filled.
amount_openbodynumbertrueQuantity open for further execution. amount_open = amount_order - amount_filled
statusbodystringtrueOrder statuses and the lifecycle are documented in the separate section: EMS / Starter Guide / Order Lifecycle
status_historybodyarraytrueTimestamped history of order status changes.
pricebodynumbertrueOrder price.
avg_pxbodynumberfalseCalculated average price of all fills on this order.
sidebodystringtrueSide of order.
order_typebodystringtrueOrder types are documented in the separate section: EMS / Starter Guide / Order parameters / Order type
time_in_forcebodystringtrueOrder time in force options are documented in the separate section: EMS / Starter Guide / Order parameters / Time in force
expire_timebodydatefalseExpiration time. Conditionaly required for orders with time_in_force = GOOD_TILL_TIME_EXCHANGE or GOOD_TILL_TIME_OEML.
exec_instbody[string]falseOrder execution instructions are documented in the separate section: EMS / Starter Guide / Order parameters / Execution instructions
error_messagebodynumbertrueError message
fillsbodyarraytrueRelay fill information on working orders

Enumerated Values

ParameterValue
» sideBUY
» sideSELL
» order_typeLIMIT
» time_in_forceGOOD_TILL_CANCEL
» time_in_forceGOOD_TILL_TIME_EXCHANGE
» time_in_forceGOOD_TILL_TIME_OMS
» time_in_forceFILL_OR_KILL
» time_in_forceIMMEDIATE_OR_CANCEL
» exec_instMAKER_OR_CANCEL
» exec_instAUCTION_ONLY
» exec_instINDICATION_OF_INTEREST

BALANCE_SNAPSHOT IN

Example of the BALANCE_SNAPSHOT message from the KRAKEN exchange.

{
"type": "BALANCE_SNAPSHOT",
"exchange_id": "KRAKEN",
"data": [
{
"asset_id_exchange": "XBT",
"asset_id_coinapi": "BTC",
"balance": 0.00134444,
"available": 0.00134444,
"locked": 0,
"last_updated_by": "EXCHANGE",
"rate_usd": 9544.21
},
{
"asset_id_exchange": "BCH",
"asset_id_coinapi": "BCHABC",
"balance": 1234,
"available": 1000,
"locked": 234,
"last_updated_by": "BALANCE_MANAGER",
"rate_usd": 228.12
}
]
}

This message provides all balances from the single exchange and will be sent separately for all interconnected exchanges.

When this message is received, then the client must discard all balances from this exchange and apply the snapshot, which later will be modified by the BALANCE_UPDATE messages.

Delivery triggers:

  • On connection open

Properties

NameTypeRequiredDescription
typestringtrueMessage type, constant BALANCE_SNAPSHOT.
exchange_idstringfalseExchange identifier.
exchange_idstringfalseExchange identifier.
data[object]falseNo description
» asset_id_exchangestringfalseExchange currency code.
» asset_id_coinapistringfalseCoinAPI currency code.
» balancenumber(float)falseValue of the current total currency balance on the exchange.
» availablenumber(float)falseValue of the current available currency balance on the exchange that can be used as collateral.
» lockednumber(float)falseValue of the current locked currency balance by the exchange.
» last_updated_bystringfalseSource of the last modification.
» rate_usdnumber(float)falseCurrent exchange rate to the USD for the single unit of the currency.

Enumerated Values

PropertyValue
last_updated_byINITIALIZATION
last_updated_byBALANCE_MANAGER
last_updated_byEXCHANGE

BALANCE_UPDATE IN

Example of the BALANCE_UPDATE message from the KRAKEN exchange.

{
"type": "BALANCE_UPDATE",
"exchange_id": "KRAKEN",
"asset_id_exchange": "XBT",
"asset_id_coinapi": "BTC",
"balance": 0.00134444,
"available": 0,
"locked": 0.00134444,
"last_updated_by": "EXCHANGE",
"rate_usd": 9544.21
}

This message is sent to notify the client that the balance for the specific exchange currency pair changed.

When this message is received, the client must update the balance in the memory to maintain the current state of balance across all exchanges and currencies.

The initial state of the collection is delivered via the snapshot message BALANCE_SNAPSHOT.

Delivery triggers:

  • On balance update

Properties

NameTypeRequiredDescription
typestringtrueMessage type, constant BALANCE_SNAPSHOT.
exchange_idstringfalseExchange identifier.
exchange_idstringfalseExchange identifier.
asset_id_exchangestringfalseExchange currency code.
asset_id_coinapistringfalseCoinAPI currency code.
balancenumber(float)falseValue of the current total currency balance on the exchange.
availablenumber(float)falseValue of the current available currency balance on the exchange that can be used as collateral.
lockednumber(float)falseValue of the current locked currency balance by the exchange.
last_updated_bystringfalseSource of the last modification.
rate_usdnumber(float)falseCurrent exchange rate to the USD for the single unit of the currency.

Enumerated Values

PropertyValue
last_updated_byINITIALIZATION
last_updated_byBALANCE_MANAGER
last_updated_byEXCHANGE

POSITION_SNAPSHOT IN

Example of the POSITION_SNAPSHOT message from the KRAKENFTS exchange.

{
"type": "POSITION_SNAPSHOT",
"exchange_id": "KRAKENFTS",
"data":
[
{
"symbol_id_exchange": "XBT/USDT",
"symbol_id_coinapi": "KRAKENFTS_PERP_BTC_USDT",
"avg_entry_price": 0.00134444,
"quantity": 0.00134444,
"side": "BUY",
"unrealised_pnl": 0,
"leverage": 0,
"cross_margin": true,
"liquidation_price": 0.072323
}
]
}

This message provides all positions from the single exchange and will be sent separately for all interconnected exchanges.

When this message is received, then the client must discard al positions from this exchange and apply the snapshot, which later will be modified by the POSITION_UPDATE messages.

Delivery triggers:

  • On connection open

Properties

NameTypeRequiredDescription
typestringtrueMessage type, constant POSITION_SNAPSHOT.
exchange_idstringfalseExchange identifier.
data[object]falseNo description
» symbol_id_exchangestringfalseExchange symbol.
» symbol_id_coinapistringfalseCoinAPI symbol.
» avg_entry_pricenumberfalseCalculated average price of all fills on this position.
» quantitynumberfalseThe current position quantity.
» sidestringfalseSide of order.
» unrealized_pnlnumberfalseUnrealised profit or loss (PNL) of this position.
» leveragenumberfalseLeverage for this position reported by the exchange.
» cross_marginbooleanfalseIs cross margin mode enable for this position?
» liquidation_pricenumberfalseLiquidation price. If mark price will reach this value, the position will be liquidated.

POSITION_UPDATE IN

Example of the POSITION_UPDATE message from the KRAKENFTS exchange.

{
"type": "POSITION_UPDATE",
"exchange_id": "KRAKENFTS",
"symbol_id_exchange": "XBT/USDT",
"symbol_id_coinapi": "KRAKENFTS_PERP_BTC_USDT",
"avg_entry_price": 0.00134444,
"quantity": 0.00134444,
"side": "BUY",
"unrealised_pnl": 0,
"leverage": 0,
"cross_margin": true,
"liquidation_price": 0.072323
}

This message is sent to notify the client that the position changed.

When this message is received, then the client must update the position in the memory to maintain the current state of all positions across all symbols and exchanges.

The initial state of the collection is delivered via the snapshot message POSITION_SNPASHOT.

Delivery triggers:

  • On position update

Properties

NameTypeRequiredDescription
typestringtrueMessage type, constant POSITION_SNAPSHOT.
exchange_idstringfalseExchange identifier.
symbol_id_exchangestringfalseExchange symbol.
symbol_id_coinapistringfalseCoinAPI symbol.
avg_entry_pricenumberfalseCalculated average price of all fills on this position.
quantitynumberfalseThe current position quantity.
sidestringfalseSide of order.
unrealized_pnlnumberfalseUnrealised profit or loss (PNL) of this position.
leveragenumberfalseLeverage for this position reported by the exchange.
cross_marginbooleanfalseIs cross margin mode enable for this position?
liquidation_pricenumberfalseLiquidation price. If mark price will reach this value, the position will be liquidated.

SYMBOLS_SNAPSHOT IN

Example of the SYMBOLS_SNAPSHOT message.

{
"type": "SYMBOLS_SNAPSHOT",
"exchange_id": "BITMEX",
"data": [
{
"symbol_id_coinapi": "BITMEX_FTS_ETH_USD_200925",
"symbol_id_exchange": "ETHUSDU20",
"asset_id_base_exchange": "ETH",
"asset_id_quote_exchange": "USD",
"asset_id_base_coinapi": "ETH",
"asset_id_quote_coinapi": "USD",
"price_precision": 0.010000000,
"size_precision": 1.000000000
},
{
"symbol_id_coinapi": "BITMEX_FTS_LTC_BTC_200925",
"symbol_id_exchange": "LTCU20",
"asset_id_base_exchange": "LTC",
"asset_id_quote_exchange": "XBT",
"asset_id_base_coinapi": "LTC",
"asset_id_quote_coinapi": "BTC",
"price_precision": 0.000001000,
"size_precision": 1.000000000
}
]
}

This message provides all market symbols from the single exchange and will be sent separately for all interconnected exchanges.

When this message is received, then the client must discard all market symbols from this exchange and apply the snapshot.

Delivery triggers:

  • On connection open

Properties

NameTypeRequiredDescription
typestringtrueMessage type, constant SYMBOLS_SNAPSHOT.
exchange_idstringfalseExchange identifier.
data[object]falseNo description
» symbol_id_exchangestringfalseExchange symbol identifier.
» symbol_id_coinapistringfalseCoinAPI symbol identifier.
» asset_id_base_exchangestringfalseBase asset exchange identifier.
» asset_id_quote_exchangestringfalseQuote asset exchange identifier.
» asset_id_base_coinapistringfalseBase asset CoinAPI identifier.
» asset_id_quote_coinapistringfalseQuote asset CoinAPI identifier.
» price_precisionnumberfalsePrice precision for the symbol.
» size_precisionnumberfalseSize precision for the symbol.

MESSAGE_REJECT IN

Example of the MESSAGE_REJECT object.

{
"type": "MESSAGE_REJECT",
"reject_reason": "ORDER_ID_NOT_FOUND",
"exchange_id": "BINANCE",
"message": "Order with ID: BINANCE-7d8a-4888 not found",
"rejected_message": "{\"client_order_id\":\"BINANCE-7d8a-4888\",\"exchange_id\":\"BINANCE\",\"type\":\"ORDER_CANCEL_SINGLE_REQUEST\"}"
}

Object is used to communicate rejection of user order request.

Properties

MessageReject object.

NameTypeRequiredDescription
typestringtrueMessage type, constant MESSAGE_REJECT.
reject_reasonstringtrueCause of rejection. Allowed values: OTHER, EXCHANGE_UNREACHABLE, EXCHANGE_RESPONSE_TIMEOUT, ORDER_ID_NOT_FOUND, INVALID_TYPE, METHOD_NOT_SUPPORTED, JSON_ERROR,
exchange_idstringfalseIf the message related to exchange, then the identifier of the exchange will be provided.
messagestringtrueMessage text.
rejected_messagestringfalseValue of rejected request, if available