20 tools - type / or use the sidebar filter to jump to one

Tool Reference

Every Stocklake tool - parameters, response fields, and examples. Organized by what you're paying for: data is free, intelligence is Pro. ← Getting Started

Not financial advice. All data, ratings, signals, and AI assessments are for informational and research purposes only. Nothing here constitutes investment advice or a recommendation to buy or sell any security.
Data usage. Stocklake data is for your own use - research, analysis, and your own agents and tools. Reselling or redistributing API data or access, bulk-exporting data beyond normal API usage, or building a mirror or downstream feed on top of the API is not allowed, and accounts that do so can be suspended. See Acceptable Use in the Terms.
No tool matches - try a different search term.

get_stock free

Returns price, fundamentals, technical indicators, and company profile for a ticker - everything you need about a stock in one call.

Parameters

NameTypeDescription
symbolstringTicker symbol, e.g. AAPL. Case-insensitive.

Response fields

FieldTypeDescription
symbolstringTicker
namestringCompany full name
sector / industrystringSector and industry classification
country / currency / exchangestringCountry, reporting currency, exchange code
pricenumberCurrent market price (multi-source, authoritative)
change_pctnumberDay change %
volume / avg_volumenumberDay volume and average volume
prev_closenumberPrevious close
week52_high / week52_lownumber52-week range
market_cap / enterprise_valuenumberMarket cap and enterprise value, in the listing's own currency (see currency)
market_cap_usdnumber | nullMarket cap converted to US dollars; null when no FX rate is available for the listing currency
betanumberBeta vs market
pe_trailing / pe_forwardnumberTrailing and forward P/E ratios
price_to_booknumberPrice-to-book ratio
dividend_yield / dividend_rate / ex_dividend_datenumber / stringDividend info
debt_to_equitynumberD/E ratio
profit_margins / operating_margins / gross_marginsnumberNet, operating and gross profit margins (ratios, e.g. 0.25 = 25%)
revenue_growth / earnings_growthnumberYoY growth rates
earnings_date / earnings_is_estimate / last_earnings_datestring / bool / stringNext scheduled earnings report (UTC ISO; null when no date has been announced) and whether that date is an estimate; last_earnings_date is the most recent report
revenue_ttm / gross_profit_ttmnumberTrailing twelve-month revenue and gross profit
free_cashflownumberFree cash flow (TTM), in the listing currency. Converted from the filing currency when they differ; null with a financials_note when no rate is available
financial_currencystringCurrency the company files its statements in (e.g. CNY for BABA)
return_on_equitynumberROE
analyst_ratingstringAnalyst consensus label: strong_buy · buy · hold · sell · strong_sell
analyst_rating_scorenumberMean analyst recommendation score: 1.0 = strong buy, 5.0 = strong sell (lower is better)
analyst_target / analyst_countnumberMean price target and number of analyst opinions
indicatorsobjectRSI, MACD {macd_line, signal_line, histogram}, Bollinger Bands {upper_band, middle_band, lower_band}, SMA20/SMA200, EMA20/EMA200, ATR (all tiers). pro also unlocks every other field inside this same object: williams_r, ultimate_osc, vix_fix {value, percentile, spike}, williams_ad {trend, divergence}, td_sequential {setup_count, setup_direction (the setup currently counting: downtrend_exhaustion = counting falling closes, a decline that may be running out; uptrend_exhaustion = counting rising closes), countdown_count, countdown_complete, countdown_direction (same two values, for the countdown; can differ from setup_direction), signal (the most recent completed setup or countdown: DOWNTREND_EXHAUSTION_SETUP / UPTREND_EXHAUSTION_SETUP / DOWNTREND_EXHAUSTION_COUNTDOWN / UPTREND_EXHAUSTION_COUNTDOWN. It can be weeks old. For the count running now, read setup_direction with setup_count, or countdown_direction with countdown_count), phase}, elliott_wave {signal, trade_signal}, adx {adx, plus_di, minus_di}, ichimoku {tenkan, kijun, cloud_top, cloud_bot, above_cloud, below_cloud}, squeeze {squeeze_on, hist}, rs_rank (relative-strength rank 1-99, stocks only: past-year return with the latest quarter counted double, ranked against every tracked stock; 99 = strongest) - omitted entirely (not just unlabeled) for free/guest, along with any indicator added later.
descriptionstringLong-form company business description
websitestringCompany website URL
employeesintegerFull-time employee count
officersarrayTop 5 executives: name, title, total_pay
updated_atstringData freshness timestamp (ISO 8601 UTC)
ratingobjectpro Composite technical score: score (0-10), direction (POSITIVE/NEUTRAL/NEGATIVE), signals (per-indicator breakdown). Computed from the same indicators block, no extra AI cost.
signalsobjectpro Flat labeled technical signals - overall + rsi/macd/bollinger/sma200/sma50/williams_r/ultimate_osc/vix_fix/williams_ad/td_sequential/elliott_wave, each with a plain-English label pre-interpreted for programmatic use.
stance_signalsarraypro Unified list of per-source directional calls - technical rating, AI summary (near_term + longer_term), insider/institutional sentiment, analyst consensus, and any active screener signals. Each entry: stance (POSITIVE/NEGATIVE/NEUTRAL), conviction (0-10), horizon (INTRADAY/SWING/POSITION/LONG_TERM), edge_quality (PROVEN/OBSERVATION/UNKNOWN - that source's own signal_backtest track record), source, raw_label, as_of. A source with no data for this stock is simply omitted, not returned as null.
relative_strengthobjectpro Multi-window relative strength vs SPY, QQQ, and the stock's GICS sector ETF. windows: 5d/20d/60d/120d/12m → stock_return_pct plus rs_vs_spy/rs_vs_qqq/rs_vs_sector (percentage-point spread, stock return minus benchmark return - not a ratio). verdict: one-line plain-language read, e.g. "Laggard - weak near- and long-term". Windows/benchmarks with insufficient history are simply omitted; null if not precomputed yet for this symbol.
ai_verdict / ai_headlinestring / stringpro The minimum useful AI-narrative slice, precomputed (no extra AI cost) - positive/neutral/negative verdict and a one-line "why". For the full text (summary/key_points/risks/near_term/longer_term), call get_stock_research.
ai_score / ai_score_bandnumber | null / string | nullpro 0-100 AI research composite score - same 0-100 scale/band convention as get_signals' signal_score but a distinct field/pipeline. Band: Weak / Moderate / Strong / Very Strong. Null if no ai_summary doc exists yet.
forensic_scoresobjectpro Three classic forensic-accounting formulas computed from balance sheet/income statement/cash flow data, refreshed on each company's own filing cadence (roughly annual): altman_z {score, zone: safe/grey/distress} - Altman 1968 bankruptcy-risk composite; piotroski_f {score 0-9, strength: strong/moderate/weak} - Piotroski 2000 fundamental-strength score; beneish_m {score, likely_manipulator: bool} - Beneish 1999 earnings-manipulation-likelihood score (a screening heuristic, not a determination of actual manipulation). Every sub-block also carries a note explaining what it measures and known caveats - e.g. Altman Z isn't meaningful for banks/insurers and can flag REITs or client-money-float businesses as "distress" by design, not because anything is wrong. score: null means genuinely not computable for this company (common for financial-sector names), not an error. computed_at: ISO 8601 timestamp. No trading signal is derived from these scores anywhere in this API today.
sector_contextobjectpro Where this stock's fundamentals sit versus the other tracked equities in its own sector: revenue_growth, gross_margin and operating_margin, each {value, sector_median, percentile, n} - percentile is 0-100 (share of sector peers below this stock, ties counted half), n the number of peers with data. Purely descriptive positioning - no interpretation or direction. A metric is omitted when the stock has no value or the sector has fewer than 15 peers with data; the whole block is omitted when nothing is computable. Sectors are pooled globally across all tracked equities; baseline refreshed daily (as_of). get_stock (not get_stocks) also returns trend: {period: "quarterly", points: [...]}, oldest first - the same three metrics for the last few quarters (revenue growth is year-over-year), each as {value, sector_median, n} beside the sector median for that quarter, so you can see whether a company is gaining or losing ground on its peers. Off-cycle fiscal quarters are matched to the nearest calendar quarter; a quarter or metric is left out where either side lacks data.
Example
{ "symbol": "NVDA", "name": "NVIDIA Corporation", "price": 116.78, "change_pct": 2.31, "market_cap": 2847000000000, "pe_trailing": 38.2, "analyst_rating": "buy", "analyst_target": 165.00, "indicators": { "rsi": 58.4, "macd": { "macd_line": 1.23, "signal_line": 0.94, "histogram": 0.29 }, "bollinger_bands": { "upper_band": 124.1, "middle_band": 114.3, "lower_band": 104.5 } } }
Example - META (Communication Services, strong buy consensus)
{ "symbol": "META", "name": "Meta Platforms Inc.", "short_name": "Meta", "price": 635.29, "change_pct": 1.54, "volume": 18720000, "market_cap": 1612600000000, "pe_trailing": 27.8, "analyst_rating": "strong_buy", "analyst_target": 725.00, "indicators": { "rsi": 65.3, "macd": { "macd_line": 8.45, "signal_line": 6.12, "histogram": 2.33 }, "bollinger_bands": { "upper_band": 652.80, "middle_band": 598.40, "lower_band": 544.00 } } }
Example - Pro tier rating + signals (appended alongside the fields above)
{ "rating": { "score": 6.0, "direction": "POSITIVE", "signals": { "rsi": { "verdict": "mild_negative", "text": "strong (65.7) - mild negative" }, "macd": { "verdict": "positive", "text": "above signal - positive crossover" }, "trend": { "verdict": "positive", "text": "price > SMA50 > SMA200 - strong uptrend" } } }, "signals": { "overall": "POSITIVE", "rsi": { "value": 65.7, "signal": "approaching_overbought" }, "macd": { "signal": "positive", "histogram": 0.8984, "strength": "moderate" }, "sma200": { "trend": "above", "gap_pct": 20.7 } } }
Example - Pro tier stance_signals (appended alongside the fields above)
{ "stance_signals": [ { "stance": "POSITIVE", "conviction": 2, "horizon": "SWING", "edge_quality": "UNKNOWN", "source": "technical_rating", "raw_label": "6.0/10", "as_of": "2026-07-31T14:02:11+00:00" }, { "stance": "POSITIVE", "conviction": 7, "horizon": "LONG_TERM", "edge_quality": "UNKNOWN", "source": "ai_summary", "raw_label": "Cloud momentum accelerating into next earnings", "as_of": "2026-07-30T22:15:00+00:00" }, { "stance": "POSITIVE", "conviction": 9, "horizon": "LONG_TERM", "edge_quality": "UNKNOWN", "source": "analyst_consensus", "raw_label": "Strong Buy (58 analysts)", "as_of": "2026-07-31T14:02:11+00:00" } ] }
Example - Pro tier relative_strength (appended alongside the fields above)
{ "relative_strength": { "windows": { "5d": { "stock_return_pct": -8.31, "rs_vs_spy": -9.38, "rs_vs_qqq": -9.17, "rs_vs_sector": -8.91 }, "20d": { "stock_return_pct": -1.25, "rs_vs_spy": -0.68, "rs_vs_qqq": 3.57, "rs_vs_sector": 3.23 }, "60d": { "stock_return_pct": 7.54, "rs_vs_spy": 5.48, "rs_vs_qqq": 8.55, "rs_vs_sector": 4.29 }, "120d": { "stock_return_pct": 12.59, "rs_vs_spy": 4.37, "rs_vs_qqq": 0.33, "rs_vs_sector": -10.03 }, "12m": { "stock_return_pct": 49.41, "rs_vs_spy": 29.91, "rs_vs_qqq": 27.06, "rs_vs_sector": 15.23 } }, "verdict": "Mixed - lagging near-term, outperforming long-term" } }
Example - Pro tier AI-narrative slice (appended alongside the fields above)
{ "ai_verdict": "positive", "ai_headline": "Data center demand still outpacing supply into next quarter", "ai_score": 72, "ai_score_band": "Strong" }

get_stocks free+

Batch stock data for up to 25 symbols in a single call - the same fields get_stock returns for the same key/symbol, so this is a true batch, not a thinned-down scan. Returns prices, fundamentals, and indicators keyed by symbol. Each symbol in the batch counts as one call toward your daily limit. Pro tier adds the same precomputed rating/signals/relative_strength blocks as get_stock, together with forensic_scores, market_risk and sector_context (without its quarterly trend), plus ai_verdict/ai_headline/ai_score/ai_score_band per symbol - no extra AI cost. Not included even on Pro: stance_signals and the full ai_summary text - call get_stock/get_stock_research for those.

ParameterTypeDefaultDescription
symbolsarray of stringsrequiredStock tickers (max 25). Symbols with hyphens (e.g. BRK-B) are supported. Invalid symbols are silently skipped.
curl -s https://api.stocklake.dev/mcp \ -H "Authorization: Bearer sl_your_key" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_stocks","arguments":{"symbols":["JPM","GS"]}}}'
Example response
{ "count": 2, "symbols": { "JPM": { "symbol": "JPM", "name": "JPMorgan Chase & Co.", "sector": "Financial Services", "price": 296.73, "change_pct": -0.42, "volume": 8930000, "analyst_rating": "strong_buy", "indicators": { "rsi": 42.6, "macd": { "macd_line": -1.20, "signal_line": -0.80, "histogram": -0.40 }, "bollinger_bands": { "upper_band": 312.50, "middle_band": 298.10, "lower_band": 283.70 } }, "updated_at": "2026-06-01T14:00:00+00:00" }, "GS": { "symbol": "GS", "name": "The Goldman Sachs Group Inc.", "sector": "Financial Services", "price": 1008.37, "change_pct": 0.87, "volume": 2100000, "analyst_rating": "buy", "indicators": { "rsi": 68.2, "macd": { "macd_line": 5.60, "signal_line": 4.10, "histogram": 1.50 }, "bollinger_bands": { "upper_band": 1050.00, "middle_band": 985.00, "lower_band": 920.00 } }, "updated_at": "2026-06-01T14:00:00+00:00" } }, "requested": 2 }

Response includes the count of matched symbols plus a map with per-symbol data in the same format as get_stock. Requested symbols not found in the database are omitted from the result.

get_stock_history free+

Daily OHLCV price history for a ticker. Returns bars sorted oldest-first.

Parameters

NameTypeDefaultDescription
symbolstring-Ticker symbol
daysinteger90Number of trading days to return. Guest and free: max 365 (1 year). Pro: full history, up to 20,000 trading days - most established names go back decades. A full pull can be 10,000+ bars, so request only the window you need.

Response fields

FieldTypeDescription
symbolstringTicker
days_requestedintegerThe days you asked for, before any tier cap
days_returnedintegerBars in this response (same as count)
countintegerBars actually returned (may be less if data is newer)
historyarrayOHLCV bars: date, open, high, low, close, volume
history_availableobject{bars, earliest_date} - how much daily history exists for this ticker in total, regardless of the window returned
pro_unlocksstringPresent when a guest/free call asked for more than 365 days and was capped: says what Pro unlocks (the full history)
Example
{ "symbol": "AAPL", "days": 5, "count": 5, "history": [ { "date": "2026-04-29", "open": 208.40, "high": 212.10, "low": 207.80, "close": 211.50, "volume": 52183000 }, { "date": "2026-04-30", "open": 211.20, "high": 214.60, "low": 210.90, "close": 213.45, "volume": 48921000 } ] }
Example - AMZN 30-day history
{ "symbol": "AMZN", "days": 30, "count": 22, "history": [ { "date": "2026-04-29", "open": 247.40, "high": 250.60, "low": 246.80, "close": 249.75, "volume": 31045000 }, { "date": "2026-04-30", "open": 250.00, "high": 256.10, "low": 249.20, "close": 255.30, "volume": 28760000 }, { "date": "2026-05-01", "open": 257.10, "high": 264.80, "low": 256.40, "close": 263.90, "volume": 35412000 } ] }

get_market_pulse free

Live market health snapshot in a single call. Aggregates VIX, Fear & Greed index, market breadth, and key index prices - no AI cost, always live data.

Use this as a lightweight context check before making any investment decisions. Replaces the need to call multiple separate endpoints for basic macro state.

No parameters - returns the current market snapshot.

Response fields

FieldTypeDescription
vixnumberVIX level at last pipeline run
fear_greed.valuenumberFear & Greed index 0-100
fear_greed.descriptionstringLabel: "extreme fear" · "fear" · "neutral" · "greed" · "extreme greed"
breadth.oversold_pctnumber% of tracked stocks with RSI < 30
breadth.overbought_pctnumber% of tracked stocks with RSI > 70
breadth.neutral_pctnumber% of tracked stocks with RSI 30-70
breadth.universe_sizeintegerTotal stocks in the tracked universe
indices.spy / qqq / iwmobjectLive price, change_pct, RSI for SPY / QQQ / IWM
bonds_commodities.tlt / gldobjectTLT (long bonds) and GLD (gold) - price, change_pct, RSI
updated_atstringISO 8601 UTC timestamp of breadth + fear/greed snapshot - vix/indices/bonds_commodities above are live, but this snapshot comes from the same market intelligence pipeline as get_market_assessment (~4x/day, weekdays only, during market hours - dead overnight/weekends)
Example response
{ "vix": 15.71, "fear_greed": { "value": 55.0, "description": "neutral" }, "breadth": { "universe_size": 3501, "oversold_pct": 2.0, "overbought_pct": 7.6, "neutral_pct": 90.4 }, "indices": { "spy": { "price": 757.09, "change_pct": 0.38, "rsi": 67.97 }, "qqq": { "price": 733.81, "change_pct": 0.62, "rsi": 73.66 }, "iwm": { "price": 292.01, "change_pct": -0.31, "rsi": 57.73 } }, "bonds_commodities": { "tlt": { "price": 85.64, "change_pct": -0.42, "rsi": 52.41 }, "gld": { "price": 411.27, "change_pct": -0.18, "rsi": 38.43 } }, "data_age_hours": 0.7 }

get_earnings_calendar free+

Upcoming earnings dates for all stocks in the Stocklake universe, within a configurable look-ahead window. Dates sourced from market data - treat is_estimate: true dates as approximate.

Parameters

ParameterTypeDefaultDescription
daysinteger7Look-ahead window in days (max 30)

Response

FieldTypeDescription
window_daysnumberEffective look-ahead window applied
from_datestringWindow start (UTC ISO)
to_datestringWindow end (UTC ISO)
countnumberTotal results returned
results[].symbolstringTicker symbol
results[].namestringCompany short name
results[].sectorstringSector
results[].market_capnumberMarket capitalisation in reporting currency
results[].pricenumberCurrent stock price
results[].rsinumber | nullCurrent RSI - useful for pre-earnings momentum screening
results[].earnings_datestringExpected earnings timestamp (UTC ISO)
results[].is_estimatebooleanTrue if the date is an estimate - treat as approximate
results[].eps_trailingnumber | nullTrailing 12-month EPS
results[].eps_forwardnumber | nullForward EPS estimate

Example response

{ "window_days": 7, "from_date": "2026-05-06T10:00:00+00:00", "to_date": "2026-05-13T10:00:00+00:00", "count": 3, "results": [ { "symbol": "AAPL", "name": "Apple Inc.", "sector": "Technology", "market_cap": 3200000000000, "earnings_date": "2026-05-08T20:30:00+00:00", "is_estimate": false, "eps_trailing": 6.97, "eps_forward": 7.54 } ] }
Example - 30-day window
{ "window_days": 30, "from_date": "2026-05-06T10:00:00+00:00", "to_date": "2026-06-05T10:00:00+00:00", "count": 4, "results": [ { "symbol": "AMD", "name": "Advanced Micro Devices Inc.", "sector": "Technology", "market_cap": 845000000000, "earnings_date": "2026-05-20T20:30:00+00:00", "is_estimate": false, "eps_trailing": 3.95, "eps_forward": 4.82 }, { "symbol": "INTC", "name": "Intel Corporation", "sector": "Technology", "market_cap": 608000000000, "earnings_date": "2026-05-22T21:00:00+00:00", "is_estimate": false, "eps_trailing": 2.41, "eps_forward": 3.10 }, { "symbol": "IBM", "name": "International Business Machines Corp.", "sector": "Technology", "market_cap": 248000000000, "earnings_date": "2026-05-28T20:30:00+00:00", "is_estimate": true, "eps_trailing": 6.58, "eps_forward": 7.22 } ] }

get_screener free

Filter and rank stocks from the Stocklake universe - fundamentals, technicals, and (Pro) AI signals in one tool. Presets provide one-call screens for common setups.

Parameters

NameTypeDefaultDescription
presetstring-oversold (RSI≤35, above SMA200) · overbought (RSI≥65) · momentum (RSI 50-70, above SMA200, up 0.5%+) · high_conviction (ai_score≥70, Pro only)
sectorstring-e.g. "Technology", "Healthcare"
countrystring-e.g. "United States", "Germany"
min_rsi / max_rsinumber-Exact RSI bounds (e.g. min_rsi=30, max_rsi=50 = post-oversold recovery zone)
sma_trendstring-above_200 / below_200 - price vs 200-day MA
macd_signalstring-positive / negative - MACD line vs signal line
min_perf_1d / max_perf_1dnumber-1-day performance % bounds (e.g. min_perf_1d=2.0 = up 2%+ today)
min_volumeinteger-Minimum daily volume. e.g. 1000000
min_market_cap_b / max_market_cap_bnumber-Market cap in billions of US dollars, compared against market_cap_usd (non-USD listings are converted first)
max_pe_forwardnumber-Maximum forward P/E
analyst_ratingstring-strong_buy / buy / hold / sell / strong_sell
min_ai_scoreinteger-Minimum AI score 0-100 - Pro tier only. Gates on the same ai_score field returned below (renamed 2026-08-24 from the retired 0-10 min_flag_score).
sort_bystringmarket_capmarket_cap / rsi / perf_1d / volume / analyst_rating / rating / ai_score (Pro)
sort_dirstringdescasc / desc
limitinteger201-25. Each returned stock counts as one call toward your daily limit.

Response fields (per result)

FieldTypeDescription
symbol, name, sector, industry, countrystringStock identity
price, change_pct, volumenumberCurrent price, 1-day change %, day volume
market_cap, pe_forwardnumberFundamentals (market_cap in the listing's own currency)
market_cap_usd, currencynumber | null, stringMarket cap in US dollars (what the market_cap sort and cap filters use) and the listing currency
rsinumberRSI value
macd_signalstringpositive / negative / neutral
sma200_trendstringabove / below
analyst_ratingstringbuy / hold / sell etc.
ratingnumber0-10 technical composite score
ai_verdictstringPro only - positive / neutral / negative
ai_scorenumber | nullPro only - 0-100 AI research composite score, same scale/band convention as get_signals' signal_score but a distinct field/pipeline. Null if no ai_summary doc exists yet.
ai_score_bandstring | nullPro only - Weak / Moderate / Strong / Very Strong, or null
Example - preset: oversold
{ "count": 8, "preset": "oversold", "filters": { "max_rsi": 35, "sma_trend": "above_200", "sort_by": "market_cap", "sort_dir": "desc" }, "results": [ { "symbol": "VZ", "name": "Verizon Communications", "sector": "Communication Services", "industry": "Telecom Services", "country": "United States", "price": 38.42, "change_pct": -0.8, "volume": 18400000, "rsi": 28.9, "macd_signal": "negative", "sma200_trend": "above", "analyst_rating": "hold", "rating": 3.4, "ai_score": 62, "ai_score_band": "Moderate" } ] }

get_market_movers free

Top market movers from the Stocklake universe - gainers, losers, and most active by volume. A fast way to see what's moving in the market right now.

Parameters

NameTypeDefaultDescription
categorystringallgainers / losers / most_active / all (all returns all 3 categories)
limitinteger10Results per category (max 20). Each returned stock counts as one call toward your daily limit - a symbol appearing in more than one category counts once per category.
min_market_cap_bnumber-Filter to stocks above this market cap in billions of US dollars (e.g. 1.0 = $1B+ only), compared against market_cap_usd

Response

Returns gainers[], losers[], most_active[] (whichever categories requested). Each entry: symbol, name, sector, price, change_pct, volume, rsi, market_cap (listing currency), market_cap_usd, currency, analyst_rating, atr_pct (volatility as % of price - omitted when the underlying reading is missing or corrupted). pro adds ai_verdict / ai_headline / ai_score (0-100) / ai_score_band (Weak/Moderate/Strong/Very Strong) - a big move's price/volume/RSI alone doesn't say whether it matters; the headline is the "why".

Example
{ "category": "all", "limit_per_category": 3, "gainers": [ { "symbol": "SMCI", "name": "Super Micro Computer", "sector": "Technology", "price": 48.20, "change_pct": 18.4, "volume": 42810000, "rsi": 67.2, "market_cap": 28400000000, "analyst_rating": "buy", "atr_pct": 6.85, "ai_verdict": "positive", "ai_headline": "Server backlog extending into next fiscal year", "ai_score": 69, "ai_score_band": "Strong" } ], "losers": [ { "symbol": "WBA", "name": "Walgreens Boots Alliance", "sector": "Healthcare", "price": 9.82, "change_pct": -12.7, "volume": 18200000, "rsi": 22.4, "market_cap": 8500000000, "analyst_rating": "hold", "atr_pct": 4.12 } ], "most_active": [ { "symbol": "TSLA", "name": "Tesla", "sector": "Consumer Cyclical", "price": 192.40, "change_pct": 2.1, "volume": 94000000, "rsi": 54.8, "market_cap": 614000000000, "analyst_rating": "buy", "atr_pct": 3.27 } ] }

get_indicator_history pro

Daily indicator snapshots for a symbol - up to 2 years of history. Default returns RSI, MACD histogram, Bollinger band position, and 20/200-day SMA per day - enough for most charting and trend analysis. Pass full=true to also get Williams %R, VIX Fix, Williams A/D trend, DeMark TD Sequential, and analyst rating/target, which barely change day to day and roughly double response size over a long window.

Parameters

NameTypeDefaultDescription
symbolstring-Ticker symbol
daysinteger90Number of calendar days to look back. Max 730 (2 years).
fullbooleanfalsefalse returns the 5 basic fields below per day; true adds the 8 specialized/slow-moving fields marked "full only".

Response fields

FieldTypeDescription
symbolstringTicker
daysintegerDays requested
fullbooleanEchoes the requested full param
countintegerSnapshots returned
snapshotsarraySnapshots sorted oldest-first (see fields below). Empty (with a note field instead) if fewer than 3 found.
snapshots[].recorded_atstringSnapshot date, YYYY-MM-DD
snapshots[].pricenumberPrice at snapshot time
snapshots[].rsinumberRSI(14) value
snapshots[].macd_histogramnumberMACD histogram (line − signal)
snapshots[].bb_pctnumberBollinger band position 0-100: 0 = at lower band, 100 = at upper band
snapshots[].sma20 / sma200number20-day and 200-day simple moving averages
snapshots[].williams_rnumberfull only. Williams %R (0 to −100)
snapshots[].ultimate_oscnumberfull only. Ultimate Oscillator (0-100; >70 overbought, <30 oversold)
snapshots[].vix_fix_valuenumberfull only. Williams VIX Fix synthetic fear gauge (higher = more fear)
snapshots[].williams_ad_trendstringfull only. rising / falling / flat
snapshots[].td_signalstring | nullfull only. The most recent completed TD Sequential setup or countdown as of that day, named for the move that is running out: DOWNTREND_EXHAUSTION_SETUP / UPTREND_EXHAUSTION_SETUP / DOWNTREND_EXHAUSTION_COUNTDOWN / UPTREND_EXHAUSTION_COUNTDOWN / null
snapshots[].td_phasestring | nullfull only. setup_active / setup_complete / countdown_active / countdown_done / null
snapshots[].analyst_ratingstring | nullfull only. buy / outperform / hold / underperform / sell / null
snapshots[].analyst_targetnumber | nullfull only. Mean analyst price target
Example - default (full=false)
{ "symbol": "NVDA", "days": 90, "full": false, "count": 87, "snapshots": [ { "recorded_at": "2026-04-02", "price": 103.20, "rsi": 28.4, "macd_histogram": -1.82, "bb_pct": 6.3, "sma20": 112.40, "sma200": 128.90 } ] }
Example - full=true
{ "symbol": "NVDA", "days": 90, "full": true, "count": 87, "snapshots": [ { "recorded_at": "2026-04-02", "price": 103.20, "rsi": 28.4, "macd_histogram": -1.82, "bb_pct": 6.3, "sma20": 112.40, "sma200": 128.90, "williams_r": -88.1, "ultimate_osc": 22.7, "vix_fix_value": 18.6, "williams_ad_trend": "falling", "td_signal": null, "td_phase": null, "analyst_rating": "buy", "analyst_target": 142.00 }, { "recorded_at": "2026-07-01", "price": 142.85, "rsi": 61.3, "macd_histogram": 2.14, "bb_pct": 68.7, "sma20": 136.10, "sma200": 131.20, "williams_r": -24.5, "ultimate_osc": 58.1, "vix_fix_value": 9.3, "williams_ad_trend": "rising", "td_signal": "DOWNTREND_EXHAUSTION_SETUP", "td_phase": "setup_active", "analyst_rating": "buy", "analyst_target": 160.00 } ] }

get_stock_financials free+

Raw financial statements - balance sheet, income statement, and cash flow line items. This is the underlying statement data itself, not a derived summary - for the forensic-accounting scores computed FROM these statements (Altman Z / Piotroski F / Beneish M), see get_stock's forensic_scores block instead.

Each returned statement is shaped {line_item_name: {period_end_iso: value}} - e.g. balance_sheet["Total Revenue"]["2025-12-31"] - so you get every available period per line item and can compute your own trends/deltas/CAGRs, not just the latest value. Values are in the company's reporting currency (financial_currency), which can differ from the trading currency. ~50-60 curated line items per statement (not a raw dump of every reported row); coverage genuinely varies by symbol and sector - a bank has no "Inventory" line, a company with no buyback program has no "Repurchase Of Capital Stock" entry. A missing line item means the company doesn't report it, not a fetch error.

Free and guest get the latest fiscal year: all three statements, one period per line item, and the statement filter works. Asking for quarterly or both returns that latest annual year with quarterly: null and a pro_unlocks note, not an error. Pro gets up to 5 fiscal years, the ~7-8 most recent quarters, and period=both.

Parameters

NameTypeDefaultDescription
symbolstring-Ticker symbol. Also accepts a company name as a fallback when it uniquely resolves to one symbol.
periodstringannualannual (Pro: up to 5 fiscal years; free: the latest fiscal year), quarterly (Pro: up to ~7-8 most recent quarters), or both (Pro). Free/guest asking for quarterly/both get the latest annual year plus pro_unlocks.
statementstringallall, balance_sheet, income_stmt, or cash_flow - restricts which statement(s) come back.

Response fields

FieldTypeDescription
symbolstringTicker
periodstringEchoes the requested period
statementstringEchoes the requested statement
period_endstringLatest annual fiscal-year-end on file, for reference
financial_currencystringReporting currency of the statement values, e.g. USD, EUR, JPY
annualobject | nullPresent when period is annual or both, and always for free/guest. On free/guest it holds only the latest fiscal year (periods has one date). {periods: [...], balance_sheet: {...}, income_stmt: {...}, cash_flow: {...}} (narrowed to one statement key if statement isn't all). null with an annual_note if this symbol hasn't been widened yet.
quarterlyobject | nullPresent when period is quarterly or both. Same shape as annual. null with a quarterly_note if not yet fetched, or if this symbol genuinely has no usable quarterly data. Always null for free/guest (see pro_unlocks).
annual_periods_availableintegerFree/guest only: how many fiscal years are on file, i.e. what Pro would return
pro_unlocksstringFree/guest only: what Pro adds for this symbol (more fiscal years, quarterly statements)
notestringPresent instead of annual/quarterly when this symbol has no financials data on file at all (not yet synced, or a non-equity with no statement data - ETFs/crypto/forex/indices aren't covered by this tool).
Example - Pro, period=annual, statement=income_stmt
{ "symbol": "MSFT", "period": "annual", "statement": "income_stmt", "period_end": "2026-06-30", "annual": { "periods": ["2026-06-30", "2025-06-30", "2024-06-30", "2023-06-30", "2022-06-30"], "income_stmt": { "Total Revenue": {"2026-06-30": 315000000000, "2025-06-30": 281000000000}, "Diluted EPS": {"2026-06-30": 13.42, "2025-06-30": 11.80} } } }
Example - free tier, period=quarterly, statement=cash_flow
{ "symbol": "AAPL", "period": "quarterly", "statement": "cash_flow", "period_end": "2025-09-30", "financial_currency": "USD", "annual": { "periods": ["2025-09-30"], "cash_flow": { "Operating Cash Flow": {"2025-09-30": 111482000000}, "Free Cash Flow": {"2025-09-30": 98767000000} } }, "quarterly": null, "annual_periods_available": 5, "pro_unlocks": "Free returns the latest fiscal year only. Pro unlocks the full 5-year annual history on file for this symbol and the most recent ~7-8 quarters - for trend, growth and margin analysis." }

get_analyst_trend pro

How analyst consensus on a stock has moved over time - the trajectory of the rating and the price targets, not just today's value. get_stock gives the current analyst_rating and analyst_target; this tool answers "are analysts getting more or less positive on this name?" with one row per day, up to a year back. Snapshots are taken once per weekday, so a 90-day window is roughly 60 rows. History begins July 2026 and grows daily.

Parameters

NameTypeDefaultDescription
symbolstring-Ticker symbol. A company name is accepted as a fallback when it resolves to exactly one symbol.
daysinteger90Number of calendar days to look back. Max 365.

Response fields

FieldTypeDescription
symbolstringTicker
daysintegerDays requested (after clamping to 1-365)
countintegerSnapshots returned
snapshotsarraySnapshots sorted oldest-first (see fields below). Empty, with a note field instead, if fewer than 2 exist in the window - a single point is not a trend.
snapshots[].datestringSnapshot date, YYYY-MM-DD
snapshots[].analyst_ratingstring | nullConsensus label: strong_buy / buy / hold / underperform / sell / strong_sell. Derived from analyst_rating_score on days the source reports no label.
snapshots[].analyst_rating_scorenumber | nullMean recommendation: 1.0 = strong buy, 5.0 = strong sell (lower is more positive). Same scale as get_stock.
snapshots[].analyst_countinteger | nullNumber of analysts contributing
snapshots[].analyst_targetnumber | nullMean analyst price target
snapshots[].analyst_target_high / analyst_target_lownumber | nullHighest and lowest individual price target
snapshots[].analyst_target_mediannumber | nullMedian price target
snapshots[].pricenumber | nullThe stock's price on that date, so a target can be read against where the stock actually traded

A field is null on a day the source reported none - a symbol's rating can be null on some days even when its price targets are present, because the source occasionally drops the consensus label. A weekday can also be missing entirely when the daily snapshot did not run; those days cannot be reconstructed, so the date is simply absent. Most of the tracked universe has a usable history; ETFs and other instruments with no analyst coverage return an empty snapshots array. For price and indicator history, see get_indicator_history - this tool covers analyst consensus only.

Example - AAPL, consensus drifting slightly less positive as the mean target rises
{ "symbol": "AAPL", "days": 90, "count": 3, "snapshots": [ { "date": "2026-07-10", "analyst_rating": "buy", "analyst_rating_score": 2.02, "analyst_count": 42, "analyst_target": 315.57, "analyst_target_high": 400.0, "analyst_target_low": 215.0, "analyst_target_median": 315.0, "price": 316.75 }, { "date": "2026-08-14", "analyst_rating": "buy", "analyst_rating_score": 2.13, "analyst_count": 41, "analyst_target": 322.28, "analyst_target_high": 400.0, "analyst_target_low": 215.0, "analyst_target_median": 335.0, "price": 305.7 }, { "date": "2026-09-18", "analyst_rating": "buy", "analyst_rating_score": 2.2, "analyst_count": 39, "analyst_target": 327.84, "analyst_target_high": 405.0, "analyst_target_low": 215.0, "analyst_target_median": 340.0, "price": 335.94 } ] }

get_economic_calendar free+

Upcoming and recently-released macro/economic events - interest rate decisions, CPI, GDP, PMI, unemployment, payrolls, retail sales, and more.

Two buckets: released_recent always carries a real actual value (never blank) plus diff - a plain arithmetic difference, actual minus previous, never a beat/miss or consensus judgment, since point-in-time consensus is not available. upcoming never carries an actual value. Every item in both buckets carries key_event: true for the handful of event types that reliably move markets on their own (rate decisions, CPI, GDP, headline Non-Farm Payrolls) - an event-TYPE flag only, never a beat/miss or directional judgment on the number itself.

Free vs Pro. Every tier gets the same tool, filters and response shape - only the window differs. Guest and free: up to 7 days ahead (days), 2 days back (lookback_days) and 20 results per bucket (limit). Pro: up to 14 days ahead, 7 days back and 50 per bucket. A guest/free value above its cap is served at the cap, and the response adds capped and a pro_unlocks note - never an error.

Parameters

NameTypeDefaultDescription
daysinteger3Look-ahead window in days for upcoming events. Max 7 on guest/free, 14 on Pro.
lookback_daysinteger2Look-back window in days for recently-released events. Max 2 on guest/free, 7 on Pro. Actual values arrive with about a 1-day reporting lag - keep this at 2+ to reliably see real releases.
limitinteger20Max results per bucket - released_recent and upcoming each capped independently. Max 20 on guest/free, 50 on Pro.
major_onlybooleanfalseRestrict to the 8 largest economies: United States, Euro Area, United Kingdom, Japan, China, Germany, France, Canada.
key_events_onlybooleanfalseRestrict to rate decisions, CPI, GDP, and headline Non-Farm Payrolls - the subset flagged key_event: true.

Response fields

FieldTypeDescription
window_daysintegerEffective look-ahead window applied
lookback_daysintegerEffective look-back window applied
todaystringServer's current date, YYYY-MM-DD (UTC)
released_recentarrayRecently-released events, major-economy-first then most-recent-first
released_recent[].countrystringCountry or region name
released_recent[].eventstringEvent name
released_recent[].datestringRelease date, YYYY-MM-DD
released_recent[].timestring | nullRelease time, UTC, when known
released_recent[].actualstringReported value. Always present in this bucket.
released_recent[].previousstring | nullPrior period's value
released_recent[].consensusstring | nullMarket consensus, when one is available (often null - see note above)
released_recent[].diffstring | nullactual minus previous, signed (e.g. "+0.1", "-2.7"). Null if either value is missing or non-numeric. Never a beat/miss judgment.
released_recent[].key_eventbooleantrue for rate decisions, CPI, GDP, or headline Non-Farm Payrolls
upcomingarrayNot-yet-released events, major-economy-first then soonest-first. Same fields as released_recent except no actual/diff.
released_total / upcoming_totalintegerHow many events matched before the row limit was applied.
truncated_notestringPresent only when the row limit cut a list. Lists are major-economy-first, so a cut list can end days before the window does; narrow with key_events_only or major_only.
cappedobjectGuest/free only, present only when a value was above the free cap. One entry per capped param, e.g. {"days": {"requested": 14, "served": 7}}.
pro_unlocksstringPresent alongside capped: what Pro unlocks (14 days ahead, 7 back, 50 per bucket).
Example
{ "window_days": 3, "lookback_days": 2, "today": "2026-09-02", "released_recent": [ { "country": "Germany", "event": "CPI Prelim YY *", "date": "2026-08-31", "time": "12:00 UTC", "actual": "2.9", "previous": "2.8", "consensus": null, "diff": "+0.1", "key_event": true }, { "country": "United States", "event": "ISM Manufacturing PMI", "date": "2026-09-01", "time": "14:00 UTC", "actual": "54.6", "previous": "55.6", "consensus": null, "diff": "-1", "key_event": false } ], "upcoming": [ { "country": "Canada", "event": "BoC Rate Decision", "date": "2026-09-02", "time": "14:00 UTC", "actual": null, "previous": "2.25", "consensus": null, "key_event": true }, { "country": "United States", "event": "Non-Farm Payrolls", "date": "2026-09-04", "time": null, "actual": null, "previous": "-23", "consensus": null, "key_event": true } ] }

get_stock_news free+ AI

Returns AI-analysed news articles for a ticker. Each article has been processed by our AI pipeline - raw article content is not exposed. Free/guest get up to 5 headlines (title and date, no AI fields); Pro gets up to 50 articles with a full AI summary, plus this symbol's live signal_score, over a 90-day window.

One article per event: articles about the same event are merged into the newest one, so limit counts distinct events. Articles without a usable summary are left out.

When no articles are found, the ticker is automatically queued for a background refresh. Re-queuing an already-pending ticker does not count against your limit.

Parameters

NameTypeDescription
symbolstringTicker symbol
limitintegerMax articles to return. Default 10. Guest and free: up to 5. Pro: up to 50.
daysintegerLook-back window in days. Default 30. Guest and free: max 30. Pro: max 90.

Response

Outer envelope fields:

FieldTypeDescription
symbolstringTicker
statusstringok empty - see below
countintegerNumber of articles returned
daysintegerEffective look-back window in days (guest and free max 30, Pro max 90)
articlesarrayArticle objects (see below)
messagestringPresent when status is empty

Status values:

  • ok - articles returned
  • empty - no news found for this window; pipeline triggered in background if data was stale

Per-article fields:

FieldTypeDescription
titlestringArticle headline
published_atdatetimePublication timestamp (ISO 8601)
ai_sentimentstringPro only. POSITIVE / NEUTRAL / NEGATIVE / MIXED
ai_summarystringPro only. Full AI-generated summary of the article's relevance to the stock
signal_scorenumber | nullPro only. If this symbol has a currently-active news-sourced signal, every article shows that LIVE score - same value get_signals/get_stock_research report, kept in sync as the signal is re-scored (a per-symbol value, so every article for the symbol shows the same number then). Always a single number even then - for a genuinely two-sided signal (real opposing bull/bear theses, direction NEUTRAL), this is the stronger of the two sides. When there's no active signal for the symbol, each article instead gets its own per-article magnitude computed from that article's own AI classification - so different articles can show different numbers in that case. Null only when neither a live signal nor a computable per-article value exists.
signal_score_bandstring | nullPro only. Weak / Moderate / Strong / Very Strong. Null when signal_score is null.
collapsed_countintegerPresent only when several articles reported the same event (for example one analyst's target change carried by several outlets). Only the newest is returned; this is the number of articles merged into it.

Note: there is no field called news_score anywhere on this API - signal_score is the one name, whether it resolves to a per-symbol live signal (preferred here when one exists) or a per-article magnitude (the fallback here when it doesn't, and the norm on get_news_feed, ranked by its own AI-assessed strength).

Example - status ok
{ "symbol": "TSLA", "status": "ok", "count": 3, "days": 30, "articles": [ { "title": "Tesla Q1 deliveries beat expectations", "published_at": "2026-04-03T14:00:00+00:00", "ai_sentiment": "positive", "ai_summary": "Q1 deliveries of 387k beat analyst consensus of 375k, signalling demand stabilisation and easing investor concerns over weakening EV demand.", "signal_score": { "POSITIVE": 72.3, "NEGATIVE": 39.6 }, "signal_score_band": null } ] }
Example - status empty
{ "symbol": "RKLB", "status": "empty", "count": 0, "days": 30, "articles": [], "message": "No news available for RKLB in the last 30d." }

get_stock_research pro AI

Full research bundle for a symbol in one call - replaces 4 separate calls: get_stock + get_stock_news + get_insider_activity + get_signals (filtered to one symbol), plus the AI-generated summary (verdict, narrative, key points, risks) bundled in as ai_summary. All data is pre-computed by the nightly AI pipeline; no live AI calls on request.

Parameters

NameTypeDescription
symbolstringTicker symbol

Response sections

SectionKey fields
stocksymbol, name, sector, price, change_pct, market_cap, pe_forward, pe_trailing, beta, dividend_yield, week52_high/low, analyst_rating, analyst_target, rsi, sma200_trend
ai_summaryverdict, ai_score (0-100) / ai_score_band (Weak/Moderate/Strong/Very Strong - the AI research composite, same scale/band convention as signal_score but a distinct field/pipeline), summary, key_points[] (3-5 specific positive/neutral observations), risks[] (2-3 specific risk factors), price_at_generation (stock price when the summary was generated), generated_at, headline (one-sentence plain-language take), near_term {stance, confidence} (view over <4 weeks, technicals/momentum-weighted), longer_term {stance, confidence} (view over a multi-month horizon, fundamentals/analyst/institutional-flow-weighted) - headline/near_term/longer_term are null on summaries generated before this schema shipped; fall back to verdict/ai_score until that symbol's next regeneration
newsLast 3 AI-flagged articles, one per event: title, published_at, ai_sentiment, ai_summary, signal_score (0-100)/signal_score_band, and collapsed_count (articles merged into it) when several reported the same event
sentimentsignal, signal_score (0-100) / signal_score_band (Weak/Moderate/Strong/Very Strong - no separate "insider_score" field, same name/formula as every other signal_score on this API), insider_trend (buying/selling/neutral, or null with no transactions in the window), institutional_pct, updated_at
signalsUp to the 5 most recent signals for this symbol in the last 90 days (array - a symbol can have more than one over that window): direction, signal_score (0-100 - always a single number, even for a NEUTRAL/two-sided idea, see get_signals' own signal_score row above), signal_score_band, source, rationale, expires, flagged_at. Recency-gated, not gated on whether Stocklake's own trading engine still holds the signal live. Empty array if none in that window.
directional_conflictOnly present when ai_summary.verdict and the most recent active signal's direction genuinely disagree (e.g. verdict=negative alongside an active POSITIVE signal) - these come from independent AI pipelines with different horizons and can legitimately point opposite ways. Fields: ai_summary_verdict, signal_direction, note. Absent (not null) when there's nothing to compare or the two agree.
forensic_scoresSame object as get_stock's forensic_scores block - three classic forensic-accounting formulas: altman_z {score, zone: safe/grey/distress}, piotroski_f {score 0-9, strength: strong/moderate/weak}, beneish_m {score, likely_manipulator: bool}, each with its own note. score: null means genuinely not computable for this company (common for financial-sector names), not an error. Absent (no key at all) if this symbol has no forensic_scores doc yet.
Example (condensed)
{ "stock": { "symbol": "ORCL", "name": "Oracle Corporation", "sector": "Technology", "price": 192.40, "change_pct": 1.4, "rsi": 68.9, "sma200_trend": "above", "analyst_rating": "buy", "analyst_target": 210.0 }, "ai_summary": { "verdict": "positive", "ai_score": 78, "ai_score_band": "Strong", "summary": "Strong cloud momentum, AI workload growth accelerating...", "key_points": ["Cloud ARR up 23% YoY", "AI training contracts with major hyperscalers"], "risks": ["Elevated valuation at 28x forward earnings"], "price_at_generation": 192.40, "generated_at": "2026-06-10T20:30:38+00:00", "headline": "Cloud momentum accelerating into next earnings", "near_term": { "stance": "POSITIVE", "confidence": 7 }, "longer_term": { "stance": "POSITIVE", "confidence": 8 } }, "news": [ { "title": "Oracle beats Q3 earnings, cloud growth accelerates", "published_at": "2026-06-10T20:15:00+00:00", "ai_sentiment": "positive", "ai_summary": "Beat on EPS and revenue, cloud segment +31%..." } ], "sentiment": { "signal": "POSITIVE", "signal_score": 68, "signal_score_band": "Strong", "insider_trend": "neutral", "institutional_pct": 72.1, "updated_at": "2026-06-04T23:07:46+00:00" }, "signals": [ { "direction": "POSITIVE", "signal_score": 84, "signal_score_band": "Very Strong", "source": "screener", "rationale": "Strong AI cloud catalyst, momentum breakout...", "expires": "2026-06-12", "flagged_at": "2026-06-05T14:22:00+00:00" } ] }

get_insider_activity free+ AI

Insider transactions for a stock, from regulatory insider filings for the US, Germany, the Netherlands and Spain. Where no regulatory filing is on record, market data fills the gap and the response says so. The filing facts are free: every tier gets buy/sell counts and the individual filings behind them. Pro adds the AI read of insider and institutional activity and the institutional holder data.

  • Free / guest: insider_buys, insider_sells, summary and the 5 most recent transactions over a fixed 90-day window. A larger days is capped at 90 and the response says so in days_note. No AI fields, no institutional holders.
  • Pro: days up to 365, up to 50 transactions, plus signal, signal_score, insider_signal/inst_signal, ai_commentary, top_holders, inst_ownership, total_holders and holder_count_divergence.

The counts and the rows come from the same merge and the same window, so they always agree, and the free counts match what Pro returns for the same window. Coverage outside the US is narrower than in the US, so an empty list for a non-US company often means no filing on record, not a broken lookup. Institutional holders are merged from two feeds and refreshed nightly.

Parameters

ParameterTypeRequiredDefaultDescription
symbolstring✓-Ticker symbol (e.g. AAPL, TSLA)
daysinteger90Insider-transaction window in days. Pro: 1-365. Free/guest: 1-90 (a larger value is capped at 90). Applies to transactions, insider_buys and insider_sells.

Response fields

FieldTypeDescription
symbolstringTicker
insider_buysintInsider buy filings in the window (open-market purchases; grants, gifts and option exercises are excluded)
insider_sellsintInsider sell filings in the window
transactionsarrayThe filings behind those counts, newest first: date, name, role, type (BUY/SELL), shares, price, value. Free/guest: up to 5. Pro: up to 50.
summarystringOne-line factual readout computed from the returned transactions/counts above: buy/sell counts, dollar totals, insider count and date range. Always agrees with the counts and rows next to it.
insider_buy_valuenumberTotal value of the buy filings in the window (listing currency)
insider_sell_valuenumberTotal value of the sell filings in the window (listing currency)
window_daysintThe window actually applied
source / source_namestring | nullWhich kind of feed was used: regulatory_filing or market_data (gap fill only). Null when nothing is on record.
updated_atstringISO 8601 UTC time the filings behind transactions were last fetched.
days_requestedintFree/guest only. The days you asked for, before the 90-day cap.
days_notestringFree/guest only, present when days was capped.
transactions_notestringFree/guest only, present when there are more filings in the window than the 5 returned.
notestringPresent when no insider buys or sells are on record in the window.
pro_unlocksstringFree/guest only. What Pro adds.
signalstringpro Combined AI sentiment: STRONG_POSITIVE, POSITIVE, NEUTRAL, NEGATIVE, STRONG_NEGATIVE
signal_scorenumber | nullpro 0-100, higher = stronger/more notable - the exact same field, formula, scale and bands as every other signal_score on this API.
signal_score_bandstring | nullpro Weak/Moderate/Strong/Very Strong. Null when signal_score is null.
insider_signalstringpro Insider-only AI signal: POSITIVE, NEGATIVE, NEUTRAL, NONE
inst_signalstringpro Institutional-only AI signal: POSITIVE, NEGATIVE, NEUTRAL, NONE
ai_commentary / ai_commentary_as_ofstring | nullpro A separately-generated AI narrative (names, amounts, direction) on its own refresh cadence, with the time it was written. It can lag the current filings - trust summary and transactions if they disagree.
top_holdersarraypro Up to 15 institutional holders: name, shares, pct_held, sources, share_counts_by_source
holder_count_divergenceobject | nullpro Non-null when the two holder feeds (filings, market_data) disagree on share counts by the same factor, which means holder share counts for this symbol may be unreliable
inst_ownershipnumber | nullpro Institutional ownership percentage as a float (e.g. 74.55)
total_holdersint | nullpro Total institutional holders

Example response

Example - free/guest, NVDA with days=365 (capped at 90)
{ "symbol": "NVDA", "days_requested": 365, "insider_buys": 0, "insider_sells": 7, "transactions": [ { "date": "2026-09-17T00:00:00+00:00", "name": "Kress Colette", "role": "EVP & Chief Financial Officer", "type": "SELL", "shares": 34918, "price": 219.0455, "value": 7648632.46 }, { "date": "2026-09-04T00:00:00+00:00", "name": "STEVENS MARK A", "role": "Director", "type": "SELL", "shares": 622239, "price": 231.6199, "value": 144122944.06 }, { "date": "2026-09-03T00:00:00+00:00", "name": "STEVENS MARK A", "role": "Director", "type": "SELL", "shares": 400000, "price": 228.7848, "value": 91513923.35 }, { "date": "2026-09-02T00:00:00+00:00", "name": "STEVENS MARK A", "role": "Director", "type": "SELL", "shares": 1200000, "price": 223.3346, "value": 268001520.0 }, { "date": "2026-09-01T00:00:00+00:00", "name": "STEVENS MARK A", "role": "Director", "type": "SELL", "shares": 63501, "price": 220.0589, "value": 13973960.21 } ], "window_days": 90, "source": "regulatory_filing", "source_name": "Regulatory insider filings", "transactions_note": "Showing the 5 most recent of 7 filings in the last 90 days.", "days_note": "days=365 capped at 90 on the free tier; Pro allows up to 365.", "pro_unlocks": "Pro adds the AI read (signal, signal_score, insider_signal/inst_signal and a written summary), a window of up to 365 days with up to 50 filings, and institutional holders (top_holders, inst_ownership, total_holders, holder_count_divergence)." }
Example - Pro (transactions, window_days, source, top_holders and holder_count_divergence omitted here for brevity)
{ "symbol": "BG", "signal": "POSITIVE", "signal_score": 68, "signal_score_band": "Strong", "insider_signal": "NEGATIVE", "inst_signal": "POSITIVE", "summary": "0 buys ($0) and 1 sell ($337K) by 1 insider, on 2026-08-14.", "ai_commentary": "COO Garros Julio sold $337K - lone negative insider signal. Institutions strongly positive: 377 holders increased (+28.6M sh) vs 283 decreased. 128 new holders added 20.9M sh.", "insider_buys": 0, "insider_sells": 1, "inst_ownership": 99.81, "total_holders": 758, "updated_at": "2026-05-11T22:16:29.930700+00:00" }
Example - CRM (STRONG_POSITIVE, high insider buying)
{ "symbol": "CRM", "signal": "STRONG_POSITIVE", "signal_score": 91, "signal_score_band": "Very Strong", "insider_signal": "POSITIVE", "inst_signal": "POSITIVE", "summary": "4 buys ($16.6M) and 0 sells ($0) by 4 insiders, 2026-07-02 to 2026-08-11.", "ai_commentary": "CEO Benioff bought $12.4M worth of shares - largest insider buy in 3 years. Three additional C-suite insiders added $4.2M combined. Institutions increased holdings by 3.2% this quarter with 42 new holders opening positions. Strong alignment between insider and institutional conviction.", "insider_buys": 4, "insider_sells": 0, "inst_ownership": 82.15, "total_holders": 2410, "updated_at": "2026-05-28T06:15:00+00:00" }

get_signals pro AI

Live AI signal queue - stocks actively flagged by the Stocklake pipeline as worth attention. Sourced from sector screening, news analysis, and sentiment signals. Signals expire daily; this always reflects the pipeline's current view.

Pipeline dependency. Signals are refreshed by scheduled AI jobs. If the pipeline hasn't run recently, results may be sparse. Check flagged_at on each signal to assess freshness.

Parameters

NameTypeDefaultDescription
directionstring-POSITIVE · NEGATIVE · NEUTRAL - filter by trade direction. NEUTRAL covers both a flat/undecided read and a genuinely two-sided idea (real opposing bull/bear theses - see signal_score below). Omit for all.
min_signal_scoreinteger60Minimum composite signal score (0-100) - blends conviction/confidence/flag_score, source track record, and real technical factors. This is the field to filter on.
sourcestring-Filter by signal source: news · screener · sentiment
limitinteger25Max signals to return (max 50 - pass a higher value explicitly for the broader feed). Results sorted by recency. Each returned signal counts as one call toward your daily limit.

Response fields

FieldTypeDescription
countintegerNumber of signals returned
windowstring"24h" if fresh activity was found, otherwise a note that the response falls back to the most recent signals regardless of age
signals[].symbolstringTicker
signals[].directionstringPOSITIVE · NEGATIVE · NEUTRAL
signals[].signal_scorenumberComposite AI score 0-100 - the current, single source of truth for signal quality. Always a single number, including for a NEUTRAL signal (a genuinely two-sided idea, real opposing bull/bear theses) - in that case this is the STRONGER of the two sides, since that's the more actionable fact; the two-sided detail is in rationale.
signals[].signal_score_bandstring | nullHuman-readable label: Weak · Moderate · Strong · Very Strong. Null only when signal_score itself is null.
signals[].sourcestringPrimary pipeline source that flagged this stock
signals[].sourcesarrayAll sources that contributed (when merged across sources)
signals[].rationalestringAI rationale - why the pipeline flagged this stock
signals[].expiresstringDate after which this signal is considered stale (YYYY-MM-DD)
signals[].flagged_atstringISO 8601 UTC timestamp when this signal was last flagged by the pipeline
Example
{ "count": 2, "window": "24h", "signals": [ { "symbol": "MGM", "direction": "POSITIVE", "signal_score": 88, "signal_score_band": "Very Strong", "source": "news", "sources": ["news"], "rationale": "flag=10/10 | positive | impact=95/100 | MGM Resorts acquisition by Apollo rumored at 25% premium", "expires": "2026-06-06", "flagged_at": "2026-06-05T20:48:00Z" }, { "symbol": "CMA", "direction": "NEUTRAL", "signal_score": 62, "signal_score_band": "Strong", "source": "news", "sources": ["news"], "rationale": "flag=9/10 | mixed | impact=85/100 | Comerica net interest income guidance raised on rate optimism - a real bull case (37/100) and bear case (62/100) at once", "expires": "2026-06-06", "flagged_at": "2026-06-05T19:57:00Z" } ] }

CMA above is a NEUTRAL signal - the pipeline sees a genuine bull case (37/100) and bear case (62/100) at once, no directional consensus. signal_score reports the STRONGER side (62), so a high score alongside NEUTRAL means real conviction with a contested direction, not "nothing going on" - the two-sided detail is in rationale.

get_news_feed pro AI

Market-wide AI-flagged news briefing - top articles across all tracked stocks ranked by signal strength. Unlike get_stock_news (per-symbol), this scans the entire universe and surfaces the most notable news regardless of ticker. No URLs or source domains exposed.

Parameters

NameTypeDefaultDescription
min_signal_scoreinteger60Minimum signal_score (0-100) used to select articles server-side. Replaces the old min_flag_score (0-10, gated on the legacy ai_flag_score field) - 2026-08-24, signal_score consistency initiative.
daysinteger3Look-back window in days (max 10)
limitinteger10Max articles returned (max 25)

Each article also carries signal_score (0-100, always a single number) and signal_score_band ("Weak"/"Moderate"/"Strong"/"Very Strong"). Prefers this symbol's LIVE news-sourced signal score if one was raised in the last 90 days - same value get_signals/get_stock_news report for that symbol, kept in sync as it's re-scored, and not gated on whether Stocklake's own trading engine still considers the signal live (a dropped/expired signal still shows here); this is a per-symbol fact, not a per-article judgment, so two articles about the same stock always show the same value. Otherwise a per-article magnitude computed from that article's own AI classification, so every article still gets a real, rankable number. There is no separate news_score field - one name for "how strong is this idea," whether it's backed by a formal signal or just this article's own classification.

One article per event: when several articles report the same event, the highest-ranked one is kept and carries collapsed_count, the number of articles merged into it. limit counts distinct events. Articles without a usable summary are left out.

Example
{ "count": 10, "days": 3, "min_signal_score": 60, "articles": [ { "symbol": "NVDA", "title": "Nvidia unveils GB300 chip, accelerating AI data center roadmap", "published_at": "2026-06-04T14:30:00+00:00", "ai_sentiment": "positive", "ai_summary": "New GB300 architecture delivers 2× throughput over H100. Roadmap acceleration strengthens moat vs AMD...", "signal_score": 78, "signal_score_band": "Strong" } ] }

get_market_assessment pro AI

Combined macro regime + market outlook in a single call. Refreshed ~4x/day, weekdays only, during market hours (~2h apart) - dead overnight and on weekends, not a continuous 4-hourly cadence. Check regime_stale / outlook_stale before treating this as current. Returns two complementary perspectives:

  • Regime (regime_* fields) - answers "how much equity risk to take" → use for position sizing and asset allocation
  • Outlook (outlook_* fields) - answers "which direction and sectors to trade" → use for sector preference and directional bias

Note: market_context is a point-in-time snapshot from when the AI ran - not live. Use get_market_pulse for live prices.

Parameters

NameTypeDefaultDescription
history_countinteger0Include last N prior assessments for each perspective (0-3). Returns regime_history[] and outlook_history[].

Response - Regime fields

FieldTypeDescription
regimestringRISK_OFF / CAUTIOUS / NEUTRAL / AGGRESSIVE
risk_appetite_scorenumber0-100. Plain re-expression of regime as a score (RISK_OFF ≈ 10 → AGGRESSIVE ≈ 90). Higher = the tape currently supports more risk-taking.
macro_scorenumber | null0-100. The REAL, continuous number regime buckets into 4 categories - a blend of arithmetic inputs (VIX level, breadth oversold/overbought skew, SKEW-vs-VIX divergence, TD-exhaustion ratio) and the AI's own regime_strength read. Distinct from risk_appetite_score, which is just a coarse 4-value lookup on regime alone - macro_score is the finer-grained real number. Null on an assessment from before this field existed (2026-08-26).
regime_strengthnumber | null1-10. The AI's own read of regime conviction - one of the two inputs blended into macro_score above.
macro_score_trendobject{change_7d, change_30d, direction} - whether macro_score itself is improving/deteriorating/stable over the trailing 7/30 days, computed automatically (no history_count needed). A bare 33 doesn't say whether the environment is getting worse or just stabilized after a worse reading - this does. Either leg is null without enough history yet.
regime_biasstring"Long Setups Only" / "Short Setups Only" / "Both Directions" - whether current market conditions favor one trade direction over the other
regime_bias_notestringPlain-language sentence explaining what regime_bias means, framed as a market-conditions read
regime_confidencenumber1-10. Clarity of the regime call.
regime_rationalestringCore thesis in plain language
key_risksstring[]2-3 tail risks that could invalidate the call
watch_forstring[]Triggers that would cause a regime change
vix_at_assessmentnumberVIX level when assessment was made
regime_updated_atstringISO 8601 UTC timestamp of last assessment
indicators.macro_dataobjectMacro data: yield_spread_10y2y, fed_funds_rate, cpi_index (BLS index level ~332, not YoY %), unemployment, breakeven_10y, usd_index, m2 - each with value, date, delta_3m
indicators.volatility_term_structureobjectVIX / VIX3M / VIX6M last 5 closes + contango/backwardation signal
indicators.market_sentimentobjectFear & Greed value (0-100) and label
indicators.breadthobjectLive market-wide RSI breadth (universe_size, oversold/overbought/neutral counts + percentages) - same live numbers as get_market_pulse's breadth, bundled here too so a regime read doesn't need a second call.
market_contextobjectPoint-in-time snapshot: price/RSI/SMA200/perf for SPY, QQQ, IWM, TLT, GLD, VIX, TNX, HYG, sector ETFs. Recorded when AI ran - not live.

Response - Outlook fields

FieldTypeDescription
outlookstringPOSITIVE / NEUTRAL / NEGATIVE
outlook_convictionnumber1-10. Strength of the directional call.
equity_viewstringPlain language directional narrative
preferred_sectorsstring[]Sectors to overweight
avoided_sectorsstring[]Sectors to underweight
catalyststringPrimary catalyst driving the outlook
outlook_key_riskstringKey risk to the outlook thesis
outlook_rationalestringDetailed reasoning
outlook_updated_atstringISO 8601 UTC timestamp of last assessment
regime_history[]object[]Prior regime states (when history_count > 0): regime, risk_appetite_score, macro_score, regime_bias, regime_confidence, vix_at_assessment, updated_at
outlook_history[]object[]Prior outlook states (when history_count > 0): outlook, conviction, at
Example (condensed)
{ "regime": "CAUTIOUS", "risk_appetite_score": 35, "macro_score": 33, "regime_strength": 4, "macro_score_trend": { "change_7d": -11, "change_30d": -22, "direction": "deteriorating" }, "regime_bias": "Both Directions", "regime_confidence": 6, "regime_rationale": "Equity uptrend intact. HYG diverging - credit not confirming SPY highs.", "key_risks": ["HYG breaking below $79.50", "VIX closing above 20"], "watch_for": ["HYG reclaiming $80.50 → upgrade to NEUTRAL"], "vix_at_assessment": 16.94, "regime_updated_at": "2026-05-06T09:14:56+00:00", "indicators": { "macro_data": { "yield_spread_10y2y": { "value": 0.21, "delta_3m": 0.15 } }, "market_sentiment": { "value": 54.0, "description": "Neutral" } }, "market_context": { /* NOT live - snapshot from regime_updated_at */ "spy": { "price": 574.12, "rsi": 70.3, "above_200sma": true } }, "outlook": "POSITIVE", "outlook_conviction": 7, "equity_view": "Momentum intact. Tech leading. Small-caps lagging but not breaking down.", "preferred_sectors": ["Technology", "Industrials"], "avoided_sectors": ["Utilities", "Real Estate"], "catalyst": "AI spending cycle intact. Macro resilience.", "outlook_updated_at": "2026-05-06T09:14:56+00:00" }

get_sector_intelligence pro AI

AI-assessed sector intelligence with signals (LEADING/STRONG/NEUTRAL/WEAK/LAGGING), drivers, alerts, and computed statistics. Pass a sector for deep single-sector analysis, or omit for all 11 sectors at once - the all-sectors call doubles as the rotation view (sort_by_strength + history_count). Refreshed ~4x/day, weekdays only, during market hours (~2h apart) - dead overnight and on weekends, not a continuous 4-hourly cadence. Check the returned updated_at before treating this as current.

Parameters

ParameterTypeRequiredDefaultDescription
sectorstring-NoneSector name (e.g. Technology, Healthcare). Omit to list all sectors.
sort_by_strengthboolean-falseAll-sectors call only: sort LEADING→LAGGING instead of alphabetical - for finding leading vs lagging sectors
history_countinteger-0All-sectors call only: include last N prior signal states per sector (0-3)

Response fields

FieldTypeDescription
sectorstringSector name
signalstringLEADING / STRONG / NEUTRAL / WEAK / LAGGING
cycle_stagestringSector cycle phase (e.g. MARKUP, MARKDOWN, ACCUMULATION, DISTRIBUTION)
rotation_signalstringMoney-flow read (e.g. ACCUMULATE, DISTRIBUTE, HOLD)
sector_scorenumber | null0-100. The REAL, continuous number signal buckets into 5 categories (LEADING/STRONG/NEUTRAL/WEAK/LAGGING) - a blend of arithmetic inputs (RSI/perf percentiles, top-5 concentration, SMA200 breadth) and the AI's own strength_score read. Comparable across all 11 sectors on one absolute scale. Null on an assessment from before this field existed (2026-08-26).
strength_scorenumber | null1-10. The AI's own read of sector strength - one of the two inputs blended into sector_score above.
sector_score_trendobjectSingle-sector call only. {change_7d, change_30d, direction} - whether sector_score is improving/deteriorating/stable over the trailing 7/30 days, computed automatically. This is the only trend view available for one sector at all - history_count only applies to the all-sectors call. Two sectors both reading STRONG/68 can be moving in opposite directions; this tells them apart. Either leg is null without enough history yet.
confidencenumberAI confidence 1-10
driversstringAI narrative of sector drivers
alertstringNotable condition if applicable (breadth divergence, extreme RSI, etc.)
stats.avg_rsinumberSector-average RSI
stats.sma200_breadth_pctnumber% of stocks above their 200-day MA
stats.oversold_pct / overbought_pctnumberRSI distribution extremes
stats.avg_perf_1w_pct / avg_perf_1m_pctnumberAverage sector performance 1W / 1M
updated_atstringISO 8601 when the assessment was made
history[]arrayPresent when history_count > 0 (all-sectors call) - prior {signal, confidence, sector_score, at}
sectors[] / countarray / integerPresent when sector param is omitted - all sectors assessed
Example - single sector
{ "sector": "Technology", "signal": "STRONG", "sector_score": 68, "strength_score": 7, "sector_score_trend": { "change_7d": -28, "change_30d": -10, "direction": "deteriorating" }, "confidence": 7, "drivers": "AI capex cycle, earnings momentum. Mega-caps leading with broad participation.", "alert": "19.5% overbought, breadth only 53% - narrow leadership suggests froth in pockets", "stats": { "avg_rsi": 56.5, "sma200_breadth_pct": 53.1, "oversold_pct": 4.1, "overbought_pct": 19.5, "avg_perf_1w_pct": 1.1, "avg_perf_1m_pct": 11.0 }, "updated_at": "2026-05-12T10:19:48+00:00" }
Example - all sectors, sort_by_strength=true (rotation view)
{ "count": 11, "sectors": [ { "sector": "Technology", "signal": "STRONG", "sector_score": 68, "strength_score": 7, "confidence": 7, "stats": { "avg_rsi": 56.5, "sma200_breadth_pct": 53.1, "avg_perf_1w_pct": 1.1 }, "alert": "19.5% overbought - narrow leadership", "updated_at": "2026-05-12T10:19:48+00:00" }, { "sector": "Energy", "signal": "WEAK", "sector_score": 31, "strength_score": 3, "confidence": 6, "stats": { "avg_rsi": 42.3, "sma200_breadth_pct": 35.8, "avg_perf_1w_pct": -2.1 }, "alert": null, "updated_at": "2026-05-12T10:19:48+00:00" } ] }

get_earnings_intelligence pro AI

Upcoming earnings with AI context per stock - combines the earnings calendar with AI pipeline data to surface which events are worth monitoring. Sorted by earnings date ascending (soonest first).

Parameters

NameTypeDefaultDescription
days_aheadinteger14Look-ahead window in days (max 30)
sectorstring-Filter to one sector (optional)
min_ai_scoreinteger-Only return stocks with AI score ≥ this value, 0-100 (optional). Renamed 2026-08-24 from the retired 0-10 min_flag_score - gates on the same ai_score field returned below. Applied before limit truncates the result.
limitinteger25Max results to return (max 25). Each returned stock counts as one call toward your daily limit.

Response fields (per result)

FieldTypeDescription
symbol, name, sectorstringStock identity
earnings_datestringISO UTC timestamp of expected earnings release
is_estimatebooleanWhether the date is estimated
price, rsi, market_capnumberCurrent technicals
eps_trailing, eps_forwardnumberEarnings expectations context
ai_verdictstringpositive / neutral / negative (from nightly AI pipeline)
ai_scorenumber | null0-100 AI research composite score, same scale/band convention as get_signals' signal_score but a distinct field/pipeline. Null if no ai_summary doc exists yet.
ai_score_bandstring | nullWeak / Moderate / Strong / Very Strong, or null
ai_risksstring[]Top 2 AI-identified risk factors
analyst_rating, analyst_targetstring / numberWall Street consensus
Example
{ "count": 22, "days_ahead": 14, "results": [ { "symbol": "ORCL", "name": "Oracle Corporation", "sector": "Technology", "earnings_date": "2026-06-10T20:00:00+00:00", "is_estimate": false, "price": 192.40, "rsi": 68.9, "eps_forward": 7.20, "ai_verdict": "positive", "ai_score": 81, "ai_score_band": "Very Strong", "ai_risks": ["Elevated valuation at 28x forward earnings", "Cloud margin pressure from AI infra spend"], "analyst_rating": "buy", "analyst_target": 210.0 } ] }

get_watchlist pro AI

The caller's Stocklake watchlist - the symbols starred on the web dashboard at /dashboard - enriched with live price, technicals, and AI verdict. No parameters; resolves your account automatically from your API key or OAuth session.

Parameters

None.

Response fields

FieldTypeDescription
countintegerNumber of symbols on the watchlist
items[].symbol, name, sectorstringStock identity
items[].price, change_pct, rsi, market_capnumberLive snapshot
items[].analyst_ratingstring | nullstrong_buy / buy / hold / sell / strong_sell
items[].atr_pctnumberAverage True Range as % of price (volatility). Omitted if the underlying indicator reading is missing or corrupted.
items[].ai_verdictstringpositive / neutral / negative (from nightly AI pipeline)
items[].ai_headlinestringOne-line "why" behind the verdict
items[].ai_scorenumber | null0-100 AI research composite score - same 0-100 scale/band convention as get_signals' signal_score but a distinct field/pipeline. Null if no ai_summary doc exists yet.
items[].ai_score_bandstring | nullWeak / Moderate / Strong / Very Strong, or null
items[].added_atstringISO UTC timestamp - when the symbol was starred
items[].price_at_addnumberPrice at the moment it was starred, for a "since added" delta

Read-only - starring/unstarring a symbol is web-only for now (no add_to_watchlist/remove_from_watchlist tool yet). Returns count: 0, items: [] if nothing is starred.

Example
{ "count": 2, "items": [ { "symbol": "AAPL", "name": "Apple Inc.", "sector": "Technology", "price": 231.02, "change_pct": 1.14, "rsi": 58.3, "market_cap": 3480000000000, "analyst_rating": "buy", "atr_pct": 2.41, "ai_verdict": "positive", "ai_headline": "Services revenue growth reaccelerating", "ai_score": 64, "ai_score_band": "Strong", "added_at": "2026-07-20T09:14:02+00:00", "price_at_add": 224.87 } ] }