# Covario Docs
## Authentication
### Request Token
To request an API token, you will need to submit a POST request with the following parameters
- client_id
- client_secret
- grant_type
```
POST /connect/token
CONTENT-TYPE application/x-www-form-urlencoded
client_id = client1 & client_secret = secret & grant_type = client_credentials
```
## DMA
### SignalR
#### Overview
A SignalR hub is used to route orders down to venues.
**BaseUrl:** https://api.covar.io/v2/dma/orderHub
**Methods:**
`PlaceOrder` | `params: PlaceOrderRequest` (Add hyper link to section in which is described)
`CancelOrderById` | `params: venueCode, fundId, orderId`
##### How to connect:
```
//Javascript example
var connection = new signalR.HubConnectionBuilder()
.withUrl(endPoint, { accessTokenFactory: () => token })
.configureLogging(signalR.LogLevel.Debug)
.build();
await connection.start()
```
```
//C# example
var token = AuthenticationService.GetAccessToken();
var connection = new HubConnectionBuilder()
.WithUrl("https://api.covar.io/v2/dma/orderHub"),
options => options.AccessTokenProvider = () => token)
.Build();
connection.StartAsync().Wait();
```
##### How to listen to an event:
To listen to events, before starting the connection event listeners need to be attached to the connecion object like bellow:
```
//Javascript example
connection.on("OrderUpdated", (order) => {
//Do something with order.data
});
connection.on("NewExecution", (execution) => {
// do something with (execution.data);
});
connection.on("MarginUpdate", (margin) => {
//Do something with (margin.data);
});
```
```
//C# example
connection.On<ApiBaseResponse<OrderDTO>>("OrderUpdated", (msg) => {
//Do something with msg.data
})
connection.On<ApiBaseResponse<ExecutionReportDTO>>("NewExecution", (msg) => {
//Do something with msg.data
})
connection.On<ApiBaseResponse<MarginReportDTO>>("MarginUpdate", (msg) => {
//Do something with msg.data
})
```
##### SignalR Events to subscribe:
`OrderUpdated`
`NewExecution`
`MarginUpdate`
`Heartbeat`
#### Place Order
Send buy and sell orders direct to connected venues
**Parameters** : 1 Parameter
- ApiOrderRequest: obj
**Signature** : `PlaceOrder(ApiOrderRequest orderRequest)`
**Place order request:**
Parameter | Required | Type | Enum | Description
-----------------|----------|---------|-------------------------------------------------------------|----------------------------------------------------------
clientReference | true | string | | your unique client order reference for tracking purposes
venue | true | string | binance, deribit, ftx, kraken | venue where the order should be routed to
fundId | true | uuid | uuid | fundId in a guid (uuid) format
instrumentType | true | string | spot, options, futures, swaps | type of security to be traded
symbol | true | string | | instrument code (i.e BTC-USD-PERP-BTC)
side | true | string | buy, sell | direction of order
orderType | true | string | market, limit | type of order
timeInForce | true | string | GoodTillCancel, DayOrSession, FillOrKill, ImmediateOrCancel | Time in force to define order life cycle
price | true | decimal | | limit price to pay on the execution (default = 0)
quantity | true | decimal | | amount to buy or sell
**Place order request example**
```json
// Javascript example
var placeOrderRequest =
{
"fundId":"541cd25b-5810-4631-b97c-e92f54031094",
"clientReference":"2ad23bef-ed29-4768-a712-a0ce7e1eb7f6",
"venue":"deribit",
"symbol":"BTC-USD-PERP-BTC",
"price":1000,
"quantity":100,
"side":"buy",
"timeInForce":"GoodTillCancel",
"orderType":"limit",
"instrumentType":"swaps"
}
connection.invoke("PlaceOrder", placeOrderRequest)
```
After sending the request you will receive the order acknowledgement and need to subscribe to order update events to receieve further updates.
**Order response:**
Parameter | Type | Description
-------------------|---------|--------------------------------------------------------------------------------------------------
messageType | string | Type of payload received (Order, Rejection, MarginReport, FundingReport, CancelAck, OrderUpdate)
clientReference | string | Unique client reference passed
erroCode | int | error code (default = 0 (No error))
text | string | Text message when an error happened on the order sending/processing
data | obj | Payload response obj (Order)
› orderId | uuid | Covario OrderId
› clientReference | string | Unique client reference
› venue | string | Selected venue
› fundId | uuid | Selected fund
› instrumentType | string |
› symbol | string | Covario instrument code
› side | string | Order side (Buy or Sell)
› type | string | Market, Limit
› timeInForce | string | GoodTillCancel, DayOrSession, FillOrKill, ImmediateOrCancel
› price | decimal | default = 0 for market orders
› quantity | decimal | Order amount
› status | string | Order status
› user | string | User email that sent the order
› timestamp | string | DateTimeOffset UTC time
› text | string | Text message specific to order
**Order response example**
```json
// Javascript example
{
"messageType":"Order",
"clientReference":"TEST_ORDER:1affdaea-ef6c-48e1-ff43-3a0bffae3b91",
"errorCode":0,
"text":null,
"data":{
"orderId":"77fdeaee-5266-4bfa-b09f-879176407333",
"clientReference":"TEST_ORDER:1affdaea-ef6c-48e1-ff43-3a0bffae3b91",
"venue":"Deribit",
"fundId":"541cd25b-5810-4631-b97c-e92f54031094",
"instrumentType":"Swaps",
"symbol":"BTC-USD-PERP-BTC",
"side":"Buy",
"type":"Limit",
"timeInForce":"GoodTillCancel",
"price":1000,
"quantity":100,
"status":"PendingNew",
"user":"technology@covar.io",
"timestamp":"2022-08-04T10:00:46.997328+00:00",
"text":null
}
}
```
#### Cancel Order
Send order cancelation direct to connected venues
**Signature** : `CancelOrderById(string venue, uuid fundId, uuid orderId)`
**Cancel order request:**
Parameter | Required | Type | Enum | Description
------------|-----------|---------|-------------------------------|-------------------------------------
venueCode | true | string | binance, deribit, ftx, kraken | Name of the counterparty
fundId | true | uuid | | Fund where the order was originated
orderId | true | uuid | | Unique Covario orderId
```
// Javascript example
connection.invoke("CancelOrderById", "deribit", "541cd25b-5810-4631-b97c-92f54031094", "77fdeaee-5266-4bfa-b09f-879176407333")
```
After sending the request an order update message will be received on the websocket
```json
{
"messageType":"Order",
"clientReference":"TEST_ORDER:1affdaea-ef6c-48e1-ff43-3a0bffae3b91",
"errorCode":0,
"text":"Order 77fdeaee-5266-4bfa-b09f-879176407333, buy @ 1000.0 has been cancelled",
"data":{
"orderId":"77fdeaee-5266-4bfa-b09f-879176407333",
"clientReference":"TEST_ORDER:1affdaea-ef6c-48e1-ff43-3a0bffae3b91",
"venue":"Deribit",
"fundId":"541cd25b-5810-4631-b97c-e92f54031094",
"instrumentType":"Swaps",
"symbol":"BTC-USD-PERP-BTC",
"side":"Buy",
"type":"Limit",
"timeInForce":"GoodTillCancel",
"price":1000,
"quantity":100,
"status":"Canceled",
"user":"technology@covar.io",
"timestamp":"2022-08-04T10:00:46.997328+00:00",
"text":"Order 77fdeaee-5266-4bfa-b09f-879176407333, buy @ 1000.0 has been cancelled"
}
}
```
### Rest
### GetOrders
### GetMagins
## MarketData
### Get Orderbooks
Used to subscribe to a stream of full snapshots.
**Parameters** : 2 Parameters
- OrderBook request
- Delay between snapshots in milliseconds
**Signature** : `GetOrderbook(OrderBookRequest orderBookRequest, int delay)`
**Unsubscribe** : ` InvokeAsync("UnsubscribeOrderbook") `
**OrderBook request object**
| Parameter | Required | Type | Enum | Description |
|----------------|----------|--------|-------------------------------|-------------------------------|
| venueCode | true | string | | Name of the counterparty |
| instrumentType | true | string | Spot, Options, Futures, Swaps | Type of the instrument |
| instrumentCode | true | string | | Code of the instrument |
| depth | true | int | | Number of levels to subscribe |
**OrderBook request example**
```json
{
"venueCode": "coinbase",
"instrumentType": "Spot",
"instrumentCode": "BTC-USD",
"depth": 100
}
```
**OrderBook response example**
Name | Type | Description
---|---|---
data | object |
› asks | array of [price, amount] | List of asks
› bids | array of [price, amount] | List of bids
```json
{
"bids":[["0.07164900","10.97890000"],["0.07164300","0.03510000"],...,["0.07162000","0.69800000"]],
"asks":[["0.07165000","5.77460000"],["0.07165200","0.65050000"],...,["0.07166000","0.10760000"]]
}
```
**Javascript stream example [Docs](https://docs.microsoft.com/en-us/aspnet/core/signalr/streaming?view=aspnetcore-6.0#javascript-client)**
```js
const connection = new HubConnectionBuilder()
.withUrl('https://api-test.covar.io/v1/marketdata/realtimeHub', {
accessTokenFactory: () => 'YOUR ACCESS TOKEN TOKEN HERE'
}).build();
let orderBookRequest = {
venueCode: "Coinbase",
instrumentCode: "BTC-USD",
depth: "100"
};
connection.start().then((result) => {
connection.stream("GetOrderbook", orderBookRequest, 1000)
.subscribe({
next: (item) => {
console.log(item);
},
complete: () => {
console.log("Finished");
},
error: (err) => {
console.log(err);
}
});
});
```
### Get Trades
Used to subscribe to a stream of trades.
**Parameters** : 1 Parameters
- Trades request
**Signature** : `GetTrades(TradesRequest tradesRequest)`
**Unsubscribe** : ` InvokeAsync("UnsubscribeTrades") `
**Trades request object**
| Parameter | Type | Enum | Description |
|----------------|--------|-------------------------------|--------------------------|
| venueCode | string | | Name of the counterparty |
| instrumentType | string | Spot, Options, Futures, Swaps | Type of the instrument |
| instrumentCode | string | | Code of the instrument |
**Trades request example**
```json
{
"venueCode": "coinbase",
"instrumentType": "Spot",
"instrumentCode": "BTC-USD"
}
```
**Trades response example**
| Name | Type | Description |
|---------------|-----------|----------------------------------------|
| volume | string | Amount of the trade |
| price | string | Price of the trade execution |
| side | string | Side of the trade |
| trade_id | string | Id of the trade in the exchange |
| time | timestamp | Timestamp of the trade execution |
| time_vendor | timestamp | Timestamp from the exchange |
| time_received | timestamp | Timestamp covario received the message |
```json
{
"volume":"3.84",
"price":"3.855",
"side":"buy",
"trade_id":"571264",
"time":"2021-11-08T10:13:19.9457110+00:00"
"time_vendor":"2021-11-08T10:13:19.9453110+00:00"
"time_received":"2021-11-08T10:13:20.0011391+00:00"
}
```
**Javascript stream example [Docs](https://docs.microsoft.com/en-us/aspnet/core/signalr/streaming?view=aspnetcore-6.0#javascript-client)**
```js
const connection = new HubConnectionBuilder()
.withUrl('https://api-test.covar.io/v1/marketdata/realtimeHub', {
accessTokenFactory: () => 'YOUR ACCESS TOKEN TOKEN HERE'
}).build();
let tradesRequest = {
venueCode: "Coinbase",
instrumentCode: "BTC-USD"
};
connection.start().then((result) => {
connection.stream("GetTrades", tradesRequest)
.subscribe({
next: (item) => {
console.log(item);
},
complete: () => {
console.log("Finished");
},
error: (err) => {
console.log(err);
}
});
});
```
## Custody
**Get Transfer**
----
Get transfer information by id
* **URL**
`/api/transfer/{transferID}`
* **Method:**
`GET`
* **URL Params**
| Parameter | Type | Enum | Description |
|----------------|--------|-------------------------------|------------------------|
| transferId | GUID | | Id of the transfer |
* **Success Response:**
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| id | string | | Id of the transfer |
| vendorTransactionId | string | | Fireblocks transaction ID |
| fundId | GUID | | Id of the fund |
| senderId | GUID | | Id of the sender account |
| receiverId | GUID | | Id of the receiver account |
| asset | string | | Asset that has been transferred |
| requestedAmount | decimal | | Amount requested to transfer |
| grossAmount | decimal | | Gross amount |
| netAmount | decimal | | Net received amount |
| transactionFees | arrayof TransactionFees | | Fees object |
| status | string | SUBMITTED, QUEUED, PENDING_AUTHORIZATION, PENDING_SIGNATURE, BROADCASTING, PENDING_3RD_PARTY_MANUAL_APPROVAL, PENDING_3RD_PARTY, CONFIRMING, PENDING_AML_CHECKUP, PARTIALLY_COMPLETED, PENDING_AML_SCREENING, COMPLETED, CANCELLED, REJECTED, BLOCKED, FAILED | Status of the transfer |
| subStatus | string | | Substatus of the transfer |
| createdBy | string | | Email of the transfer initiator |
| createdAt | Timestamp | | Time the transfer initiated |
| updatedAt | Timestamp | | Last transfer update |
| numberOfConfirmations | int | | Number of confirmations needed for the transfer |
| comment | string | | Comment of the transfer |
| type | string | | Type of the transfer |
| sequence | int | | Sequence of the transfer |
| parentTransactionId | GUID? | | Parent ID in case of multileg transfer |
| childTransactions | arrayof GUID | | Id of children transaction in case of multileg |
TransactionFees:
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| id | string | | Id of the fee |
| transactionId | string | | Id of the transfer |
| feeType | string | | Type of the fee |
| asset | string | | Fee currency for the fee |
| amount | Decimal | | Amount of the fee |
* **Code:** 200 <br />
**Content:**
```
{
"id": "string",
"vendorTransactionId": "string",
"fundId": "string",
"senderId": "string",
"receiverId": "string",
"asset": "string",
"requestedAmount": 0,
"grossAmount": 0,
"netAmount": 0,
"transactionFees": [
{
"id": "string",
"transactionId": "string",
"feeType": "string",
"asset": "string",
"amount": 0
}
],
"status": "UNKNOWN",
"subStatus": "string",
"createdBy": "string",
"createdAt": "2022-08-04T09:19:15.722Z",
"updatedAt": "2022-08-04T09:19:15.722Z",
"numberOfConfirmations": 0,
"comment": "string",
"type": "STANDARD",
"sequence": 0,
"parentTransactionId": "string",
"childTransactions": [
"string"
]
}
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'GET' \
'https://baseURL/api/transfers/0000-0000-0000-0000' \
-H 'accept: application/json'
```
**Get Transfer**
----
Get transfers information
* **URL**
`/api/transfers`
* **Method:**
`GET`
* **Success Response:**
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| data | array | | List of transfers |
| > id | string | | Id of the transfer |
| > vendorTransactionId | string | | Fireblocks transaction ID |
| > fundId | GUID | | Id of the fund |
| > senderId | GUID | | Id of the sender account |
| > receiverId | GUID | | Id of the receiver account |
| > asset | string | | Asset that has been transferred |
| > requestedAmount | decimal | | Amount requested to transfer |
| > grossAmount | decimal | | Gross amount |
| > netAmount | decimal | | Net received amount |
| > transactionFees | arrayof TransactionFees | | Fees object |
| > status | string | SUBMITTED, QUEUED, PENDING_AUTHORIZATION, PENDING_SIGNATURE, BROADCASTING, PENDING_3RD_PARTY_MANUAL_APPROVAL, PENDING_3RD_PARTY, CONFIRMING, PENDING_AML_CHECKUP, PARTIALLY_COMPLETED, PENDING_AML_SCREENING, COMPLETED, CANCELLED, REJECTED, BLOCKED, FAILED | Status of the transfer |
| > subStatus | string | | Substatus of the transfer |
| > createdBy | string | | Email of the transfer initiator |
| > createdAt | Timestamp | | Time the transfer initiated |
| > updatedAt | Timestamp | | Last transfer update |
| > numberOfConfirmations | int | | Number of confirmations needed for the transfer |
| > comment | string | | Comment of the transfer |
| > type | string | | Type of the transfer |
| > sequence | int | | Sequence of the transfer |
| > parentTransactionId | GUID? | | Parent ID in case of multileg transfer |
| > childTransactions | arrayof GUID | | Id of children transaction in case of multileg |
TransactionFees:
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| id | string | | Id of the fee |
| transactionId | string | | Id of the transfer |
| feeType | string | | Type of the fee |
| asset | string | | Fee currency for the fee |
| amount | Decimal | | Amount of the fee |
* **Code:** 200 <br />
**Content:**
```
[
{
"id": "string",
"vendorTransactionId": "string",
"fundId": "string",
"senderId": "string",
"receiverId": "string",
"asset": "string",
"requestedAmount": 0,
"grossAmount": 0,
"netAmount": 0,
"transactionFees": [
{
"id": "string",
"transactionId": "string",
"feeType": "string",
"asset": "string",
"amount": 0
}
],
"status": "UNKNOWN",
"subStatus": "string",
"createdBy": "string",
"createdAt": "2022-08-04T12:29:52.730Z",
"updatedAt": "2022-08-04T12:29:52.730Z",
"numberOfConfirmations": 0,
"comment": "string",
"type": "STANDARD",
"sequence": 0,
"parentTransactionId": "string",
"childTransactions": [
"string"
]
}
]
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'GET' \
'https://baseURL/api/transfers' \
-H 'accept: application/json'
```
**Create transfer**
----
initiate a transfer of assets.
* **URL**
`/api/transfers`
* **Method:**
`POST`
* **Body Params**
| Parameter | Type | Enum | Description |
|------------|---------|------|----------------------------|
| senderId | GUID | | Account id of the sender |
| receiverId | GUID | | Account id of the receiver |
| asset | string | | Asset to be transferred |
| amount | decimal | | Amount to transfer |
```
{
"senderId": "0000-0000-0000-0000",
"receiverId": "0000-0000-0000-0000",
"asset": "BTC",
"amount": 1
}
```
* **Success Response:**
* **Code:** 200 <br />
**Content:**
```
{
"success": true,
"status": "Initiated",
"message": "",
"entryId": "0000-0000-0000-0000"
}
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'POST' \
'http://10.10.11.108/api/transfers' \
-H 'accept: application/json' \
-H 'Authorization: Bearer 897C5E42D8CB4E705F4AED5412B8D440381DC9B334B26469480621996DB806C1' \
-H 'Content-Type: application/json' \
-d '{
"senderId": "0000-0000-0000-0000",
"receiverId": "0000-0000-0000-0000",
"asset": "BTC",
"amount": 1
}'
```
## Instruments
**Get Spot instruments**
----
Get a list of spot instruments
* **URL**
`api/instruments/spot`
* **Method:**
`GET`
* **Success Response:**
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| symbol | string | | Code of the instrument |
| base | string | | Base currency |
| quote | string | | Quote currency |
| active | bool | | Active state |
* **Code:** 200 <br />
**Content:**
```
[
{
"symbol": "string",
"base": "string",
"quote": "string",
"active": true
}
]
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'GET' \
'https://api-test.covar.io/v2/api/instruments/spot' \
-H 'accept: text/plain'
```
**Get Futures instruments**
----
Get a list of spot future instruments
* **URL**
`api/instruments/future`
* **Method:**
`GET`
* **Success Response:**
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| symbol | string | | Code of the instrument |
| base | string | | Base currency |
| quote | string | | Quote currency |
| active | bool | | Active state |
* **Code:** 200 <br />
**Content:**
```
[
{
"symbol": "string",
"base": "string",
"quote": "string",
"active": true
}
]
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'GET' \
'https://api-test.covar.io/v2/api/instruments/future' \
-H 'accept: text/plain'
```
**Get Options instruments**
----
Get a list of spot options instruments
* **URL**
`api/instruments/option`
* **Method:**
`GET`
* **Success Response:**
| Name | Type | Enum | Description |
|-----------------------|-----------------|------|-------------------------------------------------|
| symbol | string | | Code of the instrument |
| base | string | | Base currency |
| quote | string | | Quote currency |
| active | bool | | Active state |
* **Code:** 200 <br />
**Content:**
```
[
{
"symbol": "string",
"base": "string",
"quote": "string",
"active": true
}
]
```
* **Error Response:**
* **Code:** 401 UNAUTHORIZED <br />
* **Sample Call:**
```
curl -X 'GET' \
'https://api-test.covar.io/v2/api/instruments/option' \
-H 'accept: text/plain'
```