diff --git a/freqtrade/rpc/api_server/api_trading.py b/freqtrade/rpc/api_server/api_trading.py index b265c5575..aaae0e783 100644 --- a/freqtrade/rpc/api_server/api_trading.py +++ b/freqtrade/rpc/api_server/api_trading.py @@ -147,7 +147,7 @@ def status(rpc: RPC = Depends(get_rpc)): # Using the responsemodel here will cause a ~100% increase in response time (from 1s to 2s) # on big databases. Correct response model: response_model=TradeResponse, -@router.get("/trades", tags=["trading-info", "trading"]) +@router.get("/trades", tags=["trading-info", "trades"]) def trades( limit: int = Query(500, ge=1, description="Maximum number of different trades to return data"), offset: int = Query(0, ge=0, description="Number of trades to skip for pagination"), @@ -159,7 +159,7 @@ def trades( return rpc._rpc_trade_history(limit, offset=offset, order_by_id=order_by_id) -@router.get("/trade/{tradeid}", response_model=OpenTradeSchema, tags=["trading"]) +@router.get("/trade/{tradeid}", response_model=OpenTradeSchema, tags=["trades"]) def trade(tradeid: int = 0, rpc: RPC = Depends(get_rpc)): try: return rpc._rpc_trade_status([tradeid])[0] @@ -167,24 +167,24 @@ def trade(tradeid: int = 0, rpc: RPC = Depends(get_rpc)): raise HTTPException(status_code=404, detail="Trade not found.") -@router.delete("/trades/{tradeid}", response_model=DeleteTrade, tags=["trading"]) +@router.delete("/trades/{tradeid}", response_model=DeleteTrade, tags=["trades"]) def trades_delete(tradeid: int, rpc: RPC = Depends(get_rpc)): return rpc._rpc_delete(tradeid) -@router.delete("/trades/{tradeid}/open-order", response_model=OpenTradeSchema, tags=["trading"]) +@router.delete("/trades/{tradeid}/open-order", response_model=OpenTradeSchema, tags=["trades"]) def trade_cancel_open_order(tradeid: int, rpc: RPC = Depends(get_rpc)): rpc._rpc_cancel_open_order(tradeid) return rpc._rpc_trade_status([tradeid])[0] -@router.post("/trades/{tradeid}/reload", response_model=OpenTradeSchema, tags=["trading"]) +@router.post("/trades/{tradeid}/reload", response_model=OpenTradeSchema, tags=["trades"]) def trade_reload(tradeid: int, rpc: RPC = Depends(get_rpc)): rpc._rpc_reload_trade_from_exchange(tradeid) return rpc._rpc_trade_status([tradeid])[0] -@router.get("/trades/open/custom-data", response_model=list[ListCustomData], tags=["trading"]) +@router.get("/trades/open/custom-data", response_model=list[ListCustomData], tags=["trades"]) def list_open_trades_custom_data( key: str | None = Query(None, description="Optional key to filter data"), limit: int = Query(100, ge=1, description="Maximum number of different trades to return data"), @@ -202,7 +202,7 @@ def list_open_trades_custom_data( raise HTTPException(status_code=404, detail=str(e)) -@router.get("/trades/{trade_id}/custom-data", response_model=list[ListCustomData], tags=["trading"]) +@router.get("/trades/{trade_id}/custom-data", response_model=list[ListCustomData], tags=["trades"]) def list_custom_data(trade_id: int, key: str | None = Query(None), rpc: RPC = Depends(get_rpc)): """ Fetch custom data for a specific trade. @@ -215,11 +215,11 @@ def list_custom_data(trade_id: int, key: str | None = Query(None), rpc: RPC = De # /forcebuy is deprecated with short addition. use /forceentry instead -@router.post("/forceenter", response_model=ForceEnterResponse, tags=["trading"]) +@router.post("/forceenter", response_model=ForceEnterResponse, tags=["trades"]) @router.post( "/forcebuy", response_model=ForceEnterResponse, - tags=["trading"], + tags=["trades"], summary="(deprecated) Please use /forceenter instead", ) def force_entry(payload: ForceEnterPayload, rpc: RPC = Depends(get_rpc)): @@ -244,11 +244,11 @@ def force_entry(payload: ForceEnterPayload, rpc: RPC = Depends(get_rpc)): # /forcesell is deprecated with short addition. use /forceexit instead -@router.post("/forceexit", response_model=ResultMsg, tags=["trading"]) +@router.post("/forceexit", response_model=ResultMsg, tags=["trades"]) @router.post( "/forcesell", response_model=ResultMsg, - tags=["trading"], + tags=["trades"], summary="(deprecated) Please use /forceexit instead", ) def forceexit(payload: ForceExitPayload, rpc: RPC = Depends(get_rpc)): diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index a80699d00..6b5e0e07c 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -62,12 +62,38 @@ class ApiServer(RPCHandler): ApiServer.__initialized = True api_config = self._config["api_server"] + trade_mode_only = "*only available in trading mode*" self.app = FastAPI( title="Freqtrade API", docs_url="/docs" if api_config.get("enable_openapi", False) else None, redoc_url=None, default_response_class=FTJSONResponse, + openapi_tags=[ + {"name": "auth", "description": "Authentication endpoints."}, + { + "name": "info", + "description": ( + "Information endpoints providing general information about the bot." + ), + }, + { + "name": "trading", + "description": f"Trading related endpoints - {trade_mode_only}.", + }, + { + "name": "webserver", + "description": ( + "Webserver related endpoints - *only available in webserver mode*." + ), + }, + { + "name": "botcontrol", + "description": ( + f"Bot control endpoints to start/stop trading - {trade_mode_only}." + ), + }, + ], ) self.configure_app(self.app, self._config) self.start_api()