{"ok":true,"timestamp":"2026-08-12T05:48:32.682449+00:00","manifest_version":"2.114","server":{"name":"astellr-firm","build":"d6aa37eeb260","shapes":["ec2","firm"],"default_shape":"ec2"},"auth":{"api_key_header":"X-API-Key","admin_key_header":"X-Admin-Key","idempotency_header":"Idempotency-Key","internal_key_header":"X-Internal-Key","capabilities_auth_required":false},"base_url":"https://firm.tengu.co","groups":{"legacy":{"count":10,"description":"EC2-compat surface (tengu_*)"},"v2":{"count":15,"description":"Astellr-FIRM upgrades (tengu_v2_*)"},"v3":{"count":301,"description":"Expert surface: agents, decision, execution, strategies, memory, lab (tengu_v3_*)"},"copilot":{"count":20,"description":"Chat-copilot aggregations (tengu_copilot_*)"},"ml":{"count":5,"description":"Direct ML model surface (tengu_ml_*)"},"admin":{"count":0,"description":"Mutating — requires X-Admin-Key"}},"tools":[{"name":"tengu_snapshot","method":"GET","path":"/api/snapshot/{ticker}","group":"legacy","description":"Live price snapshot for one ticker: latest price plus basic trading stats. Call it when the user asks 'where is X trading right now?' or needs a current quote before any single-name analysis. Heavy endpoint — fetch one ticker per call.","path_params":["ticker"],"admin":false,"replaced_by":"tengu_v3_fundamentals_full","display_name":"Price snapshot (live)","capability_tags":["heavy"]},{"name":"tengu_insider_clusters","method":"GET","path":"/api/insider/clusters","group":"legacy","description":"Clusters of insider buying across companies: names where multiple distinct insiders bought around the same time. Call it when the user asks 'where are insiders buying?' or wants market-wide insider conviction rather than one company's filings.","admin":false},{"name":"tengu_crypto","method":"GET","path":"/api/crypto/{ticker}","group":"legacy","description":"Live crypto quote from the market-data feed (real-time entitlement, 439 pairs): last-trade price, 24h change/volume (UTC-day basis), day + prev-day OHLC, optional last-7 daily bars, honest as_of. PRIMARY tool for 'what is BTC at?' — accepts BTC/BTCUSD/X:BTCUSD plus a vs currency (e.g. EUR); unknown symbols return a structured 404.","path_params":["ticker"],"query_params":[{"name":"vs","type":"string","default":"USD","description":"Quote currency (e.g. EUR, BTC)"},{"name":"series","type":"bool","default":true,"description":"Include last-7 daily bars"}],"admin":false,"display_name":"Crypto markets"},{"name":"tengu_macro","method":"GET","path":"/api/macro","group":"legacy","description":"One-call macro dashboard: VIX, DXY, treasury spreads, fear-greed, and the current regime read. Call it FIRST for any 'how is the overall market / macro backdrop?' question, or to frame a single-name view against market conditions.","admin":false},{"name":"tengu_regime","method":"GET","path":"/api/regime","group":"legacy","description":"Current market regime label plus the model's regime probabilities. Call it when the user asks 'what regime are we in?' or before positioning advice that depends on the prevailing regime; use tengu_v2_regime_forecast for the forward view and tengu_v2_regime_history for the past.","admin":false},{"name":"tengu_research_knowledge","method":"GET","path":"/api/research/knowledge","group":"legacy","description":"Research knowledge base","admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_status","method":"GET","path":"/api/status","group":"legacy","description":"System status for the service. Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale.","admin":false},{"name":"tengu_ready","method":"GET","path":"/api/ready","group":"legacy","description":"Readiness flags showing which subsystems are up and serving. Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale.","admin":false},{"name":"tengu_logs","method":"GET","path":"/api/logs","group":"legacy","description":"Recent service log lines. Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale and status alone doesn't explain it.","admin":false},{"name":"tengu_cache_stats","method":"GET","path":"/api/cache/stats","group":"legacy","description":"Cache hit-rate statistics for the data layer. Call when the user asks whether the system/data pipeline is healthy or why data looks stale or slow.","admin":false},{"name":"tengu_v2_intervals","method":"GET","path":"/api/v2/predict/{ticker}/intervals","group":"v2","description":"Conformal prediction intervals for one ticker's forecast: a calibrated lower/upper band at the requested miscoverage alpha (default 0.1 = 90% interval). Call it when the user asks 'how confident is the model?' or wants an uncertainty range around a prediction rather than just a point estimate.","path_params":["ticker"],"query_params":[{"name":"alpha","type":"float","default":0.1,"min":0.01,"max":0.5}],"admin":false},{"name":"tengu_v2_drift","method":"GET","path":"/api/v2/models/drift","group":"v2","description":"Feature and prediction drift over a rolling window (default 30 days). Call it when the user asks whether the models are still well calibrated, why predictions look off, or whether model inputs have shifted recently.","query_params":[{"name":"window_days","type":"int","default":30,"min":1,"max":365}],"admin":false},{"name":"tengu_v2_feature_importance","method":"GET","path":"/api/v2/features/importance","group":"v2","description":"Top-N feature importances for the prediction models (default top 50, optionally filtered to one model). Call it when the user asks 'what is the model actually looking at?' or which inputs are driving current predictions.","query_params":[{"name":"top_n","type":"int","default":50,"min":1,"max":500},{"name":"model","type":"string"}],"admin":false},{"name":"tengu_v2_factor_decay","method":"GET","path":"/api/v2/features/decay","group":"v2","description":"IC/IR half-life per factor — how fast each factor's predictive power decays. Call it when the user asks which signals are going stale, how long a factor's edge lasts, or before weighting factors in a strategy.","admin":false},{"name":"tengu_v2_regime_forecast","method":"GET","path":"/api/v2/regime/forecast","group":"v2","description":"Forecast regime probabilities N days ahead (default 21-day horizon). Call it when the user asks 'is the regime about to change?' or wants the forward market-state outlook rather than today's label — use tengu_regime for the current read.","query_params":[{"name":"horizon_days","type":"int","default":21,"min":1,"max":252}],"admin":false},{"name":"tengu_v2_regime_history","method":"GET","path":"/api/v2/regime/history","group":"v2","description":"Historical regime labels over the last N days (default 180). Call it when the user asks how long the current regime has lasted, when the last regime shift happened, or wants past behavior broken out by regime.","query_params":[{"name":"days","type":"int","default":180,"min":1,"max":3650}],"admin":false},{"name":"tengu_v2_var","method":"GET","path":"/api/v2/risk/var","group":"v2","description":"Portfolio VaR and CVaR at a chosen horizon and confidence (defaults: 1-day, 99%). Call it when the user asks 'how much could the portfolio lose?' or needs a tail-risk number before sizing or hedging decisions.","query_params":[{"name":"horizon_days","type":"int","default":1,"min":1,"max":30},{"name":"confidence","type":"float","default":0.99,"min":0.5,"max":0.9999}],"admin":false},{"name":"tengu_v2_stress","method":"GET","path":"/api/v2/risk/stress","group":"v2","description":"Stress-test scenarios from the risk engine. Call it when the user asks 'what happens if things go bad?' before sizing risk; use tengu_v2_crash_scenarios to replay specific historical crashes.","admin":false},{"name":"tengu_v2_crash_scenarios","method":"GET","path":"/api/v2/risk/crash_scenarios","group":"v2","description":"Historical crash replay through past market crash episodes. Call it when the user asks 'how would this have held up in previous crashes?' or wants tail risk anchored to real historical events; use tengu_v2_stress for hypothetical scenarios.","admin":false},{"name":"tengu_v2_signal_correlation","method":"GET","path":"/api/v2/signals/correlation","group":"v2","description":"Correlation matrix across the voter signals feeding the ensemble. Call it when the user asks whether the model's signals are independent or redundant — high pairwise correlation means the vote count overstates conviction.","admin":false},{"name":"tengu_v2_short_interest","method":"GET","path":"/api/v2/short-interest/{ticker}","group":"v2","description":"Short interest for one ticker: shares short, days-to-cover (DTC), and fails-to-deliver (FTD). Call it FIRST for any 'is X heavily shorted / squeeze candidate?' question or before evaluating short-side risk in a position.","path_params":["ticker"],"admin":false},{"name":"tengu_v2_alpha_discoveries","method":"GET","path":"/api/v2/research/alpha_discoveries","group":"v2","description":"Mined alpha expressions from the research pipeline, filtered to a minimum information ratio (min_ir, default 0.5) and capped at `limit` (default 25). Call this when the user asks what alpha signals or factor expressions the research engine has actually discovered.","query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":500},{"name":"min_ir","type":"float","default":0.5,"min":-5.0,"max":10.0}],"admin":false},{"name":"tengu_v2_strategy_evolution","method":"GET","path":"/api/v2/research/strategy_evolution","group":"v2","description":"Strategy genealogy with out-of-sample (OOS) scores — how each evolved strategy variant descends from its parents and how it validated OOS, up to `limit` entries (default 50). Call this when the user asks how strategies were developed, mutated, or which generations survived validation.","query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v2_research_datasets","method":"GET","path":"/api/v2/datasets","group":"v2","description":"Discover the 39 licensed research datasets servable via the research-dataset reader — equity prices (daily/monthly/delistings/distributions/mutual funds), fundamentals (annual/quarterly/segments/customers/supply-chain), analyst estimates (summary/detail/guidance/price-targets/actuals/recs), implied volatility, securities-finance (full-history CDS + short interest), transcripts/ratings/key-developments, board relationships, forensic-audit filings, syndicated loans, ESG ratings, crowd estimates, TRACE bond trades and Fama-French factors. Call FIRST when unsure of a slug; not_ingested lists any slug awaiting a table (currently empty).","admin":false},{"name":"tengu_v2_research_read","method":"GET","path":"/api/v2/datasets/{dataset}","group":"v2","description":"Read any licensed research dataset by slug (discover via tengu_v2_research_datasets). ?ticker= pushes an exact server-side filter down the dataset's own symbol column when it has one; datasets keyed by an internal security id instead state explicitly that ticker was ignored. The `implied_vol_by_ticker` slug REQUIRES ?ticker= and resolves the symbol to that id automatically before pushdown. The `cds_composites` slug serves the FULL 2005–2025 spread history. Unfiltered reads are capped at 5000 rows.","path_params":["dataset"],"query_params":[{"name":"ticker","type":"string","description":"exchange symbol — pushed down the dataset's own symbol column"},{"name":"limit","type":"int","default":1000,"min":1,"max":50000}],"admin":false},{"name":"tengu_v3_agents_list","method":"GET","path":"/api/v3/agents","group":"v3","description":"Catalogue of every agent in the swarm — one entry per agent. Call this when the user asks which agents exist, what the swarm is composed of, or to resolve an agent's name before drilling into its output.","admin":false},{"name":"tengu_v3_agent_status","method":"GET","path":"/api/v3/agents/{agent_name}/status","group":"v3","description":"Latest heartbeat + stats for one agent","path_params":["agent_name"],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_agent_latest","method":"GET","path":"/api/v3/agents/{agent_name}/latest","group":"v3","description":"Recent outputs from a named agent","path_params":["agent_name"],"query_params":[{"name":"ticker","type":"string"},{"name":"limit","type":"int","default":20,"min":1,"max":500}],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_trade_setups","method":"GET","path":"/api/v3/decision/trade_setups","group":"v3","description":"Top trade setups from the decision engine with **defensive-alternates baked in**. When the screen is one-sided (>=70% same direction across 3+ picks), the response carries `universe_skew` = 'bearish' | 'bullish' | 'mixed' AND a `regime_warranted_alternative` block containing the editorial fallback basket (defensive | cash_heavy | value_tilt | momentum). Each alternative carries strategy label, curated candidates with thesis per name, and a one-sentence rationale. Brain consumes the alternative when the primary picks don't fit the user's risk frame — e.g. all-bearish screen on a long-bias capital-allocation query surfaces the `defensive` basket so the model never has to refuse or invent. Schema is ADDITIVE — primary `setups` array unchanged from v2.41.","query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":500},{"name":"min_conviction","type":"float","default":0.0,"min":0.0,"max":1.0}],"admin":false,"display_name":"Trade screens"},{"name":"tengu_v3_universe_scan","method":"GET","path":"/api/v3/decision/universe_scan","group":"v3","description":"Latest universe-scanner output: the most recent scan results across the tradable universe, up to `limit` names (default 100). Call this when the user asks what the scanner is flagging right now or wants a market-wide sweep before drilling into single tickers.","query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":5000}],"admin":false,"display_name":"Universe scan"},{"name":"tengu_v3_ultimate_decision","method":"GET","path":"/api/v3/decision/ultimate","group":"v3","description":"Ultimate-engine aggregate decision for one ticker — the top-level verdict aggregated across the engine stack. PRIMARY tool for 'so what's the final call on <ticker>?' — call it when the user wants one consolidated decision rather than raw component signals.","query_params":[{"name":"ticker","type":"string"}],"admin":false,"display_name":"Final verdict","capability_tags":["heavy"]},{"name":"tengu_v3_position_monitor","method":"GET","path":"/api/v3/decision/position_monitor","group":"v3","description":"Live position monitor (exits, stops, flags)","admin":false,"display_name":"Position monitor","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_cost_estimate","method":"GET","path":"/api/v3/execution/cost_estimate/{ticker}","group":"v3","description":"Pre-trade expected execution cost for a ticker: spread, market impact, and commission for a given qty (default 100) and side (buy/sell). Call it to know what a trade will actually cost before sizing or routing it; use twap_plan/vwap_plan for the execution schedule itself.","path_params":["ticker"],"query_params":[{"name":"qty","type":"int","default":100,"min":1,"max":10000000},{"name":"side","type":"string","default":"buy","enum":["buy","sell"]}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_slippage","method":"GET","path":"/api/v3/execution/slippage/{ticker}","group":"v3","description":"Realised slippage stats (mean/median/p95)","path_params":["ticker"],"query_params":[{"name":"window_days","type":"int","default":30,"min":1,"max":365}],"admin":false,"display_name":"Slippage estimate","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_twap_plan","method":"GET","path":"/api/v3/execution/twap_plan/{ticker}","group":"v3","description":"TWAP child-order schedule for a ticker: a qty (default 100) sliced into evenly-timed child orders over `minutes` (default 60). Call this when the user asks how to work an order over time; use vwap_plan for a volume-curve schedule and cost_estimate for expected cost.","path_params":["ticker"],"query_params":[{"name":"qty","type":"int","default":100,"min":1,"max":10000000},{"name":"minutes","type":"int","default":60,"min":1,"max":390}],"admin":false,"display_name":"TWAP execution"},{"name":"tengu_v3_vwap_plan","method":"GET","path":"/api/v3/execution/vwap_plan/{ticker}","group":"v3","description":"VWAP child-order schedule for a ticker: a qty (default 100) sliced along the intraday U-curve volume profile. Call this when the user wants an order worked in line with typical intraday volume; use twap_plan for even time-slicing and cost_estimate for expected cost.","path_params":["ticker"],"query_params":[{"name":"qty","type":"int","default":100,"min":1,"max":10000000}],"admin":false,"display_name":"VWAP execution"},{"name":"tengu_v3_smart_route","method":"GET","path":"/api/v3/execution/smart_route/{ticker}","group":"v3","description":"Recommended venue mix (lit/dark/algo)","path_params":["ticker"],"query_params":[{"name":"qty","type":"int","default":100,"min":1,"max":10000000},{"name":"side","type":"string","default":"buy","enum":["buy","sell"]}],"admin":false,"display_name":"Smart routing","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_strategies_list","method":"GET","path":"/api/v3/strategies","group":"v3","description":"Catalogue of the 21-strategy library — one entry per strategy. Call this when the user asks which strategies exist or what the system can run, or to resolve a strategy name before drilling into its evolution or signals.","admin":false,"display_name":"Strategy list"},{"name":"tengu_v3_strategy_signals","method":"GET","path":"/api/v3/strategies/{strategy_name}/signals","group":"v3","description":"Latest signals from a named strategy","path_params":["strategy_name"],"query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":5000}],"admin":false,"display_name":"Strategy signals","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_strategy_metrics","method":"GET","path":"/api/v3/strategies/{strategy_name}/metrics","group":"v3","description":"Historical metrics for a named strategy","path_params":["strategy_name"],"admin":false,"display_name":"Strategy performance","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_signals_fusion","method":"GET","path":"/api/v3/signals/fusion","group":"v3","description":"Latest fused signals across all voters — the combined signal after voter aggregation, up to `limit` names (default 100). Call this when the user asks what the system's current signals are overall; use signals_mtf for one ticker's timeframe alignment.","query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":5000}],"admin":false,"display_name":"Combined signals"},{"name":"tengu_v3_signals_mtf","method":"GET","path":"/api/v3/signals/mtf/{ticker}","group":"v3","description":"One EQUITY cross-horizon ensemble row for a ticker. Despite the legacy `mtf` path name, the warehouse does NOT emit independent per-timeframe rows, so this tool cannot confirm 1m/4h/1w agreement and must not be cited as multi-timeframe evidence. Crypto requests fail closed.","path_params":["ticker"],"admin":false,"display_name":"Multi-timeframe read"},{"name":"tengu_v3_signals_veto","method":"GET","path":"/api/v3/signals/veto_state","group":"v3","description":"Active veto state — which risk, regime, or circuit-breaker (CB) vetoes are currently in force over signals. Call it to know whether signals are being suppressed before trusting any signal read; PRIMARY for 'why isn't the system acting on <ticker>?'.","admin":false,"display_name":"Risk filters"},{"name":"tengu_v3_signals_cross_asset","method":"GET","path":"/api/v3/signals/cross_asset","group":"v3","description":"Cross-asset regime signals — the regime read taken across asset classes rather than from single tickers. Call this when the user asks about the broader market regime or wants cross-asset confirmation of a single-asset view.","admin":false,"display_name":"Cross-asset signals"},{"name":"tengu_v3_self_healing","method":"GET","path":"/api/v3/monitoring/self_healing","group":"v3","description":"Recent and pending self-healing actions the system has taken or queued. Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale.","admin":false},{"name":"tengu_v3_alerts_active","method":"GET","path":"/api/v3/monitoring/alerts_active","group":"v3","description":"Currently-active alerts","query_params":[{"name":"severity","type":"string","enum":["info","warn","error","critical"]}],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_system_health","method":"GET","path":"/api/v3/monitoring/system_health","group":"v3","description":"Aggregate system health with per-subsystem status. Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale.","admin":false},{"name":"tengu_v3_metrics","method":"GET","path":"/api/v3/monitoring/metrics","group":"v3","description":"Recent system metrics (latency/QPS/error)","query_params":[{"name":"window_minutes","type":"int","default":60,"min":1,"max":1440}],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_api_quotas","method":"GET","path":"/api/v3/monitoring/api_quotas","group":"v3","description":"Per-feed external API quota usage and cap status (news, news-analytics, market-data, alt-data). Call when the user asks whether the system/data pipeline is healthy or why data looks missing/stale.","admin":false},{"name":"tengu_v3_accuracy","method":"GET","path":"/api/v3/learning/accuracy","group":"v3","description":"Realised-vs-predicted accuracy over a rolling window (window_days, default 90) — how well predictions matched what actually happened. Call this when the user asks how accurate the system has been or wants a track record before trusting a new call; use prediction_tracker for individual predictions.","query_params":[{"name":"window_days","type":"int","default":90,"min":1,"max":3650}],"admin":false},{"name":"tengu_v3_resolver_status","method":"GET","path":"/api/v3/learning/resolver_status","group":"v3","description":"Outcome-resolver status","admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_prediction_tracker","method":"GET","path":"/api/v3/learning/prediction_tracker","group":"v3","description":"Recent predictions with their resolution state, up to `limit` entries (default 200) — each call and whether it has resolved yet and how. Call this when the user asks what the system has predicted lately or how specific calls turned out; use accuracy for the aggregate hit-rate.","query_params":[{"name":"limit","type":"int","default":200,"min":1,"max":5000}],"admin":false,"display_name":"Prediction tracking"},{"name":"tengu_v3_optimizer_latest","method":"GET","path":"/api/v3/optimizer/latest","group":"v3","description":"Latest optimizer weights — the current weight set from the most recent optimization run. Call this when the user asks what the optimizer is currently recommending or how the latest run set its weights.","admin":false,"display_name":"Latest optimizer run"},{"name":"tengu_v3_memory_recall","method":"GET","path":"/api/v3/memory/recall","group":"v3","description":"Recall memory items by free-text query","query_params":[{"name":"query","type":"string"},{"name":"limit","type":"int","default":20,"min":1,"max":500}],"admin":false,"display_name":"Past context","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_memory_reflections","method":"GET","path":"/api/v3/memory/reflections","group":"v3","description":"Post-trade reflections journal","query_params":[{"name":"limit","type":"int","default":20,"min":1,"max":500}],"admin":false,"display_name":"Saved reflections","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_backtest_runs","method":"GET","path":"/api/v3/backtest/runs","group":"v3","description":"List recent backtest runs","query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Backtest history","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_backtest_run_detail","method":"GET","path":"/api/v3/backtest/runs/{run_id}","group":"v3","description":"Detail for a single backtest run","path_params":["run_id"],"admin":false,"display_name":"Backtest details","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_lab_strategies","method":"GET","path":"/api/v3/lab/strategies","group":"v3","description":"Strategies in the sandbox lab","query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_lab_deployments","method":"GET","path":"/api/v3/lab/deployments","group":"v3","description":"Live lab deployments (paper/tiny-cap)","admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_news_aggregated","method":"GET","path":"/api/v3/news/aggregated","group":"v3","description":"MARKET-WIDE feed — not per-ticker (that is tengu_v3_news_summary). Aggregated cross-source news stream over the last N hours (default 24) for broad market-news sweeps and cross-source coverage checks.","query_params":[{"name":"hours","type":"int","default":24,"min":1,"max":168},{"name":"limit","type":"int","default":100,"min":1,"max":1000}],"admin":false,"display_name":"News digest"},{"name":"tengu_v3_news_events","method":"GET","path":"/api/v3/news/events","group":"v3","description":"Detected market-moving events across the market over a lookback window (hours param, default 24). Call this when the user asks 'did anything big happen today?' or wants a scan of recent catalysts market-wide; use tengu_v3_news_latest for headlines on one ticker.","query_params":[{"name":"hours","type":"int","default":24,"min":1,"max":168}],"admin":false,"display_name":"News events"},{"name":"tengu_v3_believability","method":"GET","path":"/api/v3/experience/believability","group":"v3","description":"Calibrated trust per signal source","query_params":[{"name":"source","type":"string"},{"name":"limit","type":"int","default":100,"min":1,"max":5000}],"admin":false,"display_name":"Confidence score","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_thresholds","method":"GET","path":"/api/v3/experience/thresholds","group":"v3","description":"Currently-active decision thresholds — the live cutoff values gating automated trade decisions right now. Call it to know which thresholds are in force before interpreting why a signal did or didn't become a decision.","admin":false},{"name":"tengu_v3_hedging","method":"GET","path":"/api/v3/institutional/hedging","group":"v3","description":"Index hedge proposals (SPY/QQQ/IWM) computed from live dealer positioning — protective puts when dealers are short gamma and IV rank is cheap, collars when the 25-delta risk reversal shows calls rich, plus IV term-structure context","admin":false,"display_name":"Hedge analysis"},{"name":"tengu_v3_portfolio_risk_parity_latest","method":"GET","path":"/api/v3/portfolio/risk_parity/latest","group":"v3","description":"Latest naive risk-parity weights","admin":false,"display_name":"HRP portfolio (latest cron)","capability_tags":["data_pending_v1"]},{"name":"tengu_v3_cpcv","method":"POST","path":"/api/v3/validation/cpcv","group":"v3","description":"Combinatorial Purged Cross-Validation (AFML Ch.7) on a return series you POST — leakage-purged out-of-sample validation across many train/test splits. Call this when the user asks whether a strategy's backtest is robust or overfit, before trusting any single-split result.","body_schema":{"type":"object","required":["returns"],"properties":{"returns":{"type":"array","items":{"type":"number"},"minItems":1,"description":"flat per-period return series"},"n_groups":{"type":"integer","default":10},"embargo_days":{"type":"integer","default":5},"k":{"type":"integer","default":2},"annualisation":{"type":"number","default":252.0}}},"admin":false,"display_name":"CPCV validation"},{"name":"tengu_v3_deflated_sharpe","method":"POST","path":"/api/v3/validation/deflated_sharpe","group":"v3","description":"Deflated Sharpe Ratio (AFML Ch.11) from an observed Sharpe given the number of trials, observations, and higher moments you supply. Call it when the user asks 'is this Sharpe real or a multiple-testing artifact?'; use tengu_v3_deflate to source the trial count from the registry instead.","body_schema":{"type":"object","required":["sharpe"],"properties":{"sharpe":{"type":"number","description":"the observed (annualised) Sharpe"},"n_trials":{"type":"integer","minimum":1,"default":1},"n_obs":{"type":"integer","minimum":30,"default":252},"skewness":{"type":"number","default":0.0},"kurtosis":{"type":"number","default":3.0}}},"admin":false,"display_name":"Deflated Sharpe"},{"name":"tengu_v3_deflate","method":"POST","path":"/api/v3/validation/deflate","group":"v3","description":"Deflates a supplied Sharpe ratio using the registry's lifetime trial count — no need to pass trials yourself. Call this for a multiple-testing-honest Sharpe on work tracked by this system; use tengu_v3_deflated_sharpe when you have your own trials and moments.","body_schema":{"type":"object","required":["strategy_family","sharpe"],"properties":{"strategy_family":{"type":"string","description":"registry family key whose lifetime trial count deflates the Sharpe"},"sharpe":{"type":"number"},"n_obs":{"type":"integer","default":252},"skewness":{"type":"number","default":0.0},"kurtosis":{"type":"number","default":3.0},"n_trials_override":{"type":"integer","description":"bypass the registry count"}}},"admin":false},{"name":"tengu_v3_validation_trials","method":"GET","path":"/api/v3/validation/trials","group":"v3","description":"Recent trials recorded in the DSR registry (limit param, default 100). Call it when the user asks what backtests or experiments have been run, or to audit the multiple-testing history behind a deflated Sharpe.","query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":5000}],"admin":false,"display_name":"Validation trials"},{"name":"tengu_v3_validation_trial_count","method":"GET","path":"/api/v3/validation/trial_count","group":"v3","description":"Lifetime count of registered trials — the N used for DSR deflation. Call it to know how heavy the multiple-testing burden is before interpreting any deflated Sharpe, or when the user asks how many strategy variants have been tried.","admin":false},{"name":"tengu_v3_kelly_uncertainty","method":"GET","path":"/api/v3/validation/{ticker}/kelly_uncertainty","group":"v3","description":"Uncertainty-discounted Kelly fraction for one ticker — the bet size after haircutting full Kelly for estimation error. Call this when the user asks 'how much should I bet on X?' or to know how large a position the evidence actually supports before sizing a trade.","path_params":["ticker"],"admin":false,"display_name":"Position sizing"},{"name":"tengu_v3_stream_ticks","method":"GET","path":"/api/v3/stream/ticks","group":"v3","description":"SSE stream of live US-equity trades. A filtered connect queues cross-process T+Q coverage; the dedicated producer reconciles it asynchronously (target ~5s).","query_params":[{"name":"symbols","type":"string","description":"Comma-separated ticker filter"}],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_bars","method":"GET","path":"/api/v3/stream/bars","group":"v3","description":"SSE stream of live 1-minute OHLCV bars for EVERY US-listed ticker (no subscribe step needed — the all-ticker feed is always on). Each frame closes one 1-minute candle ~1s after the venue closes it: open/high/low/close/volume/vwap + bar_period_s=60. The live-candle feed for charting; quiet outside ~04:00-20:00 ET, which is correct. For chart HISTORY use REST aggregates, not a stream.","query_params":[{"name":"symbols","type":"string","description":"Comma-separated ticker filter (optional)"}],"admin":false},{"name":"tengu_v3_stream_quotes","method":"GET","path":"/api/v3/stream/quotes","group":"v3","description":"SSE stream of live per-venue bid/ask quote events for the requested symbols (bid/ask price+size + per-side venue IDs). Connecting auto-subscribes coverage within ~5s. Quiet outside US market hours — that is correct, not broken. Sizes are the venue's numbers untransformed; never present them as share counts.","query_params":[{"name":"symbols","type":"string","required":true,"description":"Comma-separated tickers (required)"}],"admin":false},{"name":"tengu_v3_stream_quotes_subscribe","method":"POST","path":"/api/v3/stream/quotes/subscribe","group":"v3","description":"Pre-warm live-quote coverage for up to 50 symbols before opening the quotes SSE (idempotent; extends the TTL). Use when a consumer wants first-frame data instead of paying the ~5s subscribe latency on connect. Redis outage or a fully occupied 200-symbol shared warm budget returns retryable 503; partial admission is listed explicitly.","body_schema":{"type":"object","required":["symbols"],"properties":{"symbols":{"type":"array","maxItems":50,"items":{"type":"string"}},"ttl_s":{"type":"number","minimum":30,"maximum":3600,"default":300}}},"admin":false},{"name":"tengu_v3_stream_signals","method":"GET","path":"/api/v3/stream/signals","group":"v3","description":"SSE stream of fused signals","query_params":[{"name":"symbols","type":"string"}],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_decisions","method":"GET","path":"/api/v3/stream/decisions","group":"v3","description":"SSE stream of decision-lifecycle events","query_params":[{"name":"symbols","type":"string"}],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_alerts","method":"GET","path":"/api/v3/stream/alerts","group":"v3","description":"SSE stream of risk / guardrail alerts","admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_news","method":"GET","path":"/api/v3/stream/news","group":"v3","description":"SSE stream of structured-news items","query_params":[{"name":"symbols","type":"string"}],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_events","method":"GET","path":"/api/v3/stream/events","group":"v3","description":"Per-user scoped SSE event stream","query_params":[{"name":"user_id","type":"string","required":true,"server_injected":true}],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_stream_market_events","method":"GET","path":"/api/v3/stream/market_events","group":"v3","description":"SSE stream of freshness-labelled market events. Every record carries source as-of time, feed lag and staleness so old data cannot masquerade as a new breach.","query_params":[{"name":"symbols","type":"string"}],"admin":false},{"name":"tengu_v3_market_events_catchup","method":"GET","path":"/api/v3/events","group":"v3","description":"Finite catch-up page for retained market events after a Redis stream id; use after reconnect and preserve each event's source freshness fields.","query_params":[{"name":"since","type":"string","description":"Exclusive Redis stream id"},{"name":"symbols","type":"string"},{"name":"limit","type":"integer"}],"admin":false},{"name":"tengu_v3_stream_status","method":"GET","path":"/api/v3/stream/status","group":"v3","description":"Bounded Redis reachability plus expiring market-producer and signal-pipeline heartbeats, per-capability readiness, coverage modes/limits and known SSE endpoints. Call before claiming live data or diagnosing missing/stale feeds.","admin":false},{"name":"tengu_v3_stream_ingest_status","method":"GET","path":"/api/v3/stream/ingest_status","group":"v3","description":"Live-data ingest daemon status: provider, subscribed symbols, connection uptime, tick/bar counters, last error. Call when the user asks why live data looks missing/stale.","admin":false},{"name":"tengu_v3_stream_signal_generator_status","method":"GET","path":"/api/v3/stream/signal_generator_status","group":"v3","description":"Effective signal-generator status across the optional in-process worker and dedicated processor heartbeat: input ticks, emitted signals and deployment state. Call when live signals look missing/stale.","admin":false},{"name":"tengu_v3_stream_tick_writer_status","method":"GET","path":"/api/v3/stream/tick_writer_status","group":"v3","description":"Tick writer (tick-persistence buffer) status: buffered rows, batches written, last flush duration. Call when the user asks whether the pipeline is healthy or why stored tick data looks missing.","admin":false},{"name":"tengu_v3_stream_decision_generator_status","method":"GET","path":"/api/v3/stream/decision_generator_status","group":"v3","description":"Effective decision-generator status across the optional in-process worker and dedicated processor heartbeat: input signals, emitted decisions, deployment state and local gate counters. Call when decisions are missing.","admin":false},{"name":"tengu_v3_stream_news_publisher_status","method":"GET","path":"/api/v3/stream/news_publisher_status","group":"v3","description":"News publisher status: polls completed, articles seen/published, dedup hits, newswire availability. Call when the user asks why news looks missing/stale or whether the pipeline is healthy.","admin":false},{"name":"tengu_v3_stream_universe_status","method":"GET","path":"/api/v3/stream/universe_status","group":"v3","description":"Legacy in-process UniverseManager diagnostics for dev. For production cross-process warm coverage use tengu_v3_market_universe and tengu_v3_stream_status.","admin":false},{"name":"tengu_v3_market_universe","method":"GET","path":"/api/v3/market/universe","group":"v3","description":"Cross-process shared warm-set catalog plus the dedicated US-equity producer heartbeat, research-universe count, capacity and effective readiness. Warm means requested, not provider-confirmed.","admin":false},{"name":"tengu_v3_market_universe_warm","method":"POST","path":"/api/v3/market/universe/warm","group":"v3","description":"Queues expiring cross-process trade+quote coverage (body {\"symbols\": [...]}, up to 200). The dedicated producer reconciles asynchronously on its target ~5s poll; success does not claim provider confirmation. Redis failure or zero admission because the shared budget is full returns a retryable 503; partial admission is explicit.","body_schema":{"type":"object","required":["symbols"],"properties":{"symbols":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":200}}},"admin":false},{"name":"tengu_v3_stream_realtime_guide","method":"GET","path":"/api/v3/stream/realtime_guide","group":"v3","description":"Agent protocol for real-time queries: which SSE feed maps to which intent (live price, signals, decisions, news, alerts), payload shapes, when to prefer SSE over REST, and fallback rules when flags are off","admin":false},{"name":"tengu_v3_news_latest","method":"GET","path":"/api/v3/news/latest","group":"v3","description":"DRILL-DOWN ONLY — never a first-round call and never alongside tengu_v3_news_summary (it already includes recent stories). Raw newswire headlines for one ticker over a lookback window (minutes param, default 60; 60s TTL) for when the summary's stories are insufficient or you need a tighter time window.","query_params":[{"name":"ticker","type":"string"},{"name":"minutes","type":"int","default":60,"min":5,"max":1440}],"admin":false,"display_name":"Latest news"},{"name":"tengu_v3_news_by_topic","method":"GET","path":"/api/v3/news/by_topic","group":"v3","description":"Topic-filtered headlines (earnings, analysts, dividend, mergers, acquisition, ipo, fda, guidance, stock_buyback, insider, lawsuit, esg, crypto, and more), optionally per ticker, over a date_range (default last7days, 50 items). Call it when the user asks about a specific event type — 'any FDA news?', 'recent M&A headlines'.","query_params":[{"name":"topic","type":"string","required":true,"description":"earnings | analysts | dividend | mergers | acquisition | ipo | partnership | spinoff | bankruptcy | layoffs | fda | guidance | stock_buyback | stocksplit | insider | lawsuit | esg | crypto"},{"name":"ticker","type":"string"},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"date_range","type":"string","default":"last7days"}],"admin":false},{"name":"tengu_v3_news_sentiment_stats","method":"GET","path":"/api/v3/news/sentiment_stats","group":"v3","description":"Daily news-sentiment rollup for one ticker: a -1.5 to +1.5 score per day with article counts, over a date_range (default last30days). Call it when the user asks how sentiment on X is trending or whether coverage has turned negative; use tengu_v3_news_latest for the actual headlines.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"date_range","type":"string","default":"last30days"}],"admin":false,"display_name":"Sentiment stats"},{"name":"tengu_v3_news_market_sentiment","method":"GET","path":"/api/v3/news/market_sentiment","group":"v3","description":"Overall market-wide news-sentiment rollup over a date_range (default last7days). Call this when the user asks how the market 'feels' right now or whether the news backdrop is bullish or bearish — before drilling into single tickers.","query_params":[{"name":"date_range","type":"string","default":"last7days"}],"admin":false,"display_name":"Overall market sentiment"},{"name":"tengu_v3_news_trending","method":"GET","path":"/api/v3/news/trending","group":"v3","description":"DRILL-DOWN ONLY — never alongside tengu_v3_news_summary (it already includes trending status). The newswire's noise-filtered top stories for a ticker, for when you specifically need the trending ranking on its own.","query_params":[{"name":"ticker","type":"string"}],"admin":false,"display_name":"Trending news"},{"name":"tengu_v3_news_top_mentions","method":"GET","path":"/api/v3/news/top_mentions","group":"v3","description":"Most-mentioned tickers in the news over a window (default today), optionally filtered by sector — a market-attention proxy. Call this when the user asks which stocks are getting the most buzz or where the crowd's focus is today.","query_params":[{"name":"date_range","type":"string","default":"today"},{"name":"sector","type":"string"}],"admin":false,"display_name":"Trending tickers"},{"name":"tengu_v3_news_sundown","method":"GET","path":"/api/v3/news/sundown","group":"v3","description":"Curated end-of-day 'sundown' digest — a market-close recap of the day's news from the newswire, over an optional date_range. Call this when the user asks 'what happened in the market today' or wants a daily wrap-up.","query_params":[{"name":"date_range","type":"string"}],"admin":false,"display_name":"Evening digest"},{"name":"tengu_v3_news_curated_events","method":"GET","path":"/api/v3/news/curated_events","group":"v3","description":"Structured market events — earnings, M&A, FDA decisions, guidance changes, price-target moves — filterable by ticker, event_type, and date_range (default today). Call this when the user asks 'what events happened' or 'any catalysts for X' instead of scanning raw headlines.","query_params":[{"name":"ticker","type":"string"},{"name":"event_type","type":"string"},{"name":"date_range","type":"string","default":"today"},{"name":"items","type":"int","default":50,"min":1,"max":50}],"admin":false},{"name":"tengu_v3_news_ticker_news","method":"GET","path":"/api/v3/news/ticker_news","group":"v3","description":"FILTERED-SEARCH ONLY — reach for this when the user specifies filters (topic, sector, source, sentiment, date_range, article/video, free-text search) or multi-ticker search. Never for plain 'what's the news on X?' (that is tengu_v3_news_summary). Full newswire filter spec; sortby rank or oldestfirst.","query_params":[{"name":"tickers","type":"string","required":true,"description":"Comma-separated tickers"},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":50},{"name":"date_range","type":"string"},{"name":"sector","type":"string"},{"name":"topic","type":"string"},{"name":"topic_or","type":"string"},{"name":"topic_exclude","type":"string"},{"name":"source","type":"string"},{"name":"source_exclude","type":"string"},{"name":"news_type","type":"string","enum":["article","video"]},{"name":"sentiment","type":"string","enum":["positive","negative","neutral"]},{"name":"sortby","type":"string","enum":["rank","oldestfirst"]},{"name":"days","type":"int","min":1,"max":30},{"name":"search","type":"string"},{"name":"search_or","type":"string"},{"name":"fallback","type":"bool","default":false}],"admin":false,"display_name":"Ticker news"},{"name":"tengu_v3_news_ticker_only","method":"GET","path":"/api/v3/news/ticker_only","group":"v3","description":"News stories tagged with ONLY this one ticker — the strictest filter, excluding articles that co-tag competitors or peers. Call this when the user wants pure company-specific coverage without sector noise; use ticker_news for broader filtered search.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false},{"name":"tengu_v3_news_multi_ticker","method":"GET","path":"/api/v3/news/multi_ticker","group":"v3","description":"News stories where ALL the listed tickers co-appear in the same article — a correlation feed. Call this when the user asks how two or more companies are linked in the news (deals, rivalries, shared catalysts); use ticker_news for per-ticker coverage.","query_params":[{"name":"tickers","type":"string","required":true},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false,"display_name":"Multi-ticker news"},{"name":"tengu_v3_news_all_tickers_sentiment","method":"GET","path":"/api/v3/news/all_tickers_sentiment","group":"v3","description":"Sentiment leaderboard across the full tracked ticker universe over a date_range (default last7days), paginated. Call this when the user asks which stocks have the most positive or negative news sentiment right now — a screening pass before single-name digs.","query_params":[{"name":"date_range","type":"string","default":"last7days"},{"name":"page","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"Sentiment per ticker"},{"name":"tengu_v3_news_alerts","method":"GET","path":"/api/v3/news/alerts","group":"v3","description":"Headline-only alert stream — lighter and faster than full news items; category=general for market-wide or category=ticker with tickers for specific names. Call this when the user wants breaking headlines or the very latest on a name and speed matters more than article bodies.","query_params":[{"name":"category","type":"string","enum":["general","ticker"]},{"name":"tickers","type":"string"},{"name":"items","type":"int","default":100,"min":1,"max":100},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false},{"name":"tengu_v3_news_ratings","method":"GET","path":"/api/v3/news/ratings","group":"v3","description":"Analyst rating actions — upgrades, downgrades, and initiations, filterable by tickers, rating_type, and date_range; history goes back to 2022-04-08. PRIMARY tool for 'any recent upgrades or downgrades on X?' and for gauging how sell-side conviction is shifting.","query_params":[{"name":"tickers","type":"string"},{"name":"rating_type","type":"string","enum":["upgrade","downgrade","initiation"]},{"name":"date_range","type":"string"},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false,"display_name":"Analyst ratings"},{"name":"tengu_v3_news_event_by_id","method":"GET","path":"/api/v3/news/event_by_id","group":"v3","description":"All news items belonging to one clustered event, looked up by eventid, paginated. Call this when you already have an eventid from another news result and the user wants the full article set behind that single catalyst or story cluster.","query_params":[{"name":"eventid","type":"string","required":true},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"News event"},{"name":"tengu_v3_news_category","method":"GET","path":"/api/v3/news/category","group":"v3","description":"Category-scoped news feed: section=general for market-wide or alltickers for company-tagged stories, filterable by topic, sector, industry, and source. Call this when the user wants themed or sector-level news rather than coverage of a specific ticker.","query_params":[{"name":"section","type":"string","default":"general","enum":["general","alltickers"]},{"name":"topic","type":"string"},{"name":"sector","type":"string"},{"name":"industry","type":"string"},{"name":"source","type":"string"},{"name":"items","type":"int","default":50,"min":1,"max":50},{"name":"page","type":"int","default":1,"min":1,"max":50},{"name":"date_range","type":"string"}],"admin":false},{"name":"tengu_v3_news_summary","method":"GET","path":"/api/v3/news/summary/{ticker}","group":"v3","description":"One-shot news intelligence for a ticker: recent stories, sentiment stats, trending status, structured events, and analyst actions in a single parallel fetch (90s TTL). THE primary tool for 'what's the news on X?' — this ALONE answers most single-ticker news questions; do NOT stack other news tools in the same round unless it returns nothing useful.","path_params":["ticker"],"admin":false,"display_name":"News brief"},{"name":"tengu_v3_news_structured","method":"GET","path":"/api/v3/news/structured","group":"v3","description":"LLM-structured news items — event_type, tickers, sentiment, magnitude, confidence","query_params":[{"name":"hours","type":"int","default":72,"min":1,"max":720},{"name":"ticker","type":"string"},{"name":"event_type","type":"string"},{"name":"limit","type":"int","default":200,"min":1,"max":2000}],"admin":false,"capability_tags":["data_pending_v1"]},{"name":"tengu_v3_fundamentals_income_statements","method":"GET","path":"/api/v3/fundamentals/income_statements","group":"v3","description":"SEC EDGAR income statements (P&L line-items, revenue through net income/EPS) for a ticker — quarterly, annual, or TTM (default quarterly, last 8 periods). Call this when the user asks about revenue or earnings trends and wants the actual reported statements.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"period","type":"string","default":"quarterly","enum":["annual","quarterly","ttm"]},{"name":"limit","type":"int","default":8,"min":1,"max":200}],"admin":false,"display_name":"Income statement"},{"name":"tengu_v3_fundamentals_balance_sheets","method":"GET","path":"/api/v3/fundamentals/balance_sheets","group":"v3","description":"SEC EDGAR balance sheets for a ticker — assets, liabilities, and equity line-items per period, quarterly or annual (default quarterly, last 8 periods). Call this when the user asks about cash on hand, debt load, or book value straight from reported filings.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"period","type":"string","default":"quarterly","enum":["annual","quarterly","ttm"]},{"name":"limit","type":"int","default":8,"min":1,"max":200}],"admin":false,"display_name":"Balance sheet"},{"name":"tengu_v3_fundamentals_cash_flow_statements","method":"GET","path":"/api/v3/fundamentals/cash_flow_statements","group":"v3","description":"SEC EDGAR cash-flow statements for a ticker — operating, investing, and financing flows per period, quarterly or annual (default quarterly, last 8 periods). Call this when the user asks about cash generation, capex, buybacks, or how earnings convert to actual cash.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"period","type":"string","default":"quarterly","enum":["annual","quarterly","ttm"]},{"name":"limit","type":"int","default":8,"min":1,"max":200}],"admin":false,"display_name":"Cash flow"},{"name":"tengu_v3_fundamentals_all","method":"GET","path":"/api/v3/fundamentals/all","group":"v3","description":"All three financial statements — income, balance sheet, and cash flow — for a ticker in one round-trip (default quarterly, last 4 periods). Call this when the user wants a full fundamental picture of a company instead of three separate statement calls.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"period","type":"string","default":"quarterly","enum":["annual","quarterly","ttm"]},{"name":"limit","type":"int","default":4,"min":1,"max":200}],"admin":false},{"name":"tengu_v3_fundamentals_metrics","method":"GET","path":"/api/v3/fundamentals/metrics","group":"v3","description":"Derived financial-metric rows per period for a ticker — P/E, ROE, margins, FCF yield, debt ratios — quarterly, annual, or TTM (default quarterly, last 4 periods). Call this when the user asks about valuation or quality ratios and their trend without needing raw statement line-items.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"period","type":"string","default":"quarterly","enum":["annual","quarterly","ttm"]},{"name":"limit","type":"int","default":4,"min":1,"max":200}],"admin":false,"display_name":"Key metrics (full)"},{"name":"tengu_v3_fundamentals_metrics_snapshot","method":"GET","path":"/api/v3/fundamentals/metrics_snapshot","group":"v3","description":"Latest financial-metrics snapshot for a ticker — a single TTM row of valuation and quality ratios. Call this for a quick 'what's the P/E, how profitable is X right now?' check; use fundamentals_metrics when the user needs the per-period history.","query_params":[{"name":"ticker","type":"string","required":true}],"admin":false,"display_name":"Key metrics (snapshot)"},{"name":"tengu_v3_fundamentals_insider_trades","method":"GET","path":"/api/v3/fundamentals/insider_trades","group":"v3","description":"Form-4 insider transactions for one ticker — officer and director buys and sells (default limit 50). Call this when the user asks whether insiders are buying or selling a stock, or wants insider-conviction evidence for a name.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Insider Form-4 filings"},{"name":"tengu_v3_fundamentals_institutional_ownership","method":"GET","path":"/api/v3/fundamentals/institutional_ownership","group":"v3","description":"13F institutional holdings for one ticker, itemized by holding institution (default limit 50). Call this when the user asks which institutions or funds own a stock or how concentrated institutional ownership is.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Institutional ownership"},{"name":"tengu_v3_fundamentals_companyfacts","method":"GET","path":"/api/v3/fundamentals/companyfacts/{ticker}","group":"v3","description":"Directory of every as-reported XBRL concept (us-gaap/dei/ifrs-full) a company has filed — unit(s), observation count and period coverage — from the in-house SEC EDGAR companyfacts corpus. Call it FIRST to find the concept tag for /fundamentals/xbrl/{ticker}/{concept}. Point-in-time, no vendor restatement.","path_params":["ticker"],"query_params":[{"name":"search","type":"string","description":"Case-insensitive substring filter on the XBRL concept tag"},{"name":"limit","type":"int","default":400,"min":1,"max":2000}],"admin":false},{"name":"tengu_v3_fundamentals_xbrl","method":"GET","path":"/api/v3/fundamentals/xbrl/{ticker}/{concept}","group":"v3","description":"One XBRL concept's as-reported history — period, value, fiscal year/period, SEC form, accession, filed date — from the in-house SEC EDGAR companyfacts corpus. Call it for exact as-filed fundamentals: as_of= for point-in-time (no restatement look-ahead), history=true for all restatements; find tags via /fundamentals/companyfacts.","path_params":["ticker","concept"],"query_params":[{"name":"taxonomy","type":"string","description":"Pin the taxonomy (us-gaap/dei/ifrs-full); default auto-search"},{"name":"unit","type":"string","description":"Filter to one unit (USD, shares, USD/shares)"},{"name":"form","type":"string","description":"Filter to one SEC form (10-K, 10-Q)"},{"name":"start","type":"string","description":"Earliest reporting-period end date YYYY-MM-DD"},{"name":"end","type":"string","description":"Latest reporting-period end date YYYY-MM-DD"},{"name":"as_of","type":"string","description":"Point-in-time: only values filed on or before this date (no restatement look-ahead)"},{"name":"history","type":"bool","default":false,"description":"True = full disclosure history (all restatements); False = one best value per period"},{"name":"limit","type":"int","default":500,"min":1,"max":5000}],"admin":false},{"name":"tengu_v3_tape_options_chain","method":"GET","path":"/api/v3/tape/options_chain/{ticker}","group":"v3","description":"Full historical OPTIONS CHAIN for one underlying on one snapshot day from FIRM's own daily market-data capture — per contract: strike, expiry, dte, bid/ask/mid/last, day volume + VWAP, implied volatility, the full greeks (delta/gamma/theta/vega), open interest and underlying price, plus a chain summary (contract/expiration counts, put/call OI + volume ratios, front-month ATM IV). Use it to reconstruct the IV surface, greeks or OI distribution AS IT STOOD on a past day, find where OI/volume concentrated, or pull the near-the-money strikes around an event. Omit date for the latest captured day (reported as snapshot_day); filter by side, expiration/dte, min OI/volume or a moneyness band; sort by open interest or dollar notional. Capture begins 2026-05-10. For the raw options TRADE tape use tengu_v3_tape_options; for live GEX/dealer flow use the options_flow tools.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"snapshot day YYYY-MM-DD — omit for the latest captured day"},{"name":"contract_type","type":"string","enum":["call","put"],"description":"filter one side (also accepts C/P); default both"},{"name":"expiration","type":"string","description":"filter to one expiration date YYYY-MM-DD"},{"name":"min_dte","type":"int","min":0,"max":3650,"description":"minimum days-to-expiry"},{"name":"max_dte","type":"int","min":0,"max":3650,"description":"maximum days-to-expiry"},{"name":"min_open_interest","type":"float","min":0,"description":"only contracts with open_interest >= this"},{"name":"min_volume","type":"float","min":0,"description":"only contracts with day_volume >= this"},{"name":"moneyness","type":"float","min":0,"max":5.0,"description":"keep strikes within +/- this fraction of the underlying (0.1 = the near-the-money +/-10% band)"},{"name":"sort","type":"string","default":"open_interest","enum":["open_interest","notional"]},{"name":"limit","type":"int","default":100,"min":1,"max":2000}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_intel_vol_surface","method":"GET","path":"/api/v3/intel/vol_surface/{ticker}","group":"v3","description":"standardized implied-vol SURFACE for a company, joined from a plain equity ticker (resolves the symbol to the surface's internal id via the link table). Returns the standardized surface grid: for each maturity (days = 30/60/91/182/365) and delta node, per call/put the interpolated implied volatility and its dispersion — the clean vol skew + term structure behind risk-reversals, butterflies and the ATM vol term structure. Use to read a name's vol smile or how implied vol changes across expiries. Omit date for the latest-available surface (lagged academic archive — currently the 2011 slice, 3,956 names); pass date=YYYY-MM-DD for a specific session and days= to pin one maturity. Standardized grid, NOT the raw chain — for live per-contract quotes use /intel/options_chain.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"Surface date YYYY-MM-DD; OMIT for the latest-available surface (the archive is lagged, so a today-relative date reads empty). Served date + available range are reported in the response."},{"name":"days","type":"float","description":"Filter to ONE maturity in calendar days (30/60/91/182/365); omit for the full term structure"},{"name":"limit","type":"int","default":500,"min":1,"max":2000}],"admin":false},{"name":"tengu_v3_funds_mutual_fund_ownership","method":"GET","path":"/api/v3/funds/mutual_fund_ownership/{ticker}","group":"v3","description":"Which mutual funds hold a stock — each fund's percent_tna, shares and market value, largest first, plus report_dt and n_funds, from the survivor-bias-free holdings archive (coverage 2002-2021; no date = latest lagged quarter-end). Call it for mutual-fund demand base or holder concentration; for 13F institutional holders use /intel/sec13f.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"Report date YYYY-MM-DD (a quarter-end); omit for the LATEST available report — the archive lags and ends 2021-12-31"},{"name":"top","type":"int","default":100,"min":1,"max":5000,"description":"Max funds returned, largest position (market_val) first"},{"name":"min_market_val","type":"number","min":0,"description":"Only funds whose position market value (USD) is at least this (e.g. 1e9 for billion-dollar holders)"}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_factor_predictors","method":"GET","path":"/api/v3/factors/predictors/{ticker}","group":"v3","description":"academic open-source predictor panel for one stock — a compact vector of 13 replicated accounting anomalies (Sloan accruals, Cooper-Gulen-Schill asset growth, Titman capital investment, Novy-Marx gross profitability, Fama-French operating profitability, cash-to-assets, leverage change, earnings consistency, revenue growth, positive-NI/positive-CFO flags, current ratio, net share issuance) at monthly grain. Call it for a ready-made feature vector when you don't need the full ~460-column factor panel. Returns the series newest-last, or with latest=true only the single most-recent row as a name->value map; with no start/end it serves the LATEST AVAILABLE rows (lagged quarterly archive) and reports the actual window. Ticker is resolved to its internal security key automatically (the table has no ticker column).","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"ISO date series start (omit both dates for the latest available rows)"},{"name":"end","type":"string","description":"ISO date series end (omit both for the latest available rows)"},{"name":"latest","type":"bool","default":false,"description":"True = only the single most-recent predictor row (name->value map)"},{"name":"limit","type":"int","default":600,"min":1,"max":2000,"description":"max rows in series mode (newest kept); ignored when latest=true"}],"admin":false},{"name":"tengu_v3_fundamentals_segments","method":"GET","path":"/api/v3/fundamentals/segments/{ticker}","group":"v3","description":"Business + geographic SEGMENT breakdown for one company — decomposes a fiscal period into reportable segments by line of business, geography, ASC-280 operating segment and US state, each with sales, revenue, operating income and SIC, grouped by segment type. Call it to see WHERE a company earns: revenue mix by region (e.g. Greater China share) or which line of business carries the margin. Internally keyed (the ticker is resolved via the point-in-time name master, most-recent row); the archive lags, so with no year/date it returns the LATEST available period and reports the datadate served. Values are in the reported currency, fundamentals's millions convention.","path_params":["ticker"],"query_params":[{"name":"year","type":"int","min":1960,"max":2100,"description":"Fiscal year to return (matched on the segment datadate's year); omit for the latest available period"},{"name":"date","type":"string","description":"Exact segment datadate YYYY-MM-DD (overrides year); use available_datadates to pick a valid one"},{"name":"stype","type":"string","description":"Return only one segment type: business / geographic / operating / state (or the raw code BUSSEG/GEOSEG/OPSEG/STSEG); default all"},{"name":"limit","type":"int","default":200,"min":1,"max":2000,"description":"Max segment rows across all groups"}],"admin":false},{"name":"tengu_v3_fundamentals_earnings_press_releases","method":"GET","path":"/api/v3/fundamentals/earnings_press_releases","group":"v3","description":"Full text of a company's earnings press releases, including guidance language (default limit 8). Call this when the user asks what management said or guided in an earnings release, or wants exact announcement wording.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"limit","type":"int","default":8,"min":1,"max":200}],"admin":false,"display_name":"Earnings releases"},{"name":"tengu_v3_fundamentals_sec_filings","method":"GET","path":"/api/v3/fundamentals/sec_filings","group":"v3","description":"SEC filings list for a ticker — 10-K, 10-Q, 8-K, S-1 and more, with an optional form_type filter (default limit 20). Call this when the user asks what a company has filed or wants to locate a specific filing type.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"limit","type":"int","default":20,"min":1,"max":200},{"name":"form_type","type":"string"}],"admin":false,"display_name":"SEC filings"},{"name":"tengu_v3_fundamentals_company_facts","method":"GET","path":"/api/v3/fundamentals/company_facts","group":"v3","description":"Static company profile for one ticker — sector, industry, CIK, exchange, market cap and employee count. Call it to know what a company is and how big it is before deeper analysis. Not the XBRL corpus — that discovery lives at /fundamentals/companyfacts/{ticker}.","query_params":[{"name":"ticker","type":"string","required":true}],"admin":false,"display_name":"Company facts"},{"name":"tengu_v3_fundamentals_prices","method":"GET","path":"/api/v3/fundamentals/prices","group":"v3","description":"Historical OHLCV bars for one ticker at second/minute/hour/day/week/month granularity (interval_multiplier for e.g. 5-minute bars; start_date/end_date window, default limit 1000). Call this when the user asks for price history, returns over a window, or intraday bars; for the latest quote use /fundamentals/price_snapshot. CRYPTO: pass asset_class=crypto for BTC/ETH/SOL/LTC/LINK etc. Several crypto symbols are ALSO US-listed equity tickers (BTC is a Grayscale trust at ~$29; LINK is Interlink Electronics), so a bare ticker returns the EQUITY. Never use an equity price for a crypto asset.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"asset_class","type":"string","default":"equity","enum":["equity","crypto"],"description":"'crypto' returns the real crypto asset; omit or 'equity' returns the US-listed equity of the same ticker"},{"name":"interval","type":"string","default":"day","enum":["second","minute","hour","day","week","month"]},{"name":"interval_multiplier","type":"int","default":1,"min":1,"max":60},{"name":"start_date","type":"string","description":"YYYY-MM-DD"},{"name":"end_date","type":"string","description":"YYYY-MM-DD"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000,"description":"the most recent N bars in the window"}],"admin":false,"display_name":"Price history"},{"name":"tengu_v3_fundamentals_price_snapshot","method":"GET","path":"/api/v3/fundamentals/price_snapshot","group":"v3","description":"Latest quote for one ticker — last trade plus the current daily bar. Call this when the user asks what the price is now or how the stock is moving today; for history use /fundamentals/prices. CRYPTO: pass asset_class=crypto for BTC/ETH/SOL/LTC/LINK etc. Several crypto symbols are ALSO US-listed equity tickers (BTC is a Grayscale trust at ~$29; LINK is Interlink Electronics), so a bare ticker returns the EQUITY. Never use an equity price for a crypto asset. Check is_stale before using the price.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"asset_class","type":"string","default":"equity","enum":["equity","crypto"],"description":"'crypto' returns the real crypto asset; omit or 'equity' returns the US-listed equity of the same ticker"}],"admin":false,"display_name":"Price snapshot (fundamentals)"},{"name":"tengu_v3_fundamentals_news","method":"GET","path":"/api/v3/fundamentals/news","group":"v3","description":"Curated news articles for one ticker from the fundamentals market-data feed, with start_date/end_date filtering (default 50). Call it for ticker-scoped headlines while working inside fundamentals; it is distinct from the primary news surface — use the news tools for broad or breaking coverage.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"limit","type":"int","default":50,"min":1,"max":100},{"name":"start_date","type":"string","description":"YYYY-MM-DD"},{"name":"end_date","type":"string","description":"YYYY-MM-DD"}],"admin":false,"display_name":"Company news"},{"name":"tengu_v3_fundamentals_full","method":"GET","path":"/api/v3/fundamentals/full/{ticker}","group":"v3","description":"One-shot fundamentals bundle for a ticker — metrics snapshot, TTM income, latest balance sheet and cash-flow, company facts, recent insider trades and top institutional holders, fetched in parallel. PRIMARY tool for 'give me the full fundamental picture of X' — call it instead of assembling the pieces one by one.","path_params":["ticker"],"admin":false,"display_name":"Fundamentals"},{"name":"tengu_v3_fundamentals_company_full","method":"GET","path":"/api/v3/fundamentals/company_full/{ticker}","group":"v3","description":"One-call company snapshot — info + TTM + ratios + growth + MRQ balance (fundamentalsapi.com)","path_params":["ticker"],"admin":false,"display_name":"Company profile"},{"name":"tengu_v3_fundamentals_growth","method":"GET","path":"/api/v3/fundamentals/growth","group":"v3","description":"Growth metrics — YoY, 3Y CAGR, 5Y CAGR and margin trends; accepts comma-separated tickers for one-call bulk comparison. Call this when the user asks how fast a company is growing, whether margins are trending up, or to compare growth across several names.","query_params":[{"name":"tickers","type":"string","required":true,"description":"Comma-separated tickers"},{"name":"limit","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"Growth trajectory"},{"name":"tengu_v3_fundamentals_dividends","method":"GET","path":"/api/v3/fundamentals/dividends","group":"v3","description":"Dividend profile per ticker — DPS, payout ratio, consecutive-growth streak and 10Y history; accepts comma-separated tickers. Call this for any dividend-safety, income or 'how long has X raised its dividend' question.","query_params":[{"name":"tickers","type":"string","required":true,"description":"Comma-separated tickers"}],"admin":false,"display_name":"Dividends"},{"name":"tengu_v3_fundamentals_peers","method":"GET","path":"/api/v3/fundamentals/peers/{ticker}","group":"v3","description":"Same-industry comparables for a ticker, ranked by revenue, margins and ROE (default 10). Call this when the user asks who a company's competitors are or how it stacks up against peers — fetch it before any relative-valuation take.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":10,"min":1,"max":50}],"admin":false,"display_name":"Sector peers"},{"name":"tengu_v3_fundamentals_search","method":"GET","path":"/api/v3/fundamentals/search","group":"v3","description":"Fuzzy company lookup — resolves a free-text name or partial ticker to matching companies (default 10). Call it FIRST when the user names a company without a ticker, before firing any ticker-keyed fundamentals tool.","query_params":[{"name":"q","type":"string","required":true},{"name":"limit","type":"int","default":10,"min":1,"max":50}],"admin":false,"display_name":"Ticker search"},{"name":"tengu_v3_fundamentals_tickers","method":"GET","path":"/api/v3/fundamentals/tickers","group":"v3","description":"Paged listing of the full covered ticker universe, filterable to S&P 500 membership or one sector (limit/page paging). Call it when the user wants all the stocks in a sector or an index-membership list to feed a screen.","query_params":[{"name":"is_sp500","type":"bool","default":false},{"name":"sector","type":"string"},{"name":"limit","type":"int","default":100,"min":1,"max":500},{"name":"page","type":"int","default":1,"min":1,"max":200}],"admin":false,"display_name":"Ticker list"},{"name":"tengu_v3_fundamentals_screener","method":"GET","path":"/api/v3/fundamentals/screener","group":"v3","description":"Multi-filter stock screener combining profitability (ROE, ROA, net margin), growth (revenue, EPS), financial-health (debt/equity, current ratio) and dividend filters, with sector/industry scoping and sort control. PRIMARY tool for 'find me stocks that…' asks; ready-made strategies live in /fundamentals/screener/presets.","query_params":[{"name":"sector","type":"string"},{"name":"industry","type":"string"},{"name":"roe_min","type":"float"},{"name":"roe_max","type":"float"},{"name":"roa_min","type":"float"},{"name":"net_margin_min","type":"float"},{"name":"revenue_growth_min","type":"float"},{"name":"eps_growth_min","type":"float"},{"name":"debt_to_equity_max","type":"float"},{"name":"current_ratio_min","type":"float"},{"name":"years_dividend_growth_min","type":"int"},{"name":"payout_ratio_max","type":"float"},{"name":"sort_by","type":"string"},{"name":"sort_order","type":"string","default":"desc","enum":["asc","desc"]},{"name":"limit","type":"int","default":50,"min":1,"max":100},{"name":"page","type":"int","default":1,"min":1,"max":100}],"admin":false,"display_name":"Stock screener"},{"name":"tengu_v3_fundamentals_screener_presets","method":"GET","path":"/api/v3/fundamentals/screener/presets","group":"v3","description":"Catalog of pre-built screener strategies — Aristocrats, Cash Cows, Value, Quality and more. Call it when the user asks for a named strategy screen or wants screening ideas before composing /fundamentals/screener filters.","admin":false,"display_name":"Strategy screens"},{"name":"tengu_v3_fundamentals_ai_analyze","method":"GET","path":"/api/v3/fundamentals/ai_analyze/{ticker}","group":"v3","description":"AI-generated company analysis for one ticker — summary, strengths, concerns, peer comparison and a quality score. Call this when the user wants a synthesized qualitative read rather than raw numbers. Premium: metered at 100 credits/mo.","path_params":["ticker"],"admin":false,"display_name":"Filings analysis"},{"name":"tengu_v3_fundamentals_historical","method":"GET","path":"/api/v3/fundamentals/historical/{ticker}","group":"v3","description":"Multi-decade historical financial statements for one ticker from SEC EDGAR — income, balance, and cash-flow, filterable by statement_type and start_year/end_year, annual by default with include_quarterly opt-in. Call this when the user asks how fundamentals have trended over many years, not just the latest print.","path_params":["ticker"],"query_params":[{"name":"statement_type","type":"string","default":"all","enum":["income","balance","cashflow","all"]},{"name":"start_year","type":"int","min":1990,"max":2100},{"name":"end_year","type":"int","min":1990,"max":2100},{"name":"include_quarterly","type":"bool","default":false}],"admin":false,"display_name":"Financial history"},{"name":"tengu_v3_intel_options_flow","method":"GET","path":"/api/v3/intel/options_flow","group":"v3","description":"Recent unusual options-flow alerts across the whole market from the options-flow feed, filtered to trades above min_premium (default $50k). Call this when the user asks 'what is the smart money buying today?' or wants market-wide unusual options activity; use tengu_v3_intel_options_flow_ticker for a single name.","query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":200},{"name":"min_premium","type":"int","default":50000,"min":0,"max":100000000}],"admin":false,"display_name":"Options flow (recent)"},{"name":"tengu_v3_intel_options_flow_ticker","method":"GET","path":"/api/v3/intel/options_flow/{ticker}","group":"v3","description":"Unusual options-flow alerts for one ticker from the options-flow feed (default 25). Call this when the user asks 'any unusual options activity in X?' or wants the large options bets hitting a specific name; use tengu_v3_intel_options_flow for the cross-market view.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":200}],"admin":false,"display_name":"Options flow (ticker)"},{"name":"tengu_v3_intel_darkpool_recent","method":"GET","path":"/api/v3/intel/darkpool/recent","group":"v3","description":"Most recent dark-pool prints across all tickers from the options-flow feed (default 50). Call this when the user asks about market-wide dark-pool or block activity — 'any big dark-pool prints today?'; use tengu_v3_intel_darkpool_ticker for a single name.","query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":200}],"admin":false,"display_name":"Dark pool prints (recent)"},{"name":"tengu_v3_intel_darkpool_ticker","method":"GET","path":"/api/v3/intel/darkpool/{ticker}","group":"v3","description":"Dark-pool prints for one ticker from the options-flow feed (default 50). Call this when the user asks whether large blocks are crossing off-exchange in a specific name; use tengu_v3_intel_off_exchange for daily aggregate off-exchange volume instead of individual prints.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":200}],"admin":false,"display_name":"Dark pool prints (ticker)"},{"name":"tengu_v3_intel_gex","method":"GET","path":"/api/v3/intel/gex/{ticker}","group":"v3","description":"Aggregate gamma exposure (GEX) and delta exposure for one ticker from the options-flow feed. Call this when the user asks about dealer positioning or gamma levels, or whether options exposure could dampen or amplify moves in a name; pair with tengu_v3_intel_max_pain for expiry pin levels.","path_params":["ticker"],"admin":false,"display_name":"Gamma exposure"},{"name":"tengu_v3_intel_max_pain","method":"GET","path":"/api/v3/intel/max_pain/{ticker}","group":"v3","description":"Max-pain price per options expiration for one ticker from the options-flow feed. Call this when the user asks where a stock is likely to pin into expiry or what the max-pain level is; pair with tengu_v3_intel_gex for aggregate gamma/delta exposure.","path_params":["ticker"],"admin":false,"display_name":"Max pain"},{"name":"tengu_v3_intel_options_volume","method":"GET","path":"/api/v3/intel/options_volume/{ticker}","group":"v3","description":"Daily options volume and put/call ratio per day for one ticker from the options-flow feed (default 30 days). Call this when the user asks whether options activity or put/call skew is elevated versus recent days, or how bullish/bearish the options tape has been trending.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":30,"min":1,"max":200}],"admin":false,"display_name":"Options volume"},{"name":"tengu_v3_intel_factor_importance","method":"GET","path":"/api/v3/intel/factor_importance","group":"v3","description":"What drives the model: Fama-French 5-factor loadings showing which systematic factors explain the strategy's returns, plus the ensemble's Bayesian voter posteriors ranking which signals it trusts most (top_n, default 50). PRIMARY tool for 'why does the model like this?' and 'what is the strategy actually betting on?' questions.","query_params":[{"name":"top_n","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_risk_portfolio_var","method":"GET","path":"/api/v3/risk/portfolio_var","group":"v3","description":"Consensus portfolio VaR + CVaR (USD) on the live top-decile shadow book — Cornish-Fisher + t-copula Monte-Carlo + filtered-historical-simulation blended, with a liquidity-adjusted VaR. Call this when the user asks how much the model portfolio could lose. Caveat: 1-day horizon only (horizon_days_served=1); multi-day is not scaled.","query_params":[{"name":"confidence","type":"float","default":0.99,"min":0.5,"max":0.9999},{"name":"horizon_days","type":"int","default":1,"min":1,"max":30}],"capability_tags":["heavy"],"admin":false},{"name":"tengu_v3_research_correlation_mesh","method":"GET","path":"/api/v3/research/correlation_mesh","group":"v3","description":"Returns-correlation mesh around a seed ticker — nodes = tickers, edges = |rho| >= 0.6, from the 36-month realised-returns sidecar (depth expands the neighborhood). PRIMARY tool for 'what moves with X?' and finding hedge or pair candidates. Caveat: needs 36-month overlap; a freshly-listed or thinly-traded seed may be absent.","query_params":[{"name":"seed","type":"string","required":true},{"name":"depth","type":"int","default":1,"min":1,"max":3}],"capability_tags":["heavy"],"admin":false},{"name":"tengu_v3_intel_insider_trades","method":"GET","path":"/api/v3/intel/insider_trades/{ticker}","group":"v3","description":"SEC Form 4 insider trades for one ticker — recent buys and sells by officers, directors, and large holders (default 25). Call this when the user asks 'are insiders buying or selling X?' or wants to check insider conviction before acting on a name.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":200}],"admin":false,"display_name":"Insider trades (newswire)"},{"name":"tengu_v3_intel_congress","method":"GET","path":"/api/v3/intel/congress","group":"v3","description":"Congressional stock trades from two coverage sources — a realtime cross-ticker feed (provider=options_flow, default) or a bulk alternative-data feed (provider=alternative_data) — with an optional ticker filter. Call this when the user asks what Congress members have been buying or selling, market-wide or in a specific name.","query_params":[{"name":"ticker","type":"string"},{"name":"limit","type":"int","default":50,"min":1,"max":500},{"name":"provider","type":"string","default":"options_flow","enum":["options_flow","alternative_data"]}],"admin":false,"display_name":"Congressional trades"},{"name":"tengu_v3_intel_lobbying","method":"GET","path":"/api/v3/intel/lobbying/{ticker}","group":"v3","description":"Quarterly corporate lobbying spend for one ticker from the alternative-data feed (limit, default 50). Call this when the user asks how much a company spends lobbying or whether its policy exposure is growing; pair with tengu_v3_intel_gov_contracts for the government-contract side of the same story.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Lobbying activity"},{"name":"tengu_v3_intel_gov_contracts","method":"GET","path":"/api/v3/intel/gov_contracts/{ticker}","group":"v3","description":"Federal government contracts awarded to one ticker's company from the alternative-data feed (limit, default 50). Call this when the user asks how much government business a company wins or whether contract awards are accelerating; pair with tengu_v3_intel_lobbying for the lobbying-spend side.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Government contracts"},{"name":"tengu_v3_intel_wsb","method":"GET","path":"/api/v3/intel/wsb/{ticker}","group":"v3","description":"Daily r/wallstreetbets mention count and sentiment for one ticker from the alternative-data feed (default 60 days). Call this when the user asks whether retail is piling into a name or how retail buzz is trending; pair with tengu_v3_intel_twitter for the Twitter-side social read.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":60,"min":1,"max":365}],"admin":false,"display_name":"Retail chatter"},{"name":"tengu_v3_intel_twitter","method":"GET","path":"/api/v3/intel/twitter/{ticker}","group":"v3","description":"Daily Twitter mention volume and follower count for one ticker from the alternative-data feed (default 60 days). Call this when the user asks how much social buzz a name has or whether attention is spiking; pair with tengu_v3_intel_wsb for the r/wallstreetbets read.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":60,"min":1,"max":365}],"admin":false,"display_name":"Twitter mentions"},{"name":"tengu_v3_intel_off_exchange","method":"GET","path":"/api/v3/intel/off_exchange/{ticker}","group":"v3","description":"Daily off-exchange (dark pool + ATS) volume for one ticker from the alternative-data feed (default 30 days). Call this when the user asks how much of a stock's volume trades off-exchange or how dark-pool share is trending; use tengu_v3_intel_darkpool_ticker for individual prints.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":30,"min":1,"max":200}],"admin":false,"display_name":"Off-exchange flow"},{"name":"tengu_v3_intel_patents","method":"GET","path":"/api/v3/intel/patents/{ticker}","group":"v3","description":"Issued USPTO patents tagged to one ticker — date, title, IPC class, claim count, and abstract for each (default 25). Call this when the user asks what a company is patenting or wants an innovation-velocity read on its R&D pipeline.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":200}],"admin":false,"display_name":"Patents","capability_tags":["heavy"]},{"name":"tengu_v3_intel_chart","method":"GET","path":"/api/v3/intel/chart/{ticker}","group":"v3","description":"Candlestick chart with optional RSI/MACD/Bollinger overlays — returns a base64 PNG in a standard image envelope plus an OHLCV summary block (interval minute|hour|day|week|month, default day; 120 bars). Call this when the user asks to see a chart; powers chart-emitting skills (TA Master, Trading Plan, Apex Equity Intel).","path_params":["ticker"],"query_params":[{"name":"interval","type":"string","default":"day","description":"minute|hour|day|week|month"},{"name":"bars","type":"int","default":120,"min":20,"max":500},{"name":"indicators","type":"string","default":"rsi,macd,bb","description":"Comma-separated subset of {rsi,macd,bb}"}],"admin":false,"display_name":"Price chart"},{"name":"tengu_v3_intel_insiders","method":"GET","path":"/api/v3/intel/insiders","group":"v3","description":"Live cross-ticker Form-4 insider-transaction feed (alternative-data, last ~20k rows): name, transaction_code, shares, price_per_share, value_usd, shares_owned_following. Call this when the user asks 'are insiders buying or selling?' — one name or market-wide. Optional ticker filter is applied client-side.","query_params":[{"name":"ticker","type":"string","description":"Optional ticker filter"},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Insider activity"},{"name":"tengu_v3_intel_sec13f","method":"GET","path":"/api/v3/intel/sec13f","group":"v3","description":"Recent 13F position snapshots (alternative-data, cross-fund/cross-ticker, last ~10k rows): fund, ticker, shares, value_usd, report_period — the institutional-ownership signal. Call this when the user asks 'which funds hold X?' or 'what does fund Y own?'; filter by ticker and/or fund (substring match).","query_params":[{"name":"ticker","type":"string"},{"name":"fund","type":"string","description":"Substring match on fund name"},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Institutional holdings","capability_tags":["heavy"]},{"name":"tengu_v3_intel_sec13f_changes","method":"GET","path":"/api/v3/intel/sec13f/changes","group":"v3","description":"Quarter-over-quarter 13F position deltas (alternative-data), sign preserved: positive = added, negative = trimmed. Call this when the user asks 'are institutions adding or dumping X?'; set min_pct (absolute change fraction, e.g. 0.5 = 50%) to drop noise.","query_params":[{"name":"ticker","type":"string"},{"name":"fund","type":"string"},{"name":"min_pct","type":"float","default":0.0,"min":0.0,"max":10.0},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Institutional changes"},{"name":"tengu_v3_intel_top_shareholders","method":"GET","path":"/api/v3/intel/top_shareholders/{ticker}","group":"v3","description":"Top institutional / fund / insider shareholders for a ticker (alternative-data), as two lists — ownership (shares) and ownership_options (contracts) — because options exposure reads differently from equity holdings. Call this when the user asks 'who owns X?' or wants the largest holders.","path_params":["ticker"],"admin":false,"display_name":"Top shareholders"},{"name":"tengu_v3_intel_street_estimates","method":"GET","path":"/api/v3/intel/street_estimates/{ticker}","group":"v3","description":"Street consensus EPS + options-implied expected move per earnings event, with beat_rate_pct and 8-quarter surprise history (est vs actual vs surprise_pct). Call this for 'what does the Street expect?' or 'how big a move is priced in?'. report_date_basis 'estimation' = projected date, NOT confirmed — cross-check tengu_v3_earnings_next.","path_params":["ticker"],"admin":false},{"name":"tengu_v3_intel_news_headlines","method":"GET","path":"/api/v3/intel/news_headlines","group":"v3","description":"MARKET-WIDE ONLY — never for one ticker's news (that is tengu_v3_news_summary). Live cross-publisher newswire headlines: headline, publisher, tickers, is_major flag, feed-supplied sentiment; seconds-fresh, 120s cache. For 'what's happening in the market right now?' scans and cross-ticker sweeps.","query_params":[{"name":"ticker","type":"string","description":"Optional ticker filter"},{"name":"limit","type":"int","default":50,"min":1,"max":100}],"admin":false},{"name":"tengu_v3_macro_treasury_curve","method":"GET","path":"/api/v3/macro/treasury_curve","group":"v3","description":"Live US Treasury yield curve (market-data feed, T+1): 1m-30y tenor points, per-tenor 1-day change (bps), computed 2s10s and 3m10y spreads with inversion flags. Call this when the user asks about rates, curve shape, or inversion. Honest as_of = the feed's record date.","admin":false},{"name":"tengu_v3_intel_exec_compensation","method":"GET","path":"/api/v3/intel/exec_compensation/{ticker}","group":"v3","description":"Annual executive compensation history for a ticker (alternative-data): CEO + named officers with name, role, year, salary, bonus, stock_option_awards, total_compensation. Call this when the user asks 'how much is the CEO paid?' or wants pay-vs-performance context.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":25,"min":1,"max":200}],"admin":false,"display_name":"Executive pay"},{"name":"tengu_v3_intel_etf_holdings","method":"GET","path":"/api/v3/intel/etf_holdings","group":"v3","description":"alternative-data: ETF composition or inverse-lookup. Pass ?etf=SPY for full holdings of an ETF, OR ?ticker=NVDA for every ETF that holds the stock (with weight). At least one is required; when both are passed, etf takes precedence.","query_params":[{"name":"etf","type":"string","description":"ETF symbol — full holdings"},{"name":"ticker","type":"string","description":"Stock symbol — which ETFs hold it"},{"name":"limit","type":"int","default":50,"min":1,"max":1000}],"param_constraints":[{"at_least_one_of":["etf","ticker"]}],"admin":false,"display_name":"ETF holdings"},{"name":"tengu_v3_intel_politicians","method":"GET","path":"/api/v3/intel/politicians","group":"v3","description":"Full US Congress roster (House + Senate, alternative-data) with disclosed trade counts per member. Call it to resolve a politician name to a BioGuideID before pulling their trades, or for 'most-active disclosed traders in Congress' lists. Heavy full-roster pull.","query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":1000}],"admin":false,"display_name":"Politician trades","capability_tags":["heavy"]},{"name":"tengu_v3_intel_corporate_donors","method":"GET","path":"/api/v3/intel/corporate_donors/{ticker}","group":"v3","description":"Corporate-PAC donations linked to the ticker's parent company (alternative-data): candidate, committee, amount, transaction_date, cycle — a campaign-finance influence signal. Call this when the user asks who a company donates to or about its political exposure.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Corporate donors"},{"name":"tengu_v3_intel_gov_contracts_live","method":"GET","path":"/api/v3/intel/gov_contracts_live","group":"v3","description":"Quarterly cross-ticker federal-contracts feed (alternative-data) — top-line award totals only, lighter than per-ticker tengu_v3_intel_gov_contracts (no agency or description fields). Call this for 'which companies win government money?' screens; use tengu_v3_intel_gov_contracts for line-items.","query_params":[{"name":"ticker","type":"string","description":"Optional filter"},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false,"display_name":"Government contracts (live)"},{"name":"tengu_v3_intel_news_pro","method":"GET","path":"/api/v3/intel/news_pro","group":"v3","description":"Real-time newswire stories — cross-ticker, ticker-filtered (comma-separated), or by channel: id, title, teaser, url, ticker(s), channels, tags, created (ISO-8601); body=true adds full HTML (slower, larger). Call this when the user wants themed or full-text news beyond headlines. Confirmed-working channels (probed 2026-04-30; exact case + apostrophe matter): \"Press Releases\", \"Crypto\", \"Movers\", \"Why It's Moving\", \"Earnings\", \"Earnings Beats\", \"Earnings Misses\", \"Guidance\", \"Top Stories\", \"Tech\", \"Markets\", \"Analyst Color\", \"Federal Reserve\", \"Government\", \"ETFs\", \"Forex\", \"Commodities\", \"Treasuries\", \"Futures\", \"Emerging Markets\", \"Eurozone\", \"Asia\", \"Global\", \"Equities\", \"Bonds\", \"Trading Ideas\", \"After-Hours Center\".","query_params":[{"name":"tickers","type":"string","description":"Comma-separated symbols, e.g. 'AAPL,MSFT'"},{"name":"channels","type":"string","description":"Comma-separated channel names. See description for the confirmed-working allowlist."},{"name":"limit","type":"int","default":25,"min":1,"max":100},{"name":"body","type":"boolean","default":false,"description":"Include full HTML body (slower, larger)"}],"admin":false},{"name":"tengu_v3_intel_news_why_moving","method":"GET","path":"/api/v3/intel/news_why_moving","group":"v3","description":"MOVER-EXPLANATION ONLY — for 'why is X moving / what's driving X right now?' questions; never for generic 'latest news on X' (that is tengu_v3_news_summary). Newswire 'Why It's Moving' channel: short explainers for stocks making notable intraday moves. 60s cache.","query_params":[{"name":"tickers","type":"string","description":"Comma-separated symbols (optional — omit for cross-ticker feed)"},{"name":"limit","type":"int","default":25,"min":1,"max":100},{"name":"body","type":"boolean","default":false}],"admin":false,"display_name":"Why it's moving"},{"name":"tengu_v3_intel_news_press_releases","method":"GET","path":"/api/v3/intel/news_press_releases","group":"v3","description":"newswire 'Press Releases' channel — corporate press releases on the newswire (PR Newswire, Business Wire, GlobeNewswire). Use when the user asks for the company's own announcements rather than analyst/journalist coverage. 60s cache.","query_params":[{"name":"tickers","type":"string"},{"name":"limit","type":"int","default":25,"min":1,"max":100},{"name":"body","type":"boolean","default":false}],"admin":false,"display_name":"Press releases"},{"name":"tengu_v3_intel_news_crypto","method":"GET","path":"/api/v3/intel/news_crypto","group":"v3","description":"Newswire 'Crypto' channel — crypto news stream covering BTC, ETH, exchanges, regulation, miners. Call this when the user asks about crypto news; pair with coin-stock proxies (COIN, MSTR, RIOT, MARA) to fuse the equity-side reaction. 60s cache.","query_params":[{"name":"tickers","type":"string","description":"Crypto tickers (BTC, ETH) or coin-stock proxies (COIN, MSTR)"},{"name":"limit","type":"int","default":25,"min":1,"max":100},{"name":"body","type":"boolean","default":false}],"admin":false,"display_name":"Crypto newswire"},{"name":"tengu_v3_intel_news_movers","method":"GET","path":"/api/v3/intel/news_movers","group":"v3","description":"Newswire 'Movers' channel — coverage of stocks making the biggest intraday moves (gainers, losers, halts, breakouts). Call this for 'biggest movers today' questions and end-of-day 'what moved' recaps; pass tickers to narrow. 60s cache.","query_params":[{"name":"tickers","type":"string"},{"name":"limit","type":"int","default":25,"min":1,"max":100},{"name":"body","type":"boolean","default":false}],"admin":false,"display_name":"Today's movers"},{"name":"tengu_v3_intel_earnings_history","method":"GET","path":"/api/v3/intel/earnings_history/{ticker}","group":"v3","description":"Last N quarters of earnings for a ticker — report date, EPS estimate vs actual, surprise %, and the day-of-report intraday price move %. Used by the verdict prompt to anchor 'stock typically moves ±X% on earnings' claims in real numbers. Composite (newswire + market-data). 6h cache.","path_params":["ticker"],"query_params":[{"name":"lookback_quarters","type":"int","default":4,"min":1,"max":12,"description":"Number of past earnings events to return."}],"admin":false,"display_name":"Earnings history"},{"name":"tengu_v3_earnings_next","method":"GET","path":"/api/v3/earnings/next/{ticker}","group":"v3","description":"Use when: the user asks for a specific ticker's next earnings date, when a company reports, the earnings calendar entry for a name, or anything of the form \"when is X's next earnings?\". This is the CANONICAL multi-source consensus tool — fans out to market-data, market-data, newswire, news, and web search in parallel; reconciles via primacy-weighted majority; returns a single canonical answer with per-source breakdown, deduplicated citations, and a ``vendor_coverage_alert`` when paid vendors silently lack data the web confirms. ``_meta.confidence`` is `high` (≥2 sources agree, or 1 primary source = market-data|web_search), `medium` (1 secondary source), or `low` (no confirmed date — projections demoted to ``_meta.next_earnings_date_projection_only``). Top-level ``summary`` field for FE rendering. 15-min cache.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Next earnings (consensus)","capability_tags":["consensus_envelope_v1","heavy"]},{"name":"tengu_v3_earnings_next_stream","method":"GET","path":"/api/v3/earnings/next/{ticker}/stream","group":"v3","description":"STREAMING variant of ``tengu_v3_earnings_next`` — same consensus contract, delivered as Server-Sent Events (text/event-stream). Emits two events: ``partial`` when paid vendors reach consensus (~500ms first paint with `is_projected=false`, confidence=high based on paid alone) and ``result`` when web_search has verified (~2-3s; updates `vendor_coverage_alert` if web disagrees). Use when a consumer can render incrementally and wants the fastest possible first paint — chat surfaces and live tickers. Synchronous consumers should keep using ``tengu_v3_earnings_next`` (cost-aware: skips the web_search call entirely when paid agrees).","path_params":["ticker"],"query_params":[],"admin":false,"capability_tags":["chat_excluded"]},{"name":"tengu_v3_intel_macro_snapshot","method":"GET","path":"/api/v3/intel/macro_snapshot","group":"v3","description":"NOW WITH a `credit` block: CDX IG/HY on-the-run 5Y composite spreads + 1-session delta (T-2 by source, cadence-aware staleness; full series at /api/v3/credit/indices). Cross-asset macro composite returning REAL underlying values, all real-time where the data source permits. Fields: `vix` (real-time spot), `ten_year_yield_pct` (FRED DGS10, %), `usd_index_narrow_dxy` (computed from FRED 6-pair basket via the standard geometric weighted formula — the institutional standard ~99), `usd_index_trade_weighted_broad` (FRED DTWEXBGS — Fed's broader policy measure ~118), `wti_oil_usd_bbl` (FRED DCOILWTICO, $/bbl), `gold_usd_oz` (real-time forex spot, $/oz), `sp500` (real-time index; SPY×10 emergency fallback), `nasdaq100` (real-time index; QQQ×41 emergency fallback), `djia` (real-time index; null when unavailable — no ETF proxy emitted), `russell2000` (real-time index; IWM×10 emergency fallback). Every numeric field is gated by a plausibility guard — out-of-band values are nulled with an `error.implausible_value` field rather than served, so the chat Brain never cites a wrong number with the [macro_snapshot] tag. Includes `vol_regime` (low_vol/normal/elevated/stress per VIX bucket), `data_freshness` timestamp, and a `sources` block with the series reference for each indicator. 60s cache.","query_params":[],"admin":false,"display_name":"Cross-asset snapshot"},{"name":"tengu_v3_intel_ml_prediction","method":"GET","path":"/api/v3/intel/ml_prediction/{ticker}","group":"v3","description":"Latest ensemble ML prediction for the ticker, with full conformal interval + 19-voter decomposition. Sourced from the nightly ensemble scoring run (refreshed nightly Mon-Fri, ~13K tickers scored per cycle). Returns `prediction` block (predicted_return_pct, blended_score, conviction, decile, rank, percentile_rank, n_universe), `conformal_interval` block (lo/hi/half_width/method + stated_coverage 0.90 + realised_coverage_recent from live calibration table), `voter_decomposition` (per-voter contribution across the 19 voters — e.g. ml_ensemble, regime_hmm, technical_advanced, sentiment_finbert, macro_context, fundamental, options_flow, insider_flow, analyst_revisions, futures_macro, congress_trading, short_pressure), `context` (voter_coverage, confluence, feature_coverage), plus model_version, tier (small/mid/large universe), regime, sector. When a ticker isn't in the latest scoring universe, returns `available: false` with reason. 5min cache. NAMESPACE: predictions are US-EQUITY only. Nine crypto tickers collide with equities (BTC, ETH, LINK, LTC, COMP, ARB, NEAR, APT, ATOM) — such responses carry a `ticker_collision` note; for the crypto asset pass asset_class=crypto (fails closed 404: no crypto model yet). NEVER present an equity prediction as a crypto view.","path_params":["ticker"],"query_params":[{"name":"asset_class","type":"string","default":"equity","enum":["equity","crypto"],"description":"Asset namespace; crypto fails closed until the crypto family ships"}],"admin":false,"display_name":"Quant signal"},{"name":"tengu_v3_intel_voter_attribution","method":"GET","path":"/api/v3/intel/voter_attribution/{ticker}","group":"v3","description":"Causal attribution for a voter's score on a ticker. Instrumented voters: `insider_flow` (EDGAR Form-4 + insider feed, deduped by name/date/value; CEO/CFO 2x, officer 1.5x, director 1.2x weighting; contribution amounts + reconstructed score); `options_flow` (options-flow alerts with direction inferred from option_type+side: CALL@ASK=+1, PUT@ASK=-1, CALL@BID=-1, PUT@BID=+1; weighted by premium/median); `fundamental` (metadata mode — surfaces which 4 ratios the voter consumes + how to interpret). Transforms scores into EVIDENCE rather than a number. Remaining voters (sentiment, analyst_revisions, regime_hmm, technical, ml_ensemble) pending instrumentation. Optional ?voter=insider_flow|options_flow|fundamental, ?days_back=30. 15min cache.","path_params":["ticker"],"query_params":["voter","days_back"],"admin":false,"display_name":"Signal drivers"},{"name":"tengu_v3_intel_voter_ic_drift","method":"GET","path":"/api/v3/intel/voter_ic_drift","group":"v3","description":"Per-voter information-coefficient drift vs baseline for all 19 voters, recomputed daily: live_ic vs baseline_ic, ic_ratio (sign-flip flagged at <0), drift_status (green/yellow/red), sorted by absolute drift severity. Call it before leaning on a verdict — reduce confidence in any voter with red drift_status. 60min cache.","path_params":[],"query_params":[],"admin":false,"display_name":"Voter IC drift (raw)"},{"name":"tengu_v3_intel_voter_coverage","method":"GET","path":"/api/v3/intel/voter_coverage/{ticker}","group":"v3","description":"Per-ticker accounting for every voter in the 19-voter ensemble. For each voter returns the current score, baseline weight, status (firing | silent_data | shadow | no_signal), and a human-readable `why` explaining each silent voter's upstream data source so an operator can chase the gap. The `coverage_summary` block reports `weight_firing` (effective ensemble weight in use) vs `weight_silent_live` (paid-for but silent). Use this when a model_prediction shows low voter_coverage — it tells you exactly which data pipelines to wake up. 5min cache.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Signal coverage"},{"name":"tengu_v3_intel_ml_drivers","method":"GET","path":"/api/v3/intel/ml_drivers/{ticker}","group":"v3","description":"Top-N SHAP feature attributions for the ML ensemble score on a ticker: drivers[] ranked by |SHAP| with feature (e.g. beta_cma, vol_21d), signed shap_value, direction (bullish/bearish/neutral). PRIMARY tool for 'why is the model bullish/bearish on X?'. Nightly run; default top=5, max 20; available:false outside the ML universe. 5min cache.","path_params":["ticker"],"query_params":["top"],"admin":false,"display_name":"What's driving it"},{"name":"tengu_v3_intel_model_calibration","method":"GET","path":"/api/v3/intel/model_calibration","group":"v3","description":"Live conformal-coverage telemetry: how often the model's stated 90% intervals actually contain the realised 5d returns. Built nightly over the trailing 30 days of prediction-outcome pairs. Returns `stated_coverage` (target, typically 0.90), `realised_coverage` (actual, e.g. 0.78), `coverage_delta` (gap, negative = under-covering), `status` (red/amber/green), `n_pairs` (sample size, ~110K typical), `mean_interval_width_pct`, `mean_predicted_return_pct`, `mean_realised_return_pct`, and an `interpretation` string. Treat status=red as a verdict-grade caveat — chat should attach 'model intervals currently under-covering' to any ml_prediction citation when this returns red. 1h cache.","query_params":[],"admin":false,"display_name":"Model calibration"},{"name":"tengu_v3_intel_pnl_attribution","method":"GET","path":"/api/v3/intel/pnl_attribution","group":"v3","description":"Daily PnL track record for the paper book, Carhart 4-factor-decomposed. Snapshotted nightly. Returns `rows[]` of trading days with per-row gross/net return in basis points, transaction cost, turnover, plus the Carhart factor contributions (MKT-RF, SMB, HML, UMD) and residual alpha — the institutional skill measure that strips market/size/value/momentum beta. Window aggregate: mean daily bps, hit rate, annualised Sharpe, cumulative net + alpha. Default 30 trading days; query `?days=N` (bounded to 365). Use this to ground any track-record claim the chat makes — e.g. 'our paper book made +29 bps yesterday, +111 bps alpha contribution'. 1h cache.","query_params":["days"],"admin":false,"display_name":"P&L attribution"},{"name":"tengu_v3_intel_cftc_cot","method":"GET","path":"/api/v3/intel/cftc_cot","group":"v3","description":"CFTC Commitments-of-Traders report — futures positioning by cohort (producers/hedgers, money managers, other reportables, non-reportables). Polled weekly on Fridays at 18:00 ET, the CFTC's standard publication window. Without filter: returns top-10 money-manager longs and shorts across all contracts on the latest report — the institutional-spec directional bets. With `?contract=GOLD` (substring match, also accepts WTI, NATGAS, SP500-EMINI, BITCOIN-MICRO, 10Y-NOTE, etc.) returns the matched contract's 5-week positioning history with cohort net positions, % of OI, and a 4-week net delta. Extreme money-manager longs at the top of a rally historically mark exhaustion; commercial-hedger net longs at the bottom historically mark reaccumulation — leading indicator. 4h cache (CFTC publishes weekly so the data is stale-by-design).","query_params":["contract"],"admin":false,"display_name":"Futures positioning"},{"name":"tengu_v3_intel_short_interest","method":"GET","path":"/api/v3/intel/short_interest/{ticker}","group":"v3","description":"FINRA bi-monthly short interest: short_interest_shares, short_interest_pct_of_float, days_to_cover, short_interest_change_pct_30d (vs prior settlement), avg_daily_volume_at_settlement. Call for 'how shorted is X?' / squeeze questions. borrow_fee_pct_annualized is null — see /intel/borrow_cost. Market-data FINRA re-publish; 6h cache.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Short interest"},{"name":"tengu_v3_intel_analyst_consensus","method":"GET","path":"/api/v3/intel/analyst_consensus/{ticker}","group":"v3","description":"Analyst consensus: rating_label (Strong Buy…Strong Sell), rating_score (1-5), bucket counts, price_target_avg/high/low/count, recent_actions[] (upgrades/downgrades/PT changes, firm+analyst+from→to; recent_action_limit). Call for 'what do analysts say about X?' / price targets. Actions from newswire (client-side ticker filter). 1h cache.","path_params":["ticker"],"query_params":[{"name":"recent_action_limit","type":"int","default":10,"min":1,"max":50,"description":"Number of recent rating actions to return."}],"admin":false,"display_name":"Analyst coverage"},{"name":"tengu_v3_intel_borrow_cost","method":"GET","path":"/api/v3/intel/borrow_cost/{ticker}","group":"v3","description":"Securities-lending borrow cost (annualized fee %, rebate, utilization, shares available) — LIVE. Source chain, first hit wins (see `source`): 1) options-flow shorts feed (intraday) + recent SEC fails-to-deliver enrichment; 2) licensed-research securities-finance Securities Finance latest archived daily row; 3) implied-vol option-implied borrow. `is_stale` flags prints older than 48h (warehouse rows trail on the licensed-research refresh lag). data_source_pending=true ONLY when all three sources miss — then fall back to /intel/short_interest as the squeeze proxy. Use /intel/borrow_cost_history for the daily series. 15-min cache.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Borrow cost"},{"name":"tengu_v3_sec_filing_extract","method":"GET","path":"/api/v3/sec/filing/{ticker}/{filing_type}","group":"v3","description":"Structured extracts from the latest 10-K/10-Q/8-K via the SEC EDGAR JSON API: balance_sheet_summary, cash_flow_summary, shares_outstanding (basic+diluted+4Q trend), filing_date, filing_url, accession_number. Call for numbers straight from the latest filing. MVP: text_sections are deep-links only — use web_search on filing_url. 24h cache.","path_params":["ticker","filing_type"],"query_params":[],"admin":false,"display_name":"SEC filing detail"},{"name":"tengu_v3_research_portfolio_aware_score","method":"POST","path":"/api/v3/research/portfolio_aware_score","group":"v3","description":"Decorates a standalone score with portfolio-aware context. Brain provides the standalone score from copilot_score_ticker (same-turn fan-out) + the user's holdings; this endpoint returns the OVERLAY: concentration_penalty (single-name cap, default 15%), sector_cap_penalty (GICS sector cap, default 30%), correlation_to_existing top-5 by |rho|, tax_lot_warnings (short-term cap-gain detection per holding's purchase_date), and a structured rebalance_recommendation (action enum ∈ {swap, trim_only, buy_naked, hold_no_add} with sell/buy/sector blocks). The composed total_penalty multiplies the standalone score down to the portfolio_aware_score that Brain cites in the Portfolio Fit block. Brain fires this tool only when portfolioContext.connected = true (the verdict fan-out goes from 19 → 20 tools with portfolio context).","body_params":[{"name":"ticker","type":"string","required":true},{"name":"user_holdings","type":"array","required":true,"description":"Array of {ticker, weight_pct, cost_basis, purchase_date, sector?} — sector hint optional, endpoint resolves via the market-data provider if missing"},{"name":"standalone_score","type":"object","required":true,"description":"{decile: int, score: float in [0,1], verdict_label: str} — from the same-turn copilot_score_ticker call"},{"name":"cash_pct","type":"float","required":false},{"name":"total_portfolio_value","type":"float","required":false},{"name":"caps","type":"object","required":false,"description":"{single_name_pct: float (default 15.0), sector_pct: float (default 30.0)} — override the institutional default risk caps"}],"admin":false,"display_name":"Score for your portfolio"},{"name":"tengu_v3_research_scenario_simulator","method":"POST","path":"/api/v3/research/scenario_simulator","group":"v3","description":"Deep Research compute tool: deterministic DCF-style projection under bull/base/bear (or user-specified) scenarios. Caller provides TTM financials + per-scenario assumptions (revenue_growth_pct, net_margin_pct, exit_pe_multiple); endpoint runs the geometric projection over `horizon_quarters` (default 4) and returns projected_revenue / projected_eps / projected_price / implied_upside_pct / implied_cagr_pct PER scenario plus an explicit math_trail the verdict prompt can cite verbatim. Summary block: probability-weighted expected_value_price + skew label + asymmetry_ratio (bull/bear risk-reward). Pure compute — no LLM in loop, no vendor calls, fully deterministic. Brain's Deep Research session synthesizes a Scenarios block from this output.","body_params":[{"name":"ticker","type":"string","required":true},{"name":"current","type":"object","required":true,"description":"TTM financials: revenue_ttm, eps_ttm, shares_outstanding, current_price"},{"name":"scenarios","type":"object","required":true,"description":"Map of scenario_name → {revenue_growth_pct, net_margin_pct, exit_pe_multiple}"},{"name":"horizon_quarters","type":"int","required":false,"default":4,"description":"Projection horizon in quarters (1-40)"},{"name":"scenario_probabilities","type":"object","required":false,"description":"Optional map of scenario_name → probability (normalized internally); enables EV summary"}],"admin":false,"display_name":"Scenarios"},{"name":"tengu_v3_intel_calendar_economics","method":"GET","path":"/api/v3/intel/calendar/economics","group":"v3","description":"Macro economic-release calendar from the newswire — CPI, NFP, FOMC, GDP, retail sales and more, filterable by ISO-3 country (USA, CAN, DEU) and date range; importance 5 = market-moving. Call this when the user asks what macro events or data releases are coming up or could move markets this week.","query_params":[{"name":"country","type":"string","description":"ISO-3 country code (USA, CAN, DEU)"},{"name":"date_from","type":"string","description":"YYYY-MM-DD"},{"name":"date_to","type":"string","description":"YYYY-MM-DD"},{"name":"importance","type":"int","min":0,"max":5},{"name":"limit","type":"int","default":50,"min":1,"max":100}],"admin":false,"display_name":"Economic calendar"},{"name":"tengu_v3_intel_calendar_ratings","method":"GET","path":"/api/v3/intel/calendar/ratings","group":"v3","description":"Analyst rating actions and price-target changes from the newswire: analyst_firm, analyst_name, action_company (Maintains/Initiates), action_pt (Raises/Lowers), pt_current, pt_prior, pt_pct_change, rating_current/prior. Call this when the user asks about upgrades, downgrades, or price-target moves on a ticker.","query_params":[{"name":"tickers","type":"string"},{"name":"date_from","type":"string","description":"YYYY-MM-DD"},{"name":"date_to","type":"string","description":"YYYY-MM-DD"},{"name":"action","type":"string","enum":["Raises","Lowers","Maintains","Announces","Initiates","Reiterates"]},{"name":"limit","type":"int","default":50,"min":1,"max":100}],"admin":false,"display_name":"Analyst calendar"},{"name":"tengu_v3_intel_calendar_conference_calls","method":"GET","path":"/api/v3/intel/calendar/conference_calls","group":"v3","description":"newswire: upcoming earnings conference-call schedule. Returns ticker, company, date, start_time, period (Q1/Q2/...), webcast_url, phone_num, international_num, access_code, and importance (5 = mega-cap market-mover). Distinct from /calendar/earnings — this carries the call logistics analysts need to attend.","query_params":[{"name":"tickers","type":"string"},{"name":"date_from","type":"string","description":"YYYY-MM-DD"},{"name":"date_to","type":"string","description":"YYYY-MM-DD"},{"name":"importance","type":"int","min":0,"max":5},{"name":"limit","type":"int","default":50,"min":1,"max":100}],"admin":false,"display_name":"Conference calls"},{"name":"tengu_v3_intel_commodities","method":"GET","path":"/api/v3/intel/commodities","group":"v3","description":"REAL-TIME spot prices for the macro commodities (oil WTI/Brent, gold, silver, nat-gas, copper). AUTHORITATIVE source for any numeric commodity claim — call this BEFORE quoting a price level. QUOTE 'spot' DIRECTLY — it's the live commodity price (FRED's last published close anchored to the live commodity-tracking ETF's cumulative return since that date, so it reflects today's market not FRED's T+1..T+5 publish lag). 'unit' tells you the dimension (USD/barrel for oil, USD/MMBtu for natgas, USD/metric-ton for copper). Response fields per item: 'spot' (live number — quote this), 'unit' (dimension), 'spot_basis' ('live_etf_bridged' = FRED+ETF bridge | 'fred_close' = FRED only, no ETF available | 'etf_share_price' = FRED dead, falling back to ETF SHARE price [unit reads 'USD per share of {ETF}'] — DO NOT claim $/oz when basis is etf_share_price), 'spot_time' (timestamp of the live observation), 'live_spot_estimate' (same as spot when bridged, else null), 'live_basis' (transparent arithmetic, e.g. 'FRED WTI $99.89 (2026-04-27) × (USO 142.80 / 134.72)'), 'bridge_return_pct' (ETF return applied to FRED), 'official_close' + 'official_close_as_of' (FRED audit value — quote ONLY if user explicitly asks for the last settlement / closing price), 'change_pct_1d/5d/30d' (FRED-window returns), 'history_5d' (last 6 FRED observations newest-first), 'fred_days_stale' + 'is_stale' (publish-lag flags — informational; spot is still live regardless), 'etf_proxy_quote' (the underlying ETF snapshot used for the bridge; for transparency only). 'symbol=oil' returns both WTI and Brent; default 'all' returns all six.","query_params":[{"name":"symbol","type":"string","default":"all","enum":["all","oil","wti_oil","brent_oil","gold","silver","natgas","copper"]}],"admin":false,"display_name":"Commodities"},{"name":"tengu_v3_news_crypto_latest","method":"GET","path":"/api/v3/news_crypto/latest","group":"v3","description":"Recent crypto news with sentiment for one or more symbols: title, source, sentiment (Positive/Neutral/Negative), date, topic tags. PRIMARY tool for ticker-specific crypto drilling (BTC, ETH, SOL, COIN, MSTR) — call when the user asks what's happening with a specific coin; use by_category for market-wide questions. 60s cache.","query_params":[{"name":"tickers","type":"string","required":true,"description":"Comma-separated symbols, e.g. 'BTC,ETH'"},{"name":"items","type":"int","default":20,"min":1,"max":50},{"name":"date_range","type":"string","default":"today","enum":["today","yesterday","last7days","last30days"]}],"admin":false,"display_name":"Crypto news (latest)"},{"name":"tengu_v3_news_crypto_by_category","method":"GET","path":"/api/v3/news_crypto/by_category","group":"v3","description":"Crypto news by section: section='general' for overall crypto-market headlines, section='alltickers' for cross-coin coverage. PRIMARY tool for broad 'what's happening in crypto today' questions — for a single coin use news_crypto_latest instead. 120s cache.","query_params":[{"name":"section","type":"string","default":"general","enum":["general","alltickers"]},{"name":"items","type":"int","default":20,"min":1,"max":50},{"name":"date_range","type":"string","default":"today"}],"admin":false,"display_name":"Crypto news by category"},{"name":"tengu_v3_news_crypto_sentiment_stats","method":"GET","path":"/api/v3/news_crypto/sentiment_stats","group":"v3","description":"crypto-news: daily sentiment rollup for a crypto symbol (-1.5 to +1.5). Densest single-call signal — N days of (positive_count, negative_count, neutral_count, sentiment_score). Use to detect sentiment regime shifts on BTC/ETH/etc. 300s cache.","query_params":[{"name":"ticker","type":"string","required":true,"description":"Crypto symbol, e.g. BTC, ETH, SOL"},{"name":"date_range","type":"string","default":"last30days","enum":["last7days","last30days","last60days"]}],"admin":false,"display_name":"Crypto sentiment stats"},{"name":"tengu_v3_news_crypto_market_sentiment","method":"GET","path":"/api/v3/news_crypto/market_sentiment","group":"v3","description":"Overall crypto market sentiment rollup across the news feed (no ticker filter). Call this when the user asks whether crypto as a whole looks bullish or bearish right now — for a specific coin's sentiment use news_crypto_latest. 300s cache.","query_params":[{"name":"date_range","type":"string","default":"last7days"}],"admin":false,"display_name":"Crypto sentiment (overall)"},{"name":"tengu_v3_news_crypto_trending","method":"GET","path":"/api/v3/news_crypto/trending","group":"v3","description":"Trending crypto headlines, noise-filtered down to top stories only. Pass ticker to filter to one coin; omit for market-wide trending. Call this when the user asks what the biggest crypto stories are right now. 120s cache.","query_params":[{"name":"ticker","type":"string","description":"Optional crypto symbol filter"}],"admin":false,"display_name":"Crypto trending (movers)"},{"name":"tengu_v3_news_crypto_ticker_only","method":"GET","path":"/api/v3/news_crypto/ticker_only","group":"v3","description":"Crypto news mentioning ONLY the requested coin, with no co-tagged altcoins — the strictest per-coin filter. Call this when the user wants pure single-coin coverage and news_crypto_latest brings back too much cross-coin noise.","query_params":[{"name":"ticker","type":"string","required":true},{"name":"items","type":"int","default":50,"min":1,"max":100},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false,"display_name":"Crypto news (ticker only)"},{"name":"tengu_v3_news_crypto_multi_ticker","method":"GET","path":"/api/v3/news_crypto/multi_ticker","group":"v3","description":"Crypto news where ALL the listed coins co-appear in the same story — a correlation feed. Call this when the user asks how two or more coins are linked in the news, e.g. stories covering both BTC and ETH together.","query_params":[{"name":"tickers","type":"string","required":true},{"name":"items","type":"int","default":50,"min":1,"max":100},{"name":"page","type":"int","default":1,"min":1,"max":50}],"admin":false,"display_name":"Crypto news (multi-ticker)"},{"name":"tengu_v3_news_crypto_all_tickers_sentiment","method":"GET","path":"/api/v3/news_crypto/all_tickers_sentiment","group":"v3","description":"Sentiment leaderboard across the full tracked crypto universe — every coin's sentiment_score over the window (default last7days). Call this when the user asks which coins have the most bullish or most bearish news sentiment right now.","query_params":[{"name":"date_range","type":"string","default":"last7days"},{"name":"page","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"Crypto sentiment per ticker"},{"name":"tengu_v3_news_crypto_top_mentions","method":"GET","path":"/api/v3/news_crypto/top_mentions","group":"v3","description":"Top 50 most-mentioned crypto tickers over the window (default last7days) — a crypto-attention proxy. Call this when the user asks which coins are getting the most buzz or news coverage lately.","query_params":[{"name":"date_range","type":"string","default":"last7days"}],"admin":false,"display_name":"Crypto trending (mentions)"},{"name":"tengu_v3_news_crypto_events","method":"GET","path":"/api/v3/news_crypto/events","group":"v3","description":"Clustered crypto headline events — related stories grouped into discrete events; fetch recent events, filter by ticker, or drill into one eventid. Call this when the user asks what distinct news events hit a coin rather than a raw headline list.","query_params":[{"name":"tickers","type":"string"},{"name":"eventid","type":"string"},{"name":"page","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"Crypto events"},{"name":"tengu_v3_news_crypto_sundown","method":"GET","path":"/api/v3/news_crypto/sundown","group":"v3","description":"Evening crypto market-recap digest, published Mon-Fri at 7pm ET. Call this when the user asks for an end-of-day crypto wrap-up or a morning briefing needs an overnight crypto recap.","query_params":[{"name":"page","type":"int","default":1,"min":1,"max":10}],"admin":false,"display_name":"Crypto evening digest"},{"name":"tengu_v3_news_crypto_ticker_price","method":"GET","path":"/api/v3/news_crypto/ticker_price","group":"v3","description":"Delayed crypto prices with 24h volume and price changes — a single coin, a list, or the top 50 by 24h volume when tickers is omitted. Call this when the user asks where a coin is trading or which coins are moving; prices are delayed, not real-time.","query_params":[{"name":"tickers","type":"string","description":"Omit for top 50 by 24h volume"}],"admin":false,"display_name":"Crypto price"},{"name":"tengu_v3_news_crypto_whale_transactions","method":"GET","path":"/api/v3/news_crypto/whale_transactions","group":"v3","description":"Large crypto on-chain and exchange transactions for BTC/ETH/SOL/TRX plus major exchanges, filterable by min_amount USD (updated ~every 5min). Call this when the user asks about whale moves or big transfers; use whale_summary for the aggregated buy-vs-sell read.","query_params":[{"name":"tickers","type":"string"},{"name":"date_range","type":"string","default":"last24hours"},{"name":"min_amount","type":"int","min":0,"description":"Minimum USD value (e.g. 5000000)"},{"name":"items","type":"int","default":50,"min":1,"max":100},{"name":"page","type":"int","default":1,"min":1,"max":20}],"admin":false,"display_name":"Whale watch (transactions)"},{"name":"tengu_v3_news_crypto_whale_summary","method":"GET","path":"/api/v3/news_crypto/whale_summary","group":"v3","description":"Aggregated whale-transaction stats over the window: total volume, net exchange flow (in vs out), and biggest single tx. PRIMARY tool for 'is smart money buying or selling this coin?' — use whale_transactions for the individual transfers.","query_params":[{"name":"tickers","type":"string"},{"name":"date_range","type":"string","default":"last7days"}],"admin":false,"display_name":"Whale watch (summary)"},{"name":"tengu_v3_news_crypto_summary","method":"GET","path":"/api/v3/news_crypto/summary/{ticker}","group":"v3","description":"crypto-news: one-shot per-coin intel summary. Parallel-fetches recent news (24h) + 7-day sentiment stats + trending headlines. The single call to make when asked 'what's going on with BTC?' or any crypto-name analysis. 90s cache.","path_params":["ticker"],"admin":false,"display_name":"Crypto news (summary)"},{"name":"tengu_v3_news_forex_latest","method":"GET","path":"/api/v3/news_forex/latest","group":"v3","description":"Recent FX news with sentiment for one or more currency pairs: title, source, sentiment (Positive/Neutral/Negative), date, topic tags. PRIMARY tool for pair-specific drilling (EUR-USD, GBP-USD, USD-JPY, AUD-USD) — call when the user asks what's moving a specific pair; use by_category for macro themes. 180s cache.","query_params":[{"name":"pairs","type":"string","required":true,"description":"Comma-separated FX pairs, e.g. 'EUR-USD,GBP-USD'"},{"name":"items","type":"int","default":20,"min":1,"max":50},{"name":"date_range","type":"string","default":"today","enum":["today","yesterday","last7days","last30days"]}],"admin":false,"display_name":"Forex news (latest)"},{"name":"tengu_v3_news_forex_by_category","method":"GET","path":"/api/v3/news_forex/by_category","group":"v3","description":"Macro and cross-pair FX news: section='general' = market macro (Fed, CPI, ECB, NFP, BoJ, BoE), section='alltickers' = cross-pair coverage; optional topic filter (cpi, fed, oil, gold, recession...) on general. Call this when the user asks about macro FX themes rather than one pair — use news_forex_latest for pair drilling. 300s cache.","query_params":[{"name":"section","type":"string","default":"general","enum":["general","alltickers"]},{"name":"topic","type":"string","enum":["cpi","unemployment","fed","ecb","boj","boe","gdp","inflation","war","election","oil","gold","recession","tradedeals"],"description":"Optional macro topic filter (general only)"},{"name":"items","type":"int","default":20,"min":1,"max":50},{"name":"date_range","type":"string","default":"today"}],"admin":false,"display_name":"Forex news by category"},{"name":"tengu_v3_news_forex_sentiment_stats","method":"GET","path":"/api/v3/news_forex/sentiment_stats","group":"v3","description":"fx-news: daily sentiment rollup for an FX pair (-1.5 to +1.5). Densest single-call signal — N days of (positive_count, negative_count, neutral_count, sentiment_score). Use to detect regime shifts on EUR-USD/GBP-USD/etc. 600s cache.","query_params":[{"name":"pair","type":"string","required":true,"description":"FX pair, e.g. EUR-USD, GBP-USD, USD-JPY"},{"name":"date_range","type":"string","default":"last30days","enum":["last7days","last30days","last60days"]}],"admin":false,"display_name":"Forex sentiment stats"},{"name":"tengu_v3_news_forex_market_sentiment","method":"GET","path":"/api/v3/news_forex/market_sentiment","group":"v3","description":"Overall FX market sentiment rollup (no pair filter) — gauges DXY-style market posture rather than any single pair. Call this when the user asks about broad FX market mood; use news_forex_latest for a specific pair's sentiment. 600s cache.","query_params":[{"name":"date_range","type":"string","default":"last7days"}],"admin":false,"display_name":"Forex sentiment (overall)"},{"name":"tengu_v3_news_forex_top_mentions","method":"GET","path":"/api/v3/news_forex/top_mentions","group":"v3","description":"fx-news: most-mentioned FX pairs over a window with sentiment tilt. High-leverage 'what is the FX market talking about?' single call. 300s cache.","query_params":[{"name":"date_range","type":"string","default":"last7days","enum":["today","last7days","last30days"]}],"admin":false,"display_name":"Forex trending (mentions)"},{"name":"tengu_v3_news_forex_trending","method":"GET","path":"/api/v3/news_forex/trending","group":"v3","description":"Trending FX headlines, noise-filtered down to top stories only. Pass pair (e.g. EUR-USD) to filter; omit for market-wide trending. Call this when the user asks what the biggest FX stories are right now. 300s cache.","query_params":[{"name":"pair","type":"string","description":"Optional FX-pair filter, e.g. EUR-USD"}],"admin":false,"display_name":"Forex trending (movers)"},{"name":"tengu_v3_news_forex_sundown_digest","method":"GET","path":"/api/v3/news_forex/sundown_digest","group":"v3","description":"Daily evening FX market summary article. Call this when the user asks for an end-of-day FX wrap-up or a morning briefing needs an overnight FX recap; optional date_range filter (today/last7days). 600s cache.","query_params":[{"name":"date_range","type":"string","description":"Optional date filter (today/last7days/...)"}],"admin":false,"display_name":"Forex evening digest"},{"name":"tengu_v3_news_forex_events","method":"GET","path":"/api/v3/news_forex/events","group":"v3","description":"Clustered FX news events from a forex newswire — high press-coverage stories like central-bank decisions, rate hikes, and intervention rumors, optionally filtered to one pair (e.g. EUR-USD). Call this when the user asks 'what major macro events hit today' or what's moving a currency. 300s cache.","query_params":[{"name":"pair","type":"string","description":"Optional pair filter, e.g. EUR-USD"},{"name":"date_range","type":"string","default":"today"},{"name":"items","type":"int","default":20,"min":1,"max":50}],"admin":false,"display_name":"Forex events"},{"name":"tengu_v3_news_forex_economic_calendar","method":"GET","path":"/api/v3/news_forex/economic_calendar","group":"v3","description":"Economic calendar with actual, forecast, and previous values for macro releases (Fed/CPI/NFP/ECB) — these prints are priced-in by FX traders, so call it for any 'what did CPI print / what macro data hit this week' question. Filter by currency (USD/EUR/JPY) and importance (high/medium/low). 600s cache.","query_params":[{"name":"currency","type":"string","description":"ISO currency filter (e.g. USD, EUR, JPY, GBP)"},{"name":"importance","type":"string","enum":["high","medium","low"]},{"name":"date_range","type":"string","default":"last7days","enum":["today","last7days","last30days"]}],"admin":false,"display_name":"Forex calendar"},{"name":"tengu_v3_news_forex_prices","method":"GET","path":"/api/v3/news_forex/prices","group":"v3","description":"Live FX mid prices (15-min upstream refresh): pass pairs for specific quotes (e.g. EUR-USD,GBP-USD) or base for all pairs vs one currency (base=USD). Call this when the user asks where a currency pair is trading right now. 30s cache.","query_params":[{"name":"pairs","type":"string","description":"Comma-separated pairs, e.g. 'EUR-USD,GBP-USD'"},{"name":"base","type":"string","description":"Base-currency filter (e.g. USD)"}],"admin":false,"display_name":"Forex rates"},{"name":"tengu_v3_news_forex_summary","method":"GET","path":"/api/v3/news_forex/summary/{pair}","group":"v3","description":"fx-news: one-shot per-pair intel summary. Parallel-fetches recent news (24h) + 7-day sentiment stats + trending headlines. The single call to make when asked 'what's going on with EUR-USD?' or any FX-pair analysis. 180s cache.","path_params":["pair"],"admin":false,"display_name":"Forex news (summary)"},{"name":"tengu_v3_research_web_search","method":"GET","path":"/api/v3/research/web_search","group":"v3","description":"Multi-mode web search in parallel across link, cited-synthesis and social-sentiment coverage. Returns synthesized_answer, social_sentiment, citations, and a deduplicated list of links. Call this BEFORE relying on model knowledge for time-sensitive questions (markets, earnings, regulation, breaking news, macro events). 15-min LRU cache.","query_params":[{"name":"query","type":"string","required":true,"description":"Natural-language query"},{"name":"providers","type":"string","default":"links,synthesis","description":"Comma-separated coverage modes: links=link results, synthesis=cited synthesis, social=social-sentiment signal. Add 'social' for sentiment-aware queries."},{"name":"freshness","type":"string","enum":["pd","pw","pm"],"description":"Time filter — past day / week / month"},{"name":"count","type":"int","default":5,"min":1,"max":20,"description":"Results per provider"}],"admin":false,"display_name":"Web search"},{"name":"tengu_v3_research_fetch_url","method":"GET","path":"/api/v3/research/fetch_url","group":"v3","description":"Read ONE specific page you already have the URL for — call ONLY after a search returned the link, never to discover pages. Returns the page's readable body as clean markdown with title, author, published date, and a domain trust tier; handles paywalls. Read at most the 2-3 most load-bearing links per question. NOT a search tool: tengu_v3_research_web_search finds the links this tool reads.","query_params":[{"name":"url","type":"string","required":true,"description":"Absolute http(s) URL to read — use a link returned by web_search"},{"name":"max_chars","type":"int","default":8000,"min":500,"max":10000,"description":"Max extracted characters; domain trust tier may cap lower"}],"admin":false,"display_name":"Read page"},{"name":"tengu_v3_research_synthesis","method":"GET","path":"/api/v3/research/synthesis","group":"v3","description":"Citation-rich research synthesis (grounded LLM). Returns a concise synthesized answer plus the list of source URLs that grounded it. Use when the user wants the answer GROUNDED with explicit sources (e.g. 'summarize NVIDIA's last earnings call and link the transcript'). Distinct from web_search — this returns prose + citations, not a list of headlines.","query_params":[{"name":"query","type":"string","required":true},{"name":"system_prompt","type":"string","description":"Optional system instruction; defaults to a financial-analyst persona that cites sources."}],"admin":false},{"name":"tengu_v3_research_x_sentiment","method":"GET","path":"/api/v3/research/x_sentiment","group":"v3","description":"Real-time X/Twitter sentiment narrative. Pass ticker=NVDA for a focused fintwit read on a name, or query=... for a free-form social-media question. Returns the narrative answer with quantified bullish/bearish ratio and any source URLs social-search grounded against. Use when you want the *vibe* on a name right now (retail sentiment, breaking rumours, unusual social activity), not the news article list.","query_params":[{"name":"ticker","type":"string","description":"Optional ticker for ticker-targeted sentiment"},{"name":"query","type":"string","description":"Optional free-form query. Pass ticker OR query — at least one is required."}],"param_constraints":[{"at_least_one_of":["ticker","query"]}],"admin":false,"display_name":"X/Twitter sentiment"},{"name":"tengu_v3_intel_yield_curve","method":"GET","path":"/api/v3/intel/yield_curve","group":"v3","description":"Live US Treasury yield curve + recession-watch spreads + breakeven inflation. Returns DGS1MO/3MO/2/5/10/30 yields, the 10Y-2Y and 10Y-3M spreads (with 'inverted' flags — classic recession signal), 5Y/10Y breakeven inflation, and the trade-weighted USD index. Quote these numbers verbatim — DO NOT recall yields from training data, which is months stale. 5-min cache. For a focused short-end + cash-park view, use tengu_v3_intel_risk_free_rate.","admin":false,"display_name":"Yield curve"},{"name":"tengu_v3_intel_risk_free_rate","method":"GET","path":"/api/v3/intel/risk_free_rate","group":"v3","description":"Current US T-bill yields + parked-cash quick-reference. Use this for capital-allocation responses — the model needs to compare risky vs risk-free expected return ('T-bills currently yield X% — the equity allocation must clear that hurdle'). Returns 1m/3m/2y/10y yields, `parked_yield_example` showing annual coupon on $10k principal across tenors, and curated T-bill ETF references (SGOV, BIL, SHV) with expense ratios + use-case so the model has something specific to cite. Sourced from FRED. 5-min cache.","admin":false,"display_name":"T-bill yields"},{"name":"tengu_v3_intel_options_chain","method":"GET","path":"/api/v3/intel/options_chain/{ticker}","group":"v3","description":"Options-chain snapshot for a ticker: every contract with Greeks (delta/gamma/theta/vega), implied volatility, open interest, last quote/trade; filter by expiry or call/put side. PRIMARY tool for 'where's the gamma / IV smile / max pain by strike'. Pair with options_volume (flow) and gex (dealer positioning). 60s cache.","path_params":["ticker"],"query_params":[{"name":"expiration_date","type":"string","description":"Filter to a single expiry (yyyy-mm-dd)"},{"name":"contract_type","type":"string","enum":["call","put"],"description":"'call' or 'put' to filter one side"},{"name":"limit","type":"int","default":250,"min":1,"max":250}],"admin":false,"display_name":"Options chain"},{"name":"tengu_v3_intel_etf_summary","method":"GET","path":"/api/v3/intel/etf_summary/{ticker}","group":"v3","description":"One-call ETF intelligence rollup — top holdings + commodity exposure + which other v3 tools work for this ticker. Returns top constituents by weight (holdings provider), and for commodity-tracking ETFs (USO/BNO/GLD/IAU/SGOL/SLV/SIVR/UNG/BOIL/CPER) the linked FRED spot + live proxy price. CALL THIS BEFORE saying 'no data' on any ETF question — most ETFs have rich underlying-level intel even when the wrapper itself doesn't trade analyst targets / insider flow.","path_params":["ticker"],"admin":false,"display_name":"ETF summary"},{"name":"tengu_v3_skills_ta_master","method":"GET","path":"/api/v3/skills/ta_master/{ticker}","group":"v3","description":"One-call technical read on a ticker: fuses candlestick chart (RSI/MACD/BB), GEX, max pain, options flow/volume, insider and congressional trades, and off-exchange volume into a signal list, aggregate bull/bear stance, and embedded PNG chart. Call this FIRST for 'how does the chart/setup look?' — one round-trip replaces ~8 calls.","path_params":["ticker"],"query_params":[{"name":"interval","type":"string","default":"day","description":"minute|hour|day|week|month"},{"name":"bars","type":"int","default":120,"min":40,"max":400}],"admin":false,"display_name":"Technical analysis"},{"name":"tengu_v3_skills_apex_equity","method":"GET","path":"/api/v3/skills/apex_equity/{ticker}","group":"v3","description":"Apex Equity Intelligence — single-call omnibus brief for 'what do you think about $TICKER'. Fuses 12 vendor calls in parallel (daily + hourly charts, company facts, income/balance statements, snapshot, insider, congress, lobbying, gov-contracts, WSB, patents, off-exchange). Returns: 'fundamentals' (12 scalar fields — name, sector, market_cap, last_price, day_change_pct, latest_revenue, latest_net_income, latest_eps, total_assets/liabilities/equity, filing_date), 'intel' (8 scalar fields — insider/congress 30d buy-sell counts, ttm_lobbying_usd, ttm_gov_contract_usd, wsb_7d_mentions+sentiment, patent_filings_recent, avg_dark_pool_pct_30d), 'flags' (notable patterns: insider_cluster_buy/sell, elevated_dark_pool, retail_attention_spike, etc.), 'chart' (primary daily 120-bar candlestick PNG with RSI/MACD/BB indicators, palette-quantized to keep the tool result under 32KB), and 'charts' (a list of ADDITIONAL charts beyond the primary — currently just the hourly intraday chart; do NOT expect the daily here, it's only in 'chart'). 'components' carries raw counts of items behind each digest. 'vendor_errors' is non-empty when one of the parallel fetches failed; the rest of the payload is still usable. For full per-section detail (complete insider trade list, full income statements, etc.) call the dedicated tools tengu_v3_fundamentals_*/tengu_v3_intel_* — apex_equity is the digest, not the firehose.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Equity profile","capability_tags":["heavy"]},{"name":"tengu_v3_skills_trading_plan","method":"GET","path":"/api/v3/skills/trading_plan/{ticker}","group":"v3","description":"Actionable long/short plan for a ticker: entry, stop (recent swing or 1.5x-ATR proxy), 1R/2R/3R targets, position size for a given risk_pct, plus a thesis citing supporting signals (trend, flow tilt, insider, congress) and an embedded PNG chart. Call this when the user asks 'how would I trade X'; bias=auto picks direction from TA stance.","path_params":["ticker"],"query_params":[{"name":"bias","type":"string","default":"auto","description":"auto|long|short — 'auto' picks from TA stance"},{"name":"risk_pct","type":"float","default":1.0,"min":0.1,"max":5.0,"description":"Account-level risk per trade as a percent"}],"admin":false,"display_name":"Trade plan"},{"name":"tengu_v3_framework_lookup","method":"POST","path":"/api/v3/framework/lookup","group":"v3","description":"Curated decision framework for an intent (capital_allocation / verdict / comparison): methodology paragraph, decision_template (inputs_required fan-out, outputs_required, synthesis_order), and academic citations. Call it BEFORE synthesizing an allocation or verdict answer; context flags select defensive/portfolio variants.","body_schema":{"type":"object","required":[],"properties":{"intent":{"type":"string","enum":["capital_allocation","verdict","comparison"]},"framework_id":{"type":"string","description":"exact framework key — wins over intent when both passed"},"context":{"type":"object","properties":{"regime_stressed":{"type":"boolean"},"portfolio_connected":{"type":"boolean"}}}},"description":"all fields optional — empty body returns the full framework registry listing"},"admin":false,"display_name":"Investment framework"},{"name":"tengu_v3_framework_list","method":"GET","path":"/api/v3/framework/list","group":"v3","description":"Lightweight catalogue of all registered frameworks — one row per framework with framework_id + intent + 1-line applies_when + version. Useful for discovery / debugging without parsing the full library. For the actual decision template, call tengu_v3_framework_lookup.","admin":false,"display_name":"Available frameworks"},{"name":"tengu_v3_briefing_daily","method":"GET","path":"/api/v3/briefing/daily","group":"v3","description":"Daily briefing for a given user_id: regime, overnight futures, earnings_today, macro_today, watchlist_signals, news_highlights, risk_exposure, top_movers. ALWAYS returns a briefing — served from a precomputed cache (~5ms) when available, else built on demand (~3s, no LLM calls). The response carries '_source': 'precomputed' or 'computed:request_time' so callers can tell which path served them. Pass precompute_only=true ONLY when you specifically need to know whether the cron has already run (e.g. monitoring scripts) — that path returns 404 instead of building.","query_params":[{"name":"user_id","type":"string","required":true,"server_injected":true},{"name":"date","type":"string","description":"YYYY-MM-DD (default: today UTC)"},{"name":"fallback_build","type":"bool","default":true,"description":"Default true. Build synchronously when the precompute is missing."},{"name":"precompute_only","type":"bool","default":false,"description":"If true, never build synchronously; return 404 when the precompute is missing. Use for monitoring."}],"admin":false,"display_name":"Daily briefing","capability_tags":["heavy"]},{"name":"tengu_v3_briefing_status","method":"GET","path":"/api/v3/briefing/status","group":"v3","description":"Presence check for today's briefing payload for a user/date. Call when the user asks whether the daily briefing was generated or why it looks missing.","query_params":[{"name":"user_id","type":"string","required":true,"server_injected":true},{"name":"date","type":"string"}],"admin":false},{"name":"tengu_ml_health","method":"GET","path":"/api/ml/health","group":"ml","description":"ML pipeline freshness probe: has_predictions, has_weights_history, latest_as_of_ts, n_tickers. Call when the user asks whether the ML pipeline is healthy or why predictions look missing/stale.","admin":false},{"name":"tengu_ml_predict","method":"GET","path":"/api/ml/predict/{ticker}","group":"ml","description":"Latest ML ensemble prediction for one ticker: blended_score, conviction, decile rank, and per-voter sub-scores. Call this when the user asks 'what does the model think of X' or wants a quantitative score to weigh against fundamentals.","path_params":["ticker"],"admin":false},{"name":"tengu_ml_top_picks","method":"GET","path":"/api/ml/top-picks","group":"ml","description":"Top-N ranked tickers from the latest ML ensemble scoring snapshot, optionally floored by min_conviction. PRIMARY tool for 'what are the model's top picks / best-ranked stocks right now'; use tengu_ml_predict for one ticker's detail.","query_params":[{"name":"limit","type":"int","default":20},{"name":"min_conviction","type":"float","default":0.0}],"admin":false},{"name":"tengu_ml_weights","method":"GET","path":"/api/ml/weights","group":"ml","description":"Current live ML ensemble voter weights (latest history row, broken out per market regime). Call it to know how the ensemble is blending its voters before interpreting a prediction; use tengu_ml_weights_history for drift over time.","admin":false},{"name":"tengu_ml_weights_history","method":"GET","path":"/api/ml/weights/history","group":"ml","description":"Time series of ML ensemble voter weights (per regime, newest first; days=1-365, default 30). Call this when the user asks how the model's weighting has drifted or shifted across regimes; use tengu_ml_weights for the current row.","query_params":[{"name":"days","type":"int","default":30,"description":"Days of history to return (1-365)"}],"admin":false},{"name":"tengu_v3_private_markets_search","method":"GET","path":"/api/v3/private_markets/search","group":"v3","description":"Search PRIVATE companies / investors (VC/PE) / funds / people / limited partners by name (prefix, case-insensitive), ticker, or CIK — relevance-ranked so the prominent entity is #1 (brand/AKA/former-name aware: 'Nubank'→Nu Holdings, 'Square'→Block). Use this FIRST for any private-company question (e.g. 'tell me about Stripe', 'who is Sequoia') to resolve the entity id, then call the company/dossier/realtime tools. type=all searches every entity kind. detail=full returns every column per hit (for rich tables).","query_params":[{"name":"q","type":"string","description":"Name prefix, ticker, or CIK"},{"name":"type","type":"string","default":"company","enum":["company","investor","fund","person","lp","serviceprovider","all"]},{"name":"limit","type":"int","default":10,"min":1,"max":50},{"name":"detail","type":"string","default":"lean","enum":["lean","full"],"description":"lean=key fields; full=every column per hit"},{"name":"fields","type":"string","description":"explicit comma-separated columns (overrides detail)"}],"admin":false},{"name":"tengu_v3_private_markets_search_suggest","method":"GET","path":"/api/v3/private_markets/search/suggest","group":"v3","description":"INSTANT (sub-100ms) private-company typeahead — prominence-ranked with the SAME ranking as search, so the famous company is never truncated; each hit carries authoritative website/domain/logo_url plus sector, last-known valuation, ticker. Call this FIRST to resolve a name to company_id; use /search for multi-entity or detail=full.","query_params":[{"name":"q","type":"string","description":"Company name prefix / word / ticker / CIK"},{"name":"limit","type":"int","default":8,"min":1,"max":20}],"admin":false},{"name":"tengu_v3_private_markets_company","method":"GET","path":"/api/v3/private_markets/company/{company_id}","group":"v3","description":"FULL private-company profile by company_id: financials (revenue/EBITDA/EBIT/net income/EV/net debt), complete financing history (round size/valuation/date/type), classification, HQ/contact, parent hierarchy, and cikcode/ticker to join public data. Call it after resolving the id via search_suggest for the deep dive on one company.","path_params":["company_id"],"admin":false},{"name":"tengu_v3_private_markets_company_dossier","method":"GET","path":"/api/v3/private_markets/company/{company_id}/dossier","group":"v3","description":"EVERYTHING on a private company in ONE call — the complete detail-page payload: full profile (incl. financials & full financing history) + full deal history + investors + competitors + similar companies + board/team.","path_params":["company_id"],"query_params":[{"name":"deals","type":"int","default":50,"min":1,"max":200},{"name":"peers","type":"int","default":25,"min":1,"max":100},{"name":"investors","type":"int","default":100,"min":1,"max":300},{"name":"blocks","type":"string","description":"csv subset of deals,investors,competitors,similar,board (default all; 'none' = profile-only header prefetch)"},{"name":"fields","type":"string","description":"project the company profile to these columns (keeps a header-only prefetch tiny)"}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_private_markets_company_realtime","method":"GET","path":"/api/v3/private_markets/company/{company_id}/realtime","group":"v3","description":"LIVE real-time overlay for a private company — the fast-moving complement to the (weekly, possibly STALE) private-markets profile, on a short TTL with per-field source provenance. ALWAYS call this for a private company to check whether it has GONE PUBLIC: it returns a `public_transition` block (new ticker, IPO date, SEC evidence) even when the snapshot still shows 'In IPO Registration'/no ticker — then pivot to the public-equity tools (price_snapshot / company_facts / sec_filings) for live data. Also surfaces live headcount / jobs / funding freshness when those providers are set.","path_params":["company_id"],"admin":false},{"name":"tengu_v3_private_markets_company_deals","method":"GET","path":"/api/v3/private_markets/company/{company_id}/deals","group":"v3","description":"Funding-round and M&A deal history for a private company (deal size, type, VC round, pre/post-money valuation), newest first. Call this when the user asks 'when did X last raise / at what valuation / who acquired it'; use /investors for who participated.","path_params":["company_id"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_company_investors","method":"GET","path":"/api/v3/private_markets/company/{company_id}/investors","group":"v3","description":"Investor roster for a private company, resolved through the deal-investor relation; detail=full adds every investor column (AUM, dry powder, activity). Call this when the user asks 'who backed X / which VCs are on the cap table'; use /deals for the rounds themselves.","path_params":["company_id"],"query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":500},{"name":"detail","type":"string","default":"lean","enum":["lean","full"],"description":"full = every investor column (AUM, dry powder, activity)"}],"admin":false},{"name":"tengu_v3_private_markets_companies","method":"GET","path":"/api/v3/private_markets/companies","group":"v3","description":"SCREEN private companies by sector, geography, financing/business status, size (total raised/valuation/employees, $MILLIONS), founding year; rows carry ticker/cikcode to join public data. PRIMARY tool for list questions like 'VC-backed fintech in Europe raised >$100M'; status=active_private excludes public/acquired/defunct.","query_params":[{"name":"sector","type":"string"},{"name":"industry_group","type":"string"},{"name":"country","type":"string"},{"name":"region","type":"string"},{"name":"financing_status","type":"string"},{"name":"business_status","type":"string"},{"name":"q","type":"string"},{"name":"min_raised","type":"float","description":"$millions"},{"name":"max_raised","type":"float","description":"$millions"},{"name":"min_valuation","type":"float","description":"$millions"},{"name":"max_valuation","type":"float","description":"$millions"},{"name":"min_employees","type":"int"},{"name":"max_employees","type":"int"},{"name":"founded_after","type":"int"},{"name":"founded_before","type":"int"},{"name":"has_ticker","type":"bool"},{"name":"status","type":"string","default":"any","enum":["any","active_private"],"description":"active_private = currently-private OPERATING co only (excludes public/acquired-subsidiary/defunct/bankrupt). Every row also carries is_outlier (valuation > ~$1.5T sanity ceiling) so impossible figures never rank #1."},{"name":"sort","type":"string","default":"totalraised","enum":["totalraised","lastknownvaluation","employees","yearfounded","lastfinancingdate","revenue","ebitda"]},{"name":"desc","type":"bool","default":true},{"name":"limit","type":"int","default":50,"min":1,"max":500},{"name":"offset","type":"int","default":0,"min":0,"max":50000},{"name":"detail","type":"string","default":"lean","enum":["lean","full"],"description":"full = ALL ~98 columns per company (incl financials)"},{"name":"fields","type":"string","description":"explicit comma-separated columns (overrides detail)"}],"admin":false},{"name":"tengu_v3_private_markets_company_comparables","method":"GET","path":"/api/v3/private_markets/company/{company_id}/comparables","group":"v3","description":"Private peer set for one company: same industry sector and similar size band (0.2x-5x total raised), excluding the company itself. Call this when the user asks 'who are X's private comps' or needs a peer group for valuation framing; detail=full returns every column per peer.","path_params":["company_id"],"query_params":[{"name":"limit","type":"int","default":20,"min":1,"max":100},{"name":"detail","type":"string","default":"lean","enum":["lean","full"],"description":"full = every column per peer"},{"name":"fields","type":"string","description":"explicit comma-separated columns (overrides detail)"}],"admin":false},{"name":"tengu_v3_private_markets_aggregates","method":"GET","path":"/api/v3/private_markets/aggregates","group":"v3","description":"Private-market landscape aggregates grouped by sector, industry_group, region, or country: company counts, total and median capital raised, median valuation, median employees. Call this for market-level questions like 'which sectors raise the most' — not for single companies.","query_params":[{"name":"by","type":"string","default":"sector","enum":["sector","industry_group","region","country"]},{"name":"limit","type":"int","default":30,"min":1,"max":200}],"admin":false},{"name":"tengu_v3_private_markets_investor","method":"GET","path":"/api/v3/private_markets/investor/{investor_id}","group":"v3","description":"Investor profile for one VC/PE/family office by investor_id: type, AUM, dry powder, year founded, investment focus, and median valuation/round. Call this when the user asks who an investor is or how big/active they are; use investor_relations for portfolio, funds, and co-investors.","path_params":["investor_id"],"admin":false},{"name":"tengu_v3_private_markets_fund","method":"GET","path":"/api/v3/private_markets/fund/{fund_id}","group":"v3","description":"Fund profile + performance: vintage, size, category, status, and returns (IRR/DPI/TVPI/RVPI/NAV/quartile) when loaded.","path_params":["fund_id"],"admin":false},{"name":"tengu_v3_private_markets_person","method":"GET","path":"/api/v3/private_markets/person/{person_id}","group":"v3","description":"Person profile (founder/exec/board member) by person_id: role, board seats, affiliated deals/funds, education, and professional-profile link. Call this when the user asks who a founder or executive is; use person_relations to walk their full career and deal history.","path_params":["person_id"],"admin":false},{"name":"tengu_v3_private_markets_limited_partner","method":"GET","path":"/api/v3/private_markets/limited_partner/{lp_id}","group":"v3","description":"Limited-partner profile by lp_id: LP type, AUM, total/active commitments, allocation to alternatives, and openness to first-time funds. Call this when the user asks who an LP is or how much it commits; use limited_partner_relations for its fund commitments and mandates.","path_params":["lp_id"],"admin":false},{"name":"tengu_v3_private_markets_deal","method":"GET","path":"/api/v3/private_markets/deal/{deal_id}","group":"v3","description":"Single deal / financing round by deal_id: deal size, type, VC round, pre/post-money valuation, and a synopsis. Call this when the user asks about a specific round ('what was the Series C?'); use deal_relations for the investors, lenders, and tranches behind it.","path_params":["deal_id"],"admin":false},{"name":"tengu_v3_private_markets_service_provider","method":"GET","path":"/api/v3/private_markets/service_provider/{sp_id}","group":"v3","description":"Advisory-firm profile by sp_id — the law firm, investment bank, auditor or consultancy behind private-market deals: type, employees, parent, and count of companies serviced. Call this when the user asks who advised a deal or how big an adviser is; use service_provider_relations for its client list.","path_params":["sp_id"],"admin":false},{"name":"tengu_v3_private_markets_service_provider_relations","method":"GET","path":"/api/v3/private_markets/service_provider/{sp_id}/relations","group":"v3","description":"Reverse adviser index for one service provider: every deal, company, investor, fund or LP the firm has advised (relation= picks the edge, limit default 50). PRIMARY tool for 'which deals did this bank run?' / 'who does this law firm work for?' — the counterparty-selection view the forward service_providers relation cannot express.","path_params":["sp_id"],"query_params":[{"name":"relation","type":"string","required":true,"enum":["deals","companies","investors","funds","limited_partners","board"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_relations","method":"GET","path":"/api/v3/private_markets/relations","group":"v3","description":"Catalogue of every queryable relation per private-markets entity type — the map of the private-capital graph. Call it first when unsure which relation= value a company/investor/fund/deal/person/LP relations tool accepts before traversing.","admin":false},{"name":"tengu_v3_private_markets_company_relations","method":"GET","path":"/api/v3/private_markets/company/{company_id}/relations","group":"v3","description":"Traverse a company's private-market graph one edge per call (relation=): competitors, investors, board, similar companies, affiliates, buyside targets, service providers, industries/verticals, news, financials, employee history and more. Call this when the user asks who backs, competes with, or sits on the board of a company.","path_params":["company_id"],"query_params":[{"name":"relation","type":"string","enum":["competitors","investors","board","similar","affiliates","buyside","lead_partners","service_providers","industries","verticals","naics","sic","locations","news","financials","clinical_trials","market_analysis","stock_exchanges","entity_types","morningstar_codes","employee_history","cik_codes"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_deal_relations","method":"GET","path":"/api/v3/private_markets/deal/{deal_id}/relations","group":"v3","description":"Traverse a deal's graph one edge per call (relation=): investors, tranches, debt lenders, sellers, service providers, bonds, loans, distribution beneficiaries. Call this when the user asks who funded, lent into, or sold in a specific round after fetching the deal itself.","path_params":["deal_id"],"query_params":[{"name":"relation","type":"string","enum":["investors","tranches","debt_lenders","sellers","service_providers","bonds","loans","distrib_beneficiaries"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_investor_relations","method":"GET","path":"/api/v3/private_markets/investor/{investor_id}/relations","group":"v3","description":"Traverse an investor's graph one edge per call (relation=): portfolio companies, funds raised, co-investors, LPs, board, deals, news, and investment focus by industry/year. Call this when the user asks what a VC/PE firm holds, who invests alongside it, or who its LPs are.","path_params":["investor_id"],"query_params":[{"name":"relation","type":"string","enum":["portfolio_companies","funds","co_investors","board","limited_partners","affiliates","deals","locations","news","invest_industries","invest_years","service_providers","entity_types","types"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_fund_relations","method":"GET","path":"/api/v3/private_markets/fund/{fund_id}/relations","group":"v3","description":"Traverse a fund's graph one edge per call (relation=): investors, LP commitments, team, portfolio holdings, close history, fund family, service providers, and returns time-series. Call this when the user asks what a fund holds, who committed capital, or how it has performed.","path_params":["fund_id"],"query_params":[{"name":"relation","type":"string","enum":["investors","lp_commitments","team","portfolio_holdings","close_history","family","service_providers","returns"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_person_relations","method":"GET","path":"/api/v3/private_markets/person/{person_id}/relations","group":"v3","description":"Traverse a person's graph one edge per call (relation=): career positions, board seats, education, affiliated deals/funds, advisory roles. Call this when the user asks where a founder or exec worked before, what boards they sit on, or which deals they touched.","path_params":["person_id"],"query_params":[{"name":"relation","type":"string","enum":["positions","board_seats","education","affiliated_deals","affiliated_funds","advisory"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_private_markets_limited_partner_relations","method":"GET","path":"/api/v3/private_markets/limited_partner/{lp_id}/relations","group":"v3","description":"Traverse an LP's graph one edge per call (relation=): fund commitments, board, mandates, news, service providers. Call this when the user asks which funds an LP has committed to or what mandates it is running.","path_params":["lp_id"],"query_params":[{"name":"relation","type":"string","enum":["fund_commitments","board","mandates","news","service_providers"]},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_tape_bars","method":"GET","path":"/api/v3/tape/bars/{ticker}","group":"v3","description":"Intraday minute bars for one equity from FIRM's own market-data capture (~10.5k tickers, extended hours included). Use when an agent needs REAL intraday price/volume history — how a ticker traded through an event, VWAP context, or a finer-grained chart than daily bars. Archive begins 2026-05-10; pass date=YYYY-MM-DD (or start+end, max 5 trading days). 1m is the native grain; 5m/15m/1h are resampled server-side.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"trading day YYYY-MM-DD (required unless start+end given)"},{"name":"start","type":"string","description":"range start YYYY-MM-DD (with end; max 5 trading days)"},{"name":"end","type":"string","description":"range end YYYY-MM-DD (inclusive)"},{"name":"interval","type":"string","default":"1m","enum":["1m","5m","15m","1h"]},{"name":"limit","type":"int","default":5000,"min":1,"max":10000}],"admin":false,"display_name":"Intraday bars","capability_tags":["heavy"]},{"name":"tengu_v3_tape_index_bars","method":"GET","path":"/api/v3/tape/index_bars/{index}","group":"v3","description":"Intraday minute bars for the major index tapes — SPX, NDX, DJI, RUT, VIX — from FIRM's own market-data indices capture. Use for intraday market/vol context around an event (how did SPX and VIX move through the FOMC statement?) or as the benchmark leg next to tengu_v3_tape_bars. Archive begins 2026-05-14; one day or max 5 trading days per call.","path_params":["index"],"query_params":[{"name":"date","type":"string","description":"trading day YYYY-MM-DD (required unless start+end given)"},{"name":"start","type":"string"},{"name":"end","type":"string"},{"name":"interval","type":"string","default":"1m","enum":["1m","5m","15m","1h"]},{"name":"limit","type":"int","default":5000,"min":1,"max":10000}],"admin":false,"display_name":"Index intraday bars","capability_tags":["heavy"]},{"name":"tengu_v3_tape_options","method":"GET","path":"/api/v3/tape/options/{ticker}","group":"v3","description":"Raw options trade prints for one underlying on one trading day from FIRM's own market-data capture — per-print premium (notional_usd), strike, expiry, block/sweep flags, sorted largest premium first. Use when an agent needs the actual options tape behind a flow signal: whale prints, sweep activity, what struck around a specific time. Archive begins 2026-05-11; date is mandatory (70 GB day-partitioned table).","path_params":["ticker"],"query_params":[{"name":"date","type":"string","required":true,"description":"trading day YYYY-MM-DD"},{"name":"min_premium","type":"float","min":0,"description":"only prints with notional_usd >= this (e.g. 25000 for whales)"},{"name":"side","type":"string","enum":["C","P"],"description":"filter one side (also accepts call/put)"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Options tape","capability_tags":["heavy"]},{"name":"tengu_v3_tape_futures","method":"GET","path":"/api/v3/tape/futures/{root}","group":"v3","description":"Raw CME futures trade prints for one root (NG, CL, ES...) and one day, from FIRM's own capture: per-print price, size, notional, block flag across contract months. Call it for real futures flow: energy tape, rolls, block prints. date mandatory; archive from 2026-05-13, mostly CME energy (NG heavy) — empty = not-yet-captured, not quiet.","path_params":["root"],"query_params":[{"name":"date","type":"string","required":true,"description":"trading day YYYY-MM-DD"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Futures tape","capability_tags":["heavy"]},{"name":"tengu_v3_tape_futures_curve","method":"GET","path":"/api/v3/tape/futures_curve/{root}","group":"v3","description":"Futures term structure for one CME root (27 roots incl. ES, NQ, CL, NG, GC, ZN) from FIRM's daily chain snapshots — per contract month: last/settlement, bid/ask, session OHLC, volume, open interest, days-to-expiry. Call it for curve shape (contango/backwardation), roll, or OI distribution; omit date for latest, snapshots begin 2026-05-18.","path_params":["root"],"query_params":[{"name":"date","type":"string","description":"snapshot day YYYY-MM-DD — omit for latest"},{"name":"limit","type":"int","default":120,"min":1,"max":500}],"admin":false,"display_name":"Futures curve","capability_tags":["heavy"]},{"name":"tengu_v3_tape_microstructure","method":"GET","path":"/api/v3/tape/microstructure/{ticker}","group":"v3","description":"60s microstructure windows per ticker from FIRM's live tape: rolling vwap, trade count/avg size, block count/vol, buy/sell imbalance, large-trade premium. Call it to separate smart-money accumulation from retail moves. Active-set coverage (~few hundred names/session; empty = uncaptured); omit date for latest, capture from 2026-05-13.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"trading day YYYY-MM-DD — omit for latest"},{"name":"limit","type":"int","default":500,"min":1,"max":5000}],"admin":false,"display_name":"Microstructure windows","capability_tags":["heavy"]},{"name":"tengu_v3_intel_options_flow_history","method":"GET","path":"/api/v3/intel/options_flow_history/{ticker}","group":"v3","description":"Historical options-flow aggregates for one ticker — the ~60s warehouse capture behind the live /intel/options_flow tool. Call when you need how flow EVOLVED (e.g. 'was NVDA flow bullish before the earnings pop?') rather than the current snapshot. Rows: as_of_ts, polarity (-1..1 net bullish/bearish score), n_alerts, premium_total (USD) + a window summary (total premium, avg polarity, bullish/bearish snapshot counts). REQUIRES date OR start(+end), max 7 days per request (422 otherwise); warehouse coverage begins 2026-05-10. 5-min cache.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"single UTC day (YYYY-MM-DD)"},{"name":"start","type":"string","description":"window start (UTC day, inclusive)"},{"name":"end","type":"string","description":"window end (inclusive; defaults to start+6d capped at today; max 7-day window)"},{"name":"min_premium","type":"number","min":0,"description":"only snapshots with premium_total >= this many USD"},{"name":"side","type":"string","enum":["bullish","bearish"],"description":"polarity filter: bullish (>0) or bearish (<0) net flow"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Options flow history","capability_tags":["heavy"]},{"name":"tengu_v3_intel_iv_analytics","method":"GET","path":"/api/v3/intel/iv_analytics/{ticker}","group":"v3","description":"LIVE implied-volatility analytics in one call: IV RANK (current IV + its 1-year percentile — the standard 'is vol cheap or rich' gauge, with a plain-language verdict), SKEW (risk-reversal per delta — put-vs-call demand / crash premium), and TERM STRUCTURE (IV per expiry + option-implied move, labelled backwardation vs contango). Use for 'should I buy or sell premium on X', earnings-vol setups, and hedging cost. Omit date for the latest session. Each block degrades independently. NOT the same as /intel/vol_surface, which serves the lagged academic surface.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"UTC session YYYY-MM-DD; omit for latest"},{"name":"limit","type":"int","default":60,"min":1,"max":400}],"capability_tags":["heavy"],"admin":false},{"name":"tengu_v3_intel_gex_history","method":"GET","path":"/api/v3/intel/gex_history/{ticker}","group":"v3","description":"Historical dealer gamma-exposure (GEX) for one ticker — daily per-strike snapshots behind the live /intel/gex tool. Call for 'how did dealer positioning shift into OPEX / earnings?'. Default returns ONE ROW PER TRADING DAY (call/put/net GEX totals, strike count, max-gamma strike); pass per_strike=true for the full strike ladder (gamma/charm/vanna + call/put GEX per strike). REQUIRES date OR start(+end), max 30 days per request (422 otherwise); coverage begins 2026-05-10. 10-min cache.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"single trading day (YYYY-MM-DD)"},{"name":"start","type":"string","description":"window start (inclusive)"},{"name":"end","type":"string","description":"window end (inclusive; defaults to start+29d capped at today; max 30-day window)"},{"name":"per_strike","type":"bool","default":false,"description":"true = raw per-strike rows; false (default) = one aggregated row per day"},{"name":"limit","type":"int","default":10000,"min":1,"max":50000}],"admin":false,"display_name":"Gamma exposure history","capability_tags":["heavy"]},{"name":"tengu_v3_intel_darkpool_history","method":"GET","path":"/api/v3/intel/darkpool_history/{ticker}","group":"v3","description":"Historical dark-pool (off-exchange) prints for one ticker — the per-print warehouse capture behind the live /intel/darkpool tool. Call to find WHEN large blocks hit and whether they printed at bid/mid/ask. Each row is an individual execution: executed_at, price, size, premium (USD), market center + the NBBO at print time; newest first, plus total premium/size summary. REQUIRES date OR start(+end), max 7 days per request (422 otherwise); coverage begins 2026-05-10. 5-min cache.","path_params":["ticker"],"query_params":[{"name":"date","type":"string","description":"single UTC day (YYYY-MM-DD)"},{"name":"start","type":"string","description":"window start (inclusive)"},{"name":"end","type":"string","description":"window end (inclusive; defaults to start+6d capped at today; max 7-day window)"},{"name":"min_premium","type":"number","min":0,"description":"only prints with premium >= this many USD (size x price)"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Dark pool history","capability_tags":["heavy"]},{"name":"tengu_v3_intel_borrow_cost_history","method":"GET","path":"/api/v3/intel/borrow_cost_history/{ticker}","group":"v3","description":"Daily securities-lending borrow-cost HISTORY for one ticker from the licensed-research warehouse (default: last 90 days of coverage; max 365-day window). Primary source securities-finance Securities Finance (~50M rows 2010->latest licensed-research drop): annualized fee_pct / rebate_pct, utilization_pct and on-loan/lendable share quantities — the institutional squeeze-watch series (rising fee + utilization = tightening borrow). Falls back to implied-vol option-implied borrow (shortest tenor per day) when securities-finance lacks the name. licensed-research refreshes on a lag — check as_of before treating the newest row as current; use /intel/borrow_cost for the live snapshot. 1h cache.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"series start (inclusive; default end-90d)"},{"name":"end","type":"string","description":"series end (inclusive; default today; max 365-day window)"},{"name":"limit","type":"int","default":365,"min":1,"max":2000}],"admin":false,"display_name":"Borrow cost history"},{"name":"tengu_v3_transcripts_list","method":"GET","path":"/api/v3/transcripts/{ticker}","group":"v3","description":"List a company's earnings calls and investor-event transcripts (licensed institutional, 1.75M calls), newest first — call this FIRST to get the ``event_id`` you pass to the full-text route. One row per call (versions collapsed to the best copy: Proofed > Edited > Spellchecked) with date, title and event type. Full text coverage is 2020-2025; older calls are metadata-only.","path_params":["ticker"],"query_params":[{"name":"since","type":"string","description":"only calls on/after this date (YYYY-MM-DD)"},{"name":"limit","type":"int","default":25,"min":1,"max":100}],"admin":false,"display_name":"Earnings call list"},{"name":"tengu_v3_transcript_text","method":"GET","path":"/api/v3/transcripts/{ticker}/{event_id}","group":"v3","description":"Full earnings-call transcript as ordered speaker turns — use when the user wants what management or analysts actually SAID on a call. ``event_id`` comes from /api/v3/transcripts/{ticker} or /transcripts/search. Each turn carries speaker name + role (executive/analyst/operator) and section (presentation vs qa). ~2 MB text cap (``truncated: true`` when hit — refetch with components= to slice). Text coverage 2020-2025.","path_params":["ticker","event_id"],"query_params":[{"name":"components","type":"string","default":"all","enum":["all","presentation","qa"],"description":"presentation = prepared remarks only, qa = analyst Q&A only"},{"name":"max_turns","type":"int","default":800,"min":1,"max":1500}],"admin":false,"display_name":"Earnings call transcript"},{"name":"tengu_v3_transcripts_search","method":"GET","path":"/api/v3/transcripts/search","group":"v3","description":"Search earnings-call transcripts. scope=headlines (default) searches call titles across ALL companies; scope=text searches the spoken words inside one company's transcripts (ticker REQUIRED) and returns per-call hit counts + a snippet. Use when the user asks 'which calls mention X' — then fetch the full text with the returned event_id.","path_params":[],"query_params":[{"name":"q","type":"string","description":"search term, min 3 chars"},{"name":"ticker","type":"string","description":"restrict to one company (required for scope=text)"},{"name":"since","type":"string","description":"only calls on/after this date (YYYY-MM-DD)"},{"name":"scope","type":"string","default":"headlines","enum":["headlines","text"]},{"name":"limit","type":"int","default":20,"min":1,"max":50}],"admin":false,"display_name":"Transcript search"},{"name":"tengu_v3_events","method":"GET","path":"/api/v3/events/{ticker}","group":"v3","description":"Company corporate-event history from a licensed events feed (41.9M events, 1990-2026): M&A, guidance changes, buybacks, exec changes, activism, offerings, index adds/drops + 100 more types, newest-first dated headlines + summaries. PRIMARY tool for 'what happened at COMPANY'; filter type= (see /api/v3/events/types), since/until.","path_params":["ticker"],"query_params":[{"name":"type","type":"string","description":"comma-separated event-type slugs or numeric ids (see /api/v3/events/types), e.g. 'earnings_calls,m_and_a_transaction_announcements' or '48,80'"},{"name":"since","type":"string","description":"only events on/after this date (YYYY-MM-DD)"},{"name":"until","type":"string","description":"only events on/before this date (YYYY-MM-DD)"},{"name":"limit","type":"int","default":100,"min":1,"max":500}],"admin":false,"display_name":"Corporate events"},{"name":"tengu_v3_events_types","method":"GET","path":"/api/v3/events/types","group":"v3","description":"Legend of the 105 licensed institutional KeyDev corporate-event types: id, human label, and the slug accepted by the type= filter of /api/v3/events/{ticker}. Static — call once to discover valid event-type filters.","path_params":[],"query_params":[],"admin":false,"display_name":"Event types"},{"name":"tengu_v3_credit","method":"GET","path":"/api/v3/credit/{ticker}","group":"v3","description":"One-call credit snapshot for a company — call FIRST for any 'how risky is this company's debt?' question: latest securities-finance 5Y CDS spread (bps) with ~90-quote trend + market-implied default probability, current S&P rating with the last upgrade/downgrade action, a recent FINRA TRACE bond yield/volume summary, and the syndicated-loan-facility count. Blocks degrade independently (a missing dataset returns an error field in its block, never a failed call). Drill down with the credit bonds/cds/ratings/loans tools.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Credit snapshot","capability_tags":["heavy"]},{"name":"tengu_v3_credit_bonds","method":"GET","path":"/api/v3/credit/bonds/{ticker}","group":"v3","description":"FINRA TRACE corporate-bond trade prints for one issuer — individual OTC trades (price, yield, volume, buy/sell side) showing where the company's bonds ACTUALLY trade (realised credit spreads, not quotes). Matched by the FINRA bond-symbol prefix of the equity ticker; window spans at most 90 days (422 beyond). TRACE on licensed-research lags realtime by months — when the default recent window is empty the response includes latest_available; page backwards from it.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"ISO date; window start (default end - 30 days)"},{"name":"end","type":"string","description":"ISO date; window end (default today); start..end may span at most 90 days"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Bond trades","capability_tags":["heavy"]},{"name":"tengu_v3_origin_short_activity","method":"GET","path":"/api/v3/origin/short_activity/{ticker}","group":"v3","description":"How shorted is this name, from the tape itself: the DAILY consolidated short-volume prints (short ratio per session, full-market coverage) joined with the settled SHORT INTEREST published twice monthly (position, days-to-cover). Call it for squeeze setups, crowded shorts, or to check whether daily shorting is rising while settled interest lags. The two measures are a FLOW and a STOCK and can diverge — never treat them as the same number. Share volume is FRACTIONAL by design (retail fractional trading), so sub-1-share values are genuine.","path_params":["ticker"],"query_params":[{"name":"days","type":"int","default":30,"min":5,"max":180}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_origin_whale_holdings","method":"GET","path":"/api/v3/origin/whale_holdings","group":"v3","description":"What the tracked managers own, as filed on Form 13F: latest-period positions with value, share/principal count and portfolio weight, filterable by manager or issuer. Call it for whale positioning and conviction sizing. 13F is filed within 45 days of quarter end and covers LONG US equity only — it is a lagged, partial view of a book, never a live one.","query_params":[{"name":"manager","type":"string"},{"name":"ticker","type":"string"},{"name":"limit","type":"int","default":50,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_origin_insider_flow","method":"GET","path":"/api/v3/origin/insider_flow/{ticker}","group":"v3","description":"Insider transactions straight from the Form 4 filings: owner, title, transaction code, direction, shares, price and shares held after. Call it for insider conviction around events. Transaction codes matter — 'P'/'S' are open-market buys/sells while 'M' is an option exercise and 'A' an award; treating them alike overstates conviction. Coverage is a tracked issuer set, not the whole market.","path_params":["ticker"],"query_params":[{"name":"days","type":"int","default":90,"min":7,"max":365},{"name":"limit","type":"int","default":100,"min":1,"max":500}],"admin":false},{"name":"tengu_v3_origin_macro_pulse","method":"GET","path":"/api/v3/origin/macro_pulse","group":"v3","description":"One call for the cross-asset state of the world from the issuing authorities: volatility futures TERM STRUCTURE (contango vs backwardation — the stress regime flag), the composite LEADING INDICATOR by country, official-sector positioning (primary-dealer series + central-bank balance sheet), recent TREASURY AUCTIONS, and physical-trade throughput at the maritime chokepoints. Call it to frame regime before a single-name view. Each block reports its own availability; the leading indicator publishes with a ~2-month reference lag BY CONSTRUCTION — that is not staleness.","query_params":[],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_v3_origin_ipo_pipeline","method":"GET","path":"/api/v3/origin/ipo_pipeline","group":"v3","description":"What is going public: deals that are priced, upcoming or newly filed, with offer size, share count, exchange and dates. Call it for new-issue supply, going-public timing, or to corroborate a private-company transition signal. This is a SECOND, independent view of going-public activity — corroborate it against the filing index rather than treating either source as complete alone.","query_params":[{"name":"status","type":"string","default":"upcoming","enum":["priced","upcoming","filed"]},{"name":"limit","type":"int","default":50,"min":1,"max":200}],"admin":false},{"name":"tengu_v3_credit_indices","method":"GET","path":"/api/v3/credit/indices","group":"v3","description":"Credit-index composites — the credit market's VIX-equivalents: CDX (NA IG/HY) + iTraxx (Europe/Asia/SovX) daily composite spreads and prices by series/version/tenor, 2018 to T-2. Call it for credit-market risk appetite, spread-widening episodes, or cross-asset stress context. FRESHNESS IS T-2 (daily composite) — never present as realtime.","query_params":[{"name":"family","type":"string","enum":["CDX","ITRAXX-EUROPE","ITRAXX-ASIA","ITRAXX-SOVX"]},{"name":"index_ticker","type":"string"},{"name":"days","type":"int","default":7,"min":1,"max":90},{"name":"limit","type":"int","default":2000,"min":1,"max":5000}],"admin":false},{"name":"tengu_v3_credit_cds_history","method":"GET","path":"/api/v3/credit/cds/{ticker}/history","group":"v3","description":"Daily 5Y single-name CDS spread history: composite par spreads (raw + bps), market-implied default probability, average/implied agency rating. Call it for how default risk has trended (tengu_v3_credit is the one-call snapshot). Coverage 2005 to end-2025, 5Y tenor; tickers match the equity symbol for liquid US names (F, T, GE...).","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"ISO date; series start (default end - 365 days)"},{"name":"end","type":"string","description":"ISO date; series end (default today)"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"CDS spread history","capability_tags":["heavy"]},{"name":"tengu_v3_credit_ratings","method":"GET","path":"/api/v3/credit/ratings/{ticker}","group":"v3","description":"Full S&P rating-action history for one issuer's debt — every licensed institutional action (new rating, upgrade, downgrade, outlook/creditwatch change) with from/to symbols, newest first. Use when asked what a company is rated or when/why it was up/downgraded. Equity ticker is resolved to the issuer CUSIP-6 via the fundamentals security master; actions are instrument-level, so several rows can share a date.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":200,"min":1,"max":5000}],"admin":false,"display_name":"Credit ratings"},{"name":"tengu_v3_credit_loans","method":"GET","path":"/api/v3/credit/loans/{ticker}","group":"v3","description":"Syndicated loan book for one borrower: per-facility size, type (revolver/term), maturity, security/seniority, all-in drawn/undrawn spread bps, covenants; include_lenders adds recent-facility syndicate allocations. Private-credit complement to the TRACE bond tape; call for leverage, facility or covenant questions; match on borrower ticker.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":100,"min":1,"max":1000},{"name":"include_lenders","type":"bool","default":false,"description":"also return syndicate lender allocations for the most recent facilities"}],"admin":false,"display_name":"Loan book"},{"name":"tengu_v3_factor_characteristics","method":"GET","path":"/api/v3/factors/characteristics/{ticker}","group":"v3","description":"Latest monthly firm-characteristic vector from the academic firm-characteristic panel (~460 columns incl. the 102 published anomaly characteristics — size, book-to-market, momentum, liquidity, accruals, analyst coverage, plus macro interactions). Call it when you need the full quant feature set for one stock, or a point-in-time vector via as_of. Ticker is resolved to its internal security key automatically.","path_params":["ticker"],"query_params":[{"name":"as_of","type":"string","description":"ISO date — return the latest monthly vector at or before this date (default: latest month)"}],"admin":false,"display_name":"Factor characteristics"},{"name":"tengu_v3_factor_characteristic_history","method":"GET","path":"/api/v3/factors/characteristics/{ticker}/history","group":"v3","description":"Monthly time series of ONE factor characteristic for a stock (e.g. mom_12m, bm, mktcap, realized_vol, sue, turnover), newest first. Call it to chart how an anomaly signal evolved for a name or to compare signal drift across names; a typo in `char` returns 422 with the full list of valid column names.","path_params":["ticker"],"query_params":[{"name":"char","type":"string","description":"characteristic column to chart (required)"},{"name":"start","type":"string","description":"ISO date series start (default: full history)"},{"name":"end","type":"string","description":"ISO date series end (default: latest month)"},{"name":"limit","type":"int","default":600,"min":1,"max":1200}],"admin":false,"display_name":"Factor signal history","capability_tags":["heavy"]},{"name":"tengu_v3_factor_exposures","method":"GET","path":"/api/v3/factors/exposures/{ticker}","group":"v3","description":"Rolling factor betas (Fama-French 5 + momentum) for one stock: beta_mkt/smb/hml/rmw/cma/umd with alpha, idiosyncratic/total volatility and regression R², plus the monthly history of those loadings. Call it to know what factor bets a position actually carries before hedging or sizing it.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":60,"min":1,"max":1200,"description":"months of beta history to return (default 5y)"}],"admin":false,"display_name":"Factor exposures"},{"name":"tengu_v3_governance","method":"GET","path":"/api/v3/governance/{ticker}","group":"v3","description":"One-call corporate-governance dossier: board size + composition (independent vs executive directors, current members, from board-relationship), director interlocks with other boards, restatement record, auditor-change history, and the latest year's executive compensation (CEO/CFO and top-5 named officers, from executive-compensation). Call it for any management-quality, board-oversight or comp question; blocks degrade independently. For graded forensic red flags use /api/v3/intel/accounting_flags.","path_params":["ticker"],"query_params":[],"admin":false,"display_name":"Governance dossier"},{"name":"tengu_v3_accounting_flags","method":"GET","path":"/api/v3/intel/accounting_flags/{ticker}","group":"v3","description":"Forensic accounting red flags with plain-language reasons, from the forensic-audit dataset: fraud/SEC-investigation/adverse restatements, auditor resignations, going-concern or disagreement auditor changes, auditor churn, audit-fee swings >50% yoy, and non-audit-fee dominance (independence risk). Each flag carries severity + reason with the evidence rows attached. Call it before trusting reported financials on any name with earnings-quality doubts (e.g. SMCI returns the 2024 EY-resignation cluster); an empty flags list on a covered name is a genuinely clean record.","path_params":["ticker"],"query_params":[{"name":"limit","type":"int","default":50,"min":1,"max":500,"description":"max rows per evidence block"}],"admin":false,"display_name":"Accounting red flags"},{"name":"tengu_v3_news_sentiment_history","method":"GET","path":"/api/v3/news/sentiment_history/{ticker}","group":"v3","description":"Daily aggregated news sentiment for one company back to 2000 — mean event sentiment (ESS), event count and mean relevance per day from the news-analytics archive (2000-2025) stitched with the live feed. Call it for long-run sentiment regimes or news reaction around past events; for today's headlines use the /news routes instead.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"First day YYYY-MM-DD (default 1y before end; archive back to 2000)"},{"name":"end","type":"string","description":"Last day YYYY-MM-DD (default today)"},{"name":"min_relevance","type":"number","default":70.0,"min":0,"max":100,"description":"Drop events below this news-analytics relevance (90+ = story is about the company)"},{"name":"entity","type":"string","description":"Exact news-analytics entity_name override — bypasses the ticker→name bridge"},{"name":"limit","type":"int","default":400,"min":1,"max":10000}],"admin":false,"display_name":"News sentiment history","capability_tags":["heavy"]},{"name":"tengu_v3_intel_sec13f_history","method":"GET","path":"/api/v3/intel/sec13f_history/{ticker}","group":"v3","description":"Institutional-holder history — a holder × quarter matrix of 13F positions (shares per quarter-end + latest value) from the institutional-holdings 13F archive. Call it to track when funds built or exited a stock across quarters; for only the latest snapshot use /intel/sec13f.","path_params":["ticker"],"query_params":[{"name":"quarters","type":"int","default":12,"min":1,"max":40,"description":"How many quarters back"},{"name":"top","type":"int","default":25,"min":1,"max":100,"description":"Top N holders by latest position value"}],"admin":false,"display_name":"13F holder history","capability_tags":["heavy"]},{"name":"tengu_v3_intel_street_estimates_history","method":"GET","path":"/api/v3/intel/street_estimates_history/{ticker}","group":"v3","description":"Analyst-level estimate revision timeline — every individual broker estimate (announce/revision dates, analyst id, fiscal period, value, realised actual) from the analyst-estimate detail archive back to 1980. Call it to reconstruct how the street walked numbers up or down before a print; for the consensus snapshot use /intel/street_estimates.","path_params":["ticker"],"query_params":[{"name":"measure","type":"string","default":"EPS","description":"analyst-estimate measure code (EPS, SAL, EBI, CPS, DPS, GRM, NET, PRE, ROA, ROE ...)"},{"name":"days","type":"int","default":365,"min":1,"max":9500,"description":"Announcement-date lookback window"},{"name":"limit","type":"int","default":2000,"min":1,"max":50000}],"admin":false,"display_name":"Estimate revisions","capability_tags":["heavy"]},{"name":"tengu_v3_intel_street_estimates_guidance","method":"GET","path":"/api/v3/intel/street_estimates_guidance/{ticker}","group":"v3","description":"Management guidance history — every company-issued guidance range (measure, period, low/high, announce date, street consensus at that date) from the analyst-estimate Guidance archive. Call it to compare what management promised vs what the street expected, or to study guidance-cut reactions.","path_params":["ticker"],"query_params":[{"name":"measure","type":"string","description":"Filter to one analyst-estimate measure code (EPS, SAL, EBI, ...); default all"},{"name":"start","type":"string","description":"Earliest announce date YYYY-MM-DD (default: all history)"},{"name":"limit","type":"int","default":500,"min":1,"max":5000}],"admin":false,"display_name":"Guidance history"},{"name":"tengu_v3_prices_history","method":"GET","path":"/api/v3/prices/history/{ticker}","group":"v3","description":"Survivorship-bias-free daily price history — research-grade daily closes, total returns, volume and cumulative split adjustment factors (cfacpr/cfacshr) 2000-2024, stitched with live market-data daily bars 2025→today, plus the research-grade delisting record. Call it for backtests and long-horizon charts; for intraday or recent-only bars use /api/market/ohlc.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"First day YYYY-MM-DD (default 2000-01-01, archive start)"},{"name":"end","type":"string","description":"Last day YYYY-MM-DD (default today)"},{"name":"limit","type":"int","default":15000,"min":1,"max":15000}],"admin":false,"display_name":"Deep price history","capability_tags":["heavy"]},{"name":"tengu_v3_prices_corporate_actions","method":"GET","path":"/api/v3/prices/corporate_actions/{ticker}","group":"v3","description":"Complete corporate-action history — every cash dividend, stock split and distribution (research-grade distcd-coded with divamt, facpr/facshr factors and declare/ex/record/pay dates) back to first listing. Call it to build adjusted price series or dividend-growth analyses.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"Earliest ex-date YYYY-MM-DD (default: all history)"},{"name":"limit","type":"int","default":1000,"min":1,"max":5000}],"admin":false,"display_name":"Corporate actions"},{"name":"tengu_v3_intel_short_interest_history","method":"GET","path":"/api/v3/intel/short_interest_history/{ticker}","group":"v3","description":"Deep short-selling history — daily off-exchange short-volume series (short vs total shares across FINRA venues + short ratio, back to 2006) plus the official bi-monthly short-interest series from the securities-finance/licensed-research archive. Call it for multi-year squeeze setups or shorting pressure around events; for today's borrow cost use /intel/short_interest.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"First day YYYY-MM-DD for the daily series (default 1y before end)"},{"name":"end","type":"string","description":"Last day YYYY-MM-DD (default today)"},{"name":"limit","type":"int","default":400,"min":1,"max":5000}],"admin":false,"display_name":"Short interest history","capability_tags":["heavy"]},{"name":"tengu_v3_workforce_momentum","method":"GET","path":"/api/v3/workforce/momentum/{ticker}","group":"v3","description":"Monthly EMPLOYMENT MOMENTUM for one company — headcount trend, hiring vs attrition and salary level, from a monthly workforce panel rather than an annual filing. Returns the latest month's headcount with its hiring, attrition and net-hiring rates (percent of headcount per month plus annualized twins), 1m/3m/12m headcount growth, average salary per employee (USD per year) with its coverage, and the full monthly series. Call it to see a company expanding or shrinking MONTHS before the next 10-K, or to catch attrition rising while headcount looks flat. Values are modelled estimates, not company-reported figures. The panel is being backfilled: `coverage` reports the months actually present and any lookback the panel cannot support returns null with a reason — never an interpolated number. Ticker is not unique across venues; the response names the entity served and lists alternates you can pin with employer_id.","path_params":["ticker"],"query_params":[{"name":"months","type":"int","default":24,"min":2,"max":120,"description":"Months of monthly series returned (newest first)"},{"name":"employer_id","type":"int","min":1,"description":"Pin an exact employer when the symbol is ambiguous (take it from `alternates`)"}],"admin":false,"display_name":"Hiring momentum","capability_tags":["heavy"]},{"name":"tengu_v3_workforce_layoffs","method":"GET","path":"/api/v3/workforce/layoffs/{ticker}","group":"v3","description":"WARN-Act LAYOFF FILINGS for one company — the public notices an employer must file WEEKS BEFORE a cut, so they lead the press release and the next earnings call. Returns each filing (notice date, effective date, employees affected, site city/state, layoff type) newest first, plus TRUE window totals, a month-by-month series and the largest single filing; with_workforce also sizes the total against estimated headcount and names the headcount month used. Call it as a downside early-warning, or to confirm the scale of an announced restructuring — filings are SITE-level, so one restructuring appears as many rows. Coverage is US WARN notices from 1989 forward including forward-dated notices; only employers matched to a listed symbol are reachable by ticker, so an empty result is not proof there were no layoffs.","path_params":["ticker"],"query_params":[{"name":"months","type":"int","default":24,"min":1,"max":480,"description":"Lookback window in calendar months"},{"name":"limit","type":"int","default":200,"min":1,"max":2000,"description":"Filing rows returned; the totals always cover the FULL window, not just this page"},{"name":"with_workforce","type":"bool","default":true,"description":"Also size the total against estimated headcount"},{"name":"employer_id","type":"int","required":false,"description":"Pin a specific employer when the symbol is shared by more than one (see symbol_collisions). Answers are returned with identity_verified=false, since pinning asserts an identity we could not prove"}],"admin":false,"display_name":"Layoff filings","capability_tags":["heavy"]},{"name":"tengu_v3_workforce_layoff_screen","method":"GET","path":"/api/v3/workforce/layoff_screen","group":"v3","description":"CROSS-SECTIONAL LAYOFF SCREEN — which listed companies filed WARN-Act layoff notices in the last N days, ranked by employees noticed. One row per ticker (company, filing count, employees noticed, first/latest event date, states touched, largest single filing) across the whole listed universe. Call it for 'who is cutting right now' — notices are filed weeks before the cut, so this surfaces restructurings before the press release. Only employers matched to a listed symbol appear; most WARN filers are private and are excluded by design. For one company's filings use /workforce/layoffs/{ticker}.","query_params":[{"name":"days","type":"int","default":90,"min":1,"max":1825,"description":"Lookback window in days"},{"name":"min_employees","type":"int","default":0,"min":0,"max":1000000,"description":"Only tickers at or above this total employees noticed"},{"name":"state","type":"string","description":"Two-letter US state filter"},{"name":"limit","type":"int","default":100,"min":1,"max":1000}],"admin":false,"display_name":"Layoff screen"},{"name":"tengu_v3_workforce_momentum_screen","method":"GET","path":"/api/v3/workforce/momentum_screen","group":"v3","description":"CROSS-SECTIONAL HIRING SCREEN — rank listed employers by headcount growth between the panel's latest month and N months earlier: ticker, company, headcount then and now, percent and absolute change, latest hiring and attrition rates and average salary, sorted fastest-growing or fastest-shrinking. This is the workforce factor as a screen — who is actually staffing up (or quietly shrinking) months before it reaches a filing. The monthly panel is MID-BACKFILL, so a months_back longer than the loaded window returns an explicit warning listing the lookbacks that ARE available — never a silently shortened comparison.","query_params":[{"name":"months_back","type":"int","default":1,"min":1,"max":36,"description":"Compare the latest month against this many months earlier"},{"name":"min_headcount","type":"float","default":1000,"min":0,"description":"Drop micro-employers below this estimated headcount"},{"name":"order","type":"string","default":"fastest_growing","enum":["fastest_growing","fastest_shrinking"]},{"name":"limit","type":"int","default":100,"min":1,"max":500}],"admin":false,"display_name":"Hiring screen","capability_tags":["heavy"]},{"name":"tengu_v3_supply_chain_relationships","method":"GET","path":"/api/v3/supply_chain/relationships/{ticker}","group":"v3","description":"The SUPPLY-CHAIN GRAPH around one company — its customers, suppliers, competitors and partners in one call, each with the relationship's start date, whether it is still open, which side reported it, and revenue dependence where it was estimated. Both directions are merged and normalised to the queried company's point of view, so 'customers' includes companies that report THIS company as their supplier. Call it to map second-order exposure (whose earnings move when this name moves) or to find the listed suppliers behind a product cycle. Defaults to CURRENT relationships; status=all or as_of=YYYY-MM-DD gives history. One entry per counterparty by default (several records can back one pair) — group_by=record gives the underlying versions. revenue_percent belongs to the company named in revenue_percent_of_ticker, is an ESTIMATE on every row, and is present on only a minority of edges; coverage is reported per group.","path_params":["ticker"],"query_params":[{"name":"rel_type","type":"string","enum":["customers","suppliers","competitors","partners"],"description":"Restrict to one relationship group; omit for all four"},{"name":"status","type":"string","default":"current","enum":["current","all"],"description":"current = open relationships only (most history is closed)"},{"name":"as_of","type":"string","description":"YYYY-MM-DD point-in-time view (overrides status)"},{"name":"listed_only","type":"bool","default":false,"description":"Drop counterparties with no ticker (private companies)"},{"name":"group_by","type":"string","default":"counterparty","enum":["counterparty","record"]},{"name":"limit","type":"int","default":50,"min":1,"max":500},{"name":"company_id","type":"string","description":"Pin an exact entity when the symbol is ambiguous"}],"admin":false,"display_name":"Supply chain map","capability_tags":["heavy"]},{"name":"tengu_v3_supply_chain_revenue_dependence","method":"GET","path":"/api/v3/supply_chain/revenue_dependence/{ticker}","group":"v3","description":"REVENUE DEPENDENCE, both sides — the revenue-at-risk map around one company. `customer_concentration`: how much of THIS company's revenue each customer accounts for. `dependents_on_company`: other companies whose revenue depends on THIS one (e.g. a component maker that books most of its revenue from one handset vendor) — the list that reprices when this name changes its orders, and it is in no filing screen. Percentages are of the DEPENDENT company's revenue and every row names whose revenue it is, so the number can never be read backwards. Coverage is sparse and disclosed: only a minority of relationships carry an estimated percentage, so absence means UNKNOWN, never zero.","path_params":["ticker"],"query_params":[{"name":"status","type":"string","default":"current","enum":["current","all"]},{"name":"as_of","type":"string","description":"YYYY-MM-DD point-in-time view"},{"name":"min_percent","type":"float","default":0,"min":0,"max":100,"description":"Only rows at or above this percent of the dependent's revenue (percent, 0-100)"},{"name":"limit","type":"int","default":50,"min":1,"max":500},{"name":"company_id","type":"string","description":"Pin an exact entity when the symbol is ambiguous"}],"admin":false,"display_name":"Revenue dependence","capability_tags":["heavy"]},{"name":"tengu_v3_supply_chain_geo_revenue","method":"GET","path":"/api/v3/supply_chain/geo_revenue/{ticker}","group":"v3","description":"GEOGRAPHIC REVENUE EXPOSURE for one company — where the revenue actually comes from, estimated region by region and country by country for a fiscal period, with a per-row confidence score. This is the tariff / geopolitical lens: it answers 'how much of this company's revenue is China?' for names that never break that out. Returns the requested hierarchy layer as `regions`, the country leaves as `countries`, concentration metrics (largest country share and an HHI), the period served and the other periods available. ?country=CN,TW returns a per-period HISTORY for exactly those countries. Each layer sums to 100 on its own, so never add a region to a country. Amounts carry NO currency code in the source and the reporting currency can change between periods, so compare on PERCENT, not amount. Estimates, not company-reported segments — for reported segments use /fundamentals/segments/{ticker}.","path_params":["ticker"],"query_params":[{"name":"period","type":"string","description":"Fiscal period end YYYY-MM-DD; omit for the latest available"},{"name":"layer","type":"int","default":1,"min":0,"max":4,"description":"Hierarchy layer returned as `regions` (0 = world, 4 = country)"},{"name":"country","type":"string","description":"Comma-separated ISO alpha-2 codes; switches to per-period history"},{"name":"top_countries","type":"int","default":25,"min":0,"max":250},{"name":"company_id","type":"string","description":"Pin an exact entity when the symbol is ambiguous"}],"admin":false,"display_name":"Revenue by country","capability_tags":["heavy"]},{"name":"tengu_v3_fundamentals_pit","method":"GET","path":"/api/v3/fundamentals/pit/{ticker}","group":"v3","description":"WHAT THE MARKET ACTUALLY KNEW on a given date — as-FIRST-REPORTED quarterly financials for a ticker as they stood on `as_of`: for each fiscal period, the latest published version whose knowledge date is on or before that day. Later restatements are excluded BY CONSTRUCTION, which is what makes this safe to backtest on — the ordinary financials endpoints serve the restated view and will leak look-ahead. Each period also reports whether it has been restated since and what the figure reads today, so you are never silently handed a stale number. Omit as_of for the current view. Figures are in MILLIONS of each filing's own reporting currency (carried per period) — never assume USD.","path_params":["ticker"],"query_params":[{"name":"as_of","type":"string","description":"Knowledge date YYYY-MM-DD; omit for the current restated view"},{"name":"periods","type":"int","default":8,"min":1,"max":60,"description":"Fiscal periods returned, newest first"},{"name":"indfmt","type":"string","description":"Industry format key (advanced; the dominant variant is chosen for you)"},{"name":"consol","type":"string","description":"Consolidation key (advanced)"},{"name":"popsrc","type":"string","description":"Population-source key (advanced)"},{"name":"datafmt","type":"string","description":"Data format key (advanced)"}],"admin":false,"display_name":"Point-in-time financials","capability_tags":["heavy"]},{"name":"tengu_v3_fundamentals_pit_vintages","method":"GET","path":"/api/v3/fundamentals/pit/{ticker}/vintages","group":"v3","description":"THE RESTATEMENT TRAIL for one fiscal quarter — every published version of the period in order, each with the day it became the live view, the day it was superseded, and exactly WHICH line items changed from the previous version. Call it to check whether a figure you are relying on has been quietly revised, and by how much: a quarter can be restated several times, and only the trail shows it. The still-current version reports a null supersede date rather than a far-future sentinel. Omit datadate for the most recent quarter held.","path_params":["ticker"],"query_params":[{"name":"datadate","type":"string","description":"Fiscal period end YYYY-MM-DD; omit for the latest quarter held"},{"name":"indfmt","type":"string","description":"Industry format key (advanced)"},{"name":"consol","type":"string","description":"Consolidation key (advanced)"},{"name":"popsrc","type":"string","description":"Population-source key (advanced)"},{"name":"datafmt","type":"string","description":"Data format key (advanced)"}],"admin":false,"display_name":"Restatement history","capability_tags":["heavy"]},{"name":"tengu_v3_fundamentals_pit_coverage","method":"GET","path":"/api/v3/fundamentals/pit_coverage","group":"v3","description":"The honest bounds of the point-in-time primitive: how many published versions are held, for how many companies, the span of KNOWLEDGE dates (which is what an as_of query can answer) and the span of fiscal periods covered. Call it before trusting an as_of earlier than the archive starts — outside the knowledge span the answer is 'not knowable here', not 'no data'. Pass a ticker for per-company bounds.","query_params":[{"name":"ticker","type":"string","description":"Per-company coverage; omit for archive-wide"}],"admin":false,"display_name":"Point-in-time coverage"},{"name":"tengu_v3_intel_insider_flow","method":"GET","path":"/api/v3/intel/insider_flow/{ticker}","group":"v3","description":"INSIDER TRANSACTIONS SPLIT BY WHETHER THE TRADE WAS PRE-SCHEDULED — Form 4/5 activity for one company with the metadata free feeds drop: the Rule 10b5-1 flag and the filing lag. Sales made under a 10b5-1 plan were scheduled in advance and carry NO view, so they are aggregated separately from discretionary trades and never blended into one 'net insider flow'; a third bucket holds rows with no plan flag, which is unknown, not discretionary. Only open-market buys and sells enter the flow buckets — grants, option exercises and tax-withholding are counted apart. Use as_of to reproduce what was PUBLIC on a date: it filters on the filing date, the only correct as-of key for insider data (a trade-date filter leaks late-filed trades).","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"Transaction-date window start YYYY-MM-DD; omit both for the latest filings held"},{"name":"end","type":"string","description":"Transaction-date window end; with start it spans at most 1095 days"},{"name":"as_of","type":"string","description":"Only filings PUBLIC by this date (filters on filing date)"},{"name":"record_type","type":"string","enum":["nonderiv","deriv"],"description":"nonderiv = common stock, deriv = options/RSUs; omit for both"},{"name":"limit","type":"int","default":200,"min":1,"max":2000,"description":"Transaction rows returned; the flow aggregates always cover the FULL window, not just this page"}],"admin":false,"display_name":"Insider flow (10b5-1 split)"},{"name":"tengu_v3_intel_insider_form144","method":"GET","path":"/api/v3/intel/insider_form144/{ticker}","group":"v3","description":"INSIDER INTENT-TO-SELL NOTICES — supply before it hits the tape. Form 144 is filed BEFORE a sale of restricted or control stock, so it is forward-looking: who intends to sell, roughly how many shares, through which broker, at what notified market value, and how the stock was acquired. Call it to see overhang building ahead of the completed sales, which only show up later in the Form-4 flow. A notice is an INTENT — it may be executed smaller, later, or not at all, so never treat notified value as realised selling.","path_params":["ticker"],"query_params":[{"name":"start","type":"string","description":"Filing-date window start YYYY-MM-DD; omit both for the latest notices held"},{"name":"end","type":"string","description":"Filing-date window end"},{"name":"limit","type":"int","default":100,"min":1,"max":1000}],"admin":false,"display_name":"Intent-to-sell notices"},{"name":"tengu_v3_intel_insider_flow_coverage","method":"GET","path":"/api/v3/intel/insider_flow_coverage","group":"v3","description":"What insider history exists, for which dates, and how much of it carries a Rule 10b5-1 plan flag — rows by record type, distinct filers, the transaction- and filing-date spans, and the share of rows that actually carry the plan flag. Call it before reading a plan split as complete: rows without the flag are unknown, and this says how many there are. Pass a ticker for per-company coverage.","query_params":[{"name":"ticker","type":"string","description":"Per-company coverage; omit for archive-wide"}],"admin":false,"display_name":"Insider flow coverage","capability_tags":["heavy"]},{"name":"tengu_v3_intel_top_shareholders_current","method":"GET","path":"/api/v3/intel/top_shareholders_current/{ticker}","group":"v3","description":"CURRENT INSTITUTIONAL HOLDERS of a company, largest first — holder-level positions with shares, market value (USD), percent of shares outstanding (percent, 0-100) and the change against the prior report, so new, increased, decreased and exited positions are visible. This is the FRESH ownership view; /intel/top_shareholders and /intel/sec13f serve the older archive. The archive is being backfilled, so the response lists every quarter it actually holds with its holder count, defaults to the most COMPLETE quarter and flags any quarter still loading rather than serving a half-loaded snapshot as fact. A 'new_position' can also be a renamed or re-coded holder entity, which the response says explicitly.","path_params":["ticker"],"query_params":[{"name":"quarter","type":"string","description":"Quarter-end YYYY-MM-DD; omit for the most COMPLETE quarter held"},{"name":"limit","type":"int","default":50,"min":1,"max":1000},{"name":"min_pct","type":"float","min":0,"max":100,"description":"Only holders at or above this percent of shares outstanding (percent, 0-100)"}],"admin":false,"display_name":"Top shareholders (current)","capability_tags":["heavy"]},{"name":"tengu_v3_intel_top_shareholders_coverage","method":"GET","path":"/api/v3/intel/top_shareholders_coverage","group":"v3","description":"How much institutional-ownership history has actually landed — per quarter: rows, securities and distinct holders held right now, plus a flag on any quarter still loading. Call it BEFORE treating a quarter-on-quarter change as a real position change: during a backfill a newly-opened quarter is incomplete, and a naive comparison makes every name look like it lost most of its holders. Pass a ticker for per-company coverage.","query_params":[{"name":"ticker","type":"string","description":"Per-company coverage; omit for archive-wide"}],"admin":false,"display_name":"Ownership data coverage","capability_tags":["heavy"]},{"name":"tengu_v3_reference_crosswalk","method":"GET","path":"/api/v3/reference/crosswalk/{symbol}","group":"v3","description":"IDENTITY CROSSWALK for one symbol — every identifier the security and its issuer carry, which rung matched, and how confident that match is. Returns SECURITY-grain identifiers (CUSIP9, CUSIP8, ISIN, SEDOL, ticker, estimate-vendor ticker) kept deliberately SEPARATE from the ISSUER-grain keys (gvkey, CUSIP6, regulator filer number, entity id), because those identify a company and not a share line; plus the issuer's other listed securities, the dated timeline of every identifier this security has ever been bound to, and the bridge into the private-company graph with that link's confidence grade. Call it to join two data sets that key on different identifiers, to translate a CUSIP-keyed holdings file into tickers, or to find out what a symbol used to be. as_of=YYYY-MM-DD returns the identifiers that were IN FORCE on that date, not today's — FB resolves today to an ETF and Meta's 2012-02-01→2022-06-08 hold on the string comes back as a dated prior binding, never as the answer. A symbol shared by more than one current security is REFUSED with its candidate list rather than guessed; pass prefer_country to choose. Coverage is a number in every response: what THIS answer contains, and the corpus census (77,313 securities / 58,179 issuers / 969,333 identifier bindings / 26,189 issuers linked to the private graph, live-measured 2026-08-02). Identifier-history depth is uneven by construction — 38,850 of 77,313 securities carry a prior ticker — and every source block states its own as-of, its age in days and whether that age is past its expected refresh cadence.","path_params":["symbol"],"query_params":[{"name":"as_of","type":"string","description":"YYYY-MM-DD. Return the identifiers that were in force on that date instead of today's"},{"name":"prefer_country","type":"string","description":"Disambiguation policy for a symbol shared by more than one current security, e.g. USA. Without it a shared symbol is REFUSED with its candidates"},{"name":"include_history","type":"bool","default":true,"description":"Include the dated identifier timeline"},{"name":"include_share_classes","type":"bool","default":true,"description":"Include the issuer's other securities"},{"name":"include_private_graph","type":"bool","default":true,"description":"Include the private-company-graph link"}],"admin":false,"display_name":"Identifier crosswalk","capability_tags":["heavy"]},{"name":"tengu_v3_reference_lookup","method":"GET","path":"/api/v3/reference/lookup","group":"v3","description":"REVERSE IDENTIFIER LOOKUP — give it a CUSIP, ISIN, SEDOL, ticker, estimate-vendor ticker, gvkey, regulator filer number, entity id or private-company-graph id and it returns the security (or, for an ISSUER key, every security under that issuer) plus which rung matched and whether that binding is still current. Exactly one identifier per call. RETIRED identifiers resolve by default — 759,618 of the 969,333 bindings on file are retired, which is precisely why a stale identifier in your own data still lands, and it comes back with the date it was replaced and by what. Issuer keys NEVER nominate one security: an issuer can carry a common line, other share classes and a foreign listing, so all of them are returned and the grain is stated. Use it to turn a CUSIP-keyed custodian file into tickers, to find the ticker behind a regulator filing, or to audit whether an identifier in your own data has gone stale. Rung coverage, measured 2026-08-02: CUSIP9 and CUSIP8 100% of 77,313 securities, ISIN 79.4%, SEDOL 74.2%, regulator filer number 67.8%, estimate-vendor ticker 37.2%.","query_params":[{"name":"cusip","type":"string","description":"9 or 8 characters resolve a SECURITY; 6 characters are an ISSUER key and return every security under it"},{"name":"isin","type":"string"},{"name":"sedol","type":"string"},{"name":"ticker","type":"string"},{"name":"ibtic","type":"string","description":"Estimate-vendor ticker"},{"name":"gvkey","type":"string","description":"ISSUER key"},{"name":"cik","type":"string","description":"Regulator filer number — an ISSUER key"},{"name":"entity_id","type":"string","description":"This API's issuer entity id"},{"name":"private_company_id","type":"string","description":"Private-company-graph id — returns the listed issuer it bridges to, if any"},{"name":"include_retired","type":"bool","default":true,"description":"Also match identifiers that have been RETIRED"}],"admin":false,"display_name":"Identifier lookup"},{"name":"tengu_v3_reference_history","method":"GET","path":"/api/v3/reference/history/{symbol}","group":"v3","description":"IDENTIFIER HISTORY for one symbol — every identifier this security has ever been bound to, with the dates each binding started and ended, plus the dated events where the ISSUER changed its name, ticker or CUSIP. This is the part of a crosswalk a current-state table cannot give you: it answers 'what was this on 2015-06-30', 'when did this CUSIP change' and 'what was this company called then'. Returns the timeline grouped by identifier rung (each entry with valid_from, valid_thru and whether it is still current), the issuer change events with what changed at each one, and — with as_of — the exact set of identifiers in force on that date. Use it to back-map a historical holdings file, to audit identifier drift in your own data, or to explain a ticker that no longer exists. STALENESS, stated rather than implied: the issuer change log is a VINTAGE snapshot that lags the live security master (as-of 2026-04-20 when this shipped, 104 days old, newest change event 2026-01-30). Its age in days and its expected cadence are in every response, and any disagreement between it and the live spine is named explicitly rather than blended into one confident answer. Coverage is a number: 969,333 identifier bindings on file, 759,618 of them retired, 38,850 of 77,313 securities carrying at least one prior ticker.","path_params":["symbol"],"query_params":[{"name":"as_of","type":"string","description":"YYYY-MM-DD — also return the identifiers in force on that date"},{"name":"prefer_country","type":"string","description":"Disambiguation policy for a shared symbol, e.g. USA"},{"name":"include_change_log","type":"bool","default":true,"description":"Include the dated issuer name/ticker/CUSIP change events (a VINTAGE — its age is reported)"}],"admin":false,"display_name":"Identifier history","capability_tags":["heavy"]},{"name":"tengu_v3_reference_batch","method":"GET","path":"/api/v3/reference/batch","group":"v3","description":"BATCH CROSSWALK — up to 100 symbols resolved in ONE pass, each returning its current identifiers (CUSIP9, CUSIP8, ISIN, SEDOL, ticker, estimate-vendor ticker), its issuer keys (gvkey, CUSIP6, regulator filer number), which rung matched and its status. This is the endpoint for mapping a whole portfolio or watchlist in a single call rather than N of them. Every symbol comes back with an explicit status — resolved, historical (renamed or delisted; the security and what it trades as now are both returned), ambiguous (shared by more than one current security: the candidates are listed and NO identity is guessed) or unknown (not carried). Symbols beyond the 100 limit come back as explicit over_limit entries, never silently dropped, and the response reports how many of the requested symbols resolved as a number and a percentage (measured 2026-08-02 on a 102-symbol large-cap list: 100 looked up, 99 resolved, 1 historical, 2 over_limit).","query_params":[{"name":"symbols","type":"string","required":true,"description":"Comma-separated symbols, up to 100"},{"name":"prefer_country","type":"string","description":"Disambiguation policy for shared symbols, e.g. USA"}],"admin":false,"display_name":"Crosswalk (batch)","capability_tags":["heavy"]},{"name":"tengu_v3_reference_coverage","method":"GET","path":"/api/v3/reference/coverage","group":"v3","description":"CROSSWALK COVERAGE — what the reference dataset actually contains, measured live and stated as numbers rather than adjectives: securities and issuers carried and how many are still active, identifier bindings held and how many are RETIRED, the percentage of securities carrying each rung, how many issuers bridge into the private-company graph and how those links break down by confidence grade, and how many dated issuer change events are on file. It also NAMES the rungs this crosswalk deliberately does not serve and why — a missing rung is a stated fact here, not a silent gap a customer discovers after integrating. Every source is listed with its own as-of date, its age in days and whether that age is beyond its expected refresh cadence, so a vintage component can never pass as current. Live-measured 2026-08-02: 77,313 securities (25,512 active), 58,179 issuers, 969,333 identifier bindings (209,715 current / 759,618 retired) across 9 indexed rungs, 26,189 issuers (45.0%) linked to the private graph. Call it before you buy, or before you build against it.","admin":false,"display_name":"Crosswalk coverage","capability_tags":["heavy"]},{"name":"tengu_v3_features_catalogue","method":"GET","path":"/api/v3/features/datasets","group":"v3","description":"FEATURE-STORE CATALOGUE — the derived research panels this platform computes for its own models: what exists, how much of it there is, how far back it goes, and how fresh it actually is. Every entry carries MEASURED coverage (rows, symbols, distinct observation dates, history window) and a measured freshness block. freshness.status is `current` when the producer is inside twice its own declared cadence, or `archival` when the producer has stopped but the dataset is a genuine historical panel — an archival dataset is still readable and EVERY read of it says so. A second, independent flag, stale_for_its_own_cadence, fires when the newest observation is old relative to the table's own typical gap: it catches a panel rewritten nightly whose data still ends months ago because the upstream licence lags. Datasets whose producer stopped and which are NOT panels are listed under `withheld` with the measurement that disqualified them and have NO route at all; `excluded` lists live datasets deliberately not sold here, with the reason. Live-measured 2026-08-02: 19 servable datasets totalling 17,062,613 rows — 14 current, 5 archival (spanning 1962, 1970, 2000, 2025-05 and 2026-05 forward) — plus 5 withheld and 2 excluded. Call it first: it is the only place the slugs for /api/v3/features/{dataset} are published.","admin":false,"display_name":"Feature store catalogue","capability_tags":["heavy"]},{"name":"tengu_v3_features_dataset","method":"GET","path":"/api/v3/features/{dataset}","group":"v3","description":"READ ONE DERIVED FEATURE PANEL — the model-ready research features this platform computes for itself: price/return and liquidity features, monthly fundamentals, analyst-estimate dynamics, options and volatility-surface features, insider and institutional-ownership features, news-sentiment features, betas, regime and macro features. Discover the slugs via /api/v3/features/datasets — they are product names, not table names. With ?ticker= you get that symbol's observations newest first; without it you get the LATEST cross-section (every symbol on the most recent observation date), which is bounded by construction rather than by sorting the whole panel. Symbols resolve through the shared security resolver first and identity.identity_verified states whether the read was keyed on an authoritative identifier or on the resolved security's symbol; an ambiguous symbol is refused, never guessed. Every response carries the dataset's measured coverage (rows_total, symbols_total, observation_dates, history window) and its freshness, so an empty rows array arrives beside the count of symbols that DO have rows and can never be read as a dead upstream — `result` is the machine-readable outcome (rows, no_rows_for_symbol, no_rows_in_window). Five of the 19 servable datasets are `archival`: their producer has stopped, they are served for their history, and every response says so rather than implying currency. An unknown or withheld slug is a 404 and an unreadable store is a 503 — both refunded, because a billed 200 over an empty array is the defect this endpoint exists to remove.","path_params":["dataset"],"query_params":[{"name":"ticker","type":"string","description":"Symbol to read the time series for; omit for the latest cross-section"},{"name":"limit","type":"int","default":500,"min":1,"max":5000},{"name":"since","type":"string","description":"Inclusive lower bound, YYYY-MM-DD"},{"name":"until","type":"string","description":"Inclusive upper bound, YYYY-MM-DD"}],"admin":false,"display_name":"Feature panel","capability_tags":["heavy"]},{"name":"tengu_copilot_score_ticker","method":"GET","path":"/api/v1/copilot/score/{ticker}","group":"copilot","description":"Full per-ticker quant analysis. CALL THIS when the user asks about any specific stock (e.g. 'should I buy NVDA', 'what do you think of TSLA'). Returns blended_score, decile, conformal expected-return interval (90% band), 12-voter breakdown, factor tier, regime context, suggested position size, and a self-contained narrative. Use the narrative as a quotable summary; use the structured fields for follow-up questions. NAMESPACE: FIRM's universe is US EQUITIES. Nine tickers (BTC ETH LINK LTC COMP ARB NEAR APT ATOM) are ALSO crypto symbols; for those the response carries a `ticker_collision` block stating the score describes the US-listed EQUITY. If the user means the CRYPTO asset pass asset_class=crypto, which 404s (no FIRM crypto model yet). NEVER present an equity score as a crypto view.","path_params":["ticker"],"query_params":[{"name":"asset_class","type":"string","default":"equity","enum":["equity","crypto"],"description":"equity (default) | crypto. crypto fails closed with 404 until the FIRM crypto family ships — never a wrong-asset answer."}],"admin":false,"display_name":"Quant score"},{"name":"tengu_copilot_top_picks","method":"GET","path":"/api/v1/copilot/top-picks","group":"copilot","description":"Today's top N picks (long or short side). CALL THIS when the user asks 'what should I buy', 'give me trade ideas', 'top picks today', 'daily briefing', or similar list-of-ideas queries. Each pick comes with the same full quant analysis as score_ticker (score, interval, voter breakdown, narrative).","query_params":[{"name":"side","type":"string","default":"long","enum":["long","short"]},{"name":"n","type":"int","default":5,"min":1,"max":20}],"admin":false,"display_name":"Today's picks"},{"name":"tengu_copilot_universe","method":"GET","path":"/api/v1/copilot/universe","group":"copilot","description":"The ENTIRE scored universe in one call (limit=0 = all ~13k names), ranked, each with the model's absolute suggested_position_pct AND a relative normalized_weight that sums to ~100% across the returned set. Pass tickers=AAPL,NVDA,… to score+SIZE a specific holdings basket (the per-holding rebalance path); omit it to screen/rank the universe (limit/min_decile/side). Use normalized_weight for rebalance targets.","query_params":[{"name":"side","type":"string","default":"long","enum":["long","short"]},{"name":"tickers","type":"string","description":"CSV holdings basket, e.g. AAPL,NVDA,GM"},{"name":"limit","type":"int","default":0,"min":0,"max":20000},{"name":"min_decile","type":"int","default":1,"min":1,"max":10},{"name":"normalize","type":"bool","default":true},{"name":"max_weight","type":"float","default":0.15}],"admin":false,"capability_tags":["heavy"]},{"name":"tengu_copilot_macro_regime","method":"GET","path":"/api/v1/copilot/macro-regime","group":"copilot","description":"Current macro regime + plain-English interpretation of how strong the model's edge is in this regime. CALL THIS when the user asks about market conditions, regime, 'is it a good time to invest', or how confident the model is right now.","admin":false,"display_name":"Market regime","capability_tags":["heavy"]},{"name":"tengu_copilot_portfolio","method":"POST","path":"/api/v1/copilot/portfolio","group":"copilot","description":"Score a list of user-held tickers and report factor tilts, regime appropriateness, and top strengths/weaknesses. CALL THIS when the user shares their holdings (broker-connected or pasted), or asks 'how is my portfolio', 'what should I trim/add', 'where am I overweight'. Body is JSON: {holdings: [{ticker: 'AAPL', weight_pct: 0.04}, ...]}.","body_schema":{"type":"object","required":["holdings"],"properties":{"holdings":{"type":"array","minItems":1,"items":{"type":"object","required":["ticker","weight_pct"],"properties":{"ticker":{"type":"string"},"weight_pct":{"type":"number","description":"FRACTION of NAV — 0.04 = 4%"}}}}}},"admin":false,"display_name":"Portfolio review"},{"name":"tengu_copilot_top_picks_portfolio_aware","method":"POST","path":"/api/v1/copilot/top-picks-portfolio-aware","group":"copilot","description":"Portfolio-aware 'what should I buy' picks. CALL THIS instead of tengu_copilot_top_picks WHEN THE USER HAS A CONNECTED PORTFOLIO. Differs from top_picks in three ways: (1) skips any ticker the user already holds, (2) penalises candidates highly correlated with existing holdings (cosine ≥ 0.7 + sector match), (3) boosts candidates that reduce saturated factor tilts or fill under-represented sectors. Each pick comes with a portfolio-aware position size — so a 5-pick list isn't naively '5 × 4% NAV'; the per-pick sizes account for sector overweight, correlated holdings, and factor-tilt amplification (same haircut logic as portfolio_impact). Body: {holdings:[{ticker,weight_pct},...], side:'long'|'short', n, diversification_weight (0-1, default 0.5)}. Each pick has an inclusion_reason field with a 1-line plain-English rationale for WHY this pick fits THIS user's portfolio — quote it.","body_schema":{"type":"object","required":["holdings"],"properties":{"holdings":{"type":"array","minItems":1,"items":{"type":"object","required":["ticker","weight_pct"],"properties":{"ticker":{"type":"string"},"weight_pct":{"type":"number","description":"FRACTION of NAV — 0.04 = 4%"}}}},"side":{"type":"string","enum":["long","short"],"default":"long"},"n":{"type":"integer","minimum":1,"maximum":20,"default":5},"diversification_weight":{"type":"number","minimum":0.0,"maximum":1.0,"default":0.5}}},"admin":false,"display_name":"Picks for your portfolio"},{"name":"tengu_copilot_portfolio_impact","method":"POST","path":"/api/v1/copilot/portfolio-impact","group":"copilot","description":"Portfolio-aware verdict on a candidate ticker. CALL THIS as the 10th tool in the verdict fan-out WHEN THE USER HAS A CONNECTED PORTFOLIO and is asking about a specific ticker. Returns the candidate's full standalone analysis PLUS pre/post sector + voter-tilt comparison, concentration warnings, correlated holdings already in the portfolio, and a sizing recommendation adjusted for portfolio context (typically tighter than the standalone half-Kelly cap when the user is already overweight the candidate's factor cluster). Body is JSON: {holdings:[{ticker, weight_pct},...], candidate_ticker, candidate_weight_pct (default 0.04)}. The narrative field is the quotable spine — quote it or rewrite in your voice.","body_schema":{"type":"object","required":["holdings","candidate_ticker"],"properties":{"holdings":{"type":"array","minItems":1,"items":{"type":"object","required":["ticker","weight_pct"],"properties":{"ticker":{"type":"string"},"weight_pct":{"type":"number","description":"FRACTION of NAV — 0.04 = 4%"}}}},"candidate_ticker":{"type":"string","minLength":1,"maxLength":10},"candidate_weight_pct":{"type":"number","default":0.04,"description":"fraction of NAV"}}},"admin":false,"display_name":"Portfolio impact"},{"name":"tengu_copilot_track_record","method":"GET","path":"/api/v1/copilot/track-record","group":"copilot","description":"Out-of-sample model performance — Sharpe, IC, conformal coverage, factor-decomp alpha. CALL THIS when the user asks 'how do I know this works', 'what's your track record', 'is this real alpha vs factor exposure'. Covers out-of-sample backtest, strict-OOS, conformal-validation and factor-decomposition metrics, refreshed weekly.","admin":false,"display_name":"Track record"},{"name":"tengu_copilot_signal_health","method":"GET","path":"/api/v1/copilot/signal-health","group":"copilot","description":"CONTRACT C2 — is the alpha signal fit to trade, and do we actually know? CALL THIS BEFORE acting on /top-picks or /score. Returns a closed-vocabulary `status` (healthy | degraded | do_not_trade | unknown), a `tradeable` boolean to branch on, `decile_convention` (10_is_best), the per-horizon live IC, and prose guidance. Fail CLOSED on anything other than `healthy` — treat it as an empty candidate list. `unknown` is a real verdict, not a placeholder: it means no BELIEVABLE current measurement exists, which carries the same instruction as red. The contract checks whether the measurement is trustworthy, not merely recent — a drift job that re-stamps a frozen input publishes today's date over old numbers, and this refuses to grade that as fresh.","admin":false},{"name":"tengu_copilot_live_ic_drift","method":"GET","path":"/api/v1/copilot/live-ic-drift","group":"copilot","description":"Live IC drift status — comparison of realised live IC vs training-time IC. The canonical alpha-decay early warning. CALL THIS when the user asks 'is the model still working?', 'any drift?', 'should we trust today's predictions?'. Returns ic_ratio (live / training) per horizon, drift status (green / yellow / red), and a plain-English narrative. Sub-second; refreshed daily after the close. ic_ratio < 0 = sign flip (halt new positions); ic_ratio < 0.3 = severe (retrain ASAP); ic_ratio > 1.0 = model outperforming training expectation.","admin":false,"display_name":"Signal quality (live)"},{"name":"tengu_copilot_voter_ic_drift","method":"GET","path":"/api/v1/copilot/voter-ic-drift","group":"copilot","description":"Per-voter IC drift breakdown — pinpoints WHICH of the 12 voters in the ensemble is decaying. The blended-IC drift tool tells you IF the ensemble is decaying; this tells you WHICH voter. CALL THIS when the user asks 'which voter is the problem?', 'why did the model decay?', 'should we re-weight?'. Critically distinguishes 'data_silent' (voter source offline → not the voter's fault) from 'real decay' (voter producing scores that no longer predict). Returns per-voter live IC, causal-marginal-ATE baseline, ic_ratio, drift severity, current weight, and operator-suggested weight delta (capped ±0.05 absolute per cycle).","admin":false,"display_name":"Signal quality (per voter)"},{"name":"tengu_copilot_ticker_transparency","method":"GET","path":"/api/v3/copilot/ticker_transparency/{ticker}","group":"copilot","description":"ML-transparency aggregation for one ticker — collapses 5 individual tools (ml_drivers, ml_prediction, model_calibration, voter_ic_drift, voter_coverage) into a SINGLE call. Use when Brain's verdict needs the model-transparency layer ('why is the model saying this?'). Saves 4 HTTP calls per verdict. Returns a 5-layer payload + `degraded:bool` + `missing_layers:[...]` so partial failures still produce usable output. Cache TTL 60s. Pass `cache_max_age_s=0` to bypass cache.","path_params":["ticker"],"query_params":[{"name":"cache_max_age_s","type":"float","min":0,"max":3600}],"admin":false,"capability_tags":["copilot_aggregation_v1"]},{"name":"tengu_copilot_ticker_smartmoney","method":"GET","path":"/api/v3/copilot/ticker_smartmoney/{ticker}","group":"copilot","description":"Smart-money aggregation for one ticker — collapses 7 individual tools (sec13f_changes, institutional_ownership, insider_trades, options_flow, darkpool, max_pain, gex) into ONE call. Use when Brain's verdict needs positioning context ('who's accumulating?', 'what is the options market saying?'). Saves 6 HTTP calls per verdict. Same `degraded` / `missing_layers` contract as ticker_transparency. Cache TTL 180s — positioning doesn't tick at chat cadence.","path_params":["ticker"],"query_params":[{"name":"cache_max_age_s","type":"float","min":0,"max":3600}],"admin":false,"capability_tags":["copilot_aggregation_v1"]},{"name":"tengu_copilot_ticker_full","method":"GET","path":"/api/v3/copilot/ticker_full/{ticker}","group":"copilot","description":"OMNIBUS aggregation for one ticker — Brain's primary single-stock verdict path. Pulls BOTH the 5-layer transparency cluster AND the 7-layer smartmoney cluster in ONE call (up to 12 underlying tools in parallel inside FIRM). Replaces Brain's 24-72 HTTP-burst fan-out with a single call. Use for 'should I buy X?' / 'what do you think of Y?' / 'verdict on Z' shapes. `include_smartmoney` and `include_transparency` flags let comparison views skip clusters they don't need. Cache TTL 60s. Pass `cache_max_age_s=0` to bypass cache.","path_params":["ticker"],"query_params":[{"name":"include_smartmoney","type":"bool","default":true},{"name":"include_transparency","type":"bool","default":true},{"name":"candidate_weight_pct","type":"float","min":0,"max":100},{"name":"cache_max_age_s","type":"float","min":0,"max":3600}],"admin":false,"capability_tags":["copilot_aggregation_v1"]},{"name":"tengu_copilot_capital_allocation_full","method":"POST","path":"/api/v3/copilot/capital_allocation_full","group":"copilot","description":"Capital-allocation aggregation — collapses framework_lookup + risk_free_rate + macro_regime + top_picks (or portfolio_aware_score when has_portfolio is true) + per-pick ml_drivers + voter_coverage into ONE call. Two-phase fan-out inside FIRM: phase 1 fetches context + picks in parallel; phase 2 enriches each pick with model attribution and voter coverage. Brain saves 12-15 HTTP calls per capital-allocation turn. Use for 'what should I buy with $X', 'top picks for my book', 'best opportunities right now'. Cache TTL 300s — framework canon + macro state are shared across users.","body_schema":{"type":"object","required":["has_portfolio","side","n"],"properties":{"has_portfolio":{"type":"boolean"},"holdings":{"type":"array","items":{"type":"object"}},"side":{"type":"string","enum":["long","short"]},"n":{"type":"integer","minimum":1,"maximum":20}}},"query_params":[{"name":"cache_max_age_s","type":"float","min":0,"max":3600}],"admin":false,"capability_tags":["copilot_aggregation_v1"]},{"name":"tengu_copilot_comparison_full","method":"POST","path":"/api/v3/copilot/comparison_full","group":"copilot","description":"Multi-ticker comparison aggregation — for 'X vs Y', 'should I buy NVDA or AMD', 'compare these three names'. For each of N tickers (2-6), fetches ml_prediction, ml_drivers, voter_coverage, analyst_consensus, insider_trades — all 5N sub-calls run in TRUE parallel inside FIRM, latency is bounded by the slowest single sub-call (not 5N×latency). Brain receives a single response with keys like `layers.ml_prediction__NVDA`, `layers.ml_prediction__AMD` — easy to template side-by-side in chat output. Cache TTL 120s — comparisons are bursty and the per-ticker model state is shared.","body_schema":{"type":"object","required":["tickers"],"properties":{"tickers":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":6},"holdings":{"type":"array","items":{"type":"object"}}}},"query_params":[{"name":"cache_max_age_s","type":"float","min":0,"max":3600}],"admin":false,"capability_tags":["copilot_aggregation_v1"]},{"name":"tengu_copilot_briefing_overnight","method":"POST","path":"/api/v3/copilot/briefing_overnight","group":"copilot","description":"PRE-MARKET OVERNIGHT BRIEFING — the data foundation for Brain's future proactive-intelligence engine. For each holding + watchlist ticker, fetches overnight news + earnings_next. Adds market-wide context (earnings_calendar today, macro_regime, top_picks today) in parallel. Synthesizes actionable risk_flags (e.g. 'NVDA reports in 18h' / 'high overnight news volume on AAPL'). NOT called from today's chat — this is the data layer the scheduled briefing service consumes to produce the morning push notification. Cache TTL 4h — briefings are a morning artifact and multiple consumers in the same session share the same answer.","body_schema":{"type":"object","properties":{"user_id":{"type":"string","server_injected":true},"holdings":{"type":"array","items":{"type":"string"},"maxItems":50},"watchlist":{"type":"array","items":{"type":"string"},"maxItems":50},"timezone":{"type":"string","default":"America/New_York"}}},"query_params":[{"name":"cache_max_age_s","type":"float","min":0,"max":14400}],"admin":false,"capability_tags":["copilot_aggregation_v1","proactive_intelligence_v1","heavy"]},{"name":"tengu_copilot_decision_track","method":"POST","path":"/api/v3/copilot/decision_track","group":"copilot","description":"RECORD A DECISION the user has acted on. Pass the ticker, side (long/short), entry_price + entry_ts (optional — defaults to now-UTC), weight_pct, a one-sentence thesis_summary, and the FULL original verdict snapshot (typically the response from tengu_copilot_ticker_full). Returns a decision_id you store. Idempotent on (ticker, side, entry_ts, thesis_score). 90-day TTL. The companion decision_review endpoint re-fetches the verdict later and computes a structured thesis-tracking delta — the foundation of the closed-loop callback Brain needs to differentiate from reactive chat-with-tools competitors.","body_schema":{"type":"object","required":["ticker","side"],"properties":{"ticker":{"type":"string"},"side":{"type":"string","enum":["long","short"]},"entry_price":{"type":"number"},"entry_ts":{"type":"string"},"weight_pct":{"type":"number"},"thesis_summary":{"type":"string"},"original_verdict_snapshot":{"type":"object"}}},"admin":false,"capability_tags":["decision_followup_v1","preview"]},{"name":"tengu_copilot_decision_review","method":"GET","path":"/api/v3/copilot/decision_review/{decision_id}","group":"copilot","description":"REVIEW A TRACKED DECISION. Pass the decision_id returned by decision_track. FIRM re-fetches the same verdict shape (ticker_full) and computes a structured DELTA against the original snapshot. Returns thesis_status in {intact, weakening, broken, n/a} based on the score delta projected into the user's side direction. Includes a narrative the chat can render verbatim. Returns 404 if the decision expired (90-day TTL) or was never recorded. Use this for the 'your AAPL position you opened Tuesday is up X% — thesis is tracking' callback shape.","path_params":["decision_id"],"admin":false,"capability_tags":["decision_followup_v1","preview"]},{"name":"tengu_v3_copilot_thesis_alerts","method":"GET","path":"/api/v3/copilot/thesis_alerts","group":"copilot","description":"EMPTY UNTIL FIRST USE — not broken. Tracked decisions live in Redis and a row is appended ONLY on a state CHANGE, so this populates the FIRST time a tracked decision transitions. Say that to the user rather than reporting an outage. Alerts from the tracked-decision monitor: thesis intact/weakening/broken transitions, earnings-imminent, interval breaches — poll after decision_track. The 2x/day monitor job sweeps every tracked decision and appends a row ONLY on state change (deduped), so every alert here is a NEW transition worth surfacing. alert_type in {status_change, earnings_imminent, interval_breach, stale_decision}; each row carries entry/last price, realised return, score_original → score_current delta, prev_status → thesis_status, severity and a render-ready narrative. Filter with ?ticker= and ?since_hours= (default 72).","query_params":[{"name":"since_hours","type":"float","default":72,"min":1,"max":720},{"name":"ticker","type":"string"},{"name":"limit","type":"int","default":200,"min":1,"max":1000}],"admin":false,"capability_tags":["data_pending_v1","decision_followup_v1","preview","proactive_intelligence_v1"]}],"tool_count":351,"deprecated_count":64,"cached":false,"include_deprecated":false,"admin_included":false}