BSDEX Documentation (1.0.0)

Welcome to the BSDEX HTTP API Documentation

Introduction

Version: 0.5

Welcome to BSDEX! This mini-guide is intended to help you connect to BSDEX's API.

Now you should be able to create orders via the web app.

API connectivity

The following are base URLs

Base URL: https://api-public.bsdex.de/

Basic information

This section provides basics information about authentication, pagination, relevant request and response headers and anything which is relevant for integrating with the BSDEX API.

Authentication

In order to use the API, you need add the following headers in your HTTP requests:

  • "Date" should contain the current date in rfc7231 format. Such as "Tue, 07 Jul 2020 14:16:19 UTC". Let's call it "DATE".
  • "ApiKey" is your API key.
  • "Authorization" is of format 'hmac username="$BSDEX_API_KEY", algorithm="hmac-sha1", headers="date", signature="$SIGNATURE"' where

You can calculate the value of $SIGNATURE by sha1 HMAC of the string "date: $DATE" in base 64.

Example:

#!/bin/bash
BSDEX_API_KEY=put-your-api-key-here
BSDEX_API_SECRET=put-your-api-secret-here
DATE="`date -u '+%a, %d %b %Y %T %Z'`"
# The signature is in fact HMAC signature of a few fields, currently only "date", using your API secret.
AUTHORIZATION="hmac username=\"$BSDEX_API_KEY\", algorithm=\"hmac-sha1\", headers=\"date\", signature=\"`/bin/echo -n "date: ${DATE}" | openssl sha1 -binary -hmac "${BSDEX_API_SECRET}" | base64 `\""
curl -v \
-H "Date: $DATE" \
-H "ApiKey: $BSDEX_API_KEY" \
-H "Authorization: $AUTHORIZATION" \
-X GET "https://api-public.bsdex.de/api/v1/balance"

And you'll receive a response such as:

[
{
"asset_id": "btc",
"available": "0",
"locked": "0"
},
{
"asset_id": "eur",
"available": "34163",
"locked": "123"
}
]

For all API requests, "Date", "ApiKey" and "Authorization" headers must be present.

Note on Self-Trades

If self-trade prevention is enabled for your account, the trading engine prevents two ordrs of the same user to match. This is done by cancelling the aggressive order. The 'cancelled_reason' field of the cancelled order will be set to "self_trade". Note that the aggressive order can be partially filled before being cancelled due to self trade.

Auctions and Phases

Phases

At any point in time, a BSDEX market operates within a phase. By subscribing to the phases channel for a market, you get the current phase as well as changes to the phase:

{
"type": "subscribe",
"chan_name": "phases",
"subchan_name": "btc-eur"
}

And the server responds with:

{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "online"
}
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"name": "continuous-trading",
"start_ts": 1723456449279064870
}
}

Which means the market is in continuous trading phase at the moment. See section Trading Phases for an explanation of each trading phase. For more details about the phases channels behavior see section Phases Channel.

You can get the same payload by calling the current phase's HTTP endpoint:

GET /api/v1/btc-eur/phases/current

For more details about this REST API endpoint see section Get current market phase.

Auction and Phases

In continuous trading phase, orders continuously get matched. However in certain situations, the market enters an auction. This could happen when:

  • Market opens.
  • Market resumes from 'tradinghalt' or 'suspended' phases.
  • A trade causes a volatility interruption.

In such case, the market enters auction "call" phase. During an auction, no trade takes place and the orderbook may be crossed.

A message is sent to the phases channel:

{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"name": "auction-call",
"start_ts": 1723456534127110500
}
}

Auction "call" phases has a fixed duration after which, the market enters auction "price" phase, which has a random length. During auction call and price phase, the auction channel provides information on the current state of the auction.

If the orderbook is crossed, this channel receives the hypothetical auction price with volume and surplus values:

{"chan_name":"auction","subchan_name":"btc-eur","type":"data","data":{"auction_price":"9500.50", "auction_volume":"20.2", "surplus": "0.8", "surplus_side":"buy", "market": "btc-eur"}}

This means that if the auction were to end at the hypoehtical auction price of 9500.50, 20.20 worth of base asset will be traded and "0.8" worth of base asset in surplus will remain outstanding. Auction volume and surplus will continually reflect the liquidity that's being added or removed during the auction call and price phases. Note that a "surplus_side" of "none" means there is no surplus.

On the other hand, if the orderbook is not crossed, this channel receives information on top of the book:

{"chan_name":"auction","subchan_name":"btc-eur","type":"data","data":{"buy_price":"9500.00", "buy_volume":"20.2", "sell_price": "9510.10", "sell_volume":"1.11", "market": "btc-eur"}}

Trading Phases

  • continuous-trading - Clients can post orders and orders get matched continuously. Orderbook will always be uncrossed.
  • auction-call - The auction starts in the "auction-call" phase. Clients can post orders but orders do not match. Consequently, the orderbook may be crossed at times. The length of auction call phase is fixed and once it ends, the "auction-price" phase starts.
  • auction-price - The "auction-price" phase behaves similarly to auction-call phase except that it has a random but bounded length. At the end of "auction-price" phase, if the orderbook is not crossed, the market enters the "continuous-trading" phase. However, if the orderbook is crossed (i.e. there are orders to martch), the auction price will be determined as the price with highest turnover and lowest surplus. If the auction price is within an acceptable band around of the asset's price in other markets, the auction ends with the execution of orders and it enters the "continuous-trading" phase. If the auction price is not within an acceptable band of the asset's price, the market enters "auction-recall" phase.
  • auction-recall - In this phase, having entered from the "auction-price" phase with a crossed order book but without an acceptable price, clients can post orders and as soon as the would-be auction price is within the acceptable range, or the order book is uncrossed, the "auction-recall" phase goes back to the "auction-price" phase.
  • system-down - Clients can post orders but orders does not match. The "system-down" phase ends into the "auction-call" phase when the market reopens.
  • suspended - Market is suspended and all orders are deleted from the system. Clients cannot post orders.
  • trading-halt - Market is temporarily halted. Clients can post orders but orders does not match. The "trading-halt" phase ends into the "auction-call" phase when the market resumes.

Recommended Quoting Behavior During Different Phases

  • Quote during the continuous-trading phase.
  • Quoted during the auction-call, auction-price and auction-recall phases. The client may adjust the volume of the quote based on the amount of surplus reported in the auction WebSocket channel.
  • Cancel the existing orders and stop quoting when entering trading-halt and system-down phases.
  • Do not quote nor attempt to cancel quotes during the suspended phase, as orders have already been cancelled.

General guidelines on Error Handling

Specific endpoint errors are described under specific endpoints, some errors are common to all requests.

Authentication Errors

In case the HMAC authentication does not work, you might receive the following errors:

Status CodeError MessageDescription
401Invalid authentication credentialsYou are using an invalid API key.
401HMAC signature does not matchYou are using an invalid API secret or there is something wrong with your generation of the signature.
401The access token is invalid or has expiredThe route you are accessing has not configured HMAC authentication. Maybe you are not accessing the api-public subdomain.
401Your IP address is not allowedThe IP address you are using is not allowed for this API key. Also check whether you are using IPv6 instead of IPv4.

Trading API Errors

Below are lists of REST API error codes of the Trading API, and an explanation of what these errors mean.

Response-Level

Response level errors are present when the HTTP response payload will be structured like this:

{
"id": "09ae20b4bcdf13da88558fb5bb8b0399",
"status": 418,
"code": "I'm a teapot",
"detail": "still a teapot", // optional
"source": {
"field": "fld",
"message": "msg"
} // optional
}

Each error object contains "id", which is the internal bsdex request id associated with the HTTP request, "status" the string representation of http status code or an internal service level key, "code" the string representation of the http status code. The object also contains optional field "detail", which explains the actual error. 400 Bad request errors contain the sub object "source", which contains the "field" with the invalid value & "message" that explains it.

Response-Level Error Codes

Response CodeCodeComment
400invalid_order_request"field" in the "source" object contains the field with the invalid value
400invalid_order_requestBulk request payload should specify the orders to be cancelled using one of only cancel or cancel_client_ids. "field" in source object would contain value of cancel and "message" would have text "only one of cancel or cancel_client_ids can be used"
400invalid_order_requestBulk request payload cannot contain more than 10 orders to be inserted and 10 to be cancelled. "field" would contain value of body and the "message" would contain text "only 10 orders and 10 cancels can be issued within bulk"
400invalid_order_requestFor creating a single order request, a 400 error response payload would contain the "source" object with the invalid "field" and "message" specified
400order_validationFor Bulk request, if an order to be inserted contains an already used client id, then "source" object would contain "field" with value "client_id" and "message" contains text "client_id exists"
400insufficient_funds"detail" field would contain the error message
500bookkeeping_service"detail" field would contain the specific error message, but this generally means placing the order failed because of failed fund management.
500order_service"detail" would contain the specific internal failure. All order_service failures mean that order or bulk api request has failed and client should retry
503passive_modeThe Orderbook is currently in Passive Mode. Please refer to the section on Auctions and Phases.

WebSockets API

BSDEX offers a WebSockets API to subscribe to real-time data. You need to authenticate similar to HTTP endpoints.

The following example uses a command line tool "websocat". Please download the tool to run the examples below.

#!/bin/bash
BSDEX_API_KEY=put-your-api-key-here
BSDEX_API_SECRET=put-your-api-secret-here
DATE="`date -u '+%a, %d %b %Y %T %Z'`"
AUTHORIZATION="hmac username=\"$BSDEX_API_KEY\", algorithm=\"hmac-sha1\", headers=\"date\", signature=\"`/bin/echo -n "date: ${DATE}" | openssl sha1 -binary -hmac "${BSDEX_API_SECRET}" | base64 `\""
websocat wss://api-public.bsdex.de/api/v1/ws -H "Date: $DATE" -H "ApiKey: $BSDEX_API_KEY" -H "Authorization: $AUTHORIZATION"

