NAV
API Documentation
python javascript csharp
English 中文

Overview

Welcome to the FTX US API documentation. We offer complete REST, Websocket, and FIX APIs to suit your algorithmic trading needs.

REST API

HTTP-based API with full trading and asset management functionality, with public orderbook and trades data as well as private account data and order management.

REST endpoint URL: https://ftx.us/api

Requests and responses use JSON.

Authentication

import time
import hmac
from requests import Request

ts = int(time.time() * 1000)
request = Request('GET', '<api_endpoint>')
prepared = request.prepare()
signature_payload = f'{ts}{prepared.method}{prepared.path_url}'.encode()
signature = hmac.new('YOUR_API_SECRET'.encode(), signature_payload, 'sha256').hexdigest()

request.headers[f'FTXUS-KEY'] = 'YOUR_API_KEY'
request.headers[f'FTXUS-SIGN'] = signature
request.headers[f'FTXUS-TS'] = str(ts)

# Only include line if you want to access a subaccount. Remember to URI-encode the subaccount name if it contains special characters!
# request.headers[f'FTXUS-SUBACCOUNT'] = 'my_subaccount_nickname'
var method = HttpMethod.Get
var endpoint = $"/api/account";
var request = new HttpRequestMessage(method, endpoint);
var _nonce = (DateTime.UtcNow - start).TotalMilliseconds;

var hashMaker = new HMACSHA256(Encoding.UTF8.GetBytes(""YOUR_API_SECRET""));
var signaturePayload = $"{_nonce}{method.ToString().ToUpper()}{endpoint}";
var hash = hashMaker.ComputeHash(Encoding.UTF8.GetBytes(signaturePayload));
var hashString = BitConverter.ToString(hash).Replace("-", string.Empty);
var signature = hashString.ToLower();

request.Headers.Add("FTXUS-KEY", "YOUR_API_KEY");
request.Headers.Add("FTXUS-SIGN", signature);
request.Headers.Add("FTXUS-TS", _nonce.ToString());

For authenticated requests, the following headers should be sent with the request:

Rate limits

Please do not send more than 30 requests per second: doing so will result in HTTP 429 errors. We strongly recommend using the websocket API for faster market and account data.

Subaccounts

To specify a subaccount, include its URI-encoded nickname in the header FTXUS-SUBACCOUNT with the request.

Get all subaccounts

Request

GET /subaccounts

Response

