= Config

== Minimum config

.Examples

Below config will only give access to public API (since no key/secret combinations have been provided)

[source,json]
----
{
    "listen":{
        /* only bind to localhost */
        "ipaddr":"127.0.0.1",
        "port":8000
    },
    "listenWs":{
        /* only bind to localhost */
        "ipaddr":"127.0.0.1",
        "port":8001
    },
    "ui":{
        /* enable ui : ui should be built first */
        "enabled":true
    },
    "logLevel":"warn",
    "marketCap":{
        "enabled":true
    },
    "fxConverter":{
        "enabled":true
    },
    "pushover":{
        "enabled":false,
        "user":"",
        "token":""
    },
    "tickerMonitor":{
        "enabled":true
    },
    "exchanges":{
        "poloniex":{
            "type":"poloniex",
            "enabled":true,
            /* ws emulation for Poloniex klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            "key":"",
            "secret":""
        },
        "bittrex":{
            "type":"bittrex",
            "enabled":true,
            /* whether or not restricted pairs should be ignored */
            "ignoreRestrictedPairs":false,
            /* ws emulation for Bittrex klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            "key":"",
            "secret":""
        },
        "binance":{
            "type":"binance",
            "enabled":true,
            /* if true client will need to provide the pair when retrieving tickers or dealing with orders */
            "requirePair":false,
            "key":"",
            "secret":""
        },
        "kucoin":{
            "type":"kucoin",
            "enabled":true,
            /* ws emulation since Kucoin does not support ws */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            "key":"",
            "secret":"",
            "password":""
        },
        "okex":{
            "type":"okex",
            "enabled":true,
            /* ws emulation for OKEx klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            /* if true client will need to provide the pair when dealing with orders */
            "requirePair":false,
            "key":"",
            "secret":"",
            "password":""
        }
    }
}
----

== Complete config

.Examples

Below config will only give access to both public and trading API (since key/secret combinations have been provided).

Access will be restricted using the following :

* an apikey header will be needed in every request
* only one ip address will be allowed to access the service

[NOTE]
====
* When _ssl_ is enabled, following file should exist in ssl sub directory :
  - _certificate.key_ (private key)
  - _certificate.crt_ (ssl certificate)
  - _ca.crt_ (optional) (intermediate certificate, not needed when using _self-signed_ certificate)
====