If the connection and authentication are successful, you're given an interactive shell. Try subscribing to the orderbook channel:

{"type":"subscribe","chan_name":"orderbook","subchan_name":"btc-eur"}

Which subsequently you'll receive a full orderbook folllowed by real-time changes to the orderbook:

{"chan_name":"orderbook","subchan_name":"btc-eur","type":"subscribed"}
{"chan_name":"orderbook","subchan_name":"btc-eur","type":"online"}
{"chan_name":"orderbook","subchan_name":"btc-eur","type":"data","data":[{"price":"53119.54","side":"sell","size":"0.001","market":"btc-eur","order_count":1},{"price":"52794.86","side":"buy","size":"0.001","market":"btc-eur","order_count":1}],"meta":{"dti":"4H95J0R2X","asset_name":"Bitcoin","price_curr":"BTC/EUR","price_nota":"MONE","quantity_nota":"UNIT","venue":"XDEX","system":"HYBR","published_at":"2024-08-08T14:20:42.452792Z"}}
{"chan_name":"orderbook","subchan_name":"btc-eur","type":"data","data":[{"price":"53119.54","side":"sell","size":"0","market":"btc-eur","order_count":0},{"price":"53103.44","side":"sell","size":"0.001","market":"btc-eur","order_count":1},{"price":"52794.86","side":"buy","size":"0.001","market":"btc-eur","order_count":1}],"meta":{"dti":"4H95J0R2X","asset_name":"Bitcoin","price_curr":"BTC/EUR","price_nota":"MONE","quantity_nota":"UNIT","venue":"XDEX","system":"HYBR","published_at":"2024-08-08T14:20:54.022131Z"}}

Ping Pong

Client can ping server to determine whether connection is alive, server responds with pong. This is an application level ping as opposed to default ping in websockets standard which is server initiated It is ideal to use ping to avoid disconnection if no messages are received within the configured idle timeout

{"type": "ping"}

Response:

{"type": "pong"}

Connection Limits

See this section for details.

To limit load there is a hard limit of 400 websocket connections which can simultaneosly be opened per user account. Once this limit is reached any new connection will receive the below error message, after which the connection is terminated from server-side.

# Error Message
{
"type": "error",
"data": {
"message": "maximum amount of websocket connections reached"
}
}

Due to replication and routing in some edge cases this message can already occur on new connection creation from 200 active connections onwards.

Session Management

Clients can use the session message to manage the current websocket session.

Below flags are currently supported

  1. enable_cancel_on_disconnect: Enables or disables batch cancellation of all open orders if the users websocket session is disconnected. Default: false
  2. idle_timeout: Time interval in seconds until the gateway disconnects the session if no data has been exchanged between server and client. Default: 60s

To avoid automatic disconnects after idle_timeout, the client should send periodic ping messages as described above.

{
"type": "session",
"data": {
"enable_cancel_on_disconnect": true,
"idle_timeout": 60
}
}

Channels and Subchannels

The real-time feed is organised in hierarchy of "channels" and "subchannels". A channel is a category of real-time data which contains multiple subchannels.

Available channels and subchannels:

Orderbook Channel

Provides orderbook state and changes per subscribed market.

  • btc-eur
  • eth-eur
  • [ other markets ]

The first message of type data after subscribing will contain a complete snapshot of the current orderbook. Followup messages are delta updates that a client should apply to the internal orderbook representation in order to keep it up-to-date.

# Subscribe via
{
"type": "subscribe",
"chan_name": "orderbook",
"subchan_name": "btc-eur",
"params": {
#optional flag to avoid disconnect when feed goes offline during auction
#false by default. Set true to avoid disconnection
"keep_alive_when_offline": true
}
}
# Response
{
"chan_name": "orderbook",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "orderbook",
"subchan_name": "btc-eur",
# feed status -- online or offline
"type": "online"
}
# Orderbook Message
{
"chan_name": "orderbook",
"subchan_name": "btc-eur",
"type": "data",
"data": [
{
"price": "61812.91",
"side": "buy",
"size": "1",
"market": "btc-eur",
"order_count": 3
},
{
"price": "62012.3",
"side": "sell",
"size": "0.15",
"market": "btc-eur"
"order_count": 1
}
],
"meta": {
"dti": "4H95J0R2X",
"asset_name": "Bitcoin",
"price_curr": "BTC/EUR",
"price_nota": "MONE",
"quantity_nota": "UNIT",
"venue": "XDEX",
"system": "HYBR",
"published_at": "2023-07-17T16:34:09.783483Z"
}
}

Quote Channel

Contains real-time changes to top of the books

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe via
{
"type": "subscribe",
"chan_name": "quote",
"subchan_name": "btc-eur"
}
# Response
{
"chan_name": "quote",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "quote",
"subchan_name": "btc-eur",
"type": "online"
}
# Quote message
{
"chan_name": "quote",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"buy_price": "48649.27",
"buy_volume": "0.01",
"sell_price": "48701.74",
"sell_volume": "0.01",
"market": "btc-eur"
}
}

Phases Channel

Contains information about phase changes, such as "continuous-trading", "auction-call" or "auction-price". The start timestamp start_ts is given in nanoseconds since Unix epoch. After successful subscription, an initial message stating the currently active phase is sent. The start timestamp of this initial phase is typically further in the past since it started before the client subscribed to the channel. All other phase messages represent live updates and therefore typically carry a more recent timestamp.

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe
{
"type": "subscribe",
"chan_name": "phases",
"subchan_name": "btc-eur"
}
# Subscription response
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "online"
}
# Initial phase active during subscribe request (start_ts is typically further in the past since the phase started before the client subscribed)
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"name": "continuous-trading",
"start_ts": 1723456449279064870
}
}
# 1st phase update after subscribing (start_ts is more recent)
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"name": "auction-call",
"start_ts": 1723456534127110500
}
}
# 2nd phase update after subscribing (start_ts is more recent)
{
"chan_name": "phases",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"name": "auction-price",
"start_ts": 1723456547141235724
}
}

Public Trade Channel

Contains information about public trades.

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe via
{
"type": "subscribe",
"chan_name": "public_trade",
"subchan_name": "btc-eur"
}
# Response
{
"chan_name": "public_trade",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "public_trade",
"subchan_name": "btc-eur",
"type": "online"
}
# Public Trade message
{
"chan_name": "public_trade",
"subchan_name": "btc-eur",
"type": "data",
"data": [
{
"id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
"executed_at": "2023-07-17T16:34:09.123456Z",
"local_ts": 1616393143567786800,
"quantity": "0.01",
"price": "48677.73",
"market": "btc-eur",
}
],
"meta": {
"dti": "4H95J0R2X",
"asset_name": "Bitcoin",
"price_curr": "BTC/EUR",
"price_nota": "MONE",
"quantity_nota": "UNIT",
"venue": "XDEX",
"published_at": "2023-07-17T16:34:09.783483Z"
}
}

Auction Channel

Contains auction information, including real-time hypothetical auction price.

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe via
{
"type": "subscribe",
"chan_name": "auction",
"subchan_name": "btc-eur"
}
# Response
{
"chan_name": "auction",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "public_trade",
"subchan_name": "btc-eur",
"type": "online"
}
# Auction message
{
"chan_name": "auction",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"auction_price": "61905.12",
"auction_volume": "0.0104",
"surplus": "0.98960001",
"surplus_side": "buy",
"local_ts": 1616396326042637300,
"market": "btc-eur"
},
"meta": {
"dti": "4H95J0R2X",
"asset_name": "Bitcoin",
"price_curr": "BTC/EUR",
"price_nota": "MONE",
"quantity_nota": "UNIT",
"venue": "XDEX",
"system": "HYBR",
"published_at": "2023-07-17T16:34:09.783483Z"
}
}

Private Order Channel

Contains changes to an authenticated user's own orders.

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe via
{
"type": "subscribe"
"chan_name": "order",
"subchan_name": "btc-eur",
}
# Response
{
"chan_name": "order",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "order",
"subchan_name": "btc-eur",
"type": "online"
}
# Order message
{
"chan_name": "order",
"subchan_name": "btc-eur",
"type": "data",
"data": [{
"id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
"client_id": "X_1",
"side": "sell", # values can be "sell" or "buy"
"type": "limit", # values can be "limit", "market"
"quantity": "0.1",
"price": "45000",
"order_status": "open", # values can be "open", "closed", "cancelled", "rejected"
"fill_status": "unfilled", # values can be "unfilled", "partially_filled", "filled"
"created_at": 1616396326042637300,
"market": "btc-eur"
# additional fields received for market buy order
"quote_quantity": "25679.50",
"quote_filled": "12500",
# additional fields received when order was cancelled
"cancelled_at": 1616396326042637600,
"cancelled_reason": "cancelled_by_user", # values can be "cancelled_by_user", "cancelled_by_market", "self_match"
# additional fields received for stop order
"stop_price": "44500",
# additional fields received when stop order is triggered
"triggered_at": 1616396326042637450,
"triggered_price": "44650",
"triggered_reason": "last_traded_price", # values can be "last_traded_price", "highest_buy", "lowest_sell"
# additional fields received after the first fill
"recent_fill_quantity": "0.05", # most recently filled quantity
"recent_fill_price": "45000" # price of most recent fill
}],
"params": {
"user_id": "X"
}
}

