Developer API
Daily ranked stock and crypto watchlists with model conviction scores, reference levels, and macro context. Free tier live now — no key required.
Pricing
$0/mo
100 calls / day
✓Top 5 stock & crypto
✓Risk levels & sectors
✓Performance chart data
✓No API key required
$19/mo
500 calls / day
✓Model conviction scores
✓Upside & downside levels
✓Catalyst summaries
✓Full watchlist + daily change log
✓Entry-by-entry performance history
$49/mo
2,000 calls / day
✓Top 25 ranked stock feed
✓Full crypto + on-chain data
✓Real-time alert feed
✓Sector breakdowns
✓Per-symbol performance stats
✓Macro regime & market conditions
✓Weekly model confidence score
$99/mo
10,000 calls / day
Everything in Pro, plus:
✓Undervalued (GARP) watchlist
✓Monthly Generational selections (first cohort Aug 2026)
✓Full historical watchlist archive, all cohorts
✓150+ fields per stock
✓Insider & congress trading data
Not sure what you get? See the full endpoint list per tier and real sample responses below.
Cancel anytime from your Stripe dashboard. No contracts. 7-day money-back guarantee on your first charge.
Endpoints, fields, and rate limits may change. Some paid endpoints are newly added and may have limited historical data at first.
Endpoints
Full machine-readable contract: /api/v1/openapi.json (OpenAPI 3.0, importable into Postman/codegen)
/api/v1/free/today.json
Top 5 stocks + top 5 crypto + basic macro
/api/v1/crypto/today.json
Top 5 crypto with basic signals
/api/v1/performance/cumulative.json
Cumulative performance chart data
/api/v1/metadata.json
Endpoint discovery, signal health, schema
/api/v1/performance/undervalued.json
Undervalued strategy performance chart data
/api/v1/performance/undervalued_cumulative.json
Undervalued cumulative growth chart data
/api/v1/watchlist/today.json
Full watchlist with reference levels & catalysts
/api/v1/watchlist/changes.json
What changed today vs yesterday
/api/v1/performance/history.json
Full ranking history with returns
/api/v1/stocks/today.json
Top 25 stock feed with all fields
/api/v1/crypto/full.json
Top 25 crypto with on-chain & derivatives
/api/v1/confidence/latest.json
Model conviction scores
/api/v1/macro/today.json
Full macro regime: VIX, yields, GDP, CPI, FRED
/api/v1/stocks/sectors.json
Sector-level breakdown of the stock feed
/api/v1/performance.json
Returns and S&P 500 comparison
/api/v1/performance/symbols.json
Per-stock performance analytics
/api/v1/alerts/today.json
Today's price-level alert events
/api/v1/undervalued/latest.json
Undervalued watchlist (12-month value selections)
/api/v1/generational/latest.json
Generational (forever-hold) selections — launching August 2026
/api/v1/ultra/archive.json
Full historical watchlist archive with exit prices & reasons
Filter /stocks/today.json with query params:
GET /api/v1/stocks/today.json?min_score=80§or=Technology&risk=low&limit=10
GET /api/v1/stocks/today.json?symbol=NVDA
| symbol | Lookup a specific stock |
| min_score | Minimum AI score (0-99) |
| sector | Filter by sector |
| risk | Max risk level: low, medium, or high |
| limit | Max results to return |
Sample responses
Quick start
All endpoints return JSON. Your data is in the data field: response.data.stocks[0].symbol
Auth: Authorization: Bearer YOUR_API_KEY — Free endpoints need no key. Rate limits: Free 100/day, Starter 500/day, Pro 2,000/day, Ultra 10,000/day.
import requests
# Free (no key)
data = requests.get(
"https://top5stocks-api.top5stocks.workers.dev/api/v1/free/today.json"
).json()["data"]
for s in data["stocks"]:
print(f"{s['rank']}. {s['symbol']} — Score {s['selection_score']}, ${s['price']}")
# Paid (with key)
headers = {"Authorization": "Bearer YOUR_API_KEY"}
data = requests.get(
"https://top5stocks-api.top5stocks.workers.dev/api/v1/stocks/today.json",
headers=headers,
params={"min_score": 80, "sector": "Technology"}
).json()["data"]
for s in data["stocks"]:
levels = s.get("technical_levels", {})
print(f"{s['symbol']} — Up {levels.get('upside_reference_level')}, Down {levels.get('downside_reference_level')}")
// Free (no key)
const res = await fetch(
"https://top5stocks-api.top5stocks.workers.dev/api/v1/free/today.json"
);
const { data } = await res.json();
data.stocks.forEach(s =>
console.log(`${s.rank}. ${s.symbol} — Score ${s.selection_score}, $${s.price}`)
);
// Paid (with key)
const paid = await fetch(
"https://top5stocks-api.top5stocks.workers.dev/api/v1/stocks/today.json?min_score=80",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const paidData = (await paid.json()).data;
paidData.stocks.forEach(s => {
const levels = s.technical_levels || {};
console.log(`${s.symbol} — Up ${levels.upside_reference_level}, Down ${levels.downside_reference_level}`);
});
=TOP5PICKS() → Today's top 5 ranked stocks
=TOP5STOCK("NVDA", "score") → AI score for any symbol
=TOP5STOCK("AAPL", "upside") → Upside reference level (Starter+)
=TOP5SECTORS() → Sector breakdown with avg scores
Free functions work without an API key. Upside/downside fields require Starter or above.
Errors & limits
Errors return JSON with an error code:
| Status | Error code | Meaning |
|---|---|---|
| 401 | invalid_or_missing_api_key | No key, or the key doesn't exist. Send Authorization: Bearer YOUR_API_KEY. |
| 401 | api_key_revoked | Key was revoked (usually a cancelled subscription). |
| 403 | insufficient_plan | Endpoint needs a higher plan. The response includes current_plan and required_plan. |
| 429 | rate_limit_exceeded | Per-minute burst limit hit. Honor the Retry-After header (60s). |
| 429 | daily_limit_exceeded | Daily call quota used up — resets at midnight UTC. |
Limits per plan (daily quota / per-minute burst): Free 100 & 10/min, Starter 500 & 30/min, Pro 2,000 & 60/min, Ultra 10,000 & 200/min.
Every authenticated response includes X-DailyLimit-Limit and X-DailyLimit-Remaining headers so you can track usage without extra calls.
Lost your key? Your API key is emailed at purchase. To confirm which keys exist for your email:
curl -X POST https://top5stocks-api.top5stocks.workers.dev/api/v1/key/lookup \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'
Returns masked keys (never the full key) for the checkout email. Limited to 5 attempts per 15 minutes. Need the full key resent? Reply to your welcome email.
7-day money-back guarantee. Full refund of your first charge within 7 days — self-serve, no questions asked. One refund per customer; refunding cancels the subscription and revokes your API key immediately.
Data & terms
200+ signals from 25+ market data sources. Stock and crypto data aggregated, scored, and ranked daily. Signal health is monitored automatically.
Disclaimer: This API provides ranked model output for educational and informational purposes only. It is not financial advice, not a recommendation to buy, sell, or hold any security, and not personalized investment guidance. We are not a registered investment advisor. Past model performance does not guarantee future results. Use this data at your own risk. Full disclaimer →