2019-05-18 08:24:22 +00:00
# REST API Usage
## Configuration
Enable the rest API by adding the api_server section to your configuration and setting `api_server.enabled` to `true` .
Sample configuration:
``` json
"api_server": {
"enabled": true,
"listen_ip_address": "127.0.0.1",
2019-05-25 12:16:59 +00:00
"listen_port": 8080,
2020-05-31 07:51:45 +00:00
"verbosity": "info",
2020-05-10 17:42:06 +00:00
"jwt_secret_key": "somethingrandom",
2020-06-24 18:32:19 +00:00
"CORS_origins": [],
2019-05-25 12:16:59 +00:00
"username": "Freqtrader",
"password": "SuperSecret1!"
2019-05-18 08:24:22 +00:00
},
```
2019-10-30 12:27:04 +00:00
!!! Danger "Security warning"
By default, the configuration listens on localhost only (so it's not reachable from other systems). We strongly recommend to not expose this API to the internet and choose a strong, unique password, since others will potentially be able to control your bot.
2019-05-25 12:16:59 +00:00
2019-10-30 12:27:04 +00:00
!!! Danger "Password selection"
Please make sure to select a very strong, unique password to protect your bot from unauthorized access.
2019-05-18 08:24:22 +00:00
2019-11-11 19:25:44 +00:00
You can then access the API by going to `http://127.0.0.1:8080/api/v1/ping` in a browser to check if the API is running correctly.
2019-11-11 19:09:58 +00:00
This should return the response:
``` output
{"status":"pong"}
```
2020-05-10 17:42:06 +00:00
All other endpoints return sensitive info and require authentication and are therefore not available through a web browser.
2019-05-18 08:24:22 +00:00
2019-05-26 12:40:03 +00:00
To generate a secure password, either use a password manager, or use the below code snipped.
``` python
import secrets
secrets.token_hex()
```
2020-05-10 17:42:06 +00:00
!!! Hint
Use the same method to also generate a JWT secret key (`jwt_secret_key`).
2019-05-18 08:24:22 +00:00
### Configuration with docker
If you run your bot using docker, you'll need to have the bot listen to incomming connections. The security is then handled by docker.
``` json
"api_server": {
"enabled": true,
"listen_ip_address": "0.0.0.0",
"listen_port": 8080
},
```
Add the following to your docker command:
``` bash
-p 127.0.0.1:8080:8080
```
A complete sample-command may then look as follows:
```bash
docker run -d \
--name freqtrade \
-v ~/.freqtrade/config.json:/freqtrade/config.json \
-v ~/.freqtrade/user_data/:/freqtrade/user_data \
-v ~/.freqtrade/tradesv3.sqlite:/freqtrade/tradesv3.sqlite \
-p 127.0.0.1:8080:8080 \
2019-09-29 17:18:02 +00:00
freqtrade trade --db-url sqlite:///tradesv3.sqlite --strategy MyAwesomeStrategy
2019-05-18 08:24:22 +00:00
```
!!! Danger "Security warning"
2019-07-10 06:49:42 +00:00
By using `-p 8080:8080` the API is available to everyone connecting to the server under the correct port, so others may be able to control your bot.
2019-05-18 08:24:22 +00:00
## Consuming the API
You can consume the API by using the script `scripts/rest_client.py` .
2020-02-14 18:37:20 +00:00
The client script only requires the `requests` module, so Freqtrade does not need to be installed on the system.
2019-05-18 08:24:22 +00:00
``` bash
python3 scripts/rest_client.py < command > [optional parameters]
```
By default, the script assumes `127.0.0.1` (localhost) and port `8080` to be used, however you can specify a configuration file to override this behaviour.
### Minimalistic client config
``` json
{
"api_server": {
"enabled": true,
"listen_ip_address": "0.0.0.0",
"listen_port": 8080
}
}
```
``` bash
python3 scripts/rest_client.py --config rest_config.json < command > [optional parameters]
```
## Available commands
2020-08-04 17:57:28 +00:00
| Command | Description |
|----------|-------------|
| `ping` | Simple command testing the API Readiness - requires no authentication.
| `start` | Starts the trader
| `stop` | Stops the trader
| `stopbuy` | Stops the trader from opening new trades. Gracefully closes open trades according to their rules.
| `reload_config` | Reloads the configuration file
| `trades` | List last trades.
| `delete_trade <trade_id>` | Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
| `show_config` | Shows part of the current configuration with relevant settings to operation
| `status` | Lists all open trades
| `count` | Displays number of trades used and available
| `profit` | Display a summary of your profit/loss from close trades and some stats about your performance
| `forcesell <trade_id>` | Instantly sells the given trade (Ignoring `minimum_roi` ).
| `forcesell all` | Instantly sells all open trades (Ignoring `minimum_roi` ).
| `forcebuy <pair> [rate]` | Instantly buys the given pair. Rate is optional. (`forcebuy_enable` must be set to True)
| `performance` | Show performance of each finished trade grouped by pair
| `balance` | Show account balance per currency
| `daily <n>` | Shows profit or loss per day, over the last n days (n defaults to 7)
| `whitelist` | Show the current whitelist
| `blacklist [pair]` | Show the current blacklist, or adds a pair to the blacklist.
| `edge` | Show validated pairs by Edge if it is enabled.
| `version` | Show version
2019-05-18 08:24:22 +00:00
Possible commands can be listed from the rest-client script using the `help` command.
``` bash
python3 scripts/rest_client.py help
```
``` output
Possible commands:
balance
Get the account balance
:returns: json object
blacklist
Show the current blacklist
:param add: List of coins to add (example: "BNB/BTC")
:returns: json object
count
Returns the amount of open trades
:returns: json object
daily
Returns the amount of open trades
:returns: json object
edge
Returns information about edge
:returns: json object
forcebuy
Buy an asset
:param pair: Pair to buy (ETH/BTC)
:param price: Optional - price to buy
:returns: json object of the trade
forcesell
Force-sell a trade
:param tradeid: Id of the trade (can be received via status command)
:returns: json object
performance
Returns the performance of the different coins
:returns: json object
profit
Returns the profit summary
:returns: json object
2020-06-09 21:03:55 +00:00
reload_config
2019-05-18 08:24:22 +00:00
Reload configuration
:returns: json object
2019-11-17 14:05:56 +00:00
show_config
Returns part of the configuration, relevant for trading operations.
:return: json object containing the version
2019-05-18 08:24:22 +00:00
start
Start the bot if it's in stopped state.
:returns: json object
status
Get the status of open trades
:returns: json object
stop
Stop the bot. Use start to restart
:returns: json object
stopbuy
Stop buying (but handle sells gracefully).
2020-06-09 21:03:55 +00:00
use reload_config to reset
2019-05-18 08:24:22 +00:00
:returns: json object
version
Returns the version of the bot
:returns: json object containing the version
whitelist
Show the current whitelist
:returns: json object
```
2020-05-10 14:14:35 +00:00
## Advanced API usage using JWT tokens
!!! Note
2020-05-10 15:36:43 +00:00
The below should be done in an application (a Freqtrade REST API client, which fetches info via API), and is not intended to be used on a regular basis.
2020-05-10 14:14:35 +00:00
2020-05-10 15:47:43 +00:00
Freqtrade's REST API also offers JWT (JSON Web Tokens).
2020-05-10 14:14:35 +00:00
You can login using the following command, and subsequently use the resulting access_token.
``` bash
> curl -X POST --user Freqtrader http://localhost:8080/api/v1/token/login
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODkxMTk2ODEsIm5iZiI6MTU4OTExOTY4MSwianRpIjoiMmEwYmY0NWUtMjhmOS00YTUzLTlmNzItMmM5ZWVlYThkNzc2IiwiZXhwIjoxNTg5MTIwNTgxLCJpZGVudGl0eSI6eyJ1IjoiRnJlcXRyYWRlciJ9LCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MifQ.qt6MAXYIa-l556OM7arBvYJ0SDI9J8bIk3_glDujF5g","refresh_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODkxMTk2ODEsIm5iZiI6MTU4OTExOTY4MSwianRpIjoiZWQ1ZWI3YjAtYjMwMy00YzAyLTg2N2MtNWViMjIxNWQ2YTMxIiwiZXhwIjoxNTkxNzExNjgxLCJpZGVudGl0eSI6eyJ1IjoiRnJlcXRyYWRlciJ9LCJ0eXBlIjoicmVmcmVzaCJ9.d1AT_jYICyTAjD0fiQAr52rkRqtxCjUGEMwlNuuzgNQ"}
> access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODkxMTk2ODEsIm5iZiI6MTU4OTExOTY4MSwianRpIjoiMmEwYmY0NWUtMjhmOS00YTUzLTlmNzItMmM5ZWVlYThkNzc2IiwiZXhwIjoxNTg5MTIwNTgxLCJpZGVudGl0eSI6eyJ1IjoiRnJlcXRyYWRlciJ9LCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MifQ.qt6MAXYIa-l556OM7arBvYJ0SDI9J8bIk3_glDujF5g"
2020-05-10 15:47:43 +00:00
# Use access_token for authentication
2020-05-10 14:14:35 +00:00
> curl -X GET --header "Authorization: Bearer ${access_token}" http://localhost:8080/api/v1/count
```
2020-05-10 15:48:29 +00:00
Since the access token has a short timeout (15 min) - the `token/refresh` request should be used periodically to get a fresh access token:
2020-05-10 14:14:35 +00:00
``` bash
> curl -X POST --header "Authorization: Bearer ${refresh_token}"http://localhost:8080/api/v1/token/refresh
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODkxMTk5NzQsIm5iZiI6MTU4OTExOTk3NCwianRpIjoiMDBjNTlhMWUtMjBmYS00ZTk0LTliZjAtNWQwNTg2MTdiZDIyIiwiZXhwIjoxNTg5MTIwODc0LCJpZGVudGl0eSI6eyJ1IjoiRnJlcXRyYWRlciJ9LCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MifQ.1seHlII3WprjjclY6DpRhen0rqdF4j6jbvxIhUFaSbs"}
```
2020-06-24 18:32:19 +00:00
## CORS
All web-based frontends are subject to [CORS ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS ) - Cross-Origin Resource Sharing.
2020-06-27 13:26:55 +00:00
Since most of the requests to the Freqtrade API must be authenticated, a proper CORS policy is key to avoid security problems.
Also, the standard disallows `*` CORS policies for requests with credentials, so this setting must be set appropriately.
2020-06-24 18:32:19 +00:00
2020-06-27 13:26:55 +00:00
Users can configure this themselves via the `CORS_origins` configuration setting.
2020-06-24 18:32:19 +00:00
It consists of a list of allowed sites that are allowed to consume resources from the bot's API.
2020-06-27 13:26:55 +00:00
Assuming your application is deployed as `https://frequi.freqtrade.io/home/` - this would mean that the following configuration becomes necessary:
2020-06-24 18:32:19 +00:00
```jsonc
{
//...
"jwt_secret_key": "somethingrandom",
"CORS_origins": ["https://frequi.freqtrade.io"],
//...
}
```
!!! Note
We strongly recommend to also set `jwt_secret_key` to something random and known only to yourself to avoid unauthorized access to your bot.