Private Trades Channel

Contains own trades, with more information than public_trades

  • btc-eur
  • eth-eur
  • [ other markets ]
# Subscribe via
{
"type": "subscribe"
"chan_name": "trade",
"subchan_name": "btc-eur",
}
# Response
{
"chan_name": "trade",
"subchan_name": "btc-eur",
"type": "subscribed"
}
{
"chan_name": "trade",
"subchan_name": "btc-eur",
"type": "online"
}
# Private Trades message
{
"chan_name": "trade",
"subchan_name": "btc-eur",
"type": "data",
"data": {
"id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
"local_ts": 1616396326042637300,
"quantity": "0.01",
"price": "48677.73",
"side": "buy",
"order_id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
"client_order_id": "X_1",
"fee": "4.99",
"market": "btc-eur"
},
"params": {
"user_id": "X"
}
}

Private Balance Channel

Contains changes to the balance, including amounts locked for open orders.

  • btc
  • eth
  • eur
  • [ other assets ]
# Subscribe via
{
"type": "subscribe",
"chan_name": "balance"
"subchan_name": "btc",
}
# Response
{
"chan_name": "balance",
"subchan_name": "btc",
"type": "subscribed"
}
{
"chan_name": "balance",
"subchan_name": "btc",
"type": "online"
}
# Balance Update message
{
"chan_name": "balance",
"subchan_name": "btc",
"type": "data",
"data": {
"asset_id": "btc",
"available": "0.102",
"locked": "1.1",
},
"params": {
"user_id": "X"
}
}

Channel Availability

Clients receive the availability of a certain real-time feed via status messages. The current status of a channel, subchannel feed is received immediately after subscription. Clients are responsible for implementing their own rules when feed status messages are received. For example, clearing cached orderbook data when the orderbook channel goes offline.

{
"chan_name": "orderbook",
"subchan_name": "btc-eur",
"type": "online" # values can be "online", "offline"
}

Keep Alive flag

To enforce clearing of context/data cached for a websocket connection, the gateway disconnects clients who are subscribed to a channel that goes offline. To keep the connection alive, without the above disconnection, please set the keep_alive_when_offline optional flag to true, in the subscribe message.

{
"type": "subscribe",
"chan_name": "orderbook",
"subchan_name": "btc-eur",
"params": {
"keep_alive_when_offline": true
}
}

FIX API

Version 0.6 (beta)

BSDEX provides a FIX API for order management. The specification is based on FIX 4.4.

The FIX API:

  • Supports order entry operations for creating, canceling and querying orders.
  • Supports market data subscription for listening on aggregated orderbook changes and trades.
  • Support for Cancel-On-Disconnect is currently only implemented for WebSocket connections but might be added to the FIX API in a future releases.
  • Supports ResendRequest.

Connectivity

The FIX endpoint for prelive (sandbox) is listed below. Fix on live environment is not active yet but will be activated when ready.

EnvEndpoint
prelivetcp+tls://fix.prelive.staging.tribe.sh:443

General Components

Supported messages are defined in the sections below. Messages are based on Fix 4.4. with some custom adaptions. For example, a field that is optional in the Fix standard can be mandatory here and the other way around. The table below gives an overview about the meaning of the Req column.

ReqMeaning
MMandatory: Field must be present in the message
OOptional: Field can be present in the message
CConditional: Field must be present under certain conditions, see individual descriptions for details
M*Mandatory inside group entry: Field must be present if a (repeating) group entry is specified but the group entry as a whole is not mandatory

Header

Subsequent header tags must exist in every message.

TagNameTypeReqDescription
8BeginStringStringMFIX.4.4 (must be the first field)
9BodyLengthintMMessage length in bytes up to the CheckSum field (must be the second field)
35MsgTypeStringMDefines the message type (must be the third field)
34MsgSeqNumintMMessages integer sequence number
49SenderCompIDStringMClient API Key for messages sent from the client, otherwise BSDEX
52SendingTimeUTCTimestamp with microsecondsMSet to the UTC time when this message was sent, format based on Fix UTCTimestamp, but extended with microsecond resolution YYYYMMDD-HH:MM:SS.ssssss
56TargetCompIDStringMBSDEX for messages sent from the client, otherwise the Client API Key

Trailer

Subsequent trailer tags must exist in every message.

TagNameTypeReqDescription
10CheckSumStringMThree bytes checksum as specified by Fix standard, must be the last field

Error Handling

SessionMessageReject (3) and BusinessMessageReject (j) are two message types used for error handling and rejection of messages. When a reject message is sent, it provides details about the rejection reason, allowing the receiver to diagnose and address the session-level issue and/or application-level issue.

Session Message Reject (3)

The Session Message Reject (3) should be issued when a message is received but cannot be properly processed due to a session-level rule violation.

TagNameTypeReqDescription
372RefMsgTypeStringMMsgType (35) of the rejected message
373SessionRejectReasonintOError code to identify the reason for session message rejection
58TextStringOError message explaining the reason for session message rejection
45RefSeqNumintOMsgSeqNum(34) of the rejected message

Business Message Reject (j)

The Business Message Reject (j) message can reject an application-level message which fulfills session level rules and can't be rejected via any other means. Note if the message fails a session-level, a session-level reject messages should be issued.

TagNameTypeReqDescription
372RefMsgTypeStringMMsgType (35) of the rejected message
380BusinessRejectReasonintMError code to identify the reason for business message rejection
58TextStringOError message explaining the reason for business message rejection
45RefSeqNumintOMsgSeqNum(34) of the rejected message

Session Messages

Logon (A)

The Logon message is used by clients to authenticate after the TCP/TLS session has been established. It must be sent and processed successfully before any business related messages can be sent or received.

TagNameTypeReqDescription
35MsgTypeStringMA
98EncryptMethodintM0
108HeartBtIntintMHeartbeat interval in seconds, e.g. 30 (recommended)
141ResetSeqNumFlagBooleanMY if sequence numbers shall be reset for both sides, otherwise N
96RawDatadataMMessage signature, see below for details

The authentication mechanism works similar as described in Basic information, section Authentication. A base64 encoded HMAC signature needs to be generated by the client. When using the fix API this signature is transferred in field RawData(96).

The signature is composed as follows:

hmac username="BSDEX_API_KEY", algorithm="hmac-sha1", headers="date", signature="SIGNATURE"

BSDEX_API_KEY needs to be replaced by the clients API key and SIGNATURE needs to be generated as follows:

  • Create a date string with format date: DATE where DATE is the current date as specified in standard header field SendingTime(56) but using RFC7231 format, such as Tue, 07 Jul 2020 14:16:19 UTC
  • Generate an SHA1 HMAC from the date string using your API secret.
  • Encode the HMAC in base64 format.

The completed signature must be written to field RawData(96). Please make sure that the standard header fields SendingTime(52) and SenderCompID(49) are set. SendingTime(52) must use the same timestamp as used for generating the HMAC (but the format in the header field uses the standard FIX UTC timestamp format).

For a bash script example on how to generate a valid signature, see Basic information, section Authentication.

Heartbeat (0)

The Heartbeat (0) monitors the status of the communication link and identifies when the last of a string of messages was not received.

TagNameTypeReqDescription
35MsgTypeStringM0
112TestReqIDStringCRequired when the Heartbeat (0) is the result of a Test Request (1) message.

Test Request (1)

The Test Request (1) message forces a heartbeat from the opposing application. The Test Request (1) message checks sequence numbers or verifies communication line status. The opposite application responds to the Test Request (1) with a Heartbeat (0) containing the TestReqID (112).

TagNameTypeReqDescription
35MsgTypeStringM1
112TestReqIDStringMUnique identifier used to track the response to a Test Request (1).

Resend Request (2)

The Resend Request (2) is sent by the receiving application to initiate the retransmission of messages. This function is utilized if a sequence number gap is detected, if the receiving application lost a message, or as a function of the initialization process.

TagNameTypeReqDescription
35MsgTypeStringM2
7BeginSeqNointMMessage sequence number of first message in range to be resent.
16EndSeqNointMMessage sequence number of last message in range to be resent. If request is for a single message BeginSeqNo (7) = EndSeqNo. If request is for all messages subsequent to a particular message, EndSeqNo = 0 (representing infinity).

Reset Sequence (4)

The Sequence Reset (4) message has two modes: Gap Fill mode and Reset mode.

TagNameTypeReqDescription
35MsgTypeStringM4
123GapFillFlagBooleanOGap Fill mode is indicated by GapFillFlag (123) field = 'Y' and Reset mode is indicated by the GapFillFlag (123) field = 'N' or if the field is omitted
36NewSeqNointMNew sequence number.

Logout (5)

The Logout message is used by clients to gracefully terminate a Fix connection. After logout, no business related messages can be sent or received until another logon happens.

TagNameTypeReqDescription
35MsgTypeStringM5

Order Entry Messages

New Order Single (D)

The New Order Single message can be used by clients to submit a new order to the exchange. The client needs to have enough funds to place the order.

TagNameTypeReqDescription
35MsgTypeStringMD
11ClOrdIDStringMClient order ID, no more than 64 alphanumerical chars, including dash and underscore
40OrdTypecharMThe type of order to create, 1 (Market), 2 (Limit), 3 (Stop), 4 (Stop limit) are supported
54SidecharMThe side to place the order, 1 (Buy) and 2 (Sell) are supported
55SymbolStringMName of the BSDEX market to place the order on, e.g. btc-eur, eth-eur etc.
38OrderQtyQtyCDecimal quantity specifying the Crypto quantity to buy or sell, see next table for presence requirements
152CashOrderQtyQtyCDecimal Euro quantity to use for buying Cryptos via market orders, no more than two decimal places, see next table for presence requirements
44PricePriceCDecimal price to bid or ask for in Euro per whole Crypto quantity, no more than two fractional digits, see next table for presence requirements
99StopPxPriceCDecimal price for triggering Stop and Stop limit orders in Euro, no more than two fractional digits, see next table for presence requirements

