"""Routes for equity shorts and dark pool data.""" from fastapi import APIRouter, Path from models import ApiResponse from route_utils import safe, validate_symbol import shorts_service router = APIRouter(prefix="/api/v1") @router.get("/stock/{symbol}/shorts/volume", response_model=ApiResponse) @safe async def short_volume(symbol: str = Path(..., min_length=1, max_length=20)): """Daily short volume and percent (stockgrid).""" symbol = validate_symbol(symbol) data = await shorts_service.get_short_volume(symbol) return ApiResponse(data=data) @router.get("/stock/{symbol}/shorts/ftd", response_model=ApiResponse) @safe async def fails_to_deliver(symbol: str = Path(..., min_length=1, max_length=20)): """Fails-to-deliver records from SEC.""" symbol = validate_symbol(symbol) data = await shorts_service.get_fails_to_deliver(symbol) return ApiResponse(data=data) @router.get("/stock/{symbol}/shorts/interest", response_model=ApiResponse) @safe async def short_interest(symbol: str = Path(..., min_length=1, max_length=20)): """Short interest positions, days to cover (FINRA).""" symbol = validate_symbol(symbol) data = await shorts_service.get_short_interest(symbol) return ApiResponse(data=data) @router.get("/darkpool/{symbol}/otc", response_model=ApiResponse) @safe async def darkpool_otc(symbol: str = Path(..., min_length=1, max_length=20)): """OTC/dark pool aggregate trade volume (FINRA).""" symbol = validate_symbol(symbol) data = await shorts_service.get_darkpool_otc(symbol) return ApiResponse(data=data)