feat: add social media sentiment endpoints

- /stock/{symbol}/social-sentiment -- Finnhub Reddit+Twitter sentiment
  (requires premium, gracefully degrades)
- /stock/{symbol}/reddit-sentiment -- Reddit WSB/stocks/investing
  mentions, upvotes, rank via ApeWisdom (free, no key)
- /discover/reddit-trending -- Top 25 trending stocks on Reddit
  (free, no key)

ApeWisdom provides real-time Reddit data without API key.
Finnhub social-sentiment requires premium plan but endpoint
responds gracefully with premium_required flag.
This commit is contained in:
Yaojia Wang
2026-03-19 20:50:28 +01:00
parent ca8d7099b3
commit 4eb06dd8e5
2 changed files with 158 additions and 0 deletions

View File

@@ -101,3 +101,33 @@ async def stock_upgrades(symbol: str = Path(..., min_length=1, max_length=20)):
symbol = validate_symbol(symbol)
data = await openbb_service.get_upgrades_downgrades(symbol)
return ApiResponse(data=data)
@router.get("/stock/{symbol}/social-sentiment", response_model=ApiResponse)
@safe
async def stock_social_sentiment(
symbol: str = Path(..., min_length=1, max_length=20),
):
"""Social media sentiment from Reddit and Twitter (Finnhub)."""
symbol = validate_symbol(symbol)
data = await finnhub_service.get_social_sentiment(symbol)
return ApiResponse(data=data)
@router.get("/stock/{symbol}/reddit-sentiment", response_model=ApiResponse)
@safe
async def stock_reddit_sentiment(
symbol: str = Path(..., min_length=1, max_length=20),
):
"""Reddit sentiment: mentions, upvotes, rank on WSB/stocks/investing (free, no key)."""
symbol = validate_symbol(symbol)
data = await finnhub_service.get_reddit_sentiment(symbol)
return ApiResponse(data=data)
@router.get("/discover/reddit-trending", response_model=ApiResponse)
@safe
async def reddit_trending():
"""Top 25 trending stocks on Reddit (WSB, r/stocks, r/investing). Free, no key."""
data = await finnhub_service.get_reddit_trending()
return ApiResponse(data=data)