Depending on the order type and side, some conditional fields are required while others are not. Please see the table below for an overview which conditional fields must be set. Note that other conditional fields must be omitted.

OrdTypeSideRequired conditional fields
Market (1)Buy (1)CashOrderQty
Market (1)Sell (2)OrderQty
Limit (2)Buy (1)OrderQty, Price
Limit (2)Sell (2)OrderQty, Price
Stop (3)Buy (1)CashOrderQty, StopPx
Stop (3)Sell (2)OrderQty, StopPx
Stop limit (4)Buy (1)OrderQty, Price, StopPx
Stop limit (4)Sell (2)OrderQty, Price, StopPx

Response

If the message cannot be processed a Business Message Reject (j) will be sent to the client. This can happen due to insufficient funds, missing fields or other reasons. In case of successful order creation, the client will receive an Execution Report (8) containing the provided client order ID and status new.

Order Cancel Request (F)

Order Cancel can be sent by clients to cancel a single order that has not been completely filled yet. Note that one of both IDs must be specified. Either the OrigClOrdID as specified by the client during order creation or the OrderID that was assigned by the exchange. If both are present, OrigClOrdID will take precedence and OrderID may be ignored.

TagNameTypeReqDescription
35MsgTypeStringMF
11ClOrdIDStringMUnique identifier assigned by institution to identify the cancel request
41OrigClOrdIDStringCClOrdID of the order to be cancelled (as specified by the client), needed if OrderID is not specified
37OrderIDStringCOrderID of the order to be cancelled (as specified by the exchange), needed if OrigClOrdID is not specified
55SymbolStringMName of the BSDEX market where the order is present, e.g. btc-eur, eth-eur etc.

Response

In case of successful order cancellation, the client will receive an Execution Report (8) containing the provided client order ID and status canceled. If the order cancellation fails, an Order Cancel Reject (9) message will be issued. This could occur if the order is unknown or due to other factors.

Order Cancel Reject (9)

The Order Cancel Reject (9) message is sent when an Order Cancel Request is unsuccessful.

TagNameTypeReqDescription
35MsgTypeStringM9
37ClOrdIDStringMUnique identifier assigned by institution to identify the cancel request
41OrigClOrdIDStringMClOrdID of the previously accepted order (referring to orders that were electronically submitted over FIX or otherwise assigned a ClOrdID)
37OrderIDStringMOrderID of the order to be cancelled. If CxlRejReason = 0, will be specified NONE
39OrdStatuscharMOrdStatus value after this cancel reject is applied. If CxlRejReason = 0, will be specified OrdStatus_REJECTED.
434CxlRejResponseTocharMIdentifies the type of request that a Cancel Reject is in response to. 1 for Order Cancel Request
102CxlRejReasoncharOIdentifies common reasons why cancel request is rejected. 0 for CxlRejReason_UNKNOWN_ORDER, 2 for CxlRejReason_BROKER, 99 CxlRejReason_OTHER
58TextStringOError message explaining the reason for Order Cancel Request rejection

Order Mass Cancel Request (q)

Order Mass Cancel Request can be sent by clients to cancel a single market orders or cancel all orders from all markets.

TagNameTypeReqDescription
35MsgTypeStringMq(lowercase Q)
11ClOrdIDStringMUnique ID of Order Mass Cancel Request as assigned by the institution
530MassCancelRequestTypecharM1 for market wise orders cancellation, 7 for cancel all orders
55SymbolStringCRequired for MassCancelRequestType =1

Response

The OrderMassCancelReport (r) is used to acknowledge an Order Mass Cancel Request. Note that each affected order that is canceled is acknowledged with a separate Execution Report (8).

Order Mass Cancel Report (r)

TagNameTypeReqDescription
35MsgTypeStringMr(lowercase R)
11OrderIDStringMUnique Identifier for the Order Mass Cancel Request assigned by the recipient of the Order Mass Cancel Request.
530MassCancelRequestTypecharM1 for market wise orders cancellation, 7 for cancel all orders
531MassCancelResponsecharM0 for mass cancel request rejected, 1 for market wise orders cancellation, 7 for cancel all orders
532MassCancelRejectReasoncharCIndicates why Order Mass Cancel Request was rejected. Required if MassCancelResponse = 0
58TextStringOError message explaining the reason for Order Mass Cancel Request rejection

Bulk Order (U1)

The Bulk Order request is a custom message that is specified by MsgType U1 and not defined by the Fix standard. It allows clients to cancel and create up to 10 orders each with a single message. Note that the client needs to have enough funds to have new orders funded momentarily even before canceled orders are taken into account. If new orders are specified, the conditional fields to specify depend on the order type and side. Please see message New Order Single (D) for details about conditional new order fields. The requirements are the same here.

TagNameTypeReqDescription
35MsgTypeStringMU1
55SymbolStringMName of the BSDEX market, e.g. btc-eur, eth-eur etc.
6001NumNewOrdersintONumber of repeating new order group entries that follow, min value is 0 and max value is 10
11ClOrdIDStringM*Client order ID, no more than 64 alphanumerical chars, including dash and underscore
40OrdTypecharM*The type of order to create, 1 (Market), 2 (Limit), 3 (Stop), 4 (Stop limit) are supported
54SidecharM*The side to place the order, 1 (Buy) and 2 (Sell) are supported
55SymbolStringM*Must match the Symbol specified at the top level field 55
38OrderQtyQtyCDecimal quantity specifying the Crypto quantity to buy or sell, see next table for presence requirements
152CashOrderQtyQtyCDecimal Euro quantity to use for buying Cryptos via market orders, no more than two decimal places, see next table for presence requirements
44PricePriceCDecimal price to bid or ask for in Euro per whole Crypto quantity, no more than two fractional digits, see next table for presence requirements
99StopPxPriceCDecimal price for triggering Stop and Stop limit orders, no more than two fractional digits, see next table for presence requirements
11ClOrdIDStringM*Client order ID, no more than 64 alphanumerical chars, including dash and underscore
6002NumCancelOrdIDintONumber of repeating cancel by OrdID group entries that follow, min value is 0 and max value is 10
37OrderIDStringM*OrderID of the order to be cancelled (as specified by the exchange)
6003NumCancelOrigClOrdIDintONumber of repeating cancel by ClOrdID group entries that follow, min value is 0 and max value is 10
41OrigClOrdIDStringM*ClOrdID of the order to be cancelled (as specified by the client)

Response

If the message cannot be processed a Business Message Reject (j) will be sent to the client. This can happen due to insufficient funds, missing fields or other reasons. In case of successful order creation / cancellation, the client will receive an Execution Report (8) for each created and cancelled order containing the related (client) order ID and status new or canceled.

Order Status Request (H)

Order Status Request can be sent by clients to retrieve the current state of an order. Note that one of both IDs must be specified. Either the OrigClOrdID as specified by the client during order creation or the OrderID that was assigned by the exchange.

TagNameTypeReqDescription
35MsgTypeStringMH
55SymbolStringMName of the BSDEX market where the order is present, e.g. btc-eur, eth-eur etc.
11ClOrdIDStringCClOrdID of the order to be queried (as specified by the client), needed if OrderID is not specified
37OrderIDStringCOrderID of the order to be queried (as specified by the exchange), needed if ClOrdID is not specified
790OrdStatusReqIDStringOCan be provided to identify a specific status request, will be echoed back in the resulting Execution Report (8) if provided

Response

If the message cannot be processed a Business Message Reject (j) will be sent to the client. This can happen due to unknown orders or other reasons. In case of success the client will receive an Execution Report (8) with the specified (client) order ID, order status request ID (if specified) and ExecType (150) I (OrderStatus).

Execution Report (8)

Execution Report messages are sent to the client when the status of created orders changes, e.g. for newly created, rejected, cancelled or filled orders. Moreover, an Execution Report will be sent when a Status Request from the client has been received.

TagNameTypeReqDescription
35MsgTypeStringM8
37OrdIDStringMID of the order (as specified by the exchange on order creation)
11ClOrdIDStringMClient order ID as specified by the client on order creation or cancelation if sent in response to an Order Cancel (F) or Order Mass Cancel (Q) request
41OrigClOrdIDStringCClient order ID as specified by the client on order creation, set for reports sent in response to an Order Cancel (F) or Order Mass Cancel (Q) request only
790OrdStatusReqIDStringCContains the optionally provided OrdStatusReqID (790) if sent in response to an Order Status Request (H) carrying this field
17ExecIDStringMID of the execution report if initiated by the server side. Will be 0 if sent in response to a client request, i.e. if ExecType (150) is I (OrderStatus).
39OrdStatuscharM0 (New), 1 (PartiallyFilled), 2 (Filled), 4 (Cancelled), 8 (Rejected)
150ExecTypecharM0 (New), F (Trade), 4 (Cancelled), 8 (Rejected), I (OrderStatus)
54SidecharMSide of the order, 1 (Buy) or 2 (Sell)
55SymbolStringMName of the BSDEX market where the order is present, e.g. btc-eur, eth-eur etc.
151LeavesQtyQtyMUnfilled decimal quantity, for buy side market orders this value will be given in Euro, otherwise in Cryptocurrency
14CumQtyQtyMFilled decimal quantity, for buy side market orders this value will be given in Euro, otherwise in Cryptocurrency
6AvgPxPriceO0 (currently not supported)
40OrdTypecharMType of the order, 1 (Market), 2 (Limit), 3 (Stop), 4 (Stop limit)
44PricePriceCDecimal price in Euro per whole Crypto quantity as specified on order creation, set for Limit and Stop limit orders only
99StopPxPriceCDecimal price for triggering Stop and Stop limit orders in Euro as specified on order creation, set for Stop and Stop limit orders only
38OrderQtyQtyCDecimal quantity specifying the Crypto quantity to buy or sell as specified on order creation, set for Limit, Stop limit and sell side Market / Stop orders only
152CashOrderQtyQtyCDecimal Euro amount for buying Cryptos via market orders as specified on order creation, set for buy side Market and Stop orders only
31LastPxPriceCDecimal price in Euro per whole Crypto quantity for the most recent fill, set if ExecType is F (Trade) only
32LastQtyQtyCDecimal quantity specifying the Crypto quantity that was traded in the most recent fill, set if ExecType is F (Trade) only

