200+ signals. 25+ sources. One API.

Daily ranked stock and crypto watchlists with model conviction scores, reference levels, and macro context. Free tier live now — no key required.

Free

$0/mo

100 calls / day

Top 5 stock & crypto

Risk levels & sectors

Performance chart data

No API key required

Starter

$19/mo

500 calls / day

Model conviction scores

Upside & downside levels

Catalyst summaries

Full watchlist + daily change log

Entry-by-entry performance history

Ultra

$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.

Full machine-readable contract: /api/v1/openapi.json (OpenAPI 3.0, importable into Postman/codegen)

Free — no key required

GET /api/v1/free/today.json Top 5 stocks + top 5 crypto + basic macro
GET /api/v1/crypto/today.json Top 5 crypto with basic signals
GET /api/v1/performance/cumulative.json Cumulative performance chart data
GET /api/v1/metadata.json Endpoint discovery, signal health, schema
GET /api/v1/performance/undervalued.json Undervalued strategy performance chart data
GET /api/v1/performance/undervalued_cumulative.json Undervalued cumulative growth chart data

Starter — $19/mo (includes all Free endpoints)

GET /api/v1/watchlist/today.json Full watchlist with reference levels & catalysts
GET /api/v1/watchlist/changes.json What changed today vs yesterday
GET /api/v1/performance/history.json Full ranking history with returns

Pro — $49/mo (includes all Starter endpoints)

GET /api/v1/stocks/today.json Top 25 stock feed with all fields
GET /api/v1/crypto/full.json Top 25 crypto with on-chain & derivatives
GET /api/v1/confidence/latest.json Model conviction scores
GET /api/v1/macro/today.json Full macro regime: VIX, yields, GDP, CPI, FRED
GET /api/v1/stocks/sectors.json Sector-level breakdown of the stock feed
GET /api/v1/performance.json Returns and S&P 500 comparison
GET /api/v1/performance/symbols.json Per-stock performance analytics
GET /api/v1/alerts/today.json Today's price-level alert events

Ultra — $99/mo (includes all Pro endpoints)

GET /api/v1/undervalued/latest.json Undervalued watchlist (12-month value selections)
GET /api/v1/generational/latest.json Generational (forever-hold) selections — launching August 2026
GET /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
symbolLookup a specific stock
min_scoreMinimum AI score (0-99)
sectorFilter by sector
riskMax risk level: low, medium, or high
limitMax results to return
Loading...

Single stock from /watchlist/today.json (Starter):

{
  "rank": 1,
  "symbol": "DDOG",
  "company": "Datadog, Inc.",
  "sector": "Technology",
  "price": 227.70,
  "change_percent": 4.02,
  "selection_score": 100.62,
  "risk_level": "Moderate",
  "conviction_tier": "medium",
  "catalyst_summary": "Upgrade; Strong buy consensus...",
  "technical_levels": {
    "current_price": 227.70,
    "entry_reference_level": 224.50,
    "upside_reference_level": 252.00,
    "downside_reference_level": 208.00,
    "moving_average_50": 195.07,
    "moving_average_200": 153.19,
    "reference_disclaimer": "Model-derived levels for research only, not trade instructions"
  },
  "analyst_rating": "Strong Buy"
}

From /macro/today.json (Pro):

{
  "macro_regime": "cautious",
  "market_regime": "cautious",
  "vix_context": {
    "value": 20.2,
    "regime": "elevated_fear"
  },
  "fear_greed_index": 13,
  "fear_greed_label": "Extreme Fear",
  "spy_trend": {
    "price": 728.16,
    "trend": "neutral",
    "drawdown_pct": -3.89
  },
  "fed_rate": 3.63,
  "gdp_estimate": 2.5,
  "sector_strength": ["Healthcare", "Industrials", "Financials"],
  "summary": "BLS unemployment 4.3%; Treasury average interest rate 3.69%"
}

From /watchlist/changes.json (Starter):

{
  "added": [
    {"symbol": "DDOG", "score": 100.6, "sector": "Technology"},
    {"symbol": "V", "score": 84.0, "sector": "Financial Services"}
  ],
  "removed": [
    {"symbol": "FTNT", "score": 87.1},
    {"symbol": "CSX", "score": 81.2}
  ],
  "retained": ["LLY"],
  "score_changes": [
    {"symbol": "LLY", "previous_score": 78.3, "current_score": 102.0, "change": 23.7}
  ],
  "turnover": 4
}

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 return JSON with an error code:

Status Error code Meaning
401invalid_or_missing_api_keyNo key, or the key doesn't exist. Send Authorization: Bearer YOUR_API_KEY.
401api_key_revokedKey was revoked (usually a cancelled subscription).
403insufficient_planEndpoint needs a higher plan. The response includes current_plan and required_plan.
429rate_limit_exceededPer-minute burst limit hit. Honor the Retry-After header (60s).
429daily_limit_exceededDaily 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.

Request a refund

200+ signals from 25+ market data sources. Stock and crypto data aggregated, scored, and ranked daily. Signal health is monitored automatically.

  • No uptime SLA. Data refreshes daily, best-effort availability. Missing signals reduce weight rather than break output.
  • Algorithm updates: Scoring weights and fields may change. Breaking changes are announced in advance.
  • Cancel anytime from your Stripe dashboard. No contracts.

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 →