One Trading API v1
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
Introduction
The One Trading API is designed to allow programmatic access to exchange features. This documentation provides information on the available functionality of the One Trading. We provide two APIs: HTTP REST and WebSockets. For detailed information about our API visit the Rest API Overview section or the WSS Overview section.
FAST Upgrade 🚀
The updated API documentation for our new ultra fast crypto exchange includes significant enhancements for improved performance and efficiency. Key changes include:
- Introduction of two WebSocket endpoints to optimize speed and scalability, with one offering the lowest latency directly to the exchange.
- Consolidation of subscription channels into three primary ones for the exchange: TRADING, ORDER_BOOK, and PRICE_TICKS.
- Timekeeping has been upgraded to nanosecond precision, enhancing the accuracy of data packets.
- Recommendations for structuring JSON requests to leverage our custom parser for enhanced speed.
- Enhanced order cancellation processes, with a new, faster method included.
- Revised API URLs and endpoints, including changes to the way legacy data is accessed. These changes aim to deliver unparalleled performance, maintaining high availability and efficiency in trading operations.
Getting started
URLs
There are 2 URLs to communicate via WebSockets and 1 for REST API calls:
wss://streams.fast.onetrading.com?x-version=3
- WebSocket URL for the ultra fast exchange.wss://garcon.fast.onetrading.com
- WebSocket URL for less time sensitive data.https://api.onetrading.com/fast/v1
- REST API URL.
For each section of the API documentation, it will be stated which URL serves those particular endpoints.
Authentication
The One Trading API requires an api key to access private endpoints. You can generate API keys via the One Trading website.
⚠️ Never share an API key, if you suspect that an API key was compromised revoke it immediately.
When generating an API key, you may select one or more scopes for the key.
Read
- grants access to all api endpoints, except for creating or cancelling orders and transfers.Trade
- allows creation or cancellation of orders.Withdraw
- allows withdrawals via the One Trading API (these withdrawals bypass two factor authentication).
You may optionally add an IP restriction. Any request using that API key is rejected, unless the source IP of the request is one of the trusted IPs.
⚠️ Always select the minimal required scope for an api key. We recommend to set one or more trusted IPs to further harden API keys with scope Trade
or Withdraw
.
Requests to private endpoints MUST use the Bearer Token Scheme to be authenticated. The API key must be transmitted via the Authorization
header with the Bearer
scheme
Authorization: Bearer eyJvcmciOiJiaXRwYW5kYS1nZSIsImFsZyI6IlJTMjU2Iiwia2lkIjoiZXhjaGFuZ2UtbGl2ZSJ9.eyJhdW...
To protect API keys and sensitive data in transit, all requests to the One Trading API MUST use TLS encryption. Plain HTTP requests are not accepted.
⚠️ Make sure that your client validates the server certificate and aborts if validation fails.
Order placement limits
Each user can have at most 200 open orders at a given time. This limit is global, across all instruments. When submitting a new order that exceeds this limit, it will be rejected with an HTTP status 422
and an error code MAX_OPEN_ORDERS_EXCEEDED
.
Public
Base URL: https://api.onetrading.com/fast/v1
Everything that is publicly available without any authorisation
Currencies
Code samples
curl --request GET \
--url https://example.com/currencies \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/currencies", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/currencies")
.header("Accept", "application/json")
.asString();
GET /currencies
Get a list of all available currencies.
Example responses
200 Response
[
{
"code": "BTC",
"precision": 5,
"unified_cryptoasset_id": 1,
"name": "Bitcoin"
},
{
"code": "XRP",
"precision": 8,
"unified_cryptoasset_id": 52,
"name": "XRP"
},
{
"code": "USDT",
"precision": 3,
"unified_cryptoasset_id": 825,
"name": "Tether USDt"
},
{
"code": "EUR",
"precision": 2,
"unified_cryptoasset_id": 0,
"name": "Euro"
}
]
default Response
{
"error": "SOME_ERROR_CODE"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Array of available currencies | Currency |
default | Default | General error response, explanations for all error code can be found here | Error |
Candlesticks
Code samples
curl --request GET \
--url 'https://example.com/candlesticks/BTC_EUR?unit=HOURS&period=1&from=2019-10-03T04%3A59%3A59.999Z&to=2019-10-03T07%3A59%3A59.999Z' \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/candlesticks/BTC_EUR?unit=HOURS&period=1&from=2019-10-03T04%3A59%3A59.999Z&to=2019-10-03T07%3A59%3A59.999Z", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/candlesticks/BTC_EUR?unit=HOURS&period=1&from=2019-10-03T04%3A59%3A59.999Z&to=2019-10-03T07%3A59%3A59.999Z")
.header("Accept", "application/json")
.asString();
GET /candlesticks/{instrument_code}
Get instrument candlesticks for a specified time period. The requested time period may include up to 5000 candlesticks; for example, a request for minutely candles is limited to at most ~83 hours. Please note that fewer candlesticks than the theoretical limit may be provided for a given time period due to gaps in trading activity. Additionally, the endpoint now accepts a parameter called 'countBack,' which specifies the exact number of bars to load. If not provided, the default value is set to 5000. It's important to note that 'countBack' takes precedence over 'from' when both parameters are present.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
unit | query | TimeGranularityUnit | true | Defines the unit of candlestick time granularity |
period | query | TimeGranularityPeriod | true | Defines the period of candlestick time granularity. |
from | query | MarketTime | true | Defines start of a query search |
to | query | MarketTime | true | Defines end of a query search |
instrument_code | path | Instrument | true | Defines market by using unique instrument |
countBack | query | number | false | Defines the exact number of candlesticks to load. |
Enumerated Values
Parameter | Value |
---|---|
unit | MINUTES |
unit | HOURS |
unit | DAYS |
unit | WEEKS |
unit | MONTHS |
Example responses
200 Response
{
"status": "data",
"candlesticks": [
{
"last_sequence": 12345,
"instrument_code": "BTC_EUR",
"granularity": {
"unit": "MINUTES",
"period": 1
},
"high": "123.456",
"low": "123.456",
"open": "123.456",
"close": "123.456",
"total_amount": "123.456",
"volume": "123.456",
"time": "2019-08-24T14:15:22Z"
}
]
}
400 Response
{
"error": "CANDLESTICKS_TIME_RANGE_TOO_BIG"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Array of Candlesticks | Inline |
400 | Bad Request | The requested time range of candlesticks data exceeds max. supported size of 1500 items. | Error |
default | Default | General error response, explanations for all error code can be found here | Error |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» status | string | false | none | none |
» candlesticks | [Candlestick] | false | none | [Candlestick representing price action for a given period] |
»» last_sequence | number | true | none | The value of the sequence field of the last price tick (see PriceTickSequence) considered for this candlestick (see Websocket channel Price Ticks) |
»» instrument_code | Instrument | true | none | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
»» granularity | TimeGranularity | true | none | A length of time defined by unit and period used to identify the granularity of candlestick . For possible combinations see each property's documentation. |
»»» unit | TimeGranularityUnit | true | none | none |
»»» period | TimeGranularityPeriod | true | none | Combined with the unit, supported resolutions are 1, 5, 15, 30 MINUTES & 1, 4 HOURS & 1 DAYS & 1 WEEKS & 1 MONTHS. |
»» high | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» low | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» open | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» close | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» total_amount | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» volume | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
»» time | MarketTime(date-time) | true | none | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
Enumerated Values
Property | Value |
---|---|
unit | MINUTES |
unit | HOURS |
unit | DAYS |
unit | WEEKS |
unit | MONTHS |
Fee Groups
Code samples
curl --request GET \
--url https://example.com/fees \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/fees", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/fees")
.header("Accept", "application/json")
.asString();
GET /fees
Returns details of all general Fee Groups.
Example responses
200 Response
[
{
"fee_group_id": "default",
"display_text": "The standard fee plan.",
"fee_tiers": [
{
"volume": "0.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "100.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "250.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "1000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "5000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "10000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "20000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "50000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
}
]
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Available fee groups and their fee tiers | FeeGroup |
Instruments
Code samples
curl --request GET \
--url https://example.com/instruments \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/instruments", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/instruments")
.header("Accept", "application/json")
.asString();
GET /instruments
Get a list of all available trade instruments
Example responses
200 Response
[
{
"state": "ACTIVE",
"base": {
"code": "BTC",
"precision": 5
},
"quote": {
"code": "USDT",
"precision": 2
},
"amount_precision": 5,
"market_precision": 2,
"min_size": "10.0",
"min_price": "1000",
"max_price": "10000000"
},
{
"state": "ACTIVE",
"base": {
"code": "BTC",
"precision": 5
},
"quote": {
"code": "EUR",
"precision": 2
},
"amount_precision": 5,
"market_precision": 2,
"min_size": "10.0",
"min_price": "1000",
"max_price": "10000000"
},
{
"state": "ACTIVE",
"base": {
"code": "ETH",
"precision": 4
},
"quote": {
"code": "USDT",
"precision": 2
},
"amount_precision": 4,
"market_precision": 2,
"min_size": "10.0",
"min_price": "100",
"max_price": "10000000"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | none | Inline |
default | Default | General error response, explanations for all error code can be found here | Error |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» base | CurrencyCode | true | none | Currency code. |
» quote | CurrencyCode | true | none | Currency code. |
» min_size | BigDecimal | true | none | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
» amount_precision | number | true | none | The maximum allowed precision of the amount when creating an order |
» market_precision | number | true | none | The maximum allowed precision of the price when creating an order |
» state | string | true | none | Current status of the instrument. - NEW => A new instrument is launched. No trading is possible. - ACTIVE => All trading operations are supported. - SUSPENDED => Creating orders is suspended. Cancellation is possible. - IN_MAINTENANCE => Instrument is in maintenance. No trading is possible. - POST_ONLY => Only LimitOrders with post_only=true are allowed to establish liquidity in the order book. - CLOSED => A decomissioned instrument. No trading is possible. - UNDEFINED => No trading is possible. |
Enumerated Values
Property | Value |
---|---|
state | NEW |
state | ACTIVE |
state | SUSPENDED |
state | IN_MAINTENANCE |
state | POST_ONLY |
state | CLOSED |
state | UNDEFINED |
Order Book
Code samples
curl --request GET \
--url https://example.com/order-book/BTC_EUR \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/order-book/BTC_EUR", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/order-book/BTC_EUR")
.header("Accept", "application/json")
.asString();
GET /order-book/{instrument_code}
Get given instrument's order book.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
level | query | number | false | Specifies which level of order-book should be returned. Level 1 means only the best bid and ask, Level 2 is a compiled order book up to market precision and level 3 is a full orderbook. Orderbook level 3 is returned if no level is specified. If you wish to get regular updates about orderbooks please use our Websocket channel . |
depth | query | number | false | Specifies how many ask/bids should be returned. If there are more entries available, each order book side is |
instrument_code | path | Instrument | true | Defines market by using unique instrument |
Detailed descriptions
depth: Specifies how many ask/bids should be returned. If there are more entries available, each order book side is truncated to the given depth. The order of entries is preserved. The depth of a level 1 order book cannot be limited.
Example responses
This example shows all three representations of possible responses, not an actual response. You can only get one type based on what level of order book you choose
{
"instrument_code": "BTC_EUR",
"time": 1705506255137273000,
"asks": [
{
"price": "9449.0",
"amount": "54.46"
}
],
"bids": [
{
"price": "8888.0",
"amount": "16.464"
}
]
}
{
"instrument_code": "BTC_EUR",
"time": 1705506255137273000,
"bids": [
{
"price": "8673.0",
"amount": "14.48"
},
{
"price": "8670.0",
"amount": "6.354"
}
],
"asks": [
{
"price": "8978.0",
"amount": "624.24"
},
{
"price": "9757.0",
"amount": "12.7"
}
]
}
{
"instrument_code": "BTC_EUR",
"time": 1705506255137273000,
"sequence": 123456,
"bids": [
{
"price": "8882.0",
"amount": "0.1156316"
}
],
"asks": [
{
"price": "8945.4",
"amount": "0.1"
},
{
"price": "8945.9",
"amount": "0.95574218"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | This example shows all three representations of possible responses, not an actual response. You can only get one type based on what level of order book you choose | OrderBookSnapshot |
Market Ticker
Code samples
curl --request GET \
--url https://example.com/market-ticker \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/market-ticker", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/market-ticker")
.header("Accept", "application/json")
.asString();
GET /market-ticker
The market ticker provides information about the current state of a market and summary statistics on activity within the last 24 hours. Volume, low, high and price change are calculated based on a sliding window starting 24 hours ago and using minutely granularity. Market ticks are pushed on each trade when the 24 hour sliding window is moved forward. If there are no changes, no updates will be pushed.
Example responses
200 Response
[
{
"instrument_code": "BTC_EUR",
"state": "ACTIVE",
"base_volume": "3.39563",
"high": "58500.00",
"highest_bid": "58331.51",
"last_price": "58100.00",
"low": "56501.00",
"lowest_ask": "56527.86",
"price_change_percentage": "-2.11",
"price_change": "-1200.00",
"quote_volume": "194388.38",
"sequence": 1715611933889742000
},
{
"instrument_code": "BTC_USDT",
"state": "ACTIVE",
"base_volume": "30.81793",
"high": "63149.84",
"highest_bid": "63116.15",
"last_price": "58100.00",
"low": "56501.00",
"lowest_ask": "56527.86",
"price_change_percentage": "-2.81",
"price_change": "-1709.20",
"quote_volume": "194388.38",
"sequence": 1715612190307321900
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Array of latest market-ticks | MarketTick |
Market Ticker For Instrument
Code samples
curl --request GET \
--url https://example.com/market-ticker/BTC_EUR \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/market-ticker/BTC_EUR", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/market-ticker/BTC_EUR")
.header("Accept", "application/json")
.asString();
GET /market-ticker/{instrument_code}
Get statistics on a single market.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
instrument_code | path | Instrument | true | Defines market by using unique instrument |
Example responses
200 Response
{
"instrument_code": "ETH_BTC",
"state": "ACTIVE",
"base_volume": "63.183",
"high": "0.04779",
"highest_bid": "0.04774",
"last_price": "0.04727",
"low": "0.04720",
"lowest_ask": "0.04720",
"price_change_percentage": "0.90147",
"price_change": "0.00043",
"quote_volume": "2.99754",
"sequence": 1715593326581079600
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Market-tick | MarketTick |
Time
Code samples
curl --request GET \
--url https://example.com/time \
--header 'Accept: application/json'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = { 'Accept': "application/json" }
conn.request("GET", "/time", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/time")
.header("Accept", "application/json")
.asString();
GET /time
Returns the current server time in UTC.
Example responses
200 Response
{
"iso": "2018-12-11T10:58:41.219Z",
"epoch_millis": 1544525921219
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Time | Inline |
default | Default | General error response, explanations for all error code can be found here | Error |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» iso | MarketTime(date-time) | true | none | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
» epoch_millis | number | true | none | elapsed milliseconds since Unix Epoch. |
Trading
Base URL: https://api.onetrading.com/fast/v1
Everything regarding user order management.
❗️It is recommended to use the WebSocket for trading in order to get the lowest possible latencies and the best possible trading experience.
Balances
Code samples
curl --request GET \
--url https://example.com/account/balances \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/balances", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/balances")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/balances
Account balances
Returns the balance details for an account, balances are updated approximately 5 seconds after any trading activity on the exchange, or any time funds are moved. If you wish to have real time balance updates, it is recommended to use our websocket Account History Channel
.
Example responses
200 Response
{
"account_id": "e4eaaaf2-d142-11e1-b3e4-080027620cdd",
"balances": [
{
"account_id": "e4eaaaf2-d142-11e1-b3e4-080027620cdd",
"currency_code": "BTC",
"change": 0.5,
"available": "10.0",
"locked": "1.1234567",
"sequence": "5",
"time": "2024-05-10T14:38:58.506Z"
},
{
"account_id": "e4eaaaf2-d142-11e1-b3e4-080027620cdd",
"currency_code": "ETH",
"change": 0.5,
"available": "10.0",
"locked": "1.1234567",
"sequence": "6",
"time": "2024-05-10T14:38:58.506Z"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Balance information | Account |
Fees
Code samples
curl --request GET \
--url https://example.com/account/fees \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/fees", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/fees")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/fees
Current fees
Returns the fee tiers, the running 30 day trading volume and active fee tier.
Example responses
200 Response
{
"account_id": "ed524d00-820a-11e9-8f1e-69602df16d85",
"running_trading_volume": "0.0",
"running_volume": "0.0",
"running_volume_currency": "EUR",
"fee_group_id": "default",
"fee_tiers": [
{
"volume": "0.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "100.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "250.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "1000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "5000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "10000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "20000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
},
{
"volume": "50000.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
}
],
"active_fee_tier": {
"volume": "0.0",
"fee_group_id": "default",
"maker_fee": "0.0",
"taker_fee": "0.0"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Fee information for account | AccountFeeGroup |
Get Orders
Code samples
curl --request GET \
--url https://example.com/account/orders \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/orders", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/orders")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/orders
Get orders
Return a paginated report on currently open orders, sorted by creation timestamp (newest first). Query parameters and filters can be used to specify if historical orders should be reported as well. If no query filters are defined, all orders which are currently active
will be returned. If you want to query specific time frame parameters, from
and to
are mandatory, otherwise it will start from the latest orders.
Note: This endpoint only returns a maximum of the last 400 orders, prioritising currently open orders. To get longer term trade data you can use the export functionality form the UI.
Note: After the FAST upgrade 🚀, orders from the legacy Exchange are no longer returned. To get legacy orders, you will need to use the export functionality from the UI and not the API.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
from | query | MarketTime | false | Defines start of a query search |
to | query | MarketTime | false | Defines end of a query search |
instrument_code | query | Instrument | false | Filter order history by instrument code |
with_cancelled_and_rejected | query | boolean | false | Return orders which have been cancelled by the user before being filled or rejected by the system as invalid. Additionally, all inactive filled orders which would return with "with_just_filled_inactive". |
with_just_filled_inactive | query | boolean | false | Return order history for orders which have been filled and are no longer open. Use of "with_cancelled_and_rejected" extends "with_just_filled_inactive" and in case both are specified the latter is ignored. |
with_just_orders | query | boolean | false | Returns order history for orders but does not return any trades corresponding to the orders. It may be significantly faster and should be used if user is not interesting in trade information. Can be combined with any other filter. |
max_page_size | query | string | false | Set max desired page size. If no value is provided, by default a maximum of 100 results per page are returned. The maximum upper limit is 100 results per page. |
cursor | query | string | false | Pointer specifying the position from which the next pages should be returned. |
Example responses
200 Response
{
"order_history": [
{
"order": {
"account_id": "ef3a5f4c-cfcd-415e-ba89-5a9abf47b28a",
"order_id": "d453ca12-c650-46dd-9dee-66910d96bfc0",
"client_id": "6f770867-7673-4786-909a-4f7b4c1fa8d9",
"amount": "0.2",
"side": "SELL",
"instrument_code": "BTC_USDT",
"price": "10159.76",
"time": "2019-08-23T10:02:31.663Z",
"sequence": 8,
"time_last_updated": "2019-08-23T10:02:31.663Z",
"filled_amount": "0.2",
"status": "FILLED_FULLY"
},
"trades": [
{
"fee": {
"fee_amount": "0.4188869",
"fee_currency": "USDT",
"fee_percentage": "0.1",
"fee_group_id": "default",
"fee_type": "TAKER",
"running_trading_volume": "0.0"
},
"trade": {
"trade_id": "ec82896f-fd1b-4cbb-89df-a9da85ccbb4b",
"order_id": "d453ca12-c650-46dd-9dee-66910d96bfc0",
"account_id": "ef3a5f4c-cfcd-415e-ba89-5a9abf47b28a",
"amount": "0.2",
"side": "SELL",
"instrument_code": "BTC_USDT",
"price": "10159.76",
"time": "2019-08-23T10:02:32.663Z",
"sequence": 9
}
}
]
}
],
"max_page_size": 100,
"cursor": "1704316702735:5fcd9ff0-9a45-426c-8490-5338b5b7178e"
}
default Response
{
"error": "SOME_ERROR_CODE"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Order history for account | OrderHistory |
default | Default | General error response, explanations for all error code can be found here | Error |
Create Order
Code samples
curl --request POST \
--url https://example.com/account/orders \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}' \
--header 'Content-Type: application/json' \
--data '{"instrument_code":"BTC_EUR","side":"BUY","type":"LIMIT","amount":"1.23","price":"5000.00","time_in_force":"GOOD_TILL_CANCELLED"}'
import http.client
conn = http.client.HTTPSConnection("example.com")
payload = "{\"instrument_code\":\"BTC_EUR\",\"side\":\"BUY\",\"type\":\"LIMIT\",\"amount\":\"1.23\",\"price\":\"5000.00\",\"time_in_force\":\"GOOD_TILL_CANCELLED\"}"
headers = {
'Content-Type': "application/json",
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("POST", "/account/orders", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.post("https://example.com/account/orders")
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.body("{\"instrument_code\":\"BTC_EUR\",\"side\":\"BUY\",\"type\":\"LIMIT\",\"amount\":\"1.23\",\"price\":\"5000.00\",\"time_in_force\":\"GOOD_TILL_CANCELLED\"}")
.asString();
POST /account/orders
Create a new order
Create a new order of the type LIMIT
.
Additionally, LIMIT
Orders support GOOD_TILL_CANCELLED
,
IMMEDIATE_OR_CANCELLED
and FILL_OR_KILL
which can be specified as time_in_force
option.
If none is specified GOOD_TILL_CANCELLED
is assumed.
There is a minimum size per order which can be looked up by querying the /instruments
endpoint.
Additionally, the precision limitations can be found there. Globally across all markets, at most 200 orders
can be kept open at any given point in time.
Optionally a client_id
can be set by clients to track orders without waiting for the assigned order id.
NOTE: You are responsible for uniqueness of a client_id. If two or more orders are created with the same client_id, the older orders can then only be cancelled using order_id, or via the cancel all orders endpoint.
Make sure to have a valid api key with the scope TRADE
, otherwise this operation will be rejected. The api key can be generated via the user interface at https://exchange.onetrading.com/trading-accounts/account/api.
Body parameter
{
"instrument_code": "BTC_EUR",
"side": "BUY",
"type": "LIMIT",
"amount": "1.23",
"price": "5000.00",
"time_in_force": "GOOD_TILL_CANCELLED"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateOrder | true | none |
Example responses
200 Response
{
"amount": "1",
"instrument_code": "BTC_EUR",
"price": "5000",
"side": "BUY",
"time_in_force": "GOOD_TILL_CANCELLED",
"type": "LIMIT",
"client_id": "2cc6f8d6-bf0c-4944-bcaa-f989c4c8def5"
}
400 Response
{
"error": "INVALID_PRICE"
}
422 Response
{
"error": "INSUFFICIENT_FUNDS"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The order is valid and was successfully accepted. | OrderSubmitted |
400 | Bad Request | An invalid body was provided and therefore the request was rejected. Check the error code for details. | Error |
422 | Unprocessable Entity | The request is unprocessable. Check the error code for details. | Error |
Close All Orders
Code samples
curl --request DELETE \
--url https://example.com/account/orders \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("DELETE", "/account/orders", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.delete("https://example.com/account/orders")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
DELETE /account/orders
Close multiple orders
Submits a close request for all open orders of an account.
Optionally the user can specify one of an instrument_code
,
a list of ids
or a list of client_ids
as HTTP query parameters. The instrument_code
parameter will only close orders for the given instrument, while the ids
and client_ids
parameter can be used to specify various orders regardless to which
markets they belong. Calling this endpoint without any of the optional
parameters will close all orders of the account. Calling this
endpoint with more than one of the specified query parameters is not supported.
The orders must be submitted by the account that the API key has been created for.
When the API returns 200 OK, it returns a list of UUIDs representing either the order IDs
or client order IDs, that were submitted for cancellation, depending on whether the
client_ids
query parameter was used or not.
One Trading will always fill orders with best effort. Therefore, when attempting to close all orders, these orders may be in the process of being filled. In this case, One Trading will attempt to close the orders but the order may already be partially/fully filled.
Make sure to have a valid API key with the scope TRADE
,
otherwise this operation will be rejected. The API key can be generated
via the user interface at https://exchange.onetrading.com/trading-accounts/account/api.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
instrument_code | query | string | false | Only close orders in given market (omit to close all orders) |
ids | query | string | false | An array of comma separated order IDs, in the form of [UUID_1,UUID_2,UUID_3,...,UUID_N] |
client_ids | query | string | false | An array of comma separated client order IDs, in the form of [UUID_1,UUID_2,UUID_3,...,UUID_N] |
Example responses
200 Response
[
"d1efc79d-f78d-4a9d-a4c0-dbe76c9a4e6f",
"8ada8f2d-56ea-4b24-bfd4-06723dfbb3be",
"82d36d62-9d02-4154-8686-9b16472a4a38",
"09759fa5-8b3a-47e7-a8c7-a0833b749855",
"6eb6a84a-eca9-4348-8c2d-cac1a18e81e7"
]
400 Response
{
"error": "MAX_NUMBER_OF_ORDERS_TO_CLOSE_EXCEEDED"
}
404 Response
{
"error": "INVALID_ORDER_ID"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | The following orders ids were submitted for closing | Inline |
400 | Bad Request | The number of UUIDs to cancel exceeds the advertised upper limit | Error |
404 | Not Found | A supplied UUID value was invalid | Error |
default | Default | General error response, explanations for all error code can be found here | Error |
Response Schema
Get Order
Code samples
curl --request GET \
--url https://example.com/account/orders/ \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/orders/", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/orders/")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/orders/{order_id}
Get information for an order by orderId
Get information for an order
Example responses
200 Response
{
"order": {
"account_id": "a4c699f6-338d-4a26-941f-8f9853bfc4b9",
"order_id": "36bb2437-7402-4794-bf26-4bdf03526439",
"amount": "100.0",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "7349.2",
"time": "2019-09-27T15:05:32.063Z",
"sequence": 48782,
"time_last_updated": "2019-09-27T15:05:35.096Z",
"filled_amount": "100.0",
"status": "FILLED_FULLY"
},
"trades": [
{
"fee": {
"collection_type": "STANDARD"
},
"trade": {
"trade_id": "fdff2bcc-37d6-4a2d-92a5-46e09c868664",
"order_id": "36bb2437-7402-4794-bf26-4bdf03526439",
"account_id": "a4c699f6-338d-4a26-941f-8f9853bfc4b9",
"amount": "1.4",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "7341.4",
"time": "2019-09-27T15:05:32.564Z",
"sequence": 48670
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | none | OrderHistoryEntry |
Close Order by Order Id
Code samples
curl --request DELETE \
--url https://example.com/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08 \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("DELETE", "/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.delete("https://example.com/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
DELETE /account/orders/{order_id}
Close an Order by Order Id
Submits a request to close an open order by providing a valid order_id
.
Closing by client_id
is possible here.
A successful response indicates that the order cancellation has been accepted, a final confirmation of closing is sent to
the ACCOUNT_HISTORY
and TRADING
WebSocket channels. Additionally
the account history via REST API will contain the event. In some cases,
orders can not be closed successfully as they have already been closed
or filled. An error response will point to
the reason in a such scenario.
Make sure to have a valid api key with
the scope TRADE
, otherwise this operation will be rejected. The api
key can be generated via the user interface at
https://exchange.onetrading.com/trading-accounts/account/api.
Note: This endpoint will not return legacy orders after the FAST upgrade. You can export your legacy order information using the export functionality on the UI.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
order_id | path | string(uuid) | true | Order Id of order which should be closed. |
Example responses
404 Response
{
"error": "Order not found."
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Order cancellation has been submitted | None |
404 | Not Found | Order not found, it might be already closed | Error |
Get Order by Client ID
Code samples
curl --request GET \
--url https://example.com/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08 \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/orders/client/{client_id}
Get Order by Client ID
Fetches order and it's corresponding trades based on client ID provided.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
client_id | path | string(uuid) | true | Client Id of orders to fetch. |
Example responses
200 Response
{
"order_history": [
{
"account_id": "a4c699f6-338d-4a26-941f-8f9853bfc4b9",
"order_id": "36bb2437-7402-4794-bf26-4bdf03526439",
"client_id": "6f770867-7673-4786-909a-4f7b4c1fa8d9",
"amount": "100.0",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "7349.2",
"time": "2019-09-27T15:05:32.063Z",
"sequence": 48782,
"time_last_updated": "2019-09-27T15:05:35.096Z",
"filled_amount": "100.0",
"status": "FILLED_FULLY",
"trades": [
{
"fee": {
"collection_type": "STANDARD"
},
"trade": {
"trade_id": "fdff2bcc-37d6-4a2d-92a5-46e09c868664",
"order_id": "36bb2437-7402-4794-bf26-4bdf03526439",
"account_id": "a4c699f6-338d-4a26-941f-8f9853bfc4b9",
"amount": "1.4",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "7341.4",
"time": "2019-09-27T15:05:32.564Z",
"sequence": 48670
}
}
]
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | none | OrderHistoryEntry |
Close Order by Client Id
Code samples
curl --request DELETE \
--url https://example.com/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08 \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("DELETE", "/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.delete("https://example.com/account/orders/client/497f6eca-6276-4993-bfeb-53cbbbba6f08")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
DELETE /account/orders/client/{client_id}
Close an Order by Client Id
Submits a request to close an open order by providing a valid client_id
.
Closing by order_id
is possible here.
A successful response indicates that the order cancellation has been accepted, a final confirmation of closing is sent to
the ACCOUNT_HISTORY
and TRADING
WebSocket channels. Additionally
the account history via REST API will contain the event. In some cases,
orders can not be closed successfully as they have already been closed
or filled. An error response will point to
the reason in a such scenario.
Make sure to have a valid api key with
the scope TRADE
, otherwise this operation will be rejected. The api
key can be generated via the user interface at
https://exchange.onetrading.com/trading-accounts/account/api.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
client_id | path | string(uuid) | true | Client Id of order which should be closed. |
Example responses
404 Response
{
"error": "Order not found."
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Order cancellation has been submitted | None |
404 | Not Found | Order not found, it might be already closed | Error |
Trades For Order
Code samples
curl --request GET \
--url https://example.com/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08/trades \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08/trades", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/orders/497f6eca-6276-4993-bfeb-53cbbbba6f08/trades")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/orders/{order_id}/trades
Get trade information for a specific order.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
order_id | path | string(uuid) | true | none |
Example responses
200 Response
{
"trade_history": [
{
"fee": {
"collection_type": "STANDARD"
},
"trade": {
"trade_id": "ec82896f-fd1b-4cbb-89df-a9da85ccbb4b",
"order_id": "cab1ca1d-8102-4e97-b7a0-b53f66c811d0",
"account_holder": "ef3a5f4c-cfcd-415e-ba89-5a9abf47b28a",
"account_id": "ef3a5f4c-cfcd-415e-ba89-5a9abf47b28a",
"amount": "0.04123",
"side": "SELL",
"instrument_code": "BTC_USDT",
"price": "10159.76",
"time": "2019-08-23T09:33:52.433Z",
"sequence": 4
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | none | TradeHistory |
All Trades
Code samples
curl --request GET \
--url https://example.com/account/trades \
--header 'Accept: application/json' \
--header 'Authorization: Bearer {access-token}'
import http.client
conn = http.client.HTTPSConnection("example.com")
headers = {
'Accept': "application/json",
'Authorization': "Bearer {access-token}"
}
conn.request("GET", "/account/trades", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
HttpResponse response = Unirest.get("https://example.com/account/trades")
.header("Accept", "application/json")
.header("Authorization", "Bearer {access-token}")
.asString();
GET /account/trades
Return a paginated report on past trades, sorted by timestamp (newest first). If you want to query specific time frame parameters, from
and to
are mandatory, otherwise it will start from the latest trades.
Note: After the FAST upgrade this endpoint will not return data from the legacy Exchange. You can still retrieve legacy data using the export functionality available on the UI.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
from | query | MarketTime | false | Defines start of a query search |
to | query | MarketTime | false | Defines end of a query search |
instrument_code | query | Instrument | false | Filter order history by instrument_code |
max_page_size | query | string | false | Set max desired page size. If no value is provided, by default a maximum of 100 results per page are returned. The maximum upper limit is 100 results per page. |
cursor | query | string | false | Pointer specifying the position from which the next pages should be returned. |
Example responses
200 Response
{
"trade_history": [
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"collection_type": "string"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | none | TradeHistory |
Schemas
BigDecimal
"123.456"
A decimal unit. All decimal fields are of the type string
to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.
Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points).
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
NanoTime
0
Timestamp in nano seconds.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | number | false | Timestamp in nano seconds. |
MarketTime
"2019-08-24T14:15:22Z"
Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string(date-time) | false | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
AccountSequence
123456789
Global monotonically-increasing numerical sequence bound to account activity.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | number | false | Global monotonically-increasing numerical sequence bound to account activity. |
Currency
{
"code": "BTC",
"precision": 8
}
Describes each currency with unique currency code and precision which is allowed.
Properties
Name | Type | Required | Description |
---|---|---|---|
code | CurrencyCode | true | Currency code. |
precision | integer | true | Precision the currency is traded with. |
CurrencyCode
"BTC"
Currency code.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | Currency code. |
Instrument
"BTC_EUR"
The instrument denotes unique market identifier. Both base
and quote
must be valid
currency codes.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
TimeGranularity
{
"unit": "MINUTES",
"period": 1
}
A length of time defined by unit and period used to identify the granularity of candlestick
. For possible combinations see each property's documentation.
Properties
Name | Type | Required | Description |
---|---|---|---|
unit | TimeGranularityUnit | true | none |
period | TimeGranularityPeriod | true | Combined with the unit, supported resolutions are 1, 5, 15, 30 MINUTES & 1, 4 HOURS & 1 DAYS & 1 WEEKS & 1 MONTHS. |
TimeGranularityPeriod
1
Combined with the unit, supported resolutions are 1, 5, 15, 30 MINUTES & 1, 4 HOURS & 1 DAYS & 1 WEEKS & 1 MONTHS.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | number | false | Combined with the unit, supported resolutions are 1, 5, 15, 30 MINUTES & 1, 4 HOURS & 1 DAYS & 1 WEEKS & 1 MONTHS. |
TimeGranularityUnit
"MINUTES"
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
Enumerated Values
Property | Value |
---|---|
anonymous | MINUTES |
anonymous | HOURS |
anonymous | DAYS |
anonymous | WEEKS |
anonymous | MONTHS |
MarketTick
{
"instrument_code": "BTC_EUR",
"state": "NEW",
"base_volume": "123.456",
"high": "123.456",
"last_price": "123.456",
"low": "123.456",
"price_change_percentage": "123.456",
"price_change": "123.456",
"quote_volume": "123.456",
"sequence": 123456
}
*Statistics on market activity within the last 24 hours. Market ticks are updated on every trade of a market and use a sliding window with minutely granularity to calculate statistics on activity with the last 24 hours. *
Properties
Name | Type | Required | Description |
---|---|---|---|
instrument_code | Instrument | true | Code of the described market. |
state | string | true | Current status of the market. |
base_volume | BigDecimal | true | Volume within the last 24 hours in the base currency. |
high | BigDecimal | true | Highest matched price within the last 24 hours. |
last_price | BigDecimal | true | Price of the last trade. |
low | BigDecimal | true | Lowest matched price within the last 24 hours. |
price_change_percentage | BigDecimal | true | Relative price movement in the last 24 hours. |
price_change | BigDecimal | true | Difference between the price 24 hours ago and now. |
quote_volume | BigDecimal | true | Volume within the last 24 hours in the quote currency. |
sequence | integer | true | Monotonically increasing sequence number of the market tick. |
Enumerated Values
Property | Value |
---|---|
state | NEW |
state | POST_ONLY |
state | ACTIVE |
state | SUSPENDED |
state | IN_MAINTENANCE |
state | CLOSED |
state | UNDEFINED |
Account
{
"account_id": "08d84399-f5e2-46ca-846b-960aa699b69c",
"balances": [
{
"account_id": "08d84399-f5e2-46ca-846b-960aa699b69c",
"currency_code": "BTC",
"change": "123.456",
"available": "123.456",
"locked": "123.456",
"sequence": 123456789,
"time": "2019-08-24T14:15:22Z"
}
]
}
Account details of a registered user's balance(s).
Properties
Name | Type | Required | Description |
---|---|---|---|
account_id | string(uuid) | true | Unique identifier for account. |
balances | [Balance] | true | [Account balance for one single currency] |
Balance
{
"account_id": "08d84399-f5e2-46ca-846b-960aa699b69c",
"currency_code": "BTC",
"change": "123.456",
"available": "123.456",
"locked": "123.456",
"sequence": 123456789,
"time": "2019-08-24T14:15:22Z"
}
Account balance for one single currency
Properties
Name | Type | Required | Description |
---|---|---|---|
account_id | string(uuid) | true | Unique identifier for account. |
currency_code | CurrencyCode | true | Currency in which the balance is. |
change | BigDecimal | true | This value denotes the last change that was made on the balance. |
available | BigDecimal | true | Denotes all available balance to the user. |
locked | BigDecimal | true | Denotes all currently locked balance in orders. |
sequence | AccountSequence | true | Global monotonically-increasing numerical sequence bound to account activity. |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
Order
{
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_id": "1eb2ad5d-55f1-40b5-bc92-7dc05869e905",
"client_id": "2677aeb3-8b36-48b4-a44d-342a772724d7",
"instrument_code": "BTC_EUR",
"amount": "123.456",
"filled_amount": "123.456",
"side": "BUY",
"type": "LIMIT",
"status": "OPEN",
"sequence": 123456789,
"order_book_sequence": 0,
"update_modification_sequence": 0,
"price": "123.456",
"average_price": "123.456",
"reason": "INSUFFICIENT_FUNDS",
"time": "2019-08-24T14:15:22Z",
"time_in_force": "GOOD_TILL_CANCELLED",
"time_last_updated": "2019-08-24T14:15:22Z",
"is_post_only": false,
"total_fee": "123.456",
"fee_currency": "BTC"
}
Properties
Name | Type | Required | Description |
---|---|---|---|
order_id | string(uuid) | true | Uniquely identifies order. |
account_id | string(uuid) | true | Uniquely identifies account. |
client_id | string(uuid) | false | Unique identifier defined by client for this order |
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
amount | BigDecimal | true | The amount of currency for this order |
filled_amount | BigDecimal | true | The already filled amount of currency for this order |
side | Side | true | Direction of the order |
type | string | true | The type of the order |
status | string | true | An order is tracked in the system with a specific status. If an order is successfully executed, then it is considered to be in the state OPEN and is submitted to the order book. If an order validation fails, the order status is updated to REJECTED, specifying the reason for the rejection. If the system fails to process an order due to unforeseen service disruptions, then the order status is updated to FAILED and the user should re-submit the order. |
sequence | AccountSequence | true | Global monotonically-increasing numerical sequence bound to account activity. |
order_book_sequence | OrderBookSequence | true | Highest orderbook sequence recorded for the order. |
update_modification_sequence | number | false | Last orderbook sequence which was emmited by update order modification (changing Amount of placed order), this field contains an orderbook sequence of such modification which has been already applied to the order. |
price | BigDecimal | true | The price at which the order is set to execute. Applicable to LIMIT orders. |
average_price | BigDecimal | true | Weighed average price of all trades belonging to this order. Missing if there are no trades for this order. |
reason | string | false | Reason specifying why an order was rejected. Only applicable to order status REJECTED and FILLED_REJECTED. |
time | MarketTime | true | The time at which the order was executed. |
time_in_force | string | false | Only applicable to LIMIT orders. If IMMEDIATE_OR_CANCELLED is specified then the order must be filled immediately, only at the limit price or better. If the order cannot be filled immediately or fully, the unfilled portion will be cancelled. Alternatively, FILL_OR_KILL instructs the the exchange to either fully-fill the limit order at the desired price of cancel it automatically. If none is specified then GOOD_TILL_CANCELLED is considered. |
time_last_updated | MarketTime | true | The time at which the order was last updated, i.e. the order status changed. |
is_post_only | boolean | false | Only applicable to GOOD_TILL_CANCELLED as time-in-force. When set to true (defaults to false), the order will be executed with a booking guarantee unless it results in a price match in which case it gets automatically cancelled. |
total_fee | BigDecimal | false | The total fee amount paid with this order. |
fee_currency | CurrencyCode | false | The currency this order's fees were paid in. |
Enumerated Values
Property | Value |
---|---|
type | LIMIT |
status | OPEN |
status | FILLED |
status | FILLED_FULLY |
status | FILLED_CLOSED |
status | FILLED_REJECTED |
status | REJECTED |
status | CLOSED |
status | FAILED |
reason | INSUFFICIENT_FUNDS |
reason | INSUFFICIENT_LIQUIDITY |
reason | SELF_TRADE_PREVENTED |
time_in_force | GOOD_TILL_CANCELLED |
time_in_force | IMMEDIATE_OR_CANCELLED |
time_in_force | FILL_OR_KILL |
OrderSubmitted
{
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"client_id": "5b3fa7ba-57d3-4017-a65b-d57dcd2db643",
"account_id": "1eb2ad5d-55f1-40b5-bc92-7dc05869e905",
"instrument_code": "BTC_EUR",
"amount": "123.456",
"filled_amount": "123.456",
"side": "BUY",
"type": "LIMIT",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"time_in_force": "GOOD_TILL_CANCELLED",
"is_post_only": false
}
Properties
Name | Type | Required | Description |
---|---|---|---|
order_id | string(uuid) | true | Uniquely identifies order. |
client_id | string(uuid) | false | User specified client_id for this order. It is used if you need assign custom UUIDs to the orders to help keeping track of them. |
account_id | string(uuid) | true | Uniquely identifies account. |
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
amount | BigDecimal | true | The amount of currency for this order |
filled_amount | BigDecimal | true | The already filled amount of currency for this order |
side | Side | true | Direction of the order |
type | string | true | The type of the order |
price | BigDecimal | true | The price at which the order is set to execute. Applicable to LIMIT orders. |
time | MarketTime | true | The time at which the order was executed. |
time_in_force | string | false | Only applicable to LIMIT orders. If IMMEDIATE_OR_CANCELLED is specified then the order must be filled immediately, only at the limit price or better. If the order cannot be filled immediately or fully, the unfilled portion will be cancelled. Alternatively, FILL_OR_KILL instructs the the exchange to either fully-fill the limit order at the desired price of cancel it automatically. If none is specified then GOOD_TILL_CANCELLED is considered. |
is_post_only | boolean | false | Only applicable to GOOD_TILL_CANCELLED as time-in-force. When set to true (defaults to false), the order will be executed with a booking guarantee unless it results in a price match in which case it gets automatically cancelled. |
Enumerated Values
Property | Value |
---|---|
type | LIMIT |
time_in_force | GOOD_TILL_CANCELLED |
time_in_force | IMMEDIATE_OR_CANCELLED |
time_in_force | FILL_OR_KILL |
OrderBookSequence
0
monotonically increasing sequence number of single increments which progresses whenever order book changes due to market activity. Market data carrying this sequence is always totally ordered.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | number | false | monotonically increasing sequence number of single increments which progresses whenever order book changes due to market activity. Market data carrying this sequence is always totally ordered. |
PriceTickSequence
0
monotonically increasing sequence number of single increments which progresses whenever a new price is emmitted due to trading activity. Market data carrying this sequence is always totally ordered.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | number | false | monotonically increasing sequence number of single increments which progresses whenever a new price is emmitted due to trading activity. Market data carrying this sequence is always totally ordered. |
OrderBookEntry
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
Represent bid and ask entries in a (compiled) orderbook
Properties
Name | Type | Required | Description |
---|---|---|---|
price | BigDecimal | true | Price of the price level. |
amount | BigDecimal | true | Size of the price level. |
order_id | string(uuid) | false | If the entry represents an individual order, its unique id |
OrderBook
{
"instrument_code": "BTC_EUR",
"time": 0,
"sequence": 12345,
"bids": [
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
],
"asks": [
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
]
}
A snapshot of the compiled order book state
Properties
Name | Type | Required | Description |
---|---|---|---|
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
time | NanoTime | true | Timestamp in nano seconds. |
sequence | number | false | The value of the current order book sequence. See orderbook sequencing for more details. |
bids | [OrderBookEntry] | true | [Represent bid and ask entries in a (compiled) orderbook] |
asks | [OrderBookEntry] | true | [Represent bid and ask entries in a (compiled) orderbook] |
OrderBookLevelOne
{
"instrument_code": "BTC_EUR",
"time": "2019-08-24T14:15:22Z",
"sequence": 0,
"bids": [
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
],
"asks": {
"description": null,
"properties": null,
"required": null
}
}
A snapshot of the order book state
Properties
Name | Type | Required | Description |
---|---|---|---|
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
sequence | OrderBookSequence | false | monotonically increasing sequence number of single increments which progresses whenever order book changes due to market activity. Market data carrying this sequence is always totally ordered. |
bids | [OrderBookEntry] | true | [Represent bid and ask entries in a (compiled) orderbook] |
asks | object | true | none |
» $ref | any | false | none |
Candlestick
{
"last_sequence": 12345,
"instrument_code": "BTC_EUR",
"granularity": {
"unit": "MINUTES",
"period": 1
},
"high": "123.456",
"low": "123.456",
"open": "123.456",
"close": "123.456",
"total_amount": "123.456",
"volume": "123.456",
"time": "2019-08-24T14:15:22Z"
}
Candlestick representing price action for a given period
Properties
Name | Type | Required | Description |
---|---|---|---|
last_sequence | number | true | The value of the sequence field of the last price tick (see PriceTickSequence) considered for this candlestick (see Websocket channel Price Ticks) |
instrument_code | Instrument | true | The instrument/market the candlestick belongs to |
granularity | TimeGranularity | true | The time resolution of the candlestick |
high | BigDecimal | true | The highest price during the candlestick duration |
low | BigDecimal | true | The lowest price during the candlestick duration |
open | BigDecimal | true | The opening price of the candlestick period |
close | BigDecimal | true | The closing price of the candlestick period |
total_amount | BigDecimal | true | The total amount in base currency of trades on the market during the candlestick period |
volume | BigDecimal | true | The total volume in quote currency of trades on the market during the candlestick period. Volume is defined as amount multiplied by price. |
time | MarketTime | true | Cutoff time for the candlestick. It is the time at the right end of the candlestick interval window. |
CreateOrder
{
"instrument_code": "BTC_EUR",
"type": "LIMIT",
"side": "BUY",
"amount": "123.456",
"price": "123.456",
"client_id": "d75fb03b-b599-49e9-b926-3f0b6d103206",
"time_in_force": "GOOD_TILL_CANCELLED",
"is_post_only": false
}
A wrapper for accepted order types which can be submitted for execution.
Properties
None
CreateLimitOrder
{
"instrument_code": "BTC_EUR",
"type": "LIMIT",
"side": "BUY",
"amount": "123.456",
"price": "123.456",
"client_id": "d75fb03b-b599-49e9-b926-3f0b6d103206",
"time_in_force": "GOOD_TILL_CANCELLED",
"is_post_only": false
}
Properties
Name | Type | Required | Description |
---|---|---|---|
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
type | string | true | The type of the order |
side | Side | true | Direction of the Order |
amount | BigDecimal | true | The number of units to open order for |
price | BigDecimal | false | Is mandatory for LIMIT orders. Setting price for MARKET order type is ignored as this order type is always executed against instrument pricing available at the execution time. |
client_id | string(uuid) | false | The optional client order id prevents duplicated orders. Should be a unique and valid UUID of version 4 . An order, with a client order id that already has been processed, will be rejected. |
time_in_force | string | false | Only applicable to LIMIT orders. If IMMEDIATE_OR_CANCELLED is specified then the order must be filled immediately, only at the limit price or better. If the order cannot be filled immediately or fully, the unfilled portion will be cancelled. Alternatively, FILL_OR_KILL instructs the the exchange to either fully-fill the limit order at the desired price of cancel it automatically. If none is specified then GOOD_TILL_CANCELLED is considered. |
is_post_only | boolean | false | Only applicable to GOOD_TILL_CANCELLED as time-in-force. When set to true (defaults to false), the order will be executed with a booking guarantee unless it results in a price match in which case it gets automatically cancelled. |
Enumerated Values
Property | Value |
---|---|
type | LIMIT |
time_in_force | GOOD_TILL_CANCELLED |
time_in_force | IMMEDIATE_OR_CANCELLED |
time_in_force | FILL_OR_KILL |
FeeGroupId
"default"
Unique identifier of a FeeGroup.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | Unique identifier of a FeeGroup. |
FeeTier
{
"fee_group_id": "default",
"volume": "123.456",
"maker_fee": "123.456",
"taker_fee": "123.456"
}
Properties
Name | Type | Required | Description |
---|---|---|---|
fee_group_id | FeeGroupId | true | Identifier of the fee group |
volume | BigDecimal | true | Volume beyond which this fee tier is activated |
maker_fee | BigDecimal | true | Percentage fee rate that will be used for fee calculation when trade is settled as MAKER |
taker_fee | BigDecimal | true | Percentage fee rate that will be used for fee calculation when trade is settled as TAKER |
AccountFeeGroup
{
"account_id": "d75fb03b-b599-49e9-b926-3f0b6d103206",
"running_trading_volume": "123.456",
"running_volume": "123.456",
"running_volume_currency": "string",
"active_fee_tier": {
"fee_group_id": "default",
"volume": "123.456",
"maker_fee": "123.456",
"taker_fee": "123.456"
},
"collect_fees_in_best": true,
"fee_discount_rate": "123.456",
"minimum_price_value": "123.456",
"fee_group_id": "default",
"fee_tiers": [
{
"fee_group_id": "default",
"volume": "123.456",
"maker_fee": "123.456",
"taker_fee": "123.456"
}
]
}
Properties
Name | Type | Required | Description |
---|---|---|---|
account_id | string(uuid) | true | Unique identifier of account |
running_trading_volume | BigDecimal | true | The accumulated trading volume in BTC. This field is deprecated and will be removed soon. It is replaced by running_volume and running_volume_currency . |
running_volume | BigDecimal | true | The accumulated trading volume denoted in running_volume_currency . |
running_volume_currency | string | true | The code of the currency running_volume is denoted in. |
active_fee_tier | FeeTier | true | Currently active fee tier for user |
collect_fees_in_best | boolean | true | Flag to collect fees in BEST |
fee_discount_rate | BigDecimal | true | A discount rate applied to your fees, if you opted in to pay your fees using BEST |
minimum_price_value | BigDecimal | true | The minimum guaranteed price of 1 BEST in EUR, if you opted in to pay your fees using BEST |
fee_group_id | FeeGroupId | true | Unique identifier of a FeeGroup. |
fee_tiers | [FeeTier] | true | Specific fee tiers for the fee group |
FeeGroup
{
"fee_group_id": "default",
"display_text": "Default fee group",
"volume_currency": "EUR",
"fee_tiers": [
{
"fee_group_id": "default",
"volume": "123.456",
"maker_fee": "123.456",
"taker_fee": "123.456"
}
],
"fee_discount_rate": "123.456",
"minimum_price_value": "123.456"
}
Properties
Name | Type | Required | Description |
---|---|---|---|
fee_group_id | FeeGroupId | true | Unique identifier of a FeeGroup. |
display_text | string | true | Textual description of a Fee Group |
volume_currency | string | false | The code of the currency volume is denoted in. |
fee_tiers | [FeeTier] | true | Fee tiers that belong to a specific fee tier. |
fee_discount_rate | BigDecimal | true | A discount rate applied to your fees, if you opted in to pay your fees using BEST |
minimum_price_value | BigDecimal | true | The minimum guaranteed price of 1 BEST in EUR, if you opted in to pay your fees using BEST |
Trade
{
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
}
Properties
Name | Type | Required | Description |
---|---|---|---|
trade_id | string(uuid) | true | Unique identifier for trade |
order_id | string(uuid) | true | Unique identifier for order |
account_holder | string(uuid) | false | Unique identifier for main account holder id |
account_id | string(uuid) | true | Unique identifier for account id |
amount | BigDecimal | true | This is the gross amount of transaction including fees. |
side | Side | true | Represents a side of Trade or Order . It can have values BUY and SELL . |
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
price | BigDecimal | true | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
price_tick_sequence | PriceTickSequence | false | monotonically increasing sequence number of single increments which progresses whenever a new price is emmitted due to trading activity. Market data carrying this sequence is always totally ordered. |
sequence | AccountSequence | true | Global monotonically-increasing numerical sequence bound to account activity. |
Side
"BUY"
Represents a side of Trade
or Order
. It can have values BUY
and SELL
.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | Represents a side of Trade or Order . It can have values BUY and SELL . |
Enumerated Values
Property | Value |
---|---|
anonymous | BUY |
anonymous | SELL |
PriceTick
{
"instrument_code": "BTC_EUR",
"price": "123.456",
"amount": "123.456",
"volume": "123.456",
"sequence": 0,
"taker_side": "BUY",
"time": "2019-08-24T14:15:22Z",
"trade_timestamp": 1646366
}
Properties
Name | Type | Required | Description |
---|---|---|---|
instrument_code | Instrument | true | The instrument denotes unique market identifier. Both base and quote must be valid currency codes. |
price | BigDecimal | true | Price at which trade was matched |
amount | BigDecimal | true | Amount of the trade in base currency that was matched |
volume | BigDecimal | true | Volume of the trade in quote currency |
sequence | PriceTickSequence | true | monotonically increasing sequence number of single increments which progresses whenever a new price is emmitted due to trading activity. Market data carrying this sequence is always totally ordered. |
taker_side | Side | true | Denotes which side had the the taker of the trade. |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
trade_timestamp | number | true | Time in epoch miliseconds. |
TradeHistoryEntry
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"collection_type": "string"
}
}
Single trade recorded for an order.
Properties
Name | Type | Required | Description |
---|---|---|---|
trade | Trade | true | Trade object containing all information relevant to the trade. |
fee | object | true | Fee applied account balance as part of trade settlement. |
» collection_type | string | true | Fee amount that was payed with this specific trade. |
TradeHistoryEntryWithBestFees
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"fee_amount": "123.456",
"fee_percentage": "123.456",
"fee_group_id": "default",
"running_trading_volume": "123.456",
"fee_currency": "BEST",
"fee_type": "TAKER",
"applied_best_eur_rate": "1.04402"
}
}
BEST fee collection is deprecated, only legacy trades will have these specific fields
Properties
Name | Type | Required | Description |
---|---|---|---|
trade | Trade | true | Trade object containing all information relevant to the trade. |
fee | object | true | Fee applied account balance as part of trade settlement. |
» fee_amount | BigDecimal | true | Fee amount that was payed with this specific trade. |
» fee_percentage | BigDecimal | true | Fee percentage that was used to calculate fee amount. |
» fee_group_id | FeeGroupId | true | Unique identifier of a FeeGroup. |
» running_trading_volume | BigDecimal | true | Represent a running trading volume at the time of trade settlement. |
» fee_currency | string | true | none |
» fee_type | string | true | Fee type used to the fee calculation, corresponding to how the trade was matched. |
» applied_best_eur_rate | string | false | The applied BEST/EUR exchange rate for the trade. Only applicable to trades with BEST fee collection enabled. |
Enumerated Values
Property | Value |
---|---|
fee_type | TAKER |
fee_type | MAKER |
OrderHistoryEntry
{
"order": {
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_id": "1eb2ad5d-55f1-40b5-bc92-7dc05869e905",
"client_id": "2677aeb3-8b36-48b4-a44d-342a772724d7",
"instrument_code": "BTC_EUR",
"amount": "123.456",
"filled_amount": "123.456",
"side": "BUY",
"type": "LIMIT",
"status": "OPEN",
"sequence": 123456789,
"order_book_sequence": 0,
"update_modification_sequence": 0,
"price": "123.456",
"average_price": "123.456",
"reason": "INSUFFICIENT_FUNDS",
"time": "2019-08-24T14:15:22Z",
"time_in_force": "GOOD_TILL_CANCELLED",
"time_last_updated": "2019-08-24T14:15:22Z",
"is_post_only": false,
"total_fee": "123.456",
"fee_currency": "BTC"
},
"trades": [
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"collection_type": "string"
}
}
]
}
Active or Inactive order, for orders with the status FILLED, FILLED_FULLY, FILLED_CLOSED and FILLED_REJECTED, information about trades and fees is returned.
Properties
Name | Type | Required | Description |
---|---|---|---|
order | Order | true | none |
trades | [oneOf] | false | one or more trades if this order is FILLED |
oneOf
Name | Type | Required | Description |
---|---|---|---|
» anonymous | TradeHistoryEntry | false | Single trade recorded for an order. |
xor
Name | Type | Required | Description |
---|---|---|---|
» anonymous | TradeHistoryEntryWithBestFees | false | BEST fee collection is deprecated, only legacy trades will have these specific fields |
OrderHistory
{
"order_history": [
{
"order": {
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_id": "1eb2ad5d-55f1-40b5-bc92-7dc05869e905",
"client_id": "2677aeb3-8b36-48b4-a44d-342a772724d7",
"instrument_code": "BTC_EUR",
"amount": "123.456",
"filled_amount": "123.456",
"side": "BUY",
"type": "LIMIT",
"status": "OPEN",
"sequence": 123456789,
"order_book_sequence": 0,
"update_modification_sequence": 0,
"price": "123.456",
"average_price": "123.456",
"reason": "INSUFFICIENT_FUNDS",
"time": "2019-08-24T14:15:22Z",
"time_in_force": "GOOD_TILL_CANCELLED",
"time_last_updated": "2019-08-24T14:15:22Z",
"is_post_only": false,
"total_fee": "123.456",
"fee_currency": "BTC"
},
"trades": [
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"collection_type": "string"
}
}
]
}
],
"max_page_size": 100,
"cursor": "string"
}
Paginated collection of account orders
Properties
Name | Type | Required | Description |
---|---|---|---|
order_history | [OrderHistoryEntry] | true | [Active or Inactive order, for orders with the status FILLED, FILLED_FULLY, FILLED_CLOSED and FILLED_REJECTED, information about trades and fees is returned.] |
max_page_size | integer | true | Maximum number of returned results |
cursor | string | false | Cursor indicating if there are more results available to be fetched. Please use this cursor in the next query. |
TradeHistory
{
"trade_history": [
{
"trade": {
"trade_id": "2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"order_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"account_holder": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "123.456",
"time": "2019-08-24T14:15:22Z",
"price_tick_sequence": 0,
"sequence": 123456789
},
"fee": {
"collection_type": "string"
}
}
]
}
Paginated collection of account trades
Properties
Name | Type | Required | Description |
---|---|---|---|
trade_history | [oneOf] | true | none |
oneOf
Name | Type | Required | Description |
---|---|---|---|
» anonymous | TradeHistoryEntry | false | Single trade recorded for an order. |
xor
Name | Type | Required | Description |
---|---|---|---|
» anonymous | TradeHistoryEntryWithBestFees | false | BEST fee collection is deprecated, only legacy trades will have these specific fields |
DepositHistory
{
"deposit_history": [
{
"transaction_id": "C2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"funds_source": "INTERNAL",
"time": "2019-08-24T14:15:22Z",
"currency": "BTC",
"fee_amount": "123.456",
"fee_currency": "BTC",
"related_transaction_id": "e298341a-3855-405e-bce3-92db368a3157"
}
],
"max_page_size": 100,
"cursor": "string"
}
Paginated collection of deposits
Properties
Name | Type | Required | Description |
---|---|---|---|
deposit_history | [Deposit] | true | none |
max_page_size | integer | true | Maximum number of returned results. |
cursor | string | true | Cursor indicating if there are more results available to be fetched. Please use this cursor in the next query. |
WithdrawalHistory
{
"withdrawal_history": [
{
"transaction_id": "C2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"time": "2019-08-24T14:15:22Z",
"funds_source": "INTERNAL",
"currency": "BTC",
"fee_amount": "123.456",
"fee_currency": "BTC",
"blockchain_transaction_id": "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
"related_transaction_id": "e298341a-3855-405e-bce3-92db368a3157"
}
],
"max_page_size": 100,
"cursor": "string"
}
Paginated collection of withdrawals
Properties
Name | Type | Required | Description |
---|---|---|---|
withdrawal_history | [Withdrawal] | true | none |
max_page_size | integer | true | Maximum number of returned results. |
cursor | string | true | Cursor indicating if there are more results available to be fetched. Please use this cursor in the next query. |
Deposit
{
"transaction_id": "C2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"funds_source": "INTERNAL",
"time": "2019-08-24T14:15:22Z",
"currency": "BTC",
"fee_amount": "123.456",
"fee_currency": "BTC",
"related_transaction_id": "e298341a-3855-405e-bce3-92db368a3157"
}
Properties
Name | Type | Required | Description |
---|---|---|---|
transaction_id | string | true | Unique identifier for transaction |
account_id | string(uuid) | true | Unique identifier for account id |
amount | BigDecimal | true | This is the net amount of transaction excluding fees. |
funds_source | FundsSource | true | Source of funds, which will be EXTERNAL in most cases. |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
currency | CurrencyCode | true | Currency code. |
fee_amount | BigDecimal | true | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
fee_currency | CurrencyCode | true | Currency code. |
related_transaction_id | string(uuid) | false | A transaction id of the related transaction, used in failed transactions only. |
Withdrawal
{
"transaction_id": "C2b42efcd-d5b7-4a56-8e12-b69ffd68c5ef",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"amount": "123.456",
"time": "2019-08-24T14:15:22Z",
"funds_source": "INTERNAL",
"currency": "BTC",
"fee_amount": "123.456",
"fee_currency": "BTC",
"blockchain_transaction_id": "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
"related_transaction_id": "e298341a-3855-405e-bce3-92db368a3157"
}
Properties
Name | Type | Required | Description |
---|---|---|---|
transaction_id | string | true | Unique identifier for transaction |
account_id | string(uuid) | true | Unique identifier for account id |
amount | BigDecimal | true | This is the net amount of transaction excluding fees. |
time | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
funds_source | FundsSource | true | Source of funds, which will be EXTERNAL in most cases. |
currency | CurrencyCode | true | Currency code. |
fee_amount | BigDecimal | true | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
fee_currency | CurrencyCode | true | Currency code. |
blockchain_transaction_id | string | false | Blockchain transaction id of the withdrawal transaction |
related_transaction_id | string(uuid) | false | A transaction id of the related transaction, used in failed transactions only. |
FundsSource
"INTERNAL"
Source of funds, which will be EXTERNAL
in most cases.
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | Source of funds, which will be EXTERNAL in most cases. |
Enumerated Values
Property | Value |
---|---|
anonymous | INTERNAL |
anonymous | EXTERNAL |
Error
{
"error": "SOME_ERROR_CODE"
}
Default format for all errors returned by REST API. Explanation of error codes can be found here
Properties
Name | Type | Required | Description |
---|---|---|---|
error | string | false | Error code related to the problem |
WithdrawCryptoBody
{
"currency": "BTC",
"amount": "123.456",
"recipient": {
"address": "3NacQ7rzZdhfyAtfJ5a11k8jFPdcMP2Bq7",
"destination_tag": "",
"dt_type": "memo_id"
}
}
Body of an POST request used for crypto withdrawal
Properties
Name | Type | Required | Description |
---|---|---|---|
currency | CurrencyCode | true | Currency code of crypto asset |
amount | BigDecimal | true | Amount to withdraw |
recipient | object | true | none |
» address | string | true | Crypo address to which should be the transfer executed. |
» destination_tag | string | false | Destination tag for the transaction, if the transaction requires it. |
» dt_type | string | false | Destination tag type specifies which type of destination tag should be used if it's required to choose. It is only required for XLM currency. |
Enumerated Values
Property | Value |
---|---|
dt_type | memo_id |
dt_type | memo_text |
CryptoWithdraw
{
"amount": "123.456",
"fee": "123.456",
"recipient": "3NacQ7rzZdhfyAtfJ5a11k8jFPdcMP2Bq7",
"destination_tag": "",
"transaction_id": "d0f8529f-f832-4e6a-9dc5-b8d5797badb2"
}
Respose for an crypto withdrawal request.
Properties
Name | Type | Required | Description |
---|---|---|---|
amount | BigDecimal | true | Amount of withdrawal |
fee | BigDecimal | false | Fee of the withdrawal |
recipient | string | false | Address of the recipient |
destination_tag | string | false | Destination tag used if required. |
transaction_id | string(uuid) | false | Transaction id of the executed withdrawal |
WithdrawalRequestBody
{
"currency_code": "EUR",
"amount": "123.45",
"payout_account_id": "66756a10-3e86-48f4-9678-b634c4b135b2",
"type": "SEPA"
}
Body of an POST request used for withdrawal
Properties
Name | Type | Required | Description |
---|---|---|---|
currency_code | string | true | Currency code of fiat or crypto asset |
amount | string | true | Amount to withdraw |
payout_account_id | string(uuid) | true | Id of an payout account which is tied to specific bank account and transfer method. |
type | TransferMethodType | true | none |
PayoutAccountResponse
{
"payout_accounts": [
{
"payout_account_id": "7b43b931-10c4-4fe0-bc72-eb75fb1fee71",
"account_holder_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"currency": "BTC",
"type": "SEPA",
"state": "PENDING",
"created": "2019-08-24T14:15:22Z",
"label": "bank-number-one",
"blinc_id": 833333333333,
"account_holder_name": "John Doe",
"iban": "IT60X0542811101000000123456",
"bic": "AKROITMMXXX",
"address": "Via Sant'Andrea, Milano MI, Italy",
"country_code": "IT",
"signet_address": "0x4a371d8809828f366bf67f142a6ec471752445ad",
"bank_name": "BANCA",
"bank_address": "Indirizzo Bancario Italy",
"blockchain_address": "0xE4F8021d41fC886fB5Ef27Eb5999a9348E7b1b3c",
"destination_tag": 123456,
"destination_tag_type": "memo"
}
]
}
Properties
Name | Type | Required | Description |
---|---|---|---|
payout_accounts | [PayoutAccount] | false | [Payout account of account holder which connects with external account] |
PayoutAccountStatus
"PENDING"
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
Enumerated Values
Property | Value |
---|---|
anonymous | PENDING |
anonymous | CREATED |
anonymous | DEACTIVATED |
PayoutAccount
{
"payout_account_id": "7b43b931-10c4-4fe0-bc72-eb75fb1fee71",
"account_holder_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"currency": "BTC",
"type": "SEPA",
"state": "PENDING",
"created": "2019-08-24T14:15:22Z",
"label": "bank-number-one",
"blinc_id": 833333333333,
"account_holder_name": "John Doe",
"iban": "IT60X0542811101000000123456",
"bic": "AKROITMMXXX",
"address": "Via Sant'Andrea, Milano MI, Italy",
"country_code": "IT",
"signet_address": "0x4a371d8809828f366bf67f142a6ec471752445ad",
"bank_name": "BANCA",
"bank_address": "Indirizzo Bancario Italy",
"blockchain_address": "0xE4F8021d41fC886fB5Ef27Eb5999a9348E7b1b3c",
"destination_tag": 123456,
"destination_tag_type": "memo"
}
Payout account of account holder which connects with external account
Properties
Name | Type | Required | Description |
---|---|---|---|
payout_account_id | string(uuid) | true | none |
account_holder_id | string(uuid) | false | Unique identifier for account id |
currency | CurrencyCode | true | Currency code. |
type | TransferMethodType | true | none |
state | PayoutAccountStatus | true | none |
created | MarketTime | true | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
label | string | true | A user specified label |
blinc_id | number | false | Blinc id from the payout accounts for outgoing transactions(Only applicable to BLINC account) |
account_holder_name | string | false | none |
iban | string | false | none |
bic | string | false | none |
address | string | false | none |
country_code | string | false | none |
signet_address | string | false | none |
bank_name | string | false | none |
bank_address | string | false | none |
blockchain_address | string | false | none |
destination_tag | string | false | none |
destination_tag_type | string | false | none |
Enumerated Values
Property | Value |
---|---|
destination_tag_type | memo |
destination_tag_type | message |
destination_tag_type | destinationTag |
OrderBookSnapshot
{
"instrument_code": "BTC_EUR",
"time": 0,
"sequence": 12345,
"bids": [
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
],
"asks": [
{
"price": "123.456",
"amount": "123.456",
"order_id": "93101167-9065-4b9c-b98b-5d789a3ed9fe"
}
]
}
A wrapper for two different layout of orderbook snapshot responses depending on which level is queried.
Properties
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | OrderBook | false | A snapshot of the compiled order book state |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | OrderBookLevelOne | false | A snapshot of the order book state |
TransferMethodType
"SEPA"
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
Enumerated Values
Property | Value |
---|---|
anonymous | BLINC |
anonymous | SEPA |
anonymous | SWIFT |
anonymous | BLOCKCHAIN |
anonymous | SUBACCOUNT_TRANSFER |
anonymous | CARD |
Transaction
{
"transaction_id": "0fec1e58-b197-4052-99cf-2218496c5482",
"source_account": "0b96a69a-83bf-4bb3-9b52-1bfb05c01fa0",
"destination_account": "424706b0-e56e-4efc-bbf8-a61e68ec05de",
"account_holder_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"transfer_method_type": "SEPA",
"direction": "INCOMING",
"currency": "BTC",
"amount": "123.456",
"net_amount": "123.456",
"transfer_status": "INITIATED",
"user_requested_at": "2019-08-24T14:15:22Z",
"user_confirmed_at": "2019-08-24T14:15:22Z",
"completed_at": "2019-08-24T14:15:22Z",
"payout_account_label": "Testing account",
"destination_blinc_id": 0,
"iban": "AL35202111090000000001234567",
"bic": "GBTYBKEN104",
"fee_amount": "123.456",
"blockchain_transaction_id": 1.0853838427549474e+76
}
Transactional representation of funds transfer
Properties
Name | Type | Required | Description |
---|---|---|---|
transaction_id | string(uuid) | false | none |
source_account | string(uuid) | false | none |
destination_account | string(uuid) | false | none |
account_holder_id | string(uuid) | false | Unique identifier for account holder |
account_id | string(uuid) | false | Unique identifier for account id |
transfer_method_type | TransferMethodType | false | none |
direction | string | false | none |
currency | CurrencyCode | false | Currency code. |
amount | BigDecimal | false | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
net_amount | BigDecimal | false | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
transfer_status | TransferStatus | false | none |
user_requested_at | MarketTime | false | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
user_confirmed_at | MarketTime | false | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
completed_at | MarketTime | false | Zoned date time value compliant with ISO 8601 which adheres to RFC3339. All market times are in UTC. |
payout_account_label | string | false | none |
destination_blinc_id | integer | false | Blinc id from the payout accounts for outgoing transactions(Only applicable to BLINC transfer_method_type) |
iban | string | false | iban from the payout accounts(Only applicable to SEPA/SWIFT transfer_method_type) |
bic | string | false | bic from the payout accounts(Only applicable to SEPA/SWIFT transfer_method_type) |
fee_amount | BigDecimal | false | A decimal unit. All decimal fields are of the type string to ensure that all floating-point arithmetic operations can be performed with precision. If they are not encoded as strings then the post requests will be rejected.Any number in this format that is being used as input, is limited to contain a maximum of 19 digits in total (after and before decimal points). |
blockchain_transaction_id | string | false | Present for blockchain transactions. It's a hash for transaction on it's respective blockchain |
Enumerated Values
Property | Value |
---|---|
direction | INCOMING |
direction | OUTGOING |
TransactionHistory
{
"cursor": "string",
"max_page_size": 0,
"transactions": [
{
"transaction_id": "0fec1e58-b197-4052-99cf-2218496c5482",
"source_account": "0b96a69a-83bf-4bb3-9b52-1bfb05c01fa0",
"destination_account": "424706b0-e56e-4efc-bbf8-a61e68ec05de",
"account_holder_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"account_id": "c2d0076a-c20d-41f8-9e9a-1a1d028b2b58",
"transfer_method_type": "SEPA",
"direction": "INCOMING",
"currency": "BTC",
"amount": "123.456",
"net_amount": "123.456",
"transfer_status": "INITIATED",
"user_requested_at": "2019-08-24T14:15:22Z",
"user_confirmed_at": "2019-08-24T14:15:22Z",
"completed_at": "2019-08-24T14:15:22Z",
"payout_account_label": "Testing account",
"destination_blinc_id": 0,
"iban": "AL35202111090000000001234567",
"bic": "GBTYBKEN104",
"fee_amount": "123.456",
"blockchain_transaction_id": 1.0853838427549474e+76
}
]
}
Properties
Name | Type | Required | Description |
---|---|---|---|
cursor | string | false | An optional pointer to the next page, this field is omitted if there are no more pages for the query |
max_page_size | integer | false | Maximum number of returned results. |
transactions | [Transaction] | true | [Transactional representation of funds transfer] |
TransferStatus
"INITIATED"
Properties
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
Enumerated Values
Property | Value |
---|---|
anonymous | INITIATED |
anonymous | PENDING |
anonymous | CONFIRMED |
anonymous | DONE |
anonymous | CANCELLED |
anonymous | REJECTED |
anonymous | FAILED |
undefined
REST API Overview
One Trading REST API delivers a comprehensive set of resources which clients can create, modify and query. All resources are defined under the following URL:
https://api.onetrading.com/fast/v1
Public Endpoints
Public endpoints are scoped for querying Exchange market data, allowing One Trading clients and visitors to gauge status of our order books in terms of provided liquidity and pricing.
Private Endpoints
Private endpoints are scoped to account-specific resources, allowing One Trading client to create, modify and query status for balances
, orders
and trades
. These invocations require a valid API key that is sent in the HTTP header Authorization
as a Bearer
token.
Authorization: Bearer apiKey
An API key can be generated through our web user interface.
API Key
An API key can be generated through the user interface at https://onetrading.com/trading-accounts/account/api.
Be aware that this API key is unique and valid only for the One Trading. This API key can have three distinct scopes, namely READ
, TRADE
and WITHDRAW
. With the READ
scope, you can read all private endpoints, the
TRADE
scope allows you to additionally create and cancel orders and the WITHDRAW
scope allows you to deposit and withdraw funds from your account to the off-site wallets.
You can also create an IP restriction
on your API key so that it will be rejected if used by IP addresses that are not whitelisted. This is recommended additional security measure especially for an API key with scope WITHDRAW
.
API key permissions required by specific endpoints are specified in the documentation.
Pagination
The One Trading REST API uses paginated results for endpoints that return historical trades and orders.
To paginate an array of results, the API uses cursors that indicate the current position in the array.
To request the consecutive page of entries, the API user should specify the next cursor
returned with
previous response. Please note that the next request has to be same with the additional cursor parameter. The cursors we
provide are backward
only, as the history results we serve are always sorted by latest first.
GET /public/v1/account/orders?from=2019-10-06T22:00:00.000Z&to=2020-01-07T23:59:59.999Z&max_page_size=20&cursor=eyJhY2NvdW50X2lkIjp7InMiOiI1NTAwNWYzMC01YTlmLTExZTktOWQ1MS1kMzAxNTk1OGYyZmYifSwiZ2xvYmFsX29yZGVyX2luZGV4X2hhc2hfa2V5Ijp7InMiOiI1NTAwNWYzMC01YTlmLTExZTktOWQ1MS1kMzAxNTk1OGYyZmY6OklOQUNUSVZFIn0sInNvcnRfa2V5Ijp7InMiOiJPUkRFUjo6NzkwNDJhZWItYmViMy00ZTgzLWJhZTQtMTQ5ZDIyZjNmNzE5In0sImdsb2JhbF9vcmRlcl9pbmRleF9yYW5nZV9rZXkiOnsicyI6IjE1Nzg0Nzg1Mzk5OTMifX0=
Errors
{
"error":"ERROR_CODE"
}
Valid requests will result in responses with HTTP 2xx status codes. Every other response in the HTTP 4xx range will return a well defined error in the response body.
Websocket API Overview
The One Trading WebSocket (WSS) API provides clients with access to real-time data feeds, including price evolution and market state information. In addition to subscribing to data feeds, the API allows clients to create and cancel orders over the same WebSocket connection.
Endpoints
🚀 As part of our new FAST exchange, we are introducing two WebSocket endpoints to optimize speed and scalability, with the streams
endpoint providing the lowest latency directly to the exchange:
-
wss://streams.fast.onetrading.com?x-version=3 - For TRADING, PRICE_TICKS, and ORDER_BOOK.
-
wss://garcon.fast.onetrading.com - For ACCOUNT_HISTORY and MARKET_TICKER.
Connectivity
A single WebSocket connection is valid for 24 hours. After this period, the server will send a notification indicating the imminent termination of the connection:
{
"subscription": "SYSTEM",
"time": "2019-01-01T01:01:01Z",
"channel_name": "SYSTEM",
"type": "CONNECTION_CLOSING"
}
Clients are given a brief grace period to reconnect and resubscribe. If no action is taken, the server will close the connection with status code 1000
and the reason PLEASE_RECONNECT
.
WebSocket clients must not send the Origin
header when connecting. If the Origin header is included, the handshake may fail, resulting in a 403 Forbidden
response.
Some calls require the client to send an API token. For example, creating and cancelling orders necessitate a valid API token. If no API token is sent or if the token is invalid, the server will return a message like {"error":"MISSING_PERMISSION"} and close the connection.
Subscription Channels
Clients can subscribe to an arbitrary list of channels. Once successfully subscribed, they will receive real-time messages as events occur.
Summary of publicly-available subscription channels:
Channel Name | Description | Availability | Supports Subscription Updates | URL |
---|---|---|---|---|
ORDER_BOOK | Price level feed delivering all bids and asks followed by incremental changes | Public | Yes | wss://streams.fast.onetrading.com?x-version=3 |
PRICE_TICKS | Trading feed delivering all matched prices as they happen | Public | Yes | wss://streams.fast.onetrading.com?x-version=3 |
MARKET_TICKER | Market stats feed | Public | Yes | wss://garcon.fast.onetrading.com |
A client can combine the above channels into a single WebSocket feed in any order or subscribe to all channels simultaneously. However, only one subscription per channel is permitted.
Summary of authenticated subscription channels:
Channel Name | Description | Availability | Supports Subscription Updates | URL |
---|---|---|---|---|
ACCOUNT_HISTORY | authenticated private channel delivering trading and funding activity | Authenticated | No | wss://garcon.fast.onetrading.com |
TRADING | authenticated private channel delivering trading activity | Authenticated | No | wss://streams.fast.onetrading.com?x-version=3 |
Protocol
Authenticate
All private channels require client authentication before subscription. Clients should first send an AUTHENTICATE
message containing the API token, after which they can subscribe to any private channel. If the supplied API token is valid, it will be used to authorize subscriptions and requests for all private channels within this WebSocket connection.
{
"type": "AUTHENTICATE",
"api_token": "eyJ..."
}
If authentication succeeds, a confirmation is sent:
{
"type": "AUTHENTICATED"
}
Once authenticated, the next step is to subscribe to any of the private channels:
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "TRADING"
}
]
}
If the API key is not valid or is missing required permissions, the WebSocket connection is closed immediately with an error:
{
"error" : "INVALID_APIKEY"
}
Subscribe
All messages are expected and delivered in strict JSON format. When a client wishes to initiate a subscription to one or more channels, a SUBSCRIBE
message is composed and sent to the endpoint. Detailed subscribe payloads are documented in their corresponding sections.
For example, the following SUBSCRIBE
message activates the Order Book Channel and the Price Tick Channel:
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "ORDER_BOOK",
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
},
{
"name": "PRICE_TICKS",
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
]
}
Confirmation
If the subscriptions have been successful, two responses are returned:
{
"type": "SUBSCRIPTIONS",
"channels": [
{
"name": "ORDER_BOOK",
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
]
}
{
"type": "SUBSCRIPTIONS",
"channels": [
{
"name": "PRICE_TICKS",
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
]
}
Update Subscription
Publicly-available data channels that support subscription updates can deliver a seamless stream of additional or fewer markets based on specified instrument configuration. For example, let's assume the client is currently subscribed to the BTC_EUR
market.
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "ORDER_BOOK",
"depth": 200,
"instrument_codes": ["BTC_EUR"]
},
{
"name": "PRICE_TICKS",
"instrument_codes": ["BTC_EUR"]
}
]
}
Next, if the client wants to additionally listen to all updates for the ETH_EUR
market, they can avoid data loss (which would occur if they unsubscribed and then resubscribed) by sending the following message to the server:
{
"type": "UPDATE_SUBSCRIPTION",
"channels": [
{
"name": "ORDER_BOOK",
"depth": 200,
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
},
{
"name": "PRICE_TICKS",
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
]
}
This creates a new subscription that replaces the existing one. The server completes the protocol message exchange with:
{
"type": "SUBSCRIPTION_UPDATED",
"channel_name": "PRICE_TICKS",
"time": 1715350241645982152,
"details": "1 price tick subscriptions added"
}
{
"type": "SUBSCRIPTION_UPDATED",
"channel_name": "ORDER_BOOK",
"time": 1715350241645894830,
"details": "1 orderbook subscriptions added"
}
Unsubscribe
A client can send an unsubscribe message when a particular channel should be deactivated.
{
"type": "UNSUBSCRIBE",
"channels": [
"PRICE_TICKS"
]
}
Confirmation
If the unsubscribe operation was successful, the following response is returned:
{
"type": "UNSUBSCRIBED",
"channel_name": "PRICE_TICKS"
}
Sequence numbers
Sequence numbers for market data are monotonically increasing numerical sequences assigned to data fragments. These numbers are strictly monotonic but not gapless. Subscribers can use sequence numbers to establish the total order of messages.
Encoding
Messages that WSS API sends or receives are encoded in JSON.
Idle Connections
🚀 The exchange at wss://streams.fast.onetrading.com?x-version=3 will send heartbeat messages approximately every 20 seconds. It also accepts WebSocket ping packets to reset the connection timer. Similarly, heartbeats are sent from the other WebSocket at wss://garcon.fast.onetrading.com every 10 seconds.
{
"channel_name": "SYSTEM",
"subscription": "SYSTEM",
"time": "2019-04-16T08:38:13.293Z",
"type": "HEARTBEAT"
}
Resilience
Despite WebSocket connections providing a high level of stability and performance, clients can use advanced features to prepare for rare failure scenarios and minimize risks:
-
Heartbeats
Our protocol sends heartbeat messages if no data has been sent for 20 seconds. If you haven't received such a message within 20 seconds of the last data received, it's safe to assume the connection is stale (you are probably also not receiving other updates) and you should re-connect.
-
Dead-Man Switch
To protect our active traders from network interruptions and minimize their exposure in the market, we provide a dead-man switch. This switch needs to be activated and renewed within a set interval. If we fail to receive this renewal from you, the system will automatically cancel all your open orders. You can read more about it (here)[#auto-cancellation--dead-man-switch-].
Trading / Orders channel
Base URL: wss://streams.fast.onetrading.com?x-version=3
🚀 As part of our FAST exchange upgrade, we have merged the trading and orders channel.
Description
Create and cancel orders and a feed of order updates based on your trading activity in your account.
This channel requires authentication, otherwise subscription requests fail with an error.
Consider subscribing to the ACCOUNT_HISTORY
channel instead of TRADING
if you require additional information on trade settlements, transfers and non-trading activity.
Subscribe
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "TRADING"
}
]
}
Confirmation
{
"type": "SUBSCRIPTIONS",
"channels": [
{
"name": "TRADING"
}
]
}
Error
If the subscribe
request cannot be authenticated the web socket connection terminates with the status code 1008
and a reason in the following format:
{
"error" : "INVALID_APIKEY"
}
Create order requests
🚀 As part of our FAST exchange upgrade, we have made the decision to remove MARKET orders.
Market orders aren’t conducive to optimal execution, if you are prepared to sell 1 BTC for 1 EUR, then you could always send in a LIMIT order to that effect.
Once subscribed, the client must send a JSON payload representing the order to be created. The following request examples highlight the 1 type of order that can be placed: LIMIT. For an explanation of what each field of the order field represents, please consult https://docs.onetrading.com/#tocscreateorder.
Important: We highly recommend that requests populate the client_id
field when creating orders.
The client_id
field will be present in the response so that clients can correlate responses to the original requests.
Optionally the client_id
can be used to cancel or update open orders.
NOTE: You are responsible for uniqueness of a client_id. If two or more orders are created with the same client_id, the older orders can then only be cancelled using order_id, or via the cancel all orders endpoint.
Limit order request
{
"type": "CREATE_ORDER",
"order": {
"instrument_code": "BTC_EUR",
"type": "LIMIT",
"side": "BUY",
"amount": "1.23",
"price": "9876.99",
"client_id": "d75fb03b-b599-49e9-b926-3f0b6d103206",
"time_in_force": "GOOD_TILL_CANCELLED"
}
}
The WSS API will respond back with the outcome of the operation, success or failure.
Successfully created order response
{
"order_book_sequence": 32290460516,
"side": "BUY",
"uid": 123,
"amount": "1.23",
"price": "9876.99",
"instrument_code": "BTC_EUR",
"client_id": "dbf8e35b-f33e-4cfc-b5d9-8308dd341d8e",
"order_id": "59f95128-b5fe-4359-a68b-8b839bdbd706",
"channel_name": "TRADING",
"type": "BOOKED",
"time": 1704889994528163405
}
The fields in the response will contain information that will match what was asked for in the request.
Failed order creation response
The following examples are of requests which failed. Check the error code for details.
Note that the response includes the original request.
{
"type": "DONE",
"status": "INSUFFICIENT_FUNDS",
"channel_name": "TRADING",
"client_id": "d75fb03b-b599-49e9-b926-3f0b6d103206",
"instrument_code": "BTC_EUR",
"side": "BUY",
"amount": "1.23",
"price": "9876.99",
"time": 1704891103562945943
}
Important: ORDER_CREATION_FAILED error with code INTERNAL_SERVER_ERROR have to be handled as order in unknown state. A request could in rare cases fail to yield a concrete response (e.g. due to a timeout) and it could be that your order was successfully processed and submitted to the orderbook. We highly recommend subscribing to the Trading Channel to observe your activity in order book.
- Example: After submitting your order via ORDERS channel, you observe a response ORDER_CREATION_FAILED with code INTERNAL_SERVER_ERROR. Subsequently, you observe a BOOKED event in the TRADING channel - your order is now in the orderbook.
If you don't see order confirmation in the TRADING channel after 30 seconds, you can safely assume your order has failed to execute.
Cancel order
Clients can call the API to cancel existing orders. Note that success indicates submission for cancellation.
Important: Each cancel request contains the order_id
field which is returned in the response so that clients can correlate the responses back to requests.
🚀 Due to the internal structure of the new FAST exchange you will find better cancellation performance if you specify the instrument code in the cancellation packet.
Cancel order by order id
The following JSON represents how to cancel an order with known order_id
.
{
"type": "CANCEL_ORDER",
"order_id": "d44cf37a-335d-4936-9336-4c7944cd00eb",
"instrument_code":"BTC_EUR" // This is optional, but will result in an even faster cancellation
}
Cancel order by client id
The following JSON represents how to cancel an order with known client_id
.
Note that it is not allowed to provide order_id
and client_id
together. The request will result in an error.
{
"type": "CANCEL_ORDER",
"client_id": "123cf37a-335d-4936-9336-4c7944cd00eb",
"instrument_code":"BTC_EUR" // This is optional, but will result in an even faster cancellation
}
Successfully cancelled order response
The cancelled order response includes the order_id
for which the cancellation has been requested.
{
"status":"CANCELLED",
"channel_name":"TRADING",
"uid":123,
"instrument_code":"ETH_BTC",
"client_id":"f098a435-a4ce-4f35-b25b-75ce463dc8ac",
"order_id":"d44cf37a-335d-4936-9336-4c7944cd00eb",
"type":"DONE",
"side":"BUY",
"order_book_sequence":32303065154,
"remaining":"1",
"amount":"1",
"price":"0.05",
"time":1704891498321559623
}
Failed to cancel order response
An instance where the order_id
has not been found and couldn't be cancelled.
Check the error code for details.
{
"error": "ORDER_NOT_FOUND"
}
Cancel all orders
Clients can call the API to cancel all existing orders. Note that success indicates submitting a cancellation request. Clients should observe events in Trading channel if all orders have been successfully cancelled.
{
"type": "CANCEL_ALL_ORDERS"
}
Successfully cancelled all order response
You will receive a cancellation message for each order as it is cancelled
{
"status":"CANCELLED",
"channel_name":"TRADING",
"uid":123,
"instrument_code":"ETH_BTC",
"client_id":"f098a435-a4ce-4f35-b25b-75ce463dc8ac",
"order_id":"d44cf37a-335d-4936-9336-4c7944cd00eb",
"type":"DONE",
"side":"BUY",
"order_book_sequence":32303065154,
"remaining":"1",
"amount":"1",
"price":"0.05",
"time":1704891498321559623
}
{
"status":"CANCELLED",
"channel_name":"TRADING",
"uid":123,
"instrument_code":"ETH_BTC",
"client_id":"d44cf37a-335d-4936-9336-4c7944cd00eb",
"order_id":"f098a435-a4ce-4f35-b25b-75ce463dc8ac",
"type":"DONE",
"side":"BUY",
"order_book_sequence":32303065154,
"remaining":"2",
"amount":"3",
"price":"0.05",
"time":1704891498321559729
}
Cancel all orders with instrument code
Clients can request cancellation of all active orders for a specific market identified by instrument_code.
{
"type": "CANCEL_ALL_ORDERS",
"instrument_code": "BTC_EUR" // This is optional, but will result in an even faster cancellation
}
Auto-cancellation (Dead Man Switch)
For a detailed description of Dead Man Switch see Activate Close All Orders via REST API.
Activate Auto-Cancellation Timer
The following examples outlines valid request and expected response payloads.
Request
{
"type": "CANCEL_ALL_AFTER",
"timeout": 23456
}
Response
{
"channel_name": "TRADING",
"type": "AUTO_CANCELLATION_TIMER_SET",
"timeout": 23456,
"time": 1710927208222806419
}
Deactivate Auto-cancellation timer
These values are ephemeral and can be set or reset at any time.
Request
{
"type": "CANCEL_ALL_AFTER",
"timeout": 1000
}
{
"type": "CANCEL_ALL_AFTER",
"timeout": 0
}
Response
{
"channel_name": "TRADING",
"type": "AUTO_CANCELLATION_TIMER_DEACTIVATED"
}
Events
All order updates share a set of properties describing the current order state:
type
describes the type of order update (see below)channel_name
is alwaysTRADING
instrument_code
is the market where the order was placedorder_id
the unique identifier of the orderclient_id
is the identifier that was supplied by the client when creating the ordertime
when the event happened in the order book
{
"type": "TYPE",
"channel_name": "TRADING",
"instrument_code": "BASE_QUOTE",
"order_id": "00000000-0000-0000-0000-000000000000",
"client_id": "11111111-1111-1111-1111-111111111111",
"time": 1715350900427981632, // Nanosecond timestamp
}
Fill
The order was matched and (partially) filled. This event includes additional information about the trade:
trade_id
unique identifier of the tradeside
of the matched order (eitherBUY
orSELL
)amount
total size of the order (remaining plus already filled amount)matched_as
whether the order was matched asTAKER
orMAKER
matched_amount
how much of the order was filled by the tradematched_price
at which the order was filled
{
"type": "FILL",
"channel_name": "TRADING",
"instrument_code": "BTC_EUR",
"client_id": "81c88763-80e0-4ffa-80ac-d5802b596052",
"order_id": "20713dbb-f4a9-4595-bc93-9ce7fa58eb7e",
"time": 1715351831605522001,
"side": "SELL",
"order_book_sequence": 42029146112,
"remaining": "0.08",
"amount": "0.1",
"trade_id": "59c10cdd-9c38-46aa-b505-7470825bcc6d",
"matched_as": "MAKER",
"matched_amount": "0.02",
"matched_price": "10000"
}
Booked
The order was not fully filled immediately and is now open in the order book. Only limit orders can be booked.
{
"order_book_sequence": 42029146112,
"side": "SELL",
"uid": 2,
"amount": "0.1",
"price": "10000",
"instrument_code": "BTC_EUR",
"client_id": "81c88763-80e0-4ffa-80ac-d5802b596052",
"order_id": "20713dbb-f4a9-4595-bc93-9ce7fa58eb7e",
"channel_name": "TRADING",
"type": "BOOKED",
"time": 1715351726137871539
}
Done
The order is not in the order book anymore.
If an order is filled fully, all FILL
events are sent and a final DONE
event with remaining == 0
.
This event includes additional information about the order status:
CANCELLED
by a client requestSELF_TRADE
matching the order would have caused a self tradeFILLED_FULLY
there is no remaining amount on the orderINSUFFICIENT_FUNDS
not enough funds were locked to fully fill this market orderINSUFFICIENT_LIQUIDITY
there is not enough liquidity in the order book to fully fill this market order
{
"status": "CANCELLED",
"uid": 2,
"instrument_code": "BTC_EUR",
"client_id": "81c88763-80e0-4ffa-80ac-d5802b596052",
"order_id": "20713dbb-f4a9-4595-bc93-9ce7fa58eb7e",
"channel_name": "TRADING",
"type": "DONE",
"side": "SELL",
"order_book_sequence": 42029146112,
"remaining": "0.08",
"amount": "0.1",
"price": "10000",
"time": 1715351936255076636
}
Account history channel
Base URL: wss://garcon.fast.onetrading.com
Description
Authenticated
API clients should have access to a stream of account history
events corresponding to one account.
Monitoring Account Activity
The ACCOUNT_HISTORY
channel delivers updates on any account activity.
To avoid missing updates it is recommended to set up the subscription before creating/cancelling orders:
- Subscribe to the
ACCOUNT_HISTORY
channel and await initial snapshots - Submit new orders and cancellations through websockets or the http api
- Update local state on open orders and balances based on received events
Consider subscribing to the TRADING
channel instead if you require low-latency updates on order updates only.
Subscribe
In the following example, a client is attempting to create an authenticated subscription.
In order for this request to succeed, a valid API token must be provided via the Authenticate
call.
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "ACCOUNT_HISTORY"
}
]
}
Additionally, subscribers can specify a just_orders
flag, which, when set true will omit the trades from ACTIVE_ORDERS_SNAPSHOT
and INACTIVE_ORDERS_SNAPSHOT
messages.
The default value for the flag is false
.
{
"type": "SUBSCRIBE",
"bp_remaining_quota": 200,
"channels": [
{
"name": "ACCOUNT_HISTORY",
"just_orders": true
}
]
}
Confirmation
If the authenticated subscription request succeeded, a confirmation is sent back to the client.
{
"type": "SUBSCRIPTIONS",
"channels": [
{
"name": "ACCOUNT_HISTORY",
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6"
}
]
}
Error
If authentication fails
within the initial subscribe
message, due to an invalid API token or another reason, the web socket connection terminates with the status code 1008
and a reason in the following format:
{
"error" : "INVALID_APIKEY"
}
Active Orders Snapshot
The active orders snapshot returns all active orders. Note that active orders
might be partially-filled and thus include trades.
{
"account_id": "f6c74144-9e0d-49f7-8f6e-a8770f3ad77f",
"channel_name": "ACCOUNT_HISTORY",
"orders": [
{
"order": {
"account_id": "f6c74144-9e0d-49f7-8f6e-a8770f3ad77f",
"amount": "1.0",
"average_price": "197.32",
"client_id": "9897a12e-3802-4533-81c9-fc3f32c1c396",
"filled_amount": "0.5",
"instrument_code": "BTC_ETH",
"order_book_sequence": 123456,
"order_id": "07ba933f-29dc-4ec1-b00f-578cca8c5082",
"price": "200",
"sequence": 1,
"side": "BUY",
"status": "FILLED",
"time": "2019-03-21T16:38:17.093Z",
"time_last_updated": "2019-03-21T16:38:18.093Z",
"type": "LIMIT",
"update_modification_sequence": 12333
},
"trades": [
{
"fee": {
"fee_amount": "0.0002",
"fee_currency": "BTC",
"fee_group_id": "default",
"fee_percentage": "0.1",
"fee_type": "TAKER",
"running_trading_volume": "0.00277069"
},
"trade": {
"account_id": "f6c74144-9e0d-49f7-8f6e-a8770f3ad77f",
"amount": "0.5",
"instrument_code": "BTC_ETH",
"order_id": "07ba933f-29dc-4ec1-b00f-578cca8c5082",
"price": "197.32",
"sequence": 1000,
"side": "BUY",
"time": "2019-07-01T07:02:51.919Z",
"trade_id": "6c252d23-2366-40fa-b7a7-ffc6b5cfa74c"
}
}
]
}
],
"time": "2019-03-21T16:38:17.093Z",
"type": "ACTIVE_ORDERS_SNAPSHOT"
}
The field trades
is omitted if the subscription has the flag with_orders
set to true
.
{
"account_id": "55005f30-5a9f-11e9-9d51-d3015958f2ff",
"channel_name": "ACCOUNT_HISTORY",
"orders": [
{
"order": {
"account_id": "55005f30-5a9f-11e9-9d51-d3015958f2ff",
"amount": "5000.0",
"client_id": "9897a12e-3802-4533-81c9-fc3f32c1c396",
"filled_amount": "0.0",
"instrument_code": "BTC_EUR",
"is_post_only": false,
"order_id": "9f3f6c0c-07b1-4d01-8afb-1cb4497db821",
"price": "1000.0",
"sequence": 603100485,
"side": "BUY",
"status": "OPEN",
"time": "2021-04-01T14:17:32.494188Z",
"time_in_force": "GOOD_TILL_CANCELLED",
"type": "LIMIT"
}
}
],
"time": "2021-04-14T09:31:54.397160Z",
"type": "ACTIVE_ORDERS_SNAPSHOT"
}
Inactive Orders Snapshot
The inactive orders snapshot returns the 50 most recent inactive orders within the last 24 hours. Inactive orders
are those which satisfy one of these criteria:
- partially-filled and then cancelled by user.
- fully-filled.
- partially-filled and then rejected.
If no such order satisfied any of the above criteria then an empty snapshot is returned. Once the order is inactive
it can no-longer participate in the market.
{
"channel_name": "ACCOUNT_HISTORY",
"type": "INACTIVE_ORDERS_SNAPSHOT",
"time": "2019-07-22T07:06:23.073Z",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"orders": [
{
"order": {
"order_id": "43394171-9e79-4c61-ba19-61e33365c29a",
"client_id": "9897a12e-3802-4533-81c9-fc3f32c1c396",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"instrument_code": "BTC_EUR",
"time": "2019-07-22T07:06:23.073Z",
"side": "BUY",
"price": "9441.89",
"amount": "0.08709",
"filled_amount": "0.08709",
"average_price": "9441.89",
"type": "LIMIT",
"sequence": 11959,
"order_book_sequence": 123456,
"update_modification_sequence": 12333,
"status": "FILLED_FULLY",
"time_last_updated": "2019-07-22T07:06:25.338Z"
},
"trades": [
{
"fee": {
"fee_amount": "0.00008709",
"fee_currency": "BTC",
"fee_percentage": "0.1",
"fee_group_id": "default",
"fee_type": "TAKER",
"running_trading_volume": "0.00277069"
},
"trade": {
"trade_id": "5a974cdf-4eac-499c-8fa5-2f5b40b3eabd",
"order_id": "43394171-9e79-4c61-ba19-61e33365c29a",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"amount": "0.08709",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "9441.89",
"time": "2019-07-22T07:06:24.054Z",
"sequence": 11959
}
}
]
}
]
}
The field trades
is omitted if the subscription has the flag with_orders
set to true
.
{
"channel_name": "ACCOUNT_HISTORY",
"type": "INACTIVE_ORDERS_SNAPSHOT",
"time": "2019-07-22T07:06:23.073Z",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"orders": [
{
"order": {
"order_id": "43394171-9e79-4c61-ba19-61e33365c29a",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"client_id": "9897a12e-3802-4533-81c9-fc3f32c1c396",
"instrument_code": "BTC_EUR",
"time": "2019-07-22T07:06:23.073Z",
"side": "BUY",
"price": "9441.89",
"amount": "0.08709",
"filled_amount": "0.08709",
"average_price": "9441.89",
"type": "LIMIT",
"sequence": 11959,
"order_book_sequence": 123456,
"update_modification_sequence": 12333,
"status": "FILLED_FULLY",
"time_last_updated": "2019-07-22T07:06:25.338Z"
}
}
]
}
Balances Snapshot
Next, a snapshot of all last-known account balances is returned.
{
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"type": "BALANCES_SNAPSHOT",
"channel_name": "ACCOUNT_HISTORY",
"time": "2019-04-01T13:39:17.155Z",
"balances": [
{
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"currency_code": "BTC",
"change": "0.5",
"available": "10.0",
"locked": "1.1234567",
"sequence": 1,
"time": "2019-04-01T13:39:17.155Z"
},
{
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"currency_code": "ETH",
"change": "0.5",
"available": "10.0",
"locked": "1.1234567",
"sequence": 2,
"time": "2019-04-01T13:39:17.155Z"
}
]
}
Account Updates
Once the trading history has been delivered, all subsequent messages relating to the subscribed account
are delivered.
Each account history update is delivered in the following format:
{
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"update": {
// see message definitions below
},
"channel_name": "ACCOUNT_HISTORY",
"type": "ACCOUNT_UPDATE"
}
Account Update: Order Created
Emitted after the system has successfully accepted a client's order.
{
"id": "d3fe6025-5b27-4df6-a957-98b8d131cb9d",
"type": "ORDER_CREATED",
"activity": "TRADING",
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"timestamp": "2018-08-01T13:39:15.590Z",
"sequence" : 0,
"order": {
"status": "OPEN",
"order_id": "6f991342-da2c-45c6-8830-8bf519cfc8cc",
"client_id": "0742f495-b030-4ae9-948f-d8daf4942c7b",
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"instrument_code": "BTC_EUR",
"time": "2018-08-01T13:39:15.586Z",
"side": "SELL",
"price": "3",
"amount": "1.5",
"filled_amount": "0.0",
"type": "LIMIT",
"time_in_force": "GOOD_TILL_CANCELLED"
},
"balances": [
{
"currency_code": "BTC",
"amount_locked": "3",
"amount_available": "5.1232"
}
]
}
Account Update: Order Rejected
Emitted after the system establishes that an order could not be processed. The client can expect a reason
field detailing the rejection.
{
"id": "d3fe6025-5b27-4df6-a957-98b8d131cb9d",
"type": "ORDER_REJECTED",
"activity": "TRADING",
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"sequence": 0,
"timestamp": "2018-08-01T13:39:15.590Z",
"reason": "INSUFFICIENT_FUNDS",
"order_id": "6f991342-da2c-45c6-8830-8bf519cfc8cc",
"client_id": "fb497387-8223-4111-87dc-66a86f98a7cf",
"filled_amount" : "0.0",
"balances": [
{
"currency_code": "BTC",
"amount_locked": "0",
"amount_available": "0.1232"
}
]
}
Account Update: Trade Settled
Emitted after an open order leads to a trade.
{
"id": "fbd51897-5d7d-43b1-9551-7a76bcea1cd7",
"sequence": 361801,
"order_book_sequence": 123456,
"type": "TRADE_SETTLED",
"activity": "TRADING",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"time": "2019-10-22T12:12:12.745Z",
"order_id": "f8c7e7cd-105b-48ab-a0bb-7b53e363a161",
"client_id": "fb497387-8223-4111-87dc-66a86f98a7cf",
"order": {
"amount": "0.5",
"filled_amount": "0.5"
},
"trade": {
"trade_id": "38875c5d-b466-4e38-beea-2f6c5d795d47",
"order_id": "f8c7e7cd-105b-48ab-a0bb-7b53e363a161",
"account_id": "379a12c0-4560-11e9-82fe-2b25c6f7d123",
"amount": "0.5",
"side": "BUY",
"instrument_code": "BTC_EUR",
"price": "40000",
"time": "2019-10-22T12:12:12.376Z"
},
"fee": {
"fee_amount": "0.0005",
"fee_currency": "BTC",
"fee_percentage": "0.1",
"fee_group_id": "default",
"fee_type": "TAKER",
"running_trading_volume": "0.10058",
"collection_type": "STANDARD"
},
"balances": [
{
"currency_code": "BTC",
"amount_locked": "0",
"amount_available": "8.12351236"
},
{
"currency_code": "EUR",
"amount_locked": "0",
"amount_available": "124000"
}
]
}
Account Update: Order Closed
Emitted after an open order is closed.
{
"id": "c2373ec1-a2da-4e48-baa2-dfb774802342",
"type": "ORDER_CLOSED",
"activity": "TRADING",
"account_id": "b355abb8-aaae-4fae-903c-c60ff74723c6",
"timestamp": "2018-08-01T13:39:05.773Z",
"order_id": "025293a1-53d8-4a08-996b-2132a18721dc",
"client_id": "fb497387-8223-4111-87dc-66a86f98a7cf",
"sequence": 0,
"order_book_sequence": 123456,
"filled_amount" : "0.0",
"balances": [
{
"currency_code": "BTC",
"amount_locked": "0",
"amount_available": "8.12351236"
}
]
}
Account Update Order Fully Filled
Emitted when LIMIT or STOP order has been fully filled.
{
"activity": "TRADING",
"type": "ORDER_FULLY_FILLED",
"account_id": "b4c5e198-0974-4711-9d72-8e23dac1cdf0",
"order_id": "26dcfb42-b0be-4648-9f2b-cbf7483ddb5f",
"time": "2021-07-28T10:16:04.646715Z",
"order":
{
"time_in_force": "IMMEDIATE_OR_CANCELLED",
"is_post_only": false,
"order_id": "26dcfb42-b0be-4648-9f2b-cbf7483ddb5f",
"account_id": "b4c5e198-0974-4711-9d72-8e23dac1cdf0",
"instrument_code": "ETH_EUR",
"time": "2021-07-28T10:16:04.606935Z",
"side": "BUY",
"price": "100.0",
"amount": "0.5",
"filled_amount": "0.5",
"type": "LIMIT"
},
"id": "cd74b17d-474b-40e6-84f2-597b59271647",
"sequence": 200910
}
Account Update Funds Deposited
Emitted after a user has successfully deposited funds.
{
"channel_name": "ACCOUNT_HISTORY",
"time": "2024-03-20T08:49:53.072Z",
"type": "ACCOUNT_UPDATE",
"update": {
"id": "2967caef-6d09-45a5-95d0-80f1f67b6a3b",
"activity": "FUNDING",
"type": "FUNDS_DEPOSITED",
"account_id": "726288e6-a463-4f88-9068-024ae8f97a34",
"amount": "0.00100000",
"currency_code": "BTC",
"balances": [
{
"currency_code": "BTC",
"amount_locked": "0.0",
"amount_available": "0.0695918"
}
]
}
}
Account Update Funds Withdrawn
Emitted after a user has successfully withdrawn funds.
{
"channel_name": "ACCOUNT_HISTORY",
"time": "2024-03-20T08:10:25.000Z",
"type": "ACCOUNT_UPDATE",
"update": {
"id": "a4559dcf-913f-408e-b262-8b280925bcd0",
"activity": "FUNDING",
"type": "FUNDS_WITHDRAWN",
"account_id": "726288e6-a463-4f88-9068-024ae8f97a34",
"amount": "0.5",
"currency_code": "ETH",
"balances": [
{
"currency_code": "ETH",
"amount_locked": "0.0",
"amount_available": "1.1105"
}
]
}
}
Market Ticker channel
Base URL: wss://garcon.fast.onetrading.com
Description
Publicly available feed of market data: market ticks. Market ticks provide a client with the following market insights:
- last price
- 24hr volume
- 24hr high
- 24hr low
- 24hr absolute price change
- 24hr price change percentage
Volume, low, high and price change are calculated based on a sliding window of trades starting from 24 hours ago and using minutely granularity. Market ticks are pushed on each trade when the 24 hour sliding window is moved forward. If there are no changes, no updates will be pushed.
Additionally, there is information detailing how the price evolved over the last 24hrs.
Subscribe
Unauthenticated access to any number of instruments can be specified in the subscription request.
The price points are part of each market tick message.
{
"type":"SUBSCRIBE",
"channels": [
{
"name":"MARKET_TICKER",
"instrument_codes": ["ETH_USDT"]
}
]
}
Confirmation
{
"type": "SUBSCRIPTIONS",
"channels": [
{
"name": "MARKET_TICKER"
}
]
}
Ticker Updates
Updates are pushed when there is new information available. If there are no changes, no updates will be pushed.
{
"channel_name": "MARKET_TICKER",
"time": "2024-05-10T14:06:34.745Z",
"type": "MARKET_TICKER_UPDATES",
"ticker_updates": [
{
"instrument": "ETH_USDT",
"last_price": "3022.88",
"high": "3039.15",
"low": "2973.42",
"price_change": "49.460000000000036",
"price_change_percentage": "1.663404429915721",
"price_points": [
{
"time": "2024-05-09T14:21:00.000Z",
"price": "2973.42",
"sequence": "1715264461680412400"
},
{
"time": "2024-05-09T14:35:00.000Z",
"price": "2982.54",
"sequence": "1715265355733654300"
},
{
"time": "2024-05-09T15:00:00.000Z",
"price": "2998.15",
"sequence": "1715267848708587300"
},
{
"time": "2024-05-09T16:00:00.000Z",
"price": "3022.89",
"sequence": "1715271515291799600"
}
],
"volume": "38389.950000000004"
}
]
}
Orderbook channel
Base URL: wss://streams.fast.onetrading.com?x-version=3
Description
Publicly available feed of market data: order book
. User has to specify depth
of the order book
that is to be served.
Depth parameter
User can specify what depth of the orderbook he wishes to maintain, this depth is then applied to the both side of orderbook (bids,asks). It means that user will receive at most depth price levels on each side of orderbook. Should the price level within this depth region be removed from orderbook, the system will handle it and will always try to send to user such updates that would result in maintaining specified depth.
For example, user has specified depth of 10. Two orders get matched around spread which results in removal of two price levels, this will emit update event with those price levels being removed (volume = 0), and since the depth is not fulfilled as it would result only in 8 price levels the update event will also include additional price level which the system previously omitted.
Similarly, it works when additional price level with better price are added, update event will include those new ones and signal removal of the ones which are already beyond the specified depth.
Subscribe
Unauthenticated access to any number of order books backed by instruments
can be specified in the request. Depth of the displayed order book
can be also defined, depth 0
means full depth.
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "ORDER_BOOK",
"depth": 1000,
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
]
}
Confirmation
{
"channels": [
{
"name": "ORDER_BOOK",
"depth": 1000,
"instrument_codes": [
"BTC_EUR",
"ETH_EUR"
]
}
],
"type": "SUBSCRIPTIONS",
"time": 1715268699243070457
}
Order Book Snapshot
On subscribe, the most recent compiled
order book snapshot is sent back.
An order book entry is defined as a tuple of price
and amount
.
[
"123.456",
"0.12345678"
]
Full message examples:
{
"type": "ORDER_BOOK_SNAPSHOT",
"channel_name": "ORDER_BOOK",
"time": 1715268699243100946,
"instrument_code": "BTC_EUR",
"bids": [
[
"6500.11",
"0.45054140"
]
],
"asks": [
[
"6500.15",
"0.57753524"
]
]
}
Order Book Updates
Whenever a subscribed order book gets modified, a list of changes is emitted.
Note that the amount always specifies the actual amount and not the delta. If the amount is set to 0
it means that the price level has been removed.
{
"type": "ORDER_BOOK_UPDATE",
"channel_name": "ORDER_BOOK",
"time": 1715268699262970610,
"instrument_code": "BTC_EUR",
"changes": [
[
"BUY",
"6500.09",
"0.84702376"
],
[
"SELL",
"6507.00",
"1.88933140"
],
[
"SELL",
"6505.54",
"1.12386524"
],
[
"SELL",
"6504.38",
"0"
]
]
}
Price Ticks channel
Base URL: wss://streams.fast.onetrading.com?x-version=3
Description
Publicly available feed of market data: price ticks.
Subscribe
Unauthenticated access to any number of instruments that can be specified in the request.
{
"type": "SUBSCRIBE",
"channels": [
{
"name": "PRICE_TICKS",
"instrument_codes": [
"BTC_USDT"
]
}
]
}
Confirmation
{
"channels": [
{
"name": "PRICE_TICKS",
"instrument_codes": [
"BTC_USDT"
]
}
],
"type": "SUBSCRIPTIONS",
"time": 1715268986586599201
}
Price Ticks
Whenever an order match happens a new price tick
is emitted.
{
"type": "PRICE_TICK",
"channel_name": "PRICE_TICKS",
"time": 1715337132095550557,
"instrument_code": "BTC_USDT",
"price": "63052.63",
"amount": "0.04",
"volume": "2522.1052",
"best_bid": "63027.11",
"best_ask": "63070.06",
"taker_side": "BUY"
}
Error Codes
Both the REST and WSS API use the same error codes. If you found error which is not documented, or think that system is behaving not as expected please reach out to us via the Ticketing System.
Although errors are generally sent as json responses, in rare cases a request may not reach Bipanda Pro systems and fail with no or a HTML response body. The HTTP status code will signal an error (502 or 504) and the request can be retried.
If you experience repeated server errors, reach out to support.
Create Order
- ALREADY_IN_PROGRESS The system is processing the action, a new call does not trigger a new execution.
- BAD_AMOUNT_PRECISION Maximum allowed precision can be seen in the currencies endpoint, if it expects the precision of 0, the decimal point has to be left out.
- BAD_PRICE_PRECISION Maximum allowed precision can be seen in the instruments endpoint, if it expects the precision of 0, the decimal point has to be left out.
- BAD_TRIGGER_PRICE_PRECISION Maximum allowed precision can be seen in the instruments endpoint
- CLOSED_MARKET The instrument was decommissioned and cannot be used anymore, please call instruments to find out active markets.
- DUPLICATE_ORDER_EXECUTION Client order id was provided multiple times, please try using different client order id.
- IN_MAINTENANCE The instrument is currently in maintenance.
- INSUFFICIENT_FUNDS The account does not have enough funds to execute this order.
- INSUFFICIENT_LIQUIDITY Market has insufficient liquidity to execute this order.
- INTERNAL_SERVER_ERROR Error occurred during processing. Status of order is unknown.
- INVALID_ACCOUNT_SETTINGS Account settings json is malformed.
- INVALID_AFFILIATE_TAG Affiliate tag of your order is invalid.
- INVALID_AMOUNT Amount must be greater than 0, and a decimal if precision allows.
- INVALID_CLIENT_UUID Client order id is optional, but if it is provided it must be a valid UUID.
- INVALID_CURRENCY The specified currency is not a valid one, please see currencies for valid syntax.
- INVALID_EXPIRY_TIME If
GOOD_TILL_TIME
astime_in_force
is specified andexpire_after
is not in the future. - INVALID_INSTRUMENT_CODE The instrument is invalid, please use valid instrument codes from instruments endpoint e.g.
BTC_EUR
. - INVALID_ORDER_REQUEST Invalid json payload was sent.
- INVALID_ORDER_TYPE Valid order types are only
LIMIT
. - INVALID_PRICE Price must be greater than 0, and a decimal if precision allows.
- INVALID_SIDE Valid sides are
BUY
andSELL
. - INVALID_TIME_IN_FORCE Only
GOOD_TILL_CANCELLED
,GOOD_TILL_TIME
,IMMEDIATE_OR_CANCELLED
andFILL_OR_KILL
are allowed. - INVALID_ORDER_CANCELLATION_TIMER The auto-cancellation timer you specified is invalid and cannot be executed. Check the supported time range.
- MAX_OPEN_ORDERS_EXCEEDED The maximum of allowed open orders was reached, cancel some to submit new orders.
- MIN_SIZE_NOT_SATISFIED The order amount multiplied by the price must be greater than the minimum size of the instrument.
- MISSING_AMOUNT Amount field is mandatory.
- MISSING_EXPIRY_TIME If
GOOD_TILL_TIME
astime_in_force
is specified andexpire_after
is not specified. - MISSING_INSTRUMENT_CODE Valid instrument code must be provided e.g.
BTC_EUR
. - MISSING_ORDER_TYPE No order type was provided.
- MISSING_PRICE Price is mandatory on all order types but
MARKET
. - MISSING_SIDE No side was provided.
- MISSING_TRIGGER_PRICE Trigger price is mandatory order type
STOP
. - NEGATIVE_PRICE Price must be greater than 0.
- NEW_MARKET This market is new and inactive.
- NO_TRADING Trading is currently suspended.
- ONLY_LIMIT_ORDERS_ALLOWED For this market, only orders of type LIMIT are currently supported.
- OVERLOAD The order cannot be placed due to high load in the system - back off and try again later.
- POST_ONLY_MARKET Market is in
POST_ONLY
mode and onlyLIMIT
orders withPOST_ONLY
mode are allowed.
Cancel Order
- ALREADY_IN_PROGRESS Cancellation of the order was already requested recently - back of cancellation requests.
- CLOSED_MARKET The instrument was decommissioned and cannot be used anymore.
- IN_MAINTENANCE The instrument is currently in maintenance mode.
- INVALID_CLOSE_ORDERS_REQUEST The received json in invalid.
- INVALID_ORDER_ID The order id is malformed, or the requested order is open anymore.
- MAX_NUMBER_OF_ORDERS_TO_CLOSE_EXCEEDED The number of order ids to close at the same time exceeds the upper limit.
- ORDER_NOT_FOUND Order has not been found, meaning it has already been cancelled or fully filled and as such it is not present in the order book.
Update Order
- UPDATE_AMOUNT_ALREADY_FILLED Requested amount is lower than the remaining amount of the order
- PENDING_ORDER_UPDATE_CONFLICT Conflicting pending order update found
- AMOUNT_ALREADY_PRESENT Requested amount is same as the amount of order, it will not be updated.
General errors
- AMOUNT_NOT_NUMERIC Amount should be numeric, in form of string e.g.
"1234.456"
- AMOUNT_REQUIRED Amount field is required.
- CANDLESTICKS_TIME_RANGE_TOO_BIG Would return more candlesticks than a maximum limit of 1500, please choose smaller time frame.
- CANNOT_SEND_TO_OWN_ADDRESS Sending to own address is prohibited.
- CSV_EXPORT_EXPIRED Export link already expired, please generate new one again.
- CURRENCY_REQUIRED Currency parameter is required.
- CURRENCY_NOT_FOUND Currency could not be found.
- CURRENCY_NOT_SUPPORTED Currency is not supported at the moment.
- DEPOSIT_ADDRESS_NOT_USED Deposit address is not used.
- EMPTY_JSON JSON payload should not be empty.
- EMPTY_PAYLOAD Payload of WSS message should not be empty.
- FAILED_TO_SERVICE_QUERY Candlestick channel subscription has failed.
- INSUFFICIENT_FUNDS Your funds are insufficient to execute the action.
- INVALID_ACCOUNT_HISTORY_FROM_TIME Invalid format of
from
parameter, it should beISO8601
e.g.2019-07-01T12:30:55.731Z
. - INVALID_ACCOUNT_HISTORY_MAX_PAGE_SIZE Invalid max page size for paginated responses.
- INVALID_ACCOUNT_HISTORY_TIME_PERIOD Time period of a query invalid.
- INVALID_ACCOUNT_HISTORY_TO_TIME Invalid format of
to
parameter, it should beISO8601
e.g.2019-07-01T12:30:55.731Z
. - INVALID_ADDRESS Address is invalid, please re-check it.
- INVALID_AMOUNT Amount is invalid or malformed, it has to be decimal in string format e.g.
"1234.456"
- INVALID_CANDLESTICKS_GRANULARITY Candlestick granularity is not valid, is has to be one of
MINUTES
,HOURS
,DAYS
,WEEKS
andMONTHS
. - INVALID_CANDLESTICKS_UNIT Candlestick unit is not valid, supported combinations explained in candlesticks description.
- INVALID_CURRENCY Currency is not valid, please check
- INVALID_DESTINATION_TAG Destination tag for withdrawal is not valid.
- INVALID_DESTINATION_TAG_TYPE Destination tag type for withdrawal is not valid, or it is not required to be specified for given currency.
- INVALID_FEE Fee is invalid
- INVALID_ORDER_BOOK_DEPTH Orderbook depth is not valid number.
- INVALID_ORDER_BOOK_LEVEL Invalid orderbook level, supported levels are
1
,2
and3
. You can find out more in order-book description. - INVALID_PAGE_CURSOR Page cursor is not correct, please make sure you copied it completely.
- INVALID_PAYLOAD Payload had not correct format.
- INVALID_PRECISION Precision is not valid.
- INVALID_TIME_RANGE Time range is too big, please check corresponding limitations of endpoint you called.
- INVALID_TRADE_ID
trade_id
provided is not valid uuid. - INVALID_UI_ACCOUNT_SETTINGS UI settings are not in correct JSON format.
- INVALID_AUTO_CLOSE_TIMER Client specified an order auto-close timer which is not invalid. A timeout in a valid range specified in milliseconds is expected.
- MALFORMED_JSON JSON payload could not be parsed, please check if it has a valid format.
- MIN_AMOUNT_SIZE_NOT_SATISFIED Minimal amount for transfer is not met.
- MINIMUM_TRANSACTION_AMOUNT_NOT_SATISFIED Minimal amount for transaction is not met.
- MISSING_ACCOUNT_ID
account_id
is missing in request. - MISSING_ACCOUNT_VERIFICATION Account is not verified, please verify first.
- MISSING_CANDLESTICK_GRANULARITY Missing candlestick granularity.
- MISSING_CANDLESTICKS_PERIOD_PARAM Required
period
parameter is missing. - MISSING_CANDLESTICKS_UNIT_PARAM Required
unit
parameter is missing. - MISSING_FROM_PARAM Requited or mutually inclusive parameter
from
is missing. - MISSING_INSTRUMENT_CODE Instrument code is missing
- MISSING_INSTRUMENTS Instruments field in a payload is missing.
- MISSING_ORDER_ID
order_id
is missing. - MISSING_PROPERTIES Missing instrument code filter for candlestick channel.
- MISSING_TO_PARAM Required or mutually inclusive
to
parameter is missing. - MISSING_TRADE_ID
trade_id
is missing in the request. - ONLY_ONE_ERC20_ADDRESS_ALLOWED Only one
ERC_20
address is allowed. - OPERATION_DISABLED Operation is disabled. Please contact customer support.
- PAYOUT_ACCOUNT_MISMATCH Payout account does not match the currency assigned to it.
- PAYOUT_ACCOUNT_NOT_FOUND Payout account has not been found.
- RECIPIENT_REQUIRED Recipient was not specified in request.
- SERVICE_UNAVAILABLE Underlying service was not able to answer in time, please try again.
- SUBSCRIPTION_ALREADY_EXISTS Subscription already exists, please unsubscribe first.
- SUSPENDED_TRADING_FOR_ACCOUNT Trading has been suspended for this account. Please contact support.
- SUSPENDED_WITHDRAW_FOR_ACCOUNT Withdrawals have been suspended for this account. Please contact support.
- TRANSACTION_RATE_LIMIT_REACHED Too many transactions attempts.
- UNABLE_TO_CREATE_DEPOSIT_ADDRESS Could not create a deposit address.
- UNDEFINED_ERROR Undefined error occurred.
- WALLET_MAINTENANCE Wallets are in maintenance, please try again later.
- WITHDRAWAL_AMOUNT_TOO_LOW Withdrawal amount is too low for withdrawal to be executed.
- WITHDRAWAL_LIMIT_EXCEEDED Withdrawal size is too large.
- WITHDRAWAL_GLOBAL_LIMIT_EXCEEDED Global limit for withdrawal has been exceeded. Please contact support.
Authorization errors
- APIKEY_EXPIRED The apikey is not valid anymore and has to be replaced.
- APIKEY_REVOKED The apikey has been revoked. It cannot be activated again, but has to be replaced.
- CLIENT_IP_BLOCKED The client ip of the request does not match any of the allowed IPs associated with this apikey.
- MISSING_CREDENTIALS No apikey was included in the request. Send the apikey via the
Authorization
header. - INVALID_CREDENTIALS The provided apikey was malformed. Verify that the
Authorization
header contains a complete apikey and theBearer
prefix. - INTERNAL_ERROR Authenticating the request failed, it can be retried.
- INVALID_APIKEY An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_AUDIENCE An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_AUTHORIZED_PARTY An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_DEVICE_ID An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_IP_RESTRICTION An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_ISSUER An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_ORIGIN The request included an
Origin
header that was not accepted. Do not send theOrigin
header. - INVALID_SCOPES An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- INVALID_SUBJECT An apikey was found but is invalid. Ensure that the full apikey is included in the request. If the problem persists, please contact support.
- MISSING_CREDENTIALS An apikey has not been sent
- MISSING_PERMISSION The apikey does not grant the required permissions for this endpoint. Create a new apikey and ensure to select an appropriate scope.
Changelog
06/2023 Migration to One Trading
- All endpoints are now using the
onetrading.com
domain - New endpoints for funding your account
- Withdraw funds for crypto now also requires a payout account. You can create them using our UI when initiating the withdrawal or deposit.