Market Data Messages

Market Data Request (V)

Market Data Request can be sent by clients who wish to subscribe to orderbook state and trades. A repeating symbol group is used to specify one or more markets to subscribe to when setting SubscriptionRequestType (263) 1. There can only be one subscription per client at a time. A new subscription will replace the previous one. If markets shall be added or removed from the current subscription, clients can simply send a new Market Data Request specifying the updated complete list of wanted markets (symbols). It is recommended to unsubscribe market data with SubscriptionRequestType (263) 2 when it is no longer needed. This will stop market data subscription for all markets.

TagNameTypeReqDescription
35MsgTypeStringMV
262MDReqIDStringMClient identifier for the request, will be included in response messages, unsubscribe should state the same id as specified upon subscribe
263SubscriptionRequestTypecharM1 for subscribe, 2 for unsubscribe
146NoRelatedSymintONumber of repeating instrument group entries (symbols) that follow, can be omitted if all BSDEX markets shall be subscribed, not relevant for unsubscribe requests
55SymbolStringM*Name of a specific BSDEX market to subscribe, e.g. btc-eur, eth-eur etc., not relevant for unsubscribe requests

Response

If the message cannot be processed a Market Data Request Reject (Y) will be sent to the client. In case of success the client will receive a Market Data Snapshot / Full Refresh (W) message per subscribed market (symbol) providing an initial orderbook snapshot. Afterwards, Market Data Incremental Refresh (X) messages will be sent to communicate orderbook changes and trades.

Market Data Request Reject (Y)

Market Data Request Reject will be sent to the client if a Market Data Request (V) cannot be processed correctly. A description of the specific error can be found in the Text (58) field.

TagNameTypeReqDescription
35MsgTypeStringMY
262MDReqIDStringMClient identifier specified in the market data request that is rejected with this message
58TextStringOError message explaining the reason for message rejection

Market Data Snapshot / Full Refresh (W)

Market Data Snapshot / Full Refresh will be sent to the client once per requested market (symbol) after successful subscription. Each message contains a complete orderbook for a specific market. After the initial snapshot, clients will usually receive Market Data Incremental Refresh (X) messages. However, additional snapshot messages may occur occasionally due to exchange internal processes. Clients must be able to handle this and treat new snapshots as a new starting point for incorporating following Market Data Incremental Refresh (X) messages. The orderbook is aggregated. Therefore, each price level may consist of multiple orders.

TagNameTypeReqDescription
35MsgTypeStringMW
262MDReqIDStringMClient identifier specified in the most recent market data request
55SymbolStringMName of the BSDEX market where the communicated orderbook is present
263NoMDEntriesintMNumber of aggregated orderbook entries following
269MDEntryTypecharM0 for bid side orderbook levels, 1 for offer side orderbook levels
270MDEntryPxPriceMPrice of the orderbook level
271MDEntrySizeQtyMAggregated quantity of the orderbook level
346NumberOfOrdersintCAggregated order count of the orderbook level, set for MDEntryType 0 (bid) and 1 (offer) only, otherwise absent

Market Data Incremental Refresh (X)

Market Data Incremental Refresh will be sent to subscribed clients for communicating orderbook changes or trades after the initial Market Data Snapshot / Full Refresh (W). A Market Data Incremental Refresh message will contain either aggregated orderbook levels or trades, not both. While multiple entries are possible and to be expected, a single message will reference a single market (symbol) only. Note that MDUpdateAction (279) is always 0 (new) for trades and always 1 (change) for orderbook levels. New orderbook levels can be identified by new MDEntryPx (270) values while removed orderbook levels will state MDEntrySize (271) 0.

TagNameTypeReqDescription
35MsgTypeStringMX
262MDReqIDStringMClient identifier specified in the most recent market data request
263NoMDEntriesintMNumber of orderbook levels or trades that follow
279MDUpdateActioncharM0 for trades, 1 for orderbook levels (even for new and deleted orderbook levels)
55SymbolStringMName of the BSDEX market where the orderbook change or trade occurred
269MDEntryTypecharM0 for bid side orderbook levels, 1 for offer side orderbook levels, 2 for trades
270MDEntryPxPriceMPrice of the orderbook level or trade
271MDEntrySizeQtyMQuantity of the aggregated orderbook level or trade, for orderbook levels a quantity of 0 indicates removal, e.g. due to cancellation or filling
346NumberOfOrdersintCAggregated order count of the orderbook level, set for MDEntryType 0 (bid) and 1 (offer) only, otherwise absent
278MDEntryIDStringCTrade ID, set for MDEntryType 2 (trade) only, otherwise absent
272MDEntryDateUTCDateOnlyCTrade execution date, set for MDEntryType 2 (trade) only, otherwise absent, standard Fix format YYYYMMDD in UTC
273MDEntryTimeUTCTimeOnly with microsecondsCTrade execution time, set for MDEntryType 2 (trade) only, otherwise absent, Fix format extended with microsecond resolution HH:MM:SS.ssssss in UTC

Markets

Get current auction or current quote

Returns the market's current auction or the current quote

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "buy_price": "string",
  • "buy_volume": "string",
  • "market": "string",
  • "sell_price": "string",
  • "sell_volume": "string"
}

Get market information

Returns the market's information

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "name": "btc-eur",
  • "name_required": false,
  • "base":
    {
    • "id": "btc",
    • "name": "Bitcoin",
    • "basic_symbol": "₿",
    • "basic_code": "btc",
    • "unit_name": "Satoshi",
    • "unit_multiplier": 100000000,
    • "trading_unit_name": "",
    • "dti": "4H95J0R2X",
    • "TradingUnitMultiplier": 100000000,
    • "TradingToFundsMultiplier": 1
    },
  • "quote":
    {
    • "id": "eur",
    • "name": "Euro",
    • "basic_symbol": "€",
    • "basic_code": "eur",
    • "unit_name": "Cent",
    • "unit_multiplier": 100,
    • "trading_unit_name": "",
    • "TradingUnitMultiplier": 100,
    • "TradingToFundsMultiplier": 1
    },
  • "tick_size": 1
}

Get current market phase

Returns a market's current phase

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "end_ts": 0,
  • "market": "string",
  • "name": "string",
  • "start_ts": 0
}

Get market phase history

Returns a market's phase history

query Parameters
from_ts
integer <int64>

Unix time in seconds from when to return phases

to_ts
integer <int64>

Unix time in seconds untill when to return phases

Responses

Response samples

Content type
application/json
[
  • {
    • "end_ts": 0,
    • "market": "string",
    • "name": "string",
    • "start_ts": 0
    }
]

Get current quote

Returns the market's current quote

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "buy_price": "string",
  • "buy_volume": "string",
  • "market": "string",
  • "sell_price": "string",
  • "sell_volume": "string"
}

Get all markets

Returns the list of all known markets (no authentication required)

Responses

Response samples

Content type
application/json
[
  • {
    • "id": "btc-eur",
    • "url": "btc-eur/",
    • "base":
      {
      • "id": "btc",
      • "name": "Bitcoin",
      • "basic_symbol": "₿",
      • "basic_code": "btc",
      • "unit_name": "Satoshi",
      • "unit_multiplier": 100000000,
      • "dti": "4H95J0R2X"
      },
    • "base_trading_multiplier": 100000000,
    • "quote":
      {
      • "id": "eur",
      • "name": "Euro",
      • "basic_symbol": "€",
      • "basic_code": "eur",
      • "unit_name": "Cent",
      • "unit_multiplier": 100
      },
    • "tick_size": 1,
    • "fee":
      {
      • "standard":
        {
        • "aggressive":
          {
          • "type": "percent",
          • "value": "0.35"
          },
        • "passive":
          {
          • "type": "percent",
          • "value": "0.2"
          },
        • "minimum":
          {
          • "type": "absolute",
          • "value": "0.01"
          },
        • "maximum":
          {
          • "type": "absolute",
          • "value": "999999999"
          }
        }
      },
    • "price_scale": 2
    },
  • {
    • "id": "eth-eur",
    • "url": "eth-eur/",
    • "base":
      {
      • "id": "eth",
      • "name": "Ethereum",
      • "basic_symbol": "Ξ",
      • "basic_code": "eth",
      • "unit_name": "Wei",
      • "unit_multiplier": 1000000000000000000,
      • "dti": "X9J9K872S"
      },
    • "base_trading_multiplier": 1000000000,
    • "quote":
      {
      • "id": "eur",
      • "name": "Euro",
      • "basic_symbol": "€",
      • "basic_code": "eur",
      • "unit_name": "Cent",
      • "unit_multiplier": 100
      },
    • "tick_size": 1,
    • "fee":
      {
      • "standard":
        {
        • "aggressive":
          {
          • "type": "percent",
          • "value": "0.35"
          },
        • "passive":
          {
          • "type": "percent",
          • "value": "0.2"
          },
        • "minimum":
          {
          • "type": "absolute",
          • "value": "0.01"
          },
        • "maximum":
          {
          • "type": "absolute",
          • "value": "999999999"
          }
        }
      },
    • "price_scale": 2
    }
]