[source,json]
----
{
    "listen":{
        /* listen to all ip addresses */
        "ipaddr":"*",
        "port":8000,
        /* used to indicates the external endpoint used to reach http socket, in case gateway is running behing a proxy */
        "externalEndpoint":"",
        /* in case you want to enable https */
        "ssl":true
    },
    "listenWs":{
        /* only bind to localhost */
        "ipaddr":"127.0.0.1",
        "port":8001,
        /* used to indicates the external endpoint used to reach ws socket, in case gateway is running behing a proxy */
        "externalEndpoint":"",
        /* in case you want to enable wss */
        "ssl":true
    },
    "sessions":{
        /* maximum number of subscriptions per session (0 means no maximum) */
        "maxSubscriptions":0,
        /* maximum session duration in seconds (it will be automatically removed after) (0 means no maximum) */
        "maxDuration":0,
        /* whether or not ip address should be hidden when listing sessions */
        "hideIpaddr":false
    },
    "ui":{
        /* enable ui : ui should be built first */
        "enabled":true
    },
    "logLevel":"debug",
    "auth":{
        "trustProxy":{
            /* if trust proxy is enabled, client ip address will be retrieved based on X-Forwarded-For headers */
            "enabled":true,
            /* list of ip addresses of trusted proxies (only X-Forwarded-For headers received from 142.14.78.46 will be taken into account)/
            "proxies":["142.14.78.46"]
        },
        /* used to protect access through an API key */
        "apiKey":{
            "enabled":true,
            /* key should be sent in an apikey header (all requests without matching apikey will be rejected)*/
            "key":"1234"
        },
        /* used to restrict access from a list of ip addresses */
        "ipFilter":{
            "enabled":true,
            /* only requests from ip address 145.26.47.14 will be accepted (if trustProxy is enabled, client ip address might be retrieved from X-Forwarded-For)*/
            "allow":["145.26.47.14"]
        }
    },
    /* MarketCap configuration */
    "marketCap":{
        "enabled":true,
    },
    /* fxConverter configuration */
    "fxConverter":{
        "enabled":true,
    },
    /* PushOver configuration */
    "pushover":{
        "enabled":true,
        /* User key provided by PushOver (required if 'enabled' is 'true')
        "user":"u9jst7bbo57zpty6n6nfa3di67ryzo",
        /* Token provided by PushOver (required if 'enabled' is 'true')
        "token":"azfdkcafb8ynexae7wwdmb4erc71as"
    },
    /* Ticker Monitor configuration */
    "tickerMonitor":{
        "enabled":true
        /* How often (in seconds) gateway should check if conditions are met (default = 30)*/
        "delay":30,
        /* maximum number of conditions per alert (0 means no maximum) */
        "maxConditions":0,
        /* maximum alert duration in seconds (0 means no maximum) */
        "maxDuration":0
    },
    /* exchanges configuration */
    "exchanges":{
        "poloniex":{
            "type":"poloniex",
            "name":"Poloniex",
            "enabled":true,
            /* ws emulation for Poloniex klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            /* API key provided by Poloniex */
            "key":"ABCD",
            /* Secret provided by Poloniex */
            "secret":"EFGH",
            /* % fees [0,100] */
            "feesPercent":0.25,
            /* rate limiting to comply with Poloniex */
            "throttle":{
                "publicApi":{
                    "maxRequestsPerSecond":6
                },
                "tradingApi":{
                    "maxRequestsPerSecond":6
                }
            }
        },
        "bittrex":{
            "enabled":true,
            /* whether or not restricted pairs should be ignored */
            "ignoreRestrictedPairs":false,
            "type":"bittrex",
            "name":"bittrex",
            /* ws emulation for Bittrex klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            /* API key provided by Bittrex */
            "key":"ABCD",
            /* Secret provided by Bittrex */
            "secret":"EFGH",
            /* % fees [0,100] */
            "feesPercent":0.25,
            /* rate limiting to comply with Bittrex */
            "throttle":{
                "global":{
                    "maxRequestsPerSecond":1
                }
            }
        },
        /* it is possible to define multiple instances of same exchange */
        "binance":{
            "enabled":true,
            "type":"binance",
            "name":"Binance #1",
            /* if true client will need to provide the pair when retrieving tickers or dealing with orders */
            "requirePair":false,
            /* API key provided by Binance */
            "key":"ABCD",
            /* Secret provided by Binance */
            "secret":"EFGH",
            /* to account for clock skew */
            "recvWindow":5000,
            /* % fees [0,100] */
            "feesPercent":0.10,
            /* rate limiting to comply with Binance */
            "throttle":{
                "global":{
                    "maxRequestsPerSecond":20
                }
            }
        },
        "binance2":{
            "enabled":true,
            "type":"binance",
            "name":"Binance #2",
            /* if true client will need to provide the pair when retrieving tickers or dealing with orders */
            "requirePair":false,
            /* API key provided by Binance */
            "key":"ABCD",
            /* Secret provided by Binance */
            "secret":"EFGH",
            /* to account for clock skew */
            "recvWindow":5000,
            /* % fees [0,100] */
            "feesPercent":0.10,
            /* rate limiting to comply with Binance */
            "throttle":{
                "global":{
                    "maxRequestsPerSecond":20
                }
            }
        },
        "kucoin":{
            "enabled":true,
            "type":"kucoin",
            "name":"Kucoin",
            /* can be set to 'true' to debug REST requests & responses */
            "verbose":false,
            /* timeout in ms for REST requests */
            "timeout":10000,
            /* ws emulation since Kucoin does not support ws */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            /* API key provided by Kucoin */
            "key":"ABCD",
            /* Secret provided by Kucoin */
            "secret":"EFGH",
            /* Password defined on Kucoin */
            "password":"IJKL",
            /* % fees [0,100] */
            "feesPercent":0.10,
            /* rate limiting to comply with Kucoin */
            "throttle":{
                "global":{
                    "maxRequestsPerSecond":10
                }
            }
        },
        "okex":{
            "enabled":true,
            "type":"okex",
            "name":"OKEx",
            /* can be set to 'true' to debug REST requests & responses */
            "verbose":false,
            /* timeout in ms for REST requests */
            "timeout":10000,
            /* if true client will need to provide the pair when dealing with orders */
            "requirePair":false,
            /* ws emulation for OKEx klines */
            "emulatedWs":{
                "wsKlines":{
                    /* whether or not ws emulation should be enabled for klines */
                    "enabled":true
                }
            },
            /* API key provided by OKEx */
            "key":"ABCD",
            /* Secret provided by OKEx */
            "secret":"EFGH",
            /* Password defined on OKex */
            "password":"IJKL",
            /* % fees [0,100] */
            "feesPercent":0.20,
            /* rate limiting to comply with OKEx */
            "throttle":{
                "global":{
                    "maxRequestsPerSecond":3
                }
            }
        }
    }
}
----

== Retrieve current log level

*GET* _/server/logLevel_

=== Result

.Examples

Example for *GET* _/server/logLevel_

[source,json]
----
{
    "value":"debug"
}
----

== Change current log level

*POST* _/server/logLevel_

=== Mandatory query parameters

[cols="1,1a,1a", options="header"]
|===

|Name
|Type
|Description

|value
|string (_error,warn,info,verbose,debug_)
|New log level

|===

=== Result

Result will be an empty object

.Examples

Example for *POST* _/server/logLevel?value=warn_

[source,json]
----
{
}
----