{
  "success": true,
  "result": [
    {
      "nickname": "sub1",
      "deletable": true,
      "editable": true,
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
nickname string sub1 subaccount name
deletable boolean true whether the subaccount can be deleted
editable boolean true whether the nickname of the subaccount can be changed

Create subaccount

Request

POST /subaccounts
{
  "nickname": "sub2",
}

Response

{
  "success": true,
  "result": {
    "nickname": "sub2",
    "deletable": true,
    "editable": true,
  }
}

Requires authentication.

Payload format

Name Type Value Description
nickname string sub2

Response format

Name Type Value Description
nickname string sub2 subaccount name
deletable boolean true whether the subaccount can be deleted
editable boolean true whether the nickname of the subaccount can be changed

Change subaccount name

Request

POST /subaccounts/update_name
{
  "nickname": "sub2",
  "newNickname": "newSub2"
}

Response

{
  "success": true,
  "result": null
}

Requires authentication.

Payload format

Name Type Value Description
nickname string sub2 current nickname of subaccount
newNickname string newSub2 new nickname of subaccount

Delete subaccount

Request

DELETE /subaccounts
{
  "nickname": "sub2",
}

Response

{
  "success": true,
  "result": null
}

Requires authentication.

Payload format

Name Type Value Description
nickname string sub2

Get subaccount balances

Request

GET /subaccounts/{nickname}/balances

Response


{
  "success": true,
  "result": [
    {
      "coin": "USDT",
      "free": 4321.2,
      "total": 4340.2
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string USDT coin id
free number 4321.2 free amount
total number 4340.2 total amount

Transfer between subaccounts

Request

POST /subaccounts/transfer
{
  "coin": "XRP",
  "size": 10000,
  "source": null,
  "destination": "sub1",
}

Response

{
  "success": true,
  "result": {
    "id": 316450,
    "coin": "XRP",
    "size": 10000,
    "time": "2019-03-05T09:56:55.728933+00:00",
    "notes": "",
    "status": "complete",
  }
}

Requires authentication.

Payload format

Name Type Value Description
coin string XRP
size number 31431.0
source string main name of the source subaccount. Use null or 'main' for the main account
destination string sub1 name of the destination subaccount. Use null or 'main' for the main account

Response format

Name Type Value Description
id number 316450
coin string XRP
size number 10000
time string 2019-03-05T09:56:55.728933+00:00
notes string
status string complete always 'complete'

Markets

Get markets

Request

GET /markets

Response


{
  "success": true,
  "result": [
    {
      "name": "BTC/USD",
      "baseCurrency": "BTC",
      "quoteCurrency": "USD",
      "type": "spot",
      "enabled": true,
      "ask": 3949.25,
      "bid": 3949,
      "last": 10579.52,
      "priceIncrement": 0.25,
      "sizeIncrement": 0.001
    }
  ]
}

Response format

Name Type Value Description
type string spot
name string BTC/USD
baseCurrency string BTC
quoteCurrency string USD
enabled boolean true
ask number 3949.25 best ask
bid number 3949.00 best bid
last number 3949.00 last traded price
priceIncrement number 0.25
sizeIncrement number 0.001

Get single market

Request

GET /markets/{market_name}

Response

See /markets

Get orderbook

Request

GET /markets/{market_name}/orderbook?depth={depth}

Response

{
  "success": true,
  "result": {
    "asks": [
      [
        4114.25,
        6.263
      ]
    ],
    "bids": [
      [
        4112.25,
        49.29
      ]
    ]
  }
}

Parameters

Name Type Value Description
market_name string BTC/USD Required. Name of the market.
depth number 35 max 100, default 20

Response format

Name Type Value Description
asks array [4114.25, 6.263] Array with price and size
bids array [4112, 49.29] Array with price and size

Get trades

Request

GET /markets/{market_name}/trades?limit={limit}&start_time={start_time}&end_time={end_time}

Response

{
  "success": true,
  "result": [
    {
      "id": 3855995,
      "price": 3857.75,
      "side": "buy",
      "size": 0.111,
      "time": "2019-03-20T18:16:23.397991+00:00"
    }
  ]
}

Parameters

Name Type Value Description
market_name string BTC/USD name of the market
limit number 35 optional, max 100, default 20
start_time number 1559881511 optional
end_time number 1559881711 optional

Response format

Name Type Value Description
id number 3855995 trade id
price number 3857.75
side string buy
size number 0.111
time string 2019-03-20T18:16:23.397991+00:00

Get historical prices

Request

GET /markets/{market_name}/candles?resolution={resolution}&limit={limit}&start_time={start_time}&end_time={end_time}

Response

{
  "success": true,
  "result": [
    {
      "close":11055.25,
      "high":11089.0,
      "low":11043.5,
      "open":11059.25,
      "startTime":"2019-06-24T17:15:00+00:00",
      "volume":464193.95725
    }
  ]
}

Parameters

Name Type Value Description
market_name string BTC/USD name of the market
resolution number 300 window length in seconds. options: 15, 60, 300, 900, 3600, 14400, 86400
limit number 35 optional
start_time number 1559881511 optional
end_time number 1559881711 optional

Response format

Name Type Value Description
startTime string 2019-06-24T17:15:00+00:00 start time of the window
open number 11059.25 mark price at startTime
close number 11055.25 mark price at the end of the window: startTime + resolution
high number 11089.0 highest mark price over the window
low number 11059.25 lowest mark price over the window
volume number 464193.95725 volume traded in the window

Wallet

Get coins

Request

GET /wallet/coins

Response


{
  "success": true,
  "result": [
    {
      "bep2Asset": null,
      "canConvert": true,
      "canDeposit": true,
      "canWithdraw": true,
      "collateral": true,
      "collateralWeight": 0.975,
      "creditTo": null,
      "erc20Contract": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "fiat": false,
      "hasTag": false,
      "id": "USDT",
      "isToken": false,
      "methods": ["omni", "erc20", "trx"],
      "spotMargin": false,
      "name": "USD Tether",
      "trc20Contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "usdFungible": false
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
canDeposit boolean true
canWithdraw boolean true
hasTag boolean false true if addresses for this coin have a tag
id string USDT
name string USD Tether
bep2Asset string null
canConvert boolean true
collateral boolean true
collateralWeight number 0.975
creditTo string null
erc20Contract string 0xdAC17F958D2ee523a2206206994597C13D831ec7
fiat boolean false
isToken boolean false
methods array ["omni", "erc20", "trx"]
spotMargin boolean false
trc20Contract string TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
usdFungible boolean false

Get balances

Request

GET /wallet/balances

Response


{
  "success": true,
  "result": [
    {
      "coin": "USDT",
      "free": 2320.2,
      "total": 2340.2,
      "spotBorrow": 0,
      "availableWithoutBorrow": 2320.2
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string USDT coin id
free number 2320.2 free amount
total number 2340.2 total amount
spotBorrow number 0 amount borrowed using spot margin
availableWithoutBorrow number 2320.2 amount available without borrowing

Get balances of all accounts

Request

GET /wallet/all_balances

Response


{
  "success": true,
  "result": {
    "main": [
      {
        "coin": "USDT",
        "free": 2320.2,
        "total": 2340.2
      },
      {
        "coin": "BTC",
        "free": 2.0,
        "total": 3.2
      }
    ],
    "Battle Royale": [
      {
        "coin": "USD",
        "free": 2000.0,
        "total": 2200.0
      }
    ]
  }
}

Requires authentication.

The response will contain an object whose keys are the subaccount names. The main account will appear under the key main.

Response format

Name Type Value Description
coin string USDT coin id
free number 2320.2 free amount
total number 2340.2 total amount

Get deposit address

Request

GET /wallet/deposit_address/{coin}?method={method}

Response

{
  "success": true,
  "result": {
    "address": "0x83a127952d266A6eA306c40Ac62A4a70668FE3BE",
    "tag": "null"
  }
}

Requires authentication.

Request parameters

Name Type Value Description
coin string USDT
method string erc20 optional; for coins available on different blockchains (e.g USDT)

Response format

Name Type Value Description
address string 0x83a127952d266A6eA306c40Ac62A4a70668FE3BE
tag string null optional

Get deposit history

Request

GET /wallet/deposits

Response

{
  "success": true,
  "result": {
    "coin": "TUSD",
    "confirmations": 64,
    "confirmedTime": "2019-03-05T09:56:55.728933+00:00",
    "fee": 0,
    "id": 1,
    "sentTime": "2019-03-05T09:56:55.735929+00:00",
    "size": "99.0",
    "status": "confirmed",
    "time": "2019-03-05T09:56:55.728933+00:00",
    "txid": "0x8078356ae4b06a036d64747546c274af19581f1c78c510b60505798a7ffcaf1"
  }
}

Requires authentication.

Request parameters

Name Type Value Description
limit number 20 optional; number of items to return
start_time number 1564146934 optional; minimum time of items to return, in Unix time (seconds since 1970-01-01)
end_time number 1564233334 optional; maximum time of items to return, in Unix time (seconds since 1970-01-01)

Response format

Name Type Value Description
coin string TUSD coin id
confirmations number 64 number of blockchain confirmations
confirmedTime string 2019-03-05T09:56:55.728933+00:00
fee number 0.0 fee, not included in size
id number 1 deposit id
sentTime string 2019-03-05T09:56:55.735929+00:00
size string 99.0
status string confirmed one of "confirmed", "unconfirmed", or "cancelled"
time string 2019-03-05T09:56:55.728933+00:00
txid string 0x8078356ae4b06a036d64747546c274af19581f1c78c510b60505798a7ffcaf1 optional
notes string Transfer from main account to my_subaccount optional

Get withdrawal history

Request

GET /wallet/withdrawals

Response

{
  "success": true,
  "result": {
    "coin": "TUSD",
    "address": "0x83a127952d266A6eA306c40Ac62A4a70668FE3BE",
    "tag": "null",
    "fee": 0,
    "id": 1,
    "size": "99.0",
    "status": "complete",
    "time": "2019-03-05T09:56:55.728933+00:00",
    "txid": "0x8078356ae4b06a036d64747546c274af19581f1c78c510b60505798a7ffcaf1"
  }
}

Requires authentication.

Request parameters

Name Type Value Description
limit number 20 optional; number of items to return
start_time number 1564146934 optional; minimum time of items to return, in Unix time (seconds since 1970-01-01)
end_time number 1564233334 optional; maximum time of items to return, in Unix time (seconds since 1970-01-01)

Response format

Name Type Value Description
coin string TUSD coin id
address string 0x83a127952d266A6eA306c40Ac62A4a70668FE3BE deposit address the withdrawal was sent to
tag string null
fee number 0.0 fee, not included in size
id number 1 withdrawal id
size string 99.0
status string complete one of "requested", "processing", "complete", or "cancelled"
time string 2019-03-05T09:56:55.728933+00:00
txid string 0x8078356ae4b06a036d64747546c274af19581f1c78c510b60505798a7ffcaf1 optional
notes string Transfer from main account to my_subaccount optional

Request withdrawal

Request

POST /wallet/withdrawals
{
  "coin": "USDT",
  "size": 20.2,
  "address": "0x83a127952d266A6eA306c40Ac62A4a70668FE3BE",
  "tag": null,
  "password": "my_withdrawal_password",
  "code": "152823
}

Response

{
  "success": true,
  "result": {
    "coin": "USDT",
    "address": "0x83a127952d266A6eA306c40Ac62A4a70668FE3BE",
    "tag": "null",
    "fee": 0,
    "id": 1,
    "size": "20.2",
    "status": "requested",
    "time": "2019-03-05T09:56:55.728933+00:00",
    "txid": "null"
  }
}

Requires authentication.

Payload format

Name Type Value Description
coin string USDT coin to withdraw
size number 20.2 amount to withdraw
address string 0x83a127952d266A6eA306c40Ac62A4a70668FE3BE address to send to
tag string null optional
password string null optional; withdrawal password if it is required for your account
code string null optiona; 2fa code if it is required for your account

Response format

Name Type Value Description
coin string USDT coin id
address string 0x83a127952d266A6eA306c40Ac62A4a70668FE3BE deposit address the withdrawal was sent to
tag string null
fee number 0.0 fee, not included in size
id number 1 withdrawal id
size string 20.2
status string requested one of "requested", "processing", "complete", or "cancelled"
time string 2019-03-05T09:56:55.728933+00:00
txid string null

Get saved addresses

This endpoint provides you with your saved addresses

Request

GET /wallet/saved_addresses

Response

{
  "success": true,
  "result": [
    {
      "address": "0xb2EA1CC386A260c9Ae3ebda2cb7AEd212b034Ab4",
      "coin": "ETH",
      "fiat": false,
      "id": 31189,
      "isPrimetrust": false,
      "lastUsedAt": "2020-09-21T15:38:11.795763+00:00",
      "name": "MetaMask 1",
      "tag": null,
      "whitelisted": true,
      "whitelistedAfter": "2020-08-26T09:41:53.959256+00:00"
    },
    {
      "address": "0xE4Ba8791E0fdbdc50024898A384FecFD90e69553",
      "coin": "ETH",
      "fiat": false,
      "id": 46725,
      "isPrimetrust": false,
      "lastUsedAt": "2020-09-21T09:16:46.918175+00:00",
      "name": "Ledger Nano S",
      "tag": null,
      "whitelisted": true,
      "whitelistedAfter": "2020-09-21T09:16:16.829467+00:00"
    }
  ]
}

Requires authentication.

Request parameters

Name Type Value Description
coin string ETH optional, filters saved addresses by coin;

Response format

Name Type Value Description
address string "0xb2EA1CC386A260c9Ae3ebda2cb7AEd212b034Ab4"
coin string ETH coin id
fiat boolean false
id int 31189
isPrimetrust boolean false
lastUsedAt string "2020-09-21T15:38:11.795763+00:00"
tag string null
whitelisted boolean true true if the address is whitelisted, null if the address has never been whitelisted or has been unwhitelisted
whitelistedAfter string "2020-09-21T09:16:16.829467+00:00" Date after which the address has been whitelisted, null if the address has never been whitelisted or has been unwhitelisted

Create saved addresses

Request

POST /wallet/saved_addresses

Response

{
  "success": true,
  "result": {
    "address": "0xb2EA1CC386A260c9Ae3ebda2cb7AEd212b034Ab4",
    "coin": "ETH",
    "fiat": false,
    "id": 52382,
    "isPrimetrust": false,
    "lastUsedAt": "2020-10-08T06:11:03.072427+00:00",
    "name": "MetaMask",
    "tag": null,
    "whitelisted": null,
    "whitelistedAfter": null
  }
}

Requires authentication.

Request parameters

Name Type Value Description
coin string ETH coin id
address string "0xb2EA1CC386A260c9Ae3ebda2cb7AEd212b034Ab4"
addressName string MetaMask
isPrimetrust boolean false
tag string null optional, tag of the address;

Response format

Name Type Value Description
address string "0xb2EA1CC386A260c9Ae3ebda2cb7AEd212b034Ab4"
coin string ETH coin id
fiat boolean false
id int 52382
isPrimetrust boolean false
lastUsedAt string "2020-10-08T06:11:03.072427+00:00"
name string "MetaMask"
tag string null
whitelisted boolean null true if the address is whitelisted, null if the address has never been whitelisted or has been unwhitelisted
whitelistedAfter boolean null Date after which the address has been whitelisted, null if the address has never been whitelisted or has been unwhitelisted

Delete saved addresses

Request

DELETE /wallet/saved_addresses/{saved_address_id}

Response

{
  "success": true,
  "result": "Address deleted"
}

Requires authentication.

Request parameters

Name Type Value Description
saved_address_id int 52382

Orders

Get open orders

Request

GET /orders?market={market}

Response

{
  "success": true,
  "result": [
    {
      "createdAt": "2019-03-05T09:56:55.728933+00:00",
      "filledSize": 10,
      "id": 9596912,
      "market": "BTC/USD",
      "price": 0.306525,
      "avgFillPrice": 0.306526,
      "remainingSize": 31421,
      "side": "sell",
      "size": 31431,
      "status": "open",
      "type": "limit",
      "reduceOnly": false,
      "ioc": false,
      "postOnly": false,
      "clientId": null
    }
  ]
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit orders

Response format

Name Type Value Description
id number 9596912
market string BTC/USD
type string limit
side string sell
price number 0.306525
size number 31431.0
filledSize number 10.0
remainingSize number 31421.0
avgFillPrice number 0.306526
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
createdAt string 2019-03-05T09:56:55.728933+00:00
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string optional; client order id

Get order history

Request

GET /orders/history?market={market}

Response

{
  "success": true,
  "result": [
    {
      "avgFillPrice": 10135.25,
      "clientId": null,
      "createdAt": "2019-06-27T15:24:03.101197+00:00",
      "filledSize": 0.001,
      "id": 257132591,
      "ioc": false,
      "market": "BTC/USD",
      "postOnly": false,
      "price": 10135.25,
      "reduceOnly": false,
      "remainingSize": 0.0,
      "side": "buy",
      "size": 0.001,
      "status": "closed",
      "type": "limit"
    },
  ],
  "hasMoreData": false,
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit orders
start_time number 1559881511 optional; only fetch orders created after this time
end_time number 1559901511 optional; only fetch orders created before this time
limit number 100 optional; default 100, maximum 100

Response format

Name Type Value Description
id number 257132591
market string BTC/USD
type string limit
side string buy
price number 10135.25
size number 0.001
filledSize number 0.001
remainingSize number 0.0
avgFillPrice number 10135.25
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
createdAt string 2019-06-27T15:24:03.101197+00:00
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string optional; client order id

Get open trigger orders

Request

GET /conditional_orders?market={market}

Response

{
  "success": true,
  "result": [
    {
      "createdAt": "2019-03-05T09:56:55.728933+00:00",
      "id": 50001,
      "market": "BTC/USD",
      "orderPrice": null,
      "reduceOnly": false,
      "side": "buy",
      "size": 0.003,
      "status": "open",
      "trailStart": null,
      "trailValue": null,
      "triggerPrice": 0.49,
      "triggeredAt": null,
      "type": "stop"
      "orderType": "market",
      "filledSize": 0,
      "avgFillPrice": null,
      "retryUntilFilled": false
  ]
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit orders
type string stop optional; type of trigger order (stop, trailing_stop, or take_profit)

Response format

Name Type Value Description
createdAt string 2019-03-05T09:56:55.728933+00:00
id number 50001
market string BTC/USD
orderPrice number 0.50 Limit price for stop limit and take profit limit orders; otherwise null
reduceOnly boolean false
side string buy
size number 31431.0
status string open Always open for this endpoint
trailStart number null trigger price - trail value; only for trailing stop orders
trailValue number null only for trailing stop orders
triggerPrice number 0.49 market price at which this order will trigger
triggeredAt string null time of first trigger. null if never triggered
type string stop Values are stop, trailing_stop, and take_profit
orderType string market Values are market, limit
filledSize number 0
avgFillPrice number null
retryUntilFilled boolean false Whether or not to keep re-triggering until filled

Get trigger order triggers

Request

GET /conditional_orders/<conditional_order_id>/triggers

Response

{
  "success": true,
  "result": [
    {
      "error": null,
      "filledSize": 4.0,
      "orderSize": 10.0,
      "orderId": 38066650,
      "time": "2020-01-19T09:23:36.570904+00:00"
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
time string 2019-03-05T09:56:55.728933+00:00
orderSize number 31431.0 null if order failed to place
filledSize number 0 null if order failed to place
orderId number null if order failed to place
error string null reason for order failing to be placed, null if successful

Get trigger order history

Request

GET /conditional_orders/history?market={market}

Response

{
  "success": true,
  "result": [
    {
      "createdAt": "2019-03-05T09:56:55.728933+00:00",
      "id": 50000,
      "market": "BTC/USD",
      "orderPrice": null,
      "reduceOnly": false,
      "side": "buy",
      "size": 31431,
      "status": "triggered",
      "trailStart": null,
      "trailValue": null,
      "triggerPrice": 0.37,
      "triggeredAt": 2019-03-06T03:26:53.268723+00:00,
      "type": "stop",
      "orderType": "market",
      "filledSize": 31431,
      "avgFillPrice": 0.3701,
      "orderType": "market",
      "filledSize": 0,
      "avgFillPrice": null,
      "retryUntilFilled": false,
    },
  ],
  "hasMoreData": false,
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit orders
start_time number 1559881511 optional; only fetch orders created after this time
end_time number 1559881511 optional; only fetch orders created before this time
side string buy optional; valid values are buy and sell.
type string trailing_stop optional; valid values are stop, trailing_stop, and take_profit.
orderType string limit optional; valid values are market and limit.
limit number 100 optional; default 100, maximum 100

Response format

Name Type Value Description
createdAt string 2019-03-05T09:56:55.728933+00:00
id number 50001
market string BTC/USD
orderPrice number 0.50 Limit price for stop limit and take profit limit orders; otherwise null
reduceOnly boolean false
side string buy
size number 31431.0
status string open Values are open, cancelled, and triggered
trailStart number null trigger price - trail value; only for trailing stop orders
trailValue number null only for trailing stop orders
triggerPrice number 0.49 market price at which this order will trigger
triggeredAt string null time of first trigger. null if never triggered
type string stop Values are stop, trailing_stop, and take_profit
orderType string market Values are market and limit
filledSize number 31431
avgFillPrice number 0.3701
orderType string market Values are market, limit
filledSize number 0
avgFillPrice number null
retryUntilFilled boolean false Whether or not to keep re-triggering until filled

Place order

Request

POST /orders
{
  "market": "BTC/USD",
  "side": "sell",
  "price": 0.306525,
  "type": "limit",
  "size": 31431.0,
  "reduceOnly": false,
  "ioc": false,
  "postOnly": false,
  "clientId": null,
}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T09:56:55.728933+00:00",
    "filledSize": 0,
    "id": 9596912,
    "market": "BTC/USD",
    "price": 0.306525,
    "remainingSize": 31431,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "limit",
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "clientId": null,
  }
}

Requires authentication.

Payload format

Name Type Value Description
market string BTC/USD
side string sell "buy" or "sell"
price number 0.306525 Send null for market orders.
type string limit "limit" or "market"
size number 31431.0
reduceOnly boolean false optional; default is false
ioc boolean false optional; default is false
postOnly boolean false optional; default is false
clientId string null optional; client order id

Response format

Name Type Value Description
createdAt string 2019-03-05T09:56:55.728933+00:00
filledSize number 0.0
id number 9596912
market string BTC/USD
price number 0.306525
remainingSize number 31431.0
side string sell
size number 31431.0
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
type string limit
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string optional; client order id, if supplied

Place trigger order

Trigger orders include stop, trailing stop, and take profit.

Request

POST /conditional_orders
  • Stop
{
  "market": "BTC/USD",
  "side": "sell",
  "triggerPrice": 0.306525,
  "size": 31431.0,
  "type": "stop",
  "reduceOnly": false,
}
  • Trailing stop
{
  "market": "BTC/USD",
  "side": "sell",
  "trailValue": -0.05,
  "size": 31431.0,
  "type": "trailingStop",
  "reduceOnly": false,
}
  • Take profit
{
  "market": "BTC/USD",
  "side": "buy",
  "triggerPrice": 0.367895,
  "size": 31431.0,
  "type": "takeProfit",
  "reduceOnly": false,
}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T09:56:55.728933+00:00",
    "id": 9596912,
    "market": "BTC/USD",
    "triggerPrice": 0.306525,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "stop",
    "orderPrice": null,
    "triggeredAt": null,
    "reduceOnly": false,
    "orderType": "market",
    "retryUntilFilled": false,
  }
}

Requires authentication.

Payload format

Name Type Value Description
market string BTC/USD
side string sell "buy" or "sell"
size number 31431.0
type string stop "stop", "trailingStop", "takeProfit"; default is stop
reduceOnly boolean false optional; default is false
retryUntilFilled boolean false Whether or not to keep re-triggering until filled. optional, default true for market orders

Additional parameters for stop loss orders

Name Type Value Description
triggerPrice number 0.306525
orderPrice number 0.3063 optional; order type is limit if this is specified; otherwise market

Additional parameters for trailing stop orders

Name Type Value Description
trailValue number -0.05 negative for "sell"; positive for "buy"

Additional parameters for take profit orders

Name Type Value Description
triggerPrice number 0.306525
orderPrice number 0.3067 optional; order type is limit if this is specified; otherwise market

Response format

Name Type Value Description
createdAt string 2019-03-05T09:56:55.728933+00:00
id number 9596912
market string BTC/USD
triggerPrice number 0.306525
side string sell
size number 31431.0
status string Values are open, cancelled, and triggered
type string stop
orderPrice number null price of the order sent when this stop loss triggered
triggeredAt string null time at which this stop loss order triggered
reduceOnly boolean false
orderType string market Values are market, limit
retryUntilFilled boolean false Whether or not to keep re-triggering until filled

Modify order

Request

POST /orders/{order_id}/modify
{
  "size": 31431,
  "price": 0.326525,
}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T11:56:55.728933+00:00",
    "filledSize": 0,
    "id": 9596932,
    "market": "BTC/USD",
    "price": 0.326525,
    "remainingSize": 31431,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "limit",
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "clientId": null,
  }
}

Please note that the order's queue priority will be reset, and the order ID of the modified order will be different from that of the original order. Also note: this is implemented as cancelling and replacing your order. There's a chance that the order meant to be cancelled gets filled and its replacement still gets placed.

Requires authentication.

Payload format

Name Type Value Description
price number 0.306525 optional; either price or size must be specified
size number 31431.0 optional; either price or size must be specified
clientId string order1 optional; client ID for the modified order

Response format

Name Type Value Description
createdAt string 2019-03-05T11:56:55.728933+00:00
filledSize number 0.0
id number 9596932
market string BTC/USD
price number 0.326525
remainingSize number 31431.0
side string sell
size number 31431.0
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
type string limit
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string optional; client order id, if supplied

Modify order by client ID

Request

POST /orders/by_client_id/{client_order_id}/modify
{
  "size": 31431,
  "price": 0.326525,
}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T11:56:55.728933+00:00",
    "filledSize": 0,
    "id": 9596932,
    "market": "BTC/USD",
    "price": 0.326525,
    "remainingSize": 31431,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "limit",
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "clientId": null,
  }
}

Please note that the order's queue priority will be reset, and the order ID of the modified order will be different from that of the original order. Also note: this is implemented as cancelling and replacing your order. There's a chance that the order meant to be cancelled gets filled and its replacement still gets placed.

Requires authentication.

Payload format

Name Type Value Description
price number 0.306525 optional; either price or size must be specified
size number 31431.0 optional; either price or size must be specified
clientId string order1 optional; client ID for the modified order

Response format

Name Type Value Description
createdAt string 2019-03-05T11:56:55.728933+00:00
filledSize number 0.0
id number 9596932
market string BTC/USD
price number 0.326525
remainingSize number 31431.0
side string sell
size number 31431.0
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
type string limit
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string optional; client order id, if supplied

Modify trigger order

Trigger orders include stop, trailing stop, and take profit.

Request

POST /conditional_orders/{order_id}/modify
  • Stop
{
  "triggerPrice": 0.306225,
  "size": 31431.0,
}
  • Trailing stop
{
  "trailValue": -0.06,
  "size": 31432.0,
}
  • Take profit
{
  "triggerPrice": 0.367885,
  "size": 31433.0,

}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T09:56:55.728933+00:00",
    "id": 9596912,
    "market": "BTC/USD",
    "triggerPrice": 0.306225,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "stop",
    "orderPrice": null,
    "triggeredAt": null,
    "reduceOnly": false,
    "orderType": "market",
    "filledSize": 0,
    "avgFillPrice": null,
    "retryUntilFilled": false
  }
}

Requires authentication.

Payload format

Please note that the order ID of the modified order will be different from that of the original order.

Parameters for stop loss orders

Name Type Value Description
size number 31431.0
triggerPrice number 0.306525
orderPrice number 0.3063 only for stop limit orders

Parameters for trailing stop orders

Name Type Value Description
size number 31431.0
trailValue number -0.05 negative for sell orders; positive for buy orders

Parameters for take profit orders

Name Type Value Description
size number 31431.0
triggerPrice number 0.306525
orderPrice number 0.3067 only for take profit limit orders

Response format

Name Type Value Description
createdAt string 2019-03-05T12:56:55.728933+00:00
id number 9596912
market string BTC/USD
triggerPrice number 0.306525
side string sell
size number 31431.0
status string Values are open, cancelled, and triggered
type string stop
orderPrice number null price of the order sent when this stop loss triggered
triggeredAt string null time at which this stop loss first triggered
reduceOnly boolean false
orderType string market Values are market, limit
retryUntilFilled boolean false Whether or not to keep re-triggering until filled

Get order status

Request

GET /orders/{order_id}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T09:56:55.728933+00:00",
    "filledSize": 10,
    "id": 9596912,
    "market": "BTC/USD",
    "price": 0.306525,
    "avgFillPrice": 0.306526,
    "remainingSize": 31421,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "limit",
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "clientId": null
  }
}

Get order status by client id

Request

GET /orders/by_client_id/{client_order_id}

Response

{
  "success": true,
  "result": {
    "createdAt": "2019-03-05T09:56:55.728933+00:00",
    "filledSize": 10,
    "id": 9596912,
    "market": "BTC/USD",
    "price": 0.306525,
    "avgFillPrice": 0.306526,
    "remainingSize": 31421,
    "side": "sell",
    "size": 31431,
    "status": "open",
    "type": "limit",
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "clientId": "your_client_order_id"
  }
}

Requires authentication.

Response format

Name Type Value Description
id number 9596912
market string BTC/USD
type string limit
side string sell
price number 0.306525
size number 31431.0
filledSize number 10.0
remainingSize number 31421.0
avgFillPrice number 0.306526
status string new (accepted but not processed yet), open, or closed (filled or cancelled)
createdAt string 2019-03-05T09:56:55.728933+00:00
reduceOnly boolean false
ioc boolean false
postOnly boolean false
clientId string client order id

Cancel order

Request

DELETE /orders/{order_id}

Response

{
  "success": true,
  "result": "Order queued for cancelation"
}

Requires authentication.

Cancel order by client id

Request

DELETE /orders/by_client_id/{client_order_id}

Response

{
  "success": true,
  "result": "Order queued for cancellation"
}

Requires authentication.

Cancel open trigger order

Request

DELETE /conditional_orders/{id}

Response

{
  "success": true,
  "result": "Order cancelled"
}

Requires authentication.

Cancel all orders

This will also cancel conditional orders (stop loss and trailing stop orders).

Request

DELETE /orders
{
  "market": "BTC/USD",
}

Response

{
  "success": true,
  "result": "Orders queued for cancelation"
}

Requires authentication.

Payload format

Name Type Value Description
market string BTC/USD optional; restrict to cancelling orders only on this market
conditionalOrdersOnly boolean false optional; restrict to cancelling conditional orders only
limitOrdersOnly boolean false optional; restrict to cancelling existing limit orders (non-conditional orders) only

Convert

Request quote

Request

POST /otc/quotes
{
  "fromCoin": "BTC",
  "toCoin": "USD",
  "size": 0.05
}

Response

{
  "success": true,
  "result": {
    "quoteId": 1031
  }
}

Requires authentication.

Payload format

Name Type Value Description
fromCoin string BTC
toCoin string USD
size number 0.05 denominated in units of fromCoin

Response format

Name Type Value Description
quoteId number 1031

Get quote status

Request

GET /otc/quotes/{quoteId}

Response

{
  "success": true,
  "result": [
    {
      "baseCoin": "BTC"
      "cost": 0.05
      "expired": false,
      "filled": false,
      "fromCoin": "BTC",
      "id": 1031,
      "price": 7695.4,
      "proceeds": 384.77,
      "quoteCoin": "USD",
      "side": "sell",
      "toCoin": "USD"
    }
  ]
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit orders

Response format

Name Type Value Description
baseCoin string BTC
cost number 0.05 cost of accepting the quote in units of fromCoin
expired bool false if the quote is expired (if so, cannot accep tit)
filled bool false if the quote is already accepted
id number 1031
price number 7695.4 price in units of quoteCoin
proceeds number 384.77 proceeds of accepting the quote in units of toCoin
quoteCoin string USD
side string "sell" "sell" if fromCoin is baseCoin, otherwise "buy"
toCoin string USD

Accept quote

Request

POST /otc/quotes/{quote_id}/accept

Response

{
  "success": true,
  "result": null
}

Requires authentication.

Payload format

Name Type Value Description
quoteId number 1031

Spot Margin

Get borrow rates

Request

GET /spot_margin/borrow_rates

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "estimate": 1.45e-06,
      "previous": 1.44e-06
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
estimate number 1.45e-06 estimated hourly borrow rate for the next spot margin cycle
previous number 1.44e-06 hourly borrow rate in the previous spot margin cycle

Get lending rates

Request

GET /spot_margin/lending_rates

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "estimate": 1.45e-06,
      "previous": 1.44e-06
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
estimate number 1.45e-06 estimated hourly lending rate for the next spot margin cycle
previous number 1.44e-06 hourly lending rate in the previous spot margin cycle

Get daily borrowed amounts

Request

GET /spot_margin/borrow_summary

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "size": 120.1,
    }
  ]
}

Response format

Name Type Value Description
coin string BTC
size number 120.1 average matched borrowed and lent amount over the last 24h

Get market info

Request

GET /spot_margin/market_info?market={market}

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "borrowed": 0.0,
      "free": 3.87278021,
      "estimatedRate": 1e-06,
      "previousRate": 1e-06
    },
    {
      "coin": "USD",
      "borrowed": 0.0,
      "free": 69966.22310497,
      "estimatedRate": 1.027e-05,
      "previousRate": 1.027e-05
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
borrowed number 0.0 amount of coin currently borrowed
free number 3.87278021 amount of coin that can be spent buying the other coin in the supplied market
estimatedRate number 1.45e-06 estimated hourly borrow rate for the next spot margin cycle
previousRate number 1.44e-06 hourly borrow rate in the previous spot margin cycle

Get borrow history

Request

GET /spot_margin/borrow_history

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "cost": 0.00047864470072,
      "rate": 1.961096e-05,
      "size": 24.407,
      "time": "2020-11-30T12:00:00+00:00"
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
cost number 0.00047864470072 amount of coin you paid as interest on the borrow
rate number 1.961096e-05 borrow rate
size number 24.407 amount borrowed
time string 2020-11-30T12:00:00+00:00 time of interest payment

Get lending history

Request

GET /spot_margin/lending_history

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "cost": 0.00047864470072,
      "rate": 1.961096e-05,
      "size": 24.407,
      "time": "2020-11-30T12:00:00+00:00"
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
cost number 0.00047864470072 amount of coin you were paid as interest on the loan
rate number 1.961096e-05 lending rate
size number 24.407 amount lent
time string 2020-11-30T12:00:00+00:00 time of interest payment

Get lending offers

Request

GET /spot_margin/offers

Response

{
  "success": true,
  "result": [
    {
      "coin": "BTC",
      "rate": 1e-06,
      "size": 1.0
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string BTC
rate number 1e-06 hourly rate at which you will lend, if matched
size number 1.9 amount you will lend, if matched

Get lending info

Request

GET /spot_margin/lending_info

Response

{
  "success": true,
  "result": [
    {
      "coin": 'USD',
      "lendable": 10026.5,
      "locked": 100.0,
      "minRate": 1e-06,
      "offered": 100.0
    }
  ]
}

Requires authentication.

Response format

Name Type Value Description
coin string USD
lendable number 10026.5 additional size you can lend
locked number 100.0 size either in lending offers or not yet unlocked from lending offers
minRate number 1e-6 minimum rate at which your offers will lend
offered number 100.0 size in your lending offers

Submit lending offer

Request

POST /spot_margin/offers
{
  "coin": "USD",
  "size": 10.0,
  "rate": 1e-6
}

Response

{
  "success": true,
  "result": null,
}

Requires authentication.

Payload format

Name Type Value Description
coin string USD
size number 10.0
rate number 1e-6

Fills

Request

GET /fills?market={market}

Response

{
  "success": true,
  "result": [
    {
      "fee": 20.1374935,
      "feeCurrency": "BTC",
      "feeRate": 0.0005,
      "id": 11215,
      "liquidity": "taker",
      "market": "BTC/USD",
      "baseCurrency": null,
      "quoteCurrency": null,
      "orderId": 8436981,
      "tradeId": 1013912,
      "price": 4.201,
      "side": "buy",
      "size": 9587,
      "time": "2019-03-27T19:15:10.204619+00:00",
      "type": "order"
    }
  ]
}

Requires authentication.

Request parameters

Name Type Value Description
market string BTC/USD optional; market to limit fills
limit number 20 optional; number of fills to return
start_time number 1564146934 optional; minimum time of fills to return, in Unix time (seconds since 1970-01-01)
end_time number 1564233334 optional; maximum time of fills to return, in Unix time (seconds since 1970-01-01)
order string null optional; default is descending, supply 'asc' to receive fills in ascending order of time
orderId number null

Response format

Name Type Value Description
fee number 20.1374935
feeCurrency string BTC
feeRate number 0.0005
id number 11215 fill id
liquidity string taker "taker" or "maker"
market string BTC/USD
baseCurrency string BTC
quoteCurrency string USD
orderId number 8436981
tradeId number 1013912 null for trades before 2019-02-19 10:00:00
price number 4.201
side string buy
size number 9587.0
time string 2019-03-27T19:15:10.204619+00:00
type string order
Name Type Value Description
id number 5
size number 1.0
price number 3.0
option option object; see List Quote Requests section
time string "2020-01-08T02:59:57.270744+00:00"
liquidity string taker "taker" or "maker"
fee number 1.782852614186007
feeRate number 0.0001729
side string buy

Websocket API

Streaming API with the most up-to-date market and account order data. With this API, you can send messages to a server and receive event-driven responses without having to poll the server for a reply.

Websocket endpoint URL: wss://ftx.us/ws/

Requests and responses use JSON.

You can find sample code here: https://github.com/ftexchange/ftx

Request process

Websocket connections go through the following lifecycle:

Request format

Messages sent to the server should contain the following dictionary items:

Response format

Public Channels

Ticker

The ticker channel provides the latest best bid and offer market data. All messages are updates (update), and the data field contains: - bid: Best bid price if a bid exists, else null - ask: Best ask price if an ask exists, else null - last: Last trade price if it exists, else null - time: Timestamp

Markets

The markets channel provides information on the full set of tradable markets and their specifications. After subscription and once per minute, you will receive a partial message with information on all markets. If there are updates to markets (listings, delistings, or changes to specs), you will be notified through update messages. The data field both types of messages will contain a list of market information dictionaries, each of which contains:

Trades

The trades channel provides data on all trades in the market. All messages are updates of new trades (update) and the data field contains: - price: Price of the trade - size: Size of the trade - side: Side of the taker in the trade - liquidation: true if the trade involved a liquidation order, else false - time: Timestamp

Orderbooks

The orderbook channel provides data about the orderbook's best 100 orders on either side.

Initial snapshot

Upon subscribing, you will receive one snapshot of the orderbook (partial) with a data field containing:

The bids and asks are formatted like so: [[best price, size at price], [next next best price, size at price], ...]

Updates

After receiving your snapshot, you will be streamed updates (message type is update) that have data fields with:

The bids and asks fields contain updates to the orderbook.

Checksum

Every message contains a signed 32-bit integer checksum of the orderbook. You can run the same checksum on your client orderbook state and compare it to checksum field. If they are the same, your client's state is correct. If not, you have likely lost or mishandled a packet and should re-subscribe to receive the initial snapshot.

The checksum operates on a string that represents the first 100 orders on the orderbook on either side. The format of the string is:

For example, if the orderbook was comprised of the following two bids and asks:

The string would be '5005.5:10:5001.0:6:4995.0:5:5002.0:7'

If there are more orders on one side of the book than the other, then simply omit the information about orders that don't exist.

For example, if the orderbook had the following bids and asks:

The string would be '5005.5:10:5001.0:6:4995.0:5'

The final checksum is the crc32 value of this string.

Private Channels

Authentication

You can log in by sending a message like so %{code}

{
  "args": {
    "key": "<api_key>",
    "sign": "<signature>",
    "time": "<ts>"
  },
  "op": "login"
}

As an example, if:

sign would be d10b5a67a1a941ae9463a60b285ae845cdeac1b11edc7da9977bef0228b96de9

One websocket connection may be logged in to at most one user. If the connection is already authenticated, further attempts to log in will result in 400s.

Fills

You will receive messages so:

{
  "channel": "fills",
  "data": {
    "fee": 78.05799225,
    "feeRate": 0.0014,
    "id": 7828307,
    "liquidity": "taker",
    "market": "BTC/USD",
    "orderId": 38065410,
    "tradeId": 19129310,
    "price": 3723.75,
    "side": "buy",
    "size": 14.973,
    "time": "2019-05-07T16:40:58.358438+00:00",
    "type": "order"
  },
  "type": "update"
}

This channel streams your fills across all markets. You can subscribe to it on an authenticated connection by sending {'op': 'subscribe', 'channel': 'fills'}.

Orders

You will receive messages so:

{
  "channel": "orders",
  "data": {
    "id": 24852229,
    "clientId": null,
    "market": "BTC/USD",
    "type": "limit",
    "side": "buy",
    "size": 42353.0,
    "price": 0.2977,
    "reduceOnly": false,
    "ioc": false,
    "postOnly": false,
    "status": "closed",
    "filledSize": 0.0,
    "remainingSize": 0.0,
    "avgFillPrice": 0.2978
  },
  "type": "update"
}

This channel streams updates to your orders across all markets. You can subscribe to it on an authenticated connection by sending {'op': 'subscribe', 'channel': 'orders'}.

FIX API

FIX (Financial Information eXchange) is a standard electronic messaging protocol which can be used to place orders, receive order updates and executions, and cancel orders. Our FIX api is based on the FIX 4.2 specification and modeled after FIX implementations of other popular cryptocurrency exchanges.

You can find sample client code here: https://github.com/ftexchange/ftx

FIX endpoint URL: tcp+ssl://fix.ftx.us:4363

Clients should connect to the endpoint using SSL.

Sequence numbers are reset for each connection. Resend request and sequence reset messages are not supported.

Messages

8=FIX.4.2|9=162|35=A|49=zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx|56=FTXUS

All messages should include the following header:

This documentation uses | to represent the FIX field separator (byte 0x01). It should be replaced by 0x01 in actual messages.

Tag Name Example Description
8 BeginString FIX.4.2 Must be set to "FIX.4.2"
9 BodyLength 162 Length of the message body in bytes
35 MsgType 8 Message type
49 SenderCompID zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx Client API key (for messages from the client)
56 TargetCompID FTXUS Must be set to "FTXUS" (for messages from the client)
34=1|52=20190525-07:17:48

Messages should also include a sequence number MsgSeqNum (34) and a timestamp SendingTime (52). Sequence numbers start at 1 and must be incremented with every message. Messages with duplicate or out-of-order sequence numbers will be rejected. Sequence numbers are reset on new connections.

Logon (A)

Sent by the client to initiate a FIX session. Must be the first message sent after a connection is established. Only one session can be established per connection; additional Logon messages are rejected.

Request

8=FIX.4.2|9=162|35=A|49=zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx|56=FTXUS|34=1|52=20190525-07:51:51|98=0|108=30|96=8f7e7d37f8033ad249c1833687c230b6f4663f0dd72752899776bab9aa064783|10=237|
Tag Name Example Description
35 MsgType A
98 EncryptMethod 0 Must be set to "0" (None)
108 HeartBInt 30 Must be set to "30"
96 RawData 8f7e...4783 Signature (see below)
8013 CancelOrdersOnDisconnect Y "Y": all account orders will be cancelled at the end of the session. "S": all orders placed during the session will be cancelled at the end of the session. Default: no orders will be cancelled.
1 Account "my_subaccount" Optional subaccount name; can be omitted if authenticating for main account

Signature

from datetime import datetime
import hmac

api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'

sending_time = datetime.now().strftime('%Y%m%d-%H:%M:%S')

sign_target = '\x01'.join([
    sending_time,  # SendingTime
    'A',  # MsgType
    '1',  # MsgSeqNum
    api_key,  # SenderCompID
    'FTXUS',  # TargetCompID
])

signature = hmac.new(api_secret.encode(), sign_target.encode(), 'sha256').hexdigest()

let crypto = require('crypto');

let apiKey = 'YOUR_API_KEY';
let apiSecret = 'YOUR_API_SECRET';

let sendingTime = '20190525-07:51:51';

let signTarget = [
    sendingTime,  // SendingTime
    'A',  // MsgType
    '1',  // MsgSeqNum
    apiKey,  // SenderCompID
    'FTXUS',  // TargetCompID
].join('\x01');

let hmac = crypto.createHmac('sha256', apiSecret);
let signature = hmac.update(signTarget).digest('hex');

For security, the Logon message must be signed by the client. To compute the signature, concatenate the following fields, joined by the FIX field separator (byte 0x01), and compute the SHA256 HMAC using the API secret:

The resulting hash should be hex-encoded.








Response

8=FIX.4.2|9=98|35=A|49=FTXUS|56=zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx|34=1|98=0|108=30|52=20190525-07:51:51.838|10=099
Tag Name Value
35 MsgType A
98 EncryptMethod 0
108 HeartBInt 30

Heartbeat (0)

Sent by either side if a message has not been received in the past 30 seconds. Should also be sent in response to a TestRequest (1).

8=FIX.4.2|9=86|35=1|49=zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx|56=FTXUS|34=2|52=20190525-07:52:24.029|10=049|
Tag Name Value Description
35 MsgType 0
112 TestReqID 123 If this heartbeat is in response to a TestRequest, copied from the TestRequest.

Test Request (1)

May be sent by either side at any time.

8=FIX.4.2|9=112|35=1|49=zyfvB4QPg0A3kkVgqUE9V1fOA-Y6jhdG3seqIIZx|56=FTXUS|34=3|112=20190525-08:26:38.989|52=20190525-08:26:38.989|10=140|
Tag Name Value Description
35 MsgType 1
112 TestReqID 123 Arbitrary string, to be echoed back by a Heartbeat.

Logout (5)

Sent by either side to terminate the session. The other side should respond with another Logout message to acknowledge session termination. The connection will be closed afterwards.

Tag Name Value
35 MsgType 5

New Order Single (D)

Sent by the client to submit a new order. Only limit orders are currently supported by the FIX API.

Tag Name Value Description
35 MsgType D
21 HandlInst 1 Must be set to "1" (AutomatedExecutionNoIntervention)
11 ClOrdID order123 Arbituary client-selected string to identify the order; must be unique
55 Symbol BTC/USD Symbol name
40 OrdType 2 Must be set to "2" (Limit)
38 OrderQty 1.1 Order size in base units
44 Price 8000 Limit price
54 Side 1 "1": buy; "2": sell
59 TimeInForce 1 Must be set to "1" (Good Till Cancel) or "3" (Immediate or Cancel)
18 ExecInst E This paramter is optional. "E": reduce only, "6": post only, not supplied: standard

If the order is accepted, an ExecutionReport (8) with ExecType=A (Pending New) will be returned. Otherwise, an ExecutionReport with ExecType=8 (Rejected) will be returned.

Order Cancel Request (F)

Sent by the client to request to cancel an order.

Tag Name Value Description
35 MsgType F
37 OrderID 123456 System-assigned order ID of the order
41 OrigClOrdID order123 Client-assigned order ID of the order

Only one of OrderID (37) and OrigClOrdID (41) should be provided.

If the order is successfully cancelled, an ExecutionReport (8) with ExecType=6 (Pending Cancel) will be returned. Otherwise, an OrderCancelReject (9) will be returned.

Order Cancel Reject (9)

Sent by the server to notify the client that an OrderCancelRequest (F) failed.

Tag Name Value Description
35 MsgType 9
11 ClOrdID cancel123 Copied from OrderCancelRequest
37 OrderID 123456 Copied from OrderCancelRequest
41 OrigClOrdID order123 Copied from OrderCancelRequest
39 OrdStatus 4 "4" (Canceled) if the order was already cancelled
102 CxlRejReason 1 "0": order already cancelled, "1": unknown order
434 CxlRejResponseTo 1 Always set to "1"

Mass Order Cancel Request (q)

Sent by the server in response to a Mass Order Cancel Request (q)

Tag Name Value Description
35 MsgType q
530 MassCancelRequestType 7 7 for cancelling all orders on all markets, 1 for cancelling all orders on a specific market
11 ClOrdID order123 optional; client-assigned ID for mass order cancellation request
55 Symbol BTC/USD optional; symbol name. This field is is required if MassCancelRequestType is set to 1, and ignored otherwise

A Mass Order Cancel Report (r) will be returned to the client.

Mass Order Cancel Report (r)

Sent by the server in response to a Mass Order Cancel Request (q)

Tag Name Value Description
35 MsgType r
530 MassCancelRequestType 7 the MassCancelRequestType of the corresponding Mass Order Cancel Request
11 ClOrdID order123 optional; the ClOrdID of the corresponding Mass Order Cancel Request. Omitted if no ClOrdID was supplied.
531 MassCancelResponse 0 if the request was rejected, otherwise set to the MassCancelRequestType of the corresponding Mass Order Cancel Request
532 MssCancelRejectReason optional; 0 if the market specified in the Mass Order Cancel Request was unknown

Order Status Request (H)

Sent by the client to request the status of an order.

Tag Name Value Description
35 MsgType H
37 OrderID 123456 OrderID of the order to request, or "*" to request all pending orders
41 OrigClOrdID order123 Client-assigned order ID of the order
20000 IncludeFillInfo N If Y, server will include fill info

The server will respond with an ExecutionReport (8) with ExecType=I (OrderStatus) with the requested order or orders. Only one of OrderID (37) and OrigClOrdID (41) should be provided. When there are no open orders, the server will include Text (58) of "No open orders".

Additional fields included with IncludeFillInfo (20000=Y):

Tag Name Value Description
1362 NoFills 1 Number of fills for this order

The following fields are included zero or more times, once for each fill:

Tag Name Value Description
1363 FillExecID 23436 Fill ID
1364 FillPx 10.1 Fill price
1365 FillQty 6.32 Fill quantity
1366 FillTradeID 101293 Fill trade ID. This will be shared by the fill corresponding to the other side of the trade.
1367 FillTime 20200219-08:33:26.513 Fill time
1443 FillLiquidityInd 2 1 for maker, 2 for taker
20100 FeeRate 0.0007 Fees paid on the fill, in percent
20101 Fee 0.0446824 Fees paid on the fill, in USD

Execution Report (8)

Sent by the server whenever an order receives a fill, whenever the status of an order changes, or in response to a NewOrderSingle (D), OrderCancelRequest (F), or OrderStatusRequest (H) message from the client.

Tag Name Value Description
35 MsgType 8
11 ClOrdID order123 Client-selected order ID.
37 OrderID 123456 Server-assigned order ID
17 ExecID d840c87b-ad98-47b1-95d3-4d41950fa776 unique execution ID. Equal to Fill ID if this message was the result of a fill
55 Symbol BTC/SD Symbol name
54 Side 1 "1": buy; "2": sell
38 OrderQty 1.2 Original order quantity
44 Price 8000 Original order price
150 ExecType 1 Reason for this message (see below)
39 OrdStatus 0 Order status (see below)
14 CumQty 0.4 Quantity of order that has already been filled
151 LeavesQty 0.8 Quantity of order that is still open
84 CxlQty 0.0 Quantity cancelled by self-trade prevention. Only present if the cancelled quantity is greater than zero
60 TransactTime 20190525-08:26:38.989 Time of the order update. Only present on order updates
31 LastPx 7999.25 Fill price. Only present if this message was the result of a fill
32 LastQty 0.4 Fill quantity. Only present if this message was the result of a fill
1057 AggressorIndicator Y "Y": taker fill; "N": maker fill. Only present if this message was the result of a fill
1366 FillTradeID 101293 Fill trade ID. Only present if this message was the result of a fill
12 Commission 0.0067307233000000 Fee for trade in USD. Only present if this message was the result of a fill
13 CommType 3 Always 3 (absolute)
103 OrdRejReason 3 Reason the order was rejected (see below). Only present on rejected NewOrderSingle (D) requests
58 Text 58 Description of the reason the order was rejected (e.g., Too many requests). Only present on rejected NewOrderSingle (D) requests

ExecType values

The ExecType (150) field indicates the reason why this ExecutionReport was sent.

ExecType Description
0 New order
1 New fill for order
3 Order done (fully filled)
4 Order cancelled
5 Order resized (possible for reduce-only orders)
A Response to a successful NewOrderSingle (D) request
8 Response to a rejected NewOrderSingle (D) request
6 Response to a successful OrderCancelRequest (F) request
I Response to a OrderStatusRequest (H) request

Note that every fill will generate a new ExecType=1 message. If a fill causes an order to be fully filled, both a ExecType=1 message and a ExecType=3 message will be generated. Similarly, a newly placed order that is immediately matched against an opposing order will generate both a ExecType=0 message and a ExecType=1 message.

OrdStatus values

OrdStatus Description
0 New order
1 Partially filled order
3 Fully filled order
4 Cancelled order
5 Resized order
6 Pending cancel

OrdRejReason values

OrdRejReason Description
3 Risk limits exceeded
99 Too many requests
0 Other errors

Reject (3)

Sent by the server in response to an invalid message.

Tag Name Value Description
35 MsgType 3
45 RefSeqNum 2 Sequence number of the rejected message
371 RefTagID 38 Tag number of the rejected field
372 RefMsgType D Message type of the rejected message
58 Text Missing quantity Human-readable description of the reason for the rejection
373 SessionRejectReason 1 Code to identify the rejection reason (see below)

Rejection reason codes

SessionRejectReason Description
1 Required tag missing
5 Value incorrect for this tag
6 Incorrect data format for value
11 Invalid MsgType