Get user fees

Returns the user fees for an authenticated user

Responses

Response samples

Content type
application/json
{
  • "fees":
    {
    • "1":
      {
      • "fee_id": 1,
      • "aggressive":
        {
        • "type": "percent",
        • "value": "0.35"
        },
      • "passive":
        {
        • "type": "percent",
        • "value": "0.2"
        },
      • "minimum":
        {
        • "type": "absolute",
        • "value": "0.01"
        },
      • "maximum":
        {
        • "type": "absolute",
        • "value": "9223372036854775807"
        },
      • "minvol": 0,
      • "maxvol": 9223372036854776000,
      • "role": "retail",
      • "name": "",
      • "valid_from": "2021-05-01",
      • "valid_to": "2021-06-06"
      },
    • "4":
      {
      • "fee_id": 4,
      • "aggressive":
        {
        • "type": "percent",
        • "value": "0.5"
        },
      • "passive":
        {
        • "type": "percent",
        • "value": "0.5"
        },
      • "minimum":
        {
        • "type": "absolute",
        • "value": "0.01"
        },
      • "maximum":
        {
        • "type": "absolute",
        • "value": "9223372036854775807"
        },
      • "minvol": 0,
      • "maxvol": 25000,
      • "role": "retail",
      • "name": "",
      • "valid_from": "2021-06-07",
      • "valid_to": "9999-12-31"
      },
    • "5":
      {
      • "fee_id": 5,
      • "aggressive":
        {
        • "type": "percent",
        • "value": "0.35"
        },
      • "passive":
        {
        • "type": "percent",
        • "value": "0.2"
        },
      • "minimum":
        {
        • "type": "absolute",
        • "value": "0.01"
        },
      • "maximum":
        {
        • "type": "absolute",
        • "value": "9223372036854775807"
        },
      • "minvol": 25000,
      • "maxvol": 9223372036854776000,
      • "role": "retail",
      • "name": "",
      • "valid_from": "2021-06-07",
      • "valid_to": "9999-12-31"
      }
    },
  • "user_fees":
    {
    • "btc-eur": 5,
    • "eth-eur": 4,
    • "xrp-eur": 4
    },
  • "volume_last_period": 4,
  • "volume_current_period": 0,
  • "valid_from": "2022-09-13"
}

Orders

Get orders for the authenticated account

Returns a list with the users orders. Entries are sorted descending by created_at timestamp meaning that most recent orders will be listed first.

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
before
string <date-time>

Date and time to use as offset when fetching orders. Only orders with timestamp created_at before that date and time are returned. Format is defined by RFC 3339, section 5.6 and can have nanosecond precision, for example 2022-11-03T18:39:14.592033123Z

client_order_id
string

Client order ID to filter for

cursor
string

Cursor pointing at the next page to fetch. A response will contain header NEXT-CURSOR if there are more entries available. In order to fetch the next page, set cursor to the value of NEXT-CURSOR from the recent responses header. Note that other query parameters for filtering will be ignored if cursor is set (limit can be used though).

limit
integer [ 1 .. 1000 ]
Default: 1000

Maximum number of entries to return in a single response. Values must not be below 1 or above 1000.

order_id
string

Order ID to filter for

order_status
string
Enum: "open" "closed" "cancelled" "rejected" "new"

Order status to filter for

Responses

Response samples

Content type
application/json
[
  • {
    • "id": "d2cc7ca7-7802-489d-a8d9-ed4a2541bc42",
    • "client_id": "abcd-4711",
    • "side": "buy",
    • "quantity": 0.231,
    • "quote_quantity": 100.53,
    • "price": 3140.37,
    • "stop_price": 2151.12,
    • "triggered_price": 2151.12,
    • "type": "limit",
    • "filled": 0.17,
    • "quote_filled": 90.83,
    • "order_status": "open",
    • "fill_status": "partially_filled",
    • "created_at": 1667556123135812400,
    • "cancelled_at": 1667556260799030000,
    • "triggered_at": 1667556133959046100,
    • "fee": 0.3,
    • "market": "btc-eur",
    • "triggered_reason": "highest_buy",
    • "cancelled_reason": "cancelled_by_user",
    • "executed_value": 324.78,
    • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
    }
]

Create an order

Creates a new order.

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
risk_disclaimer_confirmed
boolean
Default: false

Risk disclaimer confirmation required for non-regulated businesses. These types of businesses must confirm that orders are created under risk management conditions. Otherwise, the request will be rejected. Different types of users can omit this parameter as it is not required for them.

Request Body schema: application/json
client_id
string

Optional ID that can be specified, e.g. for filtering orders at a later point. Only alphanumerical characters, dash and underscore are allowed. Maximum length is 64 characters.

end_user_id
string

Identifier for an end user if this order is created on behalf of someone else. It has to be set by businesses that create orders for their customers. Other user types must not set it.

market
string

Specifies the market to create an order for.

price
string

Decimal number string specifying the price to bid or ask for in Euro per whole Crypto quantity. Must be present if type is limit. Irrelevant if type is market. No more than two fractional digits are allowed (whole cents). Must be greater than zero.

quantity
string

Decimal number string specifying the Crypto quantity to buy or sell. Must be present if type is limit (any side) or type is market and side is sell. Must not be present if type is market and side is buy.

quote_quantity
string

Decimal number string specifying the Euro quantity to use for buying Cryptos via market orders. Must be present if type is market and side is buy. Must not be present if type is limit (any side) or type is market and side is sell. No more than two fractional digits are allowed (whole cents).

side
required
string
Enum: "buy" "sell"

Specifies whether a buy or sell order shall be created.

stop_price
string

Decimal number string specifying an optional price for triggering a stop order if desired. No more than two fractional digits are allowed (whole cents). Must be greater than zero.

type
required
string
Enum: "limit" "market"

Specifies whether a limit or market order shall be created.

Responses

Request samples

Content type
application/json
Example
{
  • "client_id": "abcd-4711",
  • "side": "buy",
  • "quantity": "0.135",
  • "price": "100.99",
  • "type": "limit",
  • "market": "btc-eur"
}

Response samples

Content type
application/json
{
  • "id": "d2cc7ca7-7802-489d-a8d9-ed4a2541bc42",
  • "client_id": "abcd-4711",
  • "side": "buy",
  • "quantity": 0.231,
  • "quote_quantity": 100.53,
  • "price": 3140.37,
  • "stop_price": 2151.12,
  • "triggered_price": 2151.12,
  • "type": "limit",
  • "filled": 0.17,
  • "quote_filled": 90.83,
  • "order_status": "open",
  • "fill_status": "partially_filled",
  • "created_at": 1667556123135812400,
  • "cancelled_at": 1667556260799030000,
  • "triggered_at": 1667556133959046100,
  • "fee": 0.3,
  • "market": "btc-eur",
  • "triggered_reason": "highest_buy",
  • "cancelled_reason": "cancelled_by_user",
  • "executed_value": 324.78,
  • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
}

Create a bulk order

Creates a set of new orders and / or cancellations. This allows bundling multiple order operations that would otherwise need individual requests. Nevertheless, the number of orders for cancellation and insert should be kept to a reasonable size. Otherwise, the request may get rejected. It is recommended to use no more than 10 entries for each cancel and insert array.

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
risk_disclaimer_confirmed
boolean
Default: false

Risk disclaimer confirmation required for non-regulated businesses. These types of businesses must confirm that orders are created under risk management conditions. Otherwise, the request will be rejected. Different types of users can omit this parameter as it is not required for them.

Request Body schema: application/json
cancel
Array of strings

Optional list of IDs referencing orders that shall be canceled. This parameter is mutually exclusive with parameter cancel_client_ids, only one of them can be used at most.

cancel_client_ids
Array of strings

Optional list of client IDs referencing orders that shall be canceled. This parameter is mutually exclusive with parameter cancel, only one of them can be used at most.

Array of objects (orderRequest)

Optional list of new orders to create.

Array ()
client_id
string

Optional ID that can be specified, e.g. for filtering orders at a later point. Only alphanumerical characters, dash and underscore are allowed. Maximum length is 64 characters.

end_user_id
string

Identifier for an end user if this order is created on behalf of someone else. It has to be set by businesses that create orders for their customers. Other user types must not set it.

market
string

Specifies the market to create an order for.

price
string

Decimal number string specifying the price to bid or ask for in Euro per whole Crypto quantity. Must be present if type is limit. Irrelevant if type is market. No more than two fractional digits are allowed (whole cents). Must be greater than zero.

quantity
string

Decimal number string specifying the Crypto quantity to buy or sell. Must be present if type is limit (any side) or type is market and side is sell. Must not be present if type is market and side is buy.

quote_quantity
string

Decimal number string specifying the Euro quantity to use for buying Cryptos via market orders. Must be present if type is market and side is buy. Must not be present if type is limit (any side) or type is market and side is sell. No more than two fractional digits are allowed (whole cents).

side
required
string
Enum: "buy" "sell"

Specifies whether a buy or sell order shall be created.

stop_price
string

Decimal number string specifying an optional price for triggering a stop order if desired. No more than two fractional digits are allowed (whole cents). Must be greater than zero.

type
required
string
Enum: "limit" "market"

Specifies whether a limit or market order shall be created.

Responses

Request samples

Content type
application/json
Example
{
  • "cancel":
    [
    • "d017879a-e91c-45f2-8309-351163e79fe0",
    • "7tac47fc-3ff1-4313-9fc9-e23698a4a5e2"
    ],
  • "insert":
    [
    • {
      • "client_id": "abcd-4711",
      • "side": "buy",
      • "quantity": "0.135",
      • "price": "100.99",
      • "type": "limit",
      • "market": "btc-eur"
      },
    • {
      • "client_id": "abcd-4712",
      • "side": "sell",
      • "quantity": "2.31",
      • "price": "101.50",
      • "type": "limit",
      • "market": "btc-eur"
      }
    ]
}

Response samples

Content type
application/json
[
  • {
    • "id": "d2cc7ca7-7802-489d-a8d9-ed4a2541bc42",
    • "client_id": "abcd-4711",
    • "side": "buy",
    • "quantity": 0.231,
    • "quote_quantity": 100.53,
    • "price": 3140.37,
    • "stop_price": 2151.12,
    • "triggered_price": 2151.12,
    • "type": "limit",
    • "filled": 0.17,
    • "quote_filled": 90.83,
    • "order_status": "open",
    • "fill_status": "partially_filled",
    • "created_at": 1667556123135812400,
    • "cancelled_at": 1667556260799030000,
    • "triggered_at": 1667556133959046100,
    • "fee": 0.3,
    • "market": "btc-eur",
    • "triggered_reason": "highest_buy",
    • "cancelled_reason": "cancelled_by_user",
    • "executed_value": 324.78,
    • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
    }
]

Cancel a list of orders

Cancels a list of orders either by client ID or normal ID. Note that only one of both ID types can be used. client_id will take preference if entries for both arrays are provided.

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Request Body schema: application/json
client_id
Array of strings

List of client IDs referencing orders that shall be canceled. Should not be used in combination with parameter id as only one of both ID types can be used. client_id will take preference if both are provided.

id
Array of strings

List of normal IDs referencing orders that shall be canceled. Should not be used in combination with parameter client_id as only one of both ID types can be used. client_id will take preference if both are provided.

Responses

Request samples

Content type
application/json
Example
{
  • "id":
    [
    • "d017879a-e91c-45f2-8309-351163e79fe0",
    • "7tac47fc-3ff1-4313-9fc9-e23698a4a5e2"
    ]
}

Response samples

Content type
application/json
[
  • {
    • "id": "d2cc7ca7-7802-489d-a8d9-ed4a2541bc42",
    • "client_id": "abcd-4711",
    • "side": "buy",
    • "quantity": 0.231,
    • "quote_quantity": 100.53,
    • "price": 3140.37,
    • "stop_price": 2151.12,
    • "triggered_price": 2151.12,
    • "type": "limit",
    • "filled": 0.17,
    • "quote_filled": 90.83,
    • "order_status": "open",
    • "fill_status": "partially_filled",
    • "created_at": 1667556123135812400,
    • "cancelled_at": 1667556260799030000,
    • "triggered_at": 1667556133959046100,
    • "fee": 0.3,
    • "market": "btc-eur",
    • "triggered_reason": "highest_buy",
    • "cancelled_reason": "cancelled_by_user",
    • "executed_value": 324.78,
    • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
    }
]

Cancel all orders

Cancels all of the accounts orders.

Responses

Response samples

Content type
application/json
[
  • {
    • "id": "d2cc7ca7-7802-489d-a8d9-ed4a2541bc42",
    • "client_id": "abcd-4711",
    • "side": "buy",
    • "quantity": 0.231,
    • "quote_quantity": 100.53,
    • "price": 3140.37,
    • "stop_price": 2151.12,
    • "triggered_price": 2151.12,
    • "type": "limit",
    • "filled": 0.17,
    • "quote_filled": 90.83,
    • "order_status": "open",
    • "fill_status": "partially_filled",
    • "created_at": 1667556123135812400,
    • "cancelled_at": 1667556260799030000,
    • "triggered_at": 1667556133959046100,
    • "fee": 0.3,
    • "market": "btc-eur",
    • "triggered_reason": "highest_buy",
    • "cancelled_reason": "cancelled_by_user",
    • "executed_value": 324.78,
    • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
    }
]

Trades

Get public trades for the market

Returns a list of public trades for this market

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
limit
integer

Number of results to be returned by the API. Must be used with 'offset'. Maximum value is 1000.

offset
integer

Offset from which the API will start returning results. Must be used with 'limit'.

order_id
string

Order ID to filter for.

Responses

Response samples

Content type
application/json
[
  • {
    • "id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
    • "executed_at": "2021-03-22T06:05:43.567786Z",
    • "local_ts": 1616393143567786800,
    • "quantity": "0.01",
    • "price": "48677.73",
    • "market": "btc-eur",
    • "published_at": "2021-03-22T06:05:43.901251Z"
    }
]

Get public trades including meta section for the market

Returns a list of public trades with additional meta information for this market. This is an alternative endpoint to /api/v1/{market}/trades which provides the same trade data and query options but no meta data section. In general, it is recommended to prefer this newer endpoint as it contains more information. However, clients may choose to keep using the normal trades endpoint if they do not need the meta section.

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
limit
integer

Number of results to be returned by the API. Must be used with 'offset'. Maximum value is 1000.

offset
integer

Offset from which the API will start returning results. Must be used with 'limit'.

order_id
string

Order ID to filter for.

Responses

Response samples

Content type
application/json
{
  • "data":
    [
    • {
      • "id": "98a831b0-b48a-4444-b926-fa0cec5a8974",
      • "executed_at": "2021-03-22T06:05:43.567786Z",
      • "local_ts": 1616393143567786800,
      • "quantity": "0.01",
      • "price": "48677.73",
      • "market": "btc-eur",
      • "published_at": "2021-03-22T06:05:43.901251Z"
      }
    ],
  • "meta":
    {
    • "dti": "4H95J0R2X",
    • "asset_name": "Bitcoin",
    • "price_curr": "BTC/EUR",
    • "price_nota": "MONE",
    • "quantity_nota": "UNIT",
    • "venue": "XDEX"
    }
}

Get authenticated account's trades

Returns a list of the account's trades for the market

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

query Parameters
before
integer <int64>

Unix time in nanoseconds until when to return trades (exclusive). Will be ignored if 'cursor' parameter is set.

cursor
string

Cursor can be used to fetch the next batch of trades. It's value should be taken from NEXT-CURSOR that will be returned in response headers from the API. Query parameters 'before' and 'order_id' will be ignored if 'cursor' is set.

order_id
string

Order ID to filter for. Will be ignored if 'cursor' parameter is set.

Responses

Response samples

Content type
application/json
[
  • {
    • "client_order_id": "string",
    • "fee": "string",
    • "id": "string",
    • "local_ts": 0,
    • "market": "string",
    • "order_id": "string",
    • "price": "string",
    • "quantity": "string",
    • "side": "string",
    • "end_user_id": "bc07ba97-145e-4dcb-926a-16d8e2297f9c"
    }
]

TradingView Data

Get the TradingView config

Returns the market's TradingView config

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "errors":
    [
    • {
      • "id": "string",
      • "code": "string",
      • "status": 0,
      • "detail": "string",
      • "source":
        {
        • "field": "string",
        • "message": "string"
        }
      }
    ]
}

Get historical data

Returns TradingView history

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "errors":
    [
    • {
      • "id": "string",
      • "code": "string",
      • "status": 0,
      • "detail": "string",
      • "source":
        {
        • "field": "string",
        • "message": "string"
        }
      }
    ]
}

Get the list of TradingView market symbols

Returns list of TradingView symbols

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "errors":
    [
    • {
      • "id": "string",
      • "code": "string",
      • "status": 0,
      • "detail": "string",
      • "source":
        {
        • "field": "string",
        • "message": "string"
        }
      }
    ]
}

Get server time

Returns TradingView time

path Parameters
market
required
string
Example: btc-eur

Market name in base-quote form

Responses

Response samples

Content type
application/json
{
  • "errors":
    [
    • {
      • "id": "string",
      • "code": "string",
      • "status": 0,
      • "detail": "string",
      • "source":
        {
        • "field": "string",
        • "message": "string"
        }
      }
    ]
}

Crypto Addresses

Get address

Get a user's crypto wallet address for a given asset_id

path Parameters
asset_id
required
string
Enum: "btc" "eth" "ltc" "xrp"
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "address": "2N7NMGkUnwoyaH75YSMGVNug5tmmpM2NiJf",
    • "created_at": "2020-08-05T17:50:48.969Z",
    • "is_used": false,
    • "tag": null
    }
}

Create address

Create a new crypto wallet address for a given asset_id

header Parameters
X-Request-Id
string
Request Body schema: application/json
asset_id
required
string
Enum: "btc" "eth" "ltc" "xrp"

one of: ["btc", "eth", "ltc", "xrp"]

Responses

Request samples

Content type
application/json
{
  • "asset_id": "eth"
}

Response samples

Content type
application/json
{
  • "data":
    {
    • "address": "2N7NMGkUnwoyaH75YSMGVNug5tmmpM2NiJf",
    • "created_at": "2020-08-05T17:50:48.969Z",
    • "is_used": false,
    • "tag": null
    }
}

Crypto Deposits

Get deposit

Get a crypto deposit made to a user's wallet

path Parameters
uuid
required
string
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "0.00004711",
    • "asset_id": "btc",
    • "created_at": "2020-12-30T14:59:27.057Z",
    • "finalized_at": "2020-12-30T14:59:27.056Z",
    • "source_address": "188wQrYSDwUfxbSSZCLMpgDBV6qNFBe1Uy",
    • "source_tag": null,
    • "target_address": "1HHCVrJ8V7borYr2G2mKjDRRNdRx37467f",
    • "destination_tag": null,
    • "transaction_state": "created",
    • "transaction_type": "deposit",
    • "uuid": "4570051f-a1ed-435a-b48b-6911f98b6036"
    }
}

List deposits

List crypto deposits made to a user's wallet

query Parameters
asset_id
required
any
Enum: "btc" "eth" "ltc" "xrp"
created_after
string <date-time>
Example:
page
integer
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    [
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:27.076Z",
      • "finalized_at": "2020-12-30T14:59:27.076Z",
      • "source_address": "1N292b4JeEFoiWryZysVR7wMxYGvptkfc3",
      • "source_tag": null,
      • "target_address": "1GL8EMwojQwZ1tStbvuTg7QZkSGQkYs1xs",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "deposit",
      • "uuid": "e57c2ccb-c8dc-419a-8c64-5cf0a6993ac5"
      },
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:27.079Z",
      • "finalized_at": "2020-12-30T14:59:27.078Z",
      • "source_address": "1546c4yJRGqB9gk9ZW7dDyJsFk1csaxEbK",
      • "source_tag": null,
      • "target_address": "1Fewvzc2RqmXpZak8DjcgdyYFedacHimmE",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "deposit",
      • "uuid": "3515beb0-9c85-4f5f-b21c-f8bdd4d2efea"
      },
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:27.081Z",
      • "finalized_at": "2020-12-30T14:59:27.081Z",
      • "source_address": "1E891uPsUAFF5shiQT8igY5EmrZCb1NELG",
      • "source_tag": null,
      • "target_address": "1ECic1bTrmrCoim7hE3mmeQ2Xwc4fFQ6At",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "deposit",
      • "uuid": "9c6771cf-116e-41bc-8a9c-6fd6ecfced79"
      }
    ]
}

Crypto Withdrawals

Get withdrawal

Get a crypto withdrawal made from a user's wallet

path Parameters
uuid
required
string
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "0.00004711",
    • "asset_id": "btc",
    • "created_at": "2020-12-30T14:59:28.019Z",
    • "finalized_at": "2020-12-30T14:59:28.019Z",
    • "source_address": "114iT4ymRSdcPUYgQaKdTvxLJV3BKd5vU",
    • "source_tag": null,
    • "target_address": "1GR7xtD11yDLhvjgx3PErhXN1exKLVLHQ3",
    • "destination_tag": null,
    • "transaction_state": "created",
    • "transaction_type": "withdrawal",
    • "uuid": "f94d1348-591a-45c9-910c-017ba008190c"
    }
}

List withdrawals

List crypto withdrawals made from a user's wallet

query Parameters
asset_id
required
any
Enum: "btc" "eth" "ltc" "xrp"
created_after
string <date-time>
Example:
page
integer
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    [
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:28.037Z",
      • "finalized_at": "2020-12-30T14:59:28.036Z",
      • "source_address": "15XcENunELnquvqfPkHM7nZqgZ5CELrerZ",
      • "source_tag": null,
      • "target_address": "15kt6eBbhyj5pg74kkeYwEpep5y1Ttr895",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "withdrawal",
      • "uuid": "db72d18a-6693-403d-b25a-cc476cdd6830"
      },
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:28.040Z",
      • "finalized_at": "2020-12-30T14:59:28.039Z",
      • "source_address": "1DHR4Ty8sb3JRihFtgejk26tCQJ6siRwtC",
      • "source_tag": null,
      • "target_address": "1MrXdbme5jz2k6XBSyuNtea7si7AwPrpih",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "withdrawal",
      • "uuid": "2b491318-ed21-432c-9c9a-766039ad6f96"
      },
    • {
      • "amount": "0.00004711",
      • "asset_id": "btc",
      • "created_at": "2020-12-30T14:59:28.042Z",
      • "finalized_at": "2020-12-30T14:59:28.042Z",
      • "source_address": "1E3FQhwBXZNjDPTYfiThdvzvAae3g16HFf",
      • "source_tag": null,
      • "target_address": "1QCTLPyDS6PTGCcpLYQHUfmmo6qMQ2ETE4",
      • "destination_tag": null,
      • "transaction_state": "created",
      • "transaction_type": "withdrawal",
      • "uuid": "63f4393b-14bc-431e-881e-5dc0dba04519"
      }
    ]
}

Create withdrawal

Create a new crypto withdrawal from a user's wallet, but do not execute it

header Parameters
X-Request-Id
string
Request Body schema: application/json
amount
required
number <decimal>

amount in decimal

asset_id
required
string
Enum: "btc" "eth" "ltc" "xrp"

one of: ["btc", "eth", "ltc", "xrp"]

destination_tag
string

optional destination tag for XRP withdrawals

target_address
required
string

wallet address to withdraw to

Responses

Request samples

Content type
application/json
{
  • "amount": 0.0612,
  • "asset_id": "btc",
  • "target_address": "17fnafpkX9fUA5V9FuPzKyX4jmq15dZZw2",
  • "destination_tag": null
}

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "0.000612",
    • "asset_id": "btc",
    • "created_at": "2020-12-30T14:59:28.073Z",
    • "finalized_at": null,
    • "source_address": null,
    • "source_tag": null,
    • "target_address": "13ML1PPWDgNX3c6MiXj6Xhdw3qX86Ka9U9",
    • "destination_tag": null,
    • "transaction_state": "created",
    • "transaction_type": "withdrawal",
    • "uuid": "a4e1f6a2-5bf6-42e4-bf51-7143178fc834"
    }
}

Execute withdrawal

Execute a crypto withdrawal from the user's wallet

path Parameters
uuid
required
string
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "0.00004711",
    • "asset_id": "btc",
    • "created_at": "2020-12-30T14:59:28.095Z",
    • "finalized_at": "2020-12-30T14:59:28.095Z",
    • "source_address": "1KqNnCN1MixHEngJJoMGxJFTzhTeqSNePz",
    • "source_tag": null,
    • "target_address": "1NozyxoxWabno6ZAq5KaWMxHk3su67rM1M",
    • "destination_tag": null,
    • "transaction_state": "created",
    • "transaction_type": "withdrawal",
    • "uuid": "474b01ca-f3eb-4476-9e25-bb2d0b041d2c"
    }
}

Fiat Withdrawals

Create withdrawal

Creates a new fiat withdrawal from the user's account, but does not execute it

header Parameters
X-Request-Id
string
Request Body schema: application/json
amount
required
number <decimal>
asset_id
required
string
Value: "EUR"
target_address
required
string

Responses

Request samples

Content type
application/json
{
  • "amount": 0,
  • "asset_id": "EUR",
  • "target_address": "string"
}

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "1500.00",
    • "asset_id": "EUR",
    • "created_at": "2020-05-08T10:36:03.123Z",
    • "finalized_at": "2020-05-08T10:39:15.681Z",
    • "source_address": "DE28110101008889546899",
    • "target_address": "DE28110101008889546901",
    • "transaction_state": "settled",
    • "transaction_type": "withdrawal",
    • "uuid": "f1c7a528-8b4e-4edf-bb43-24e7b36df352"
    }
}

List withdrawals

Lists all fiat withdrawals of a user (filters might apply)

query Parameters
asset_id
required
string
Value: "EUR"
created_after
string <date_time>
page
integer
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data": [ ]
}

Get withdrawal

Gets a fiat withdrawal

path Parameters
uuid
required
string <uuid>
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "1500.00",
    • "asset_id": "EUR",
    • "created_at": "2020-05-08T10:36:03.123Z",
    • "finalized_at": "2020-05-08T10:39:15.681Z",
    • "source_address": "DE28110101008889546899",
    • "target_address": "DE28110101008889546901",
    • "transaction_state": "settled",
    • "transaction_type": "withdrawal",
    • "uuid": "f1c7a528-8b4e-4edf-bb43-24e7b36df352"
    }
}

Execute withdrawal

Executes a fiat withdrawal, idempotent

path Parameters
uuid
required
string <uuid>
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "1500.00",
    • "asset_id": "EUR",
    • "created_at": "2020-05-08T10:36:03.123Z",
    • "finalized_at": "2020-05-08T10:39:15.681Z",
    • "source_address": "DE28110101008889546899",
    • "target_address": "DE28110101008889546901",
    • "transaction_state": "settled",
    • "transaction_type": "withdrawal",
    • "uuid": "f1c7a528-8b4e-4edf-bb43-24e7b36df352"
    }
}

Fiat Deposits

List deposits

Returns a list of all fiat deposits of a user (filters might apply)

query Parameters
asset_id
required
string
Value: "EUR"
created_after
string <date_time>
page
integer
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data": [ ]
}

Get deposit

Gets a fiat deposit

path Parameters
uuid
required
string <uuid>
header Parameters
X-Request-Id
string

Responses

Response samples

Content type
application/json
{
  • "data":
    {
    • "amount": "1500.00",
    • "asset_id": "EUR",
    • "created_at": "2020-05-08T10:36:03.123Z",
    • "finalized_at": "2020-05-08T10:39:15.681Z",
    • "source_address": "DE28110101008889546899",
    • "target_address": "DE28110101008889546901",
    • "transaction_state": "settled",
    • "transaction_type": "withdrawal",
    • "uuid": "f1c7a528-8b4e-4edf-bb43-24e7b36df352"
    }
}