Free, no sign-up: global stocks, UCITS ETF costs and overlap, company risk and macro, all dated.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compare the cached company relationship graphs of two to five stock tickers. Finds shared suppliers, customers, competitors and partners, including cross-role overlaps, using stable company entity IDs or exact tickers only. Returns directed direct relationships with VERIFIED vs SUGGESTED/NEEDS_REVIEW status, confidence, sole-source flags, disclosed metrics with meaning/unit/period, and primary-source URLs/dates. Shared groups reference the evidence-bearing relationship rows by ID. Missing graphs or edges mean unknown coverage. One cached graph read per company (plus a ticker lookup when the typed ticker has no graph); never starts paid discovery, infers exposure weights or estimates portfolio losses. Read-only.
Two to five distinct Bullrun listing tickers, e.g. AAPL, BMW or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Company names are not accepted here.
Counterparty roles from EACH subject company's point of view; default all four. Suppliers and customers preserve the direction of SUPPLIES_TO.
Only VERIFIED edges when true. The default also includes SUGGESTED/NEEDS_REVIEW edges, explicitly labelled with their individual confidence and evidence.
Maximum direct relationships returned per input company. Shared counterparties are prioritized; totals and any truncation are reported.
Compare the cached company relationship graphs of two to five stock tickers. Finds shared suppliers, customers, competitors and partners, including cross-role overlaps, using stable company entity IDs or exact tickers only. Returns directed direct relationships with VERIFIED vs SUGGESTED/NEEDS_REVIEW status, confidence, sole-source flags, disclosed metrics with meaning/unit/period, and primary-source URLs/dates. Shared groups reference the evidence-bearing relationship rows by ID. Missing graphs or edges mean unknown coverage. One cached graph read per company (plus a ticker lookup when the typed ticker has no graph); never starts paid discovery, infers exposure weights or estimates portfolio losses. Read-only.
| Argument | Type | Description |
|---|---|---|
| roles | array | Counterparty roles from EACH subject company's point of view; default all four. Suppliers and customers preserve the direction of SUPPLIES_TO. |
| tickers* | array | Two to five distinct Bullrun listing tickers, e.g. AAPL, BMW or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Company names are not accepted here. |
| verifiedOnly | boolean | Only VERIFIED edges when true. The default also includes SUGGESTED/NEEDS_REVIEW edges, explicitly labelled with their individual confidence and evidence. |
| limitPerCompany | integer | Maximum direct relationships returned per input company. Shared counterparties are prioritized; totals and any truncation are reported. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tickers"
],
"properties": {
"roles": {
"type": "array",
"items": {
"enum": [
"competitors",
"suppliers",
"customers",
"partners"
],
"type": "string"
},
"default": [
"competitors",
"suppliers",
"customers",
"partners"
],
"maxItems": 4,
"minItems": 1,
"description": "Counterparty roles from EACH subject company's point of view; default all four. Suppliers and customers preserve the direction of SUPPLIES_TO."
},
"tickers": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 5,
"minItems": 2,
"description": "Two to five distinct Bullrun listing tickers, e.g. AAPL, BMW or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Company names are not accepted here."
},
"verifiedOnly": {
"type": "boolean",
"default": false,
"description": "Only VERIFIED edges when true. The default also includes SUGGESTED/NEEDS_REVIEW edges, explicitly labelled with their individual confidence and evidence."
},
"limitPerCompany": {
"type": "integer",
"default": 25,
"maximum": 50,
"minimum": 1,
"description": "Maximum direct relationships returned per input company. Shared counterparties are prioritized; totals and any truncation are reported."
}
},
"additionalProperties": false
}Return a normalized side-by-side comparison of two to ten ETFs across selected classification, market, fund-data, cost, income, benchmark, price-performance, price-risk, holdings, and optional overlap modules. Include overlap to measure pairwise shared securities and weighted overlap from latest stored holdings, matched by security identity rather than ticker alone; cash, currency and derivatives are excluded. Missing holdings make overlap unavailable, while partial holdings make it a lower bound. Only requested modules run; overlap alone fetches no price history. Leaders are mechanical extrema, not recommendations. Currency, holdings dates and coverage caveats are explicit. Read-only.
| Argument | Type | Description |
|---|---|---|
| include | array | Selected comparison modules. overlap is opt-in and returns pairwise shared holdings and weighted overlap from each fund's latest stored snapshot. |
| tickers* | array | Two to ten exact Bullrun ETF listing tickers. |
| topSharedLimit | integer | Maximum shared holdings per ETF pair when overlap is requested; does not limit the snapshots used in overlap calculations. |
| performanceDays | integer | Window in calendar days back from each fund's newest close; the start is the last close on or before that day. 365 matches the fund page and the screener's 1-year return. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tickers"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"classification",
"market",
"fund_data",
"costs",
"income",
"benchmark",
"performance",
"risk",
"holdings",
"overlap"
],
"type": "string"
},
"default": [
"classification",
"market",
"fund_data",
"costs",
"income",
"benchmark"
],
"maxItems": 10,
"minItems": 1,
"description": "Selected comparison modules. overlap is opt-in and returns pairwise shared holdings and weighted overlap from each fund's latest stored snapshot."
},
"tickers": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"minItems": 2,
"description": "Two to ten exact Bullrun ETF listing tickers."
},
"topSharedLimit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Maximum shared holdings per ETF pair when overlap is requested; does not limit the snapshots used in overlap calculations."
},
"performanceDays": {
"type": "integer",
"default": 365,
"maximum": 1825,
"minimum": 30,
"description": "Window in calendar days back from each fund's newest close; the start is the last close on or before that day. 365 matches the fund page and the screener's 1-year return."
}
},
"additionalProperties": false
}Compare two to five stock tickers in one compact structured response: annual fundamentals and growth, quality ratios, stored valuation and Bullrun model context, and measured risk dials. Reports each fiscal year, source date, native quote/reporting currency and missing coverage. No currency conversion, quarterly-to-annual substitution, buy/sell ranking or generated research. Read-only.
| Argument | Type | Description |
|---|---|---|
| include | array | Selected compact modules. Fundamentals and quality use the latest usable ANNUAL fiscal year only; valuation includes stored multiples and Bullrun model context; risk includes measured dials. |
| tickers* | array | Two to five distinct Bullrun stock tickers, e.g. AAPL, BMW, NESN, 6324.T or 7203. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Company names are not accepted here. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tickers"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"fundamentals",
"quality",
"valuation",
"risk"
],
"type": "string"
},
"default": [
"fundamentals",
"quality",
"valuation",
"risk"
],
"maxItems": 4,
"minItems": 1,
"description": "Selected compact modules. Fundamentals and quality use the latest usable ANNUAL fiscal year only; valuation includes stored multiples and Bullrun model context; risk includes measured dials."
},
"tickers": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 5,
"minItems": 2,
"description": "Two to five distinct Bullrun stock tickers, e.g. AAPL, BMW, NESN, 6324.T or 7203. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Company names are not accepted here."
}
},
"additionalProperties": false
}Use when the user wants you to BUILD or PROPOSE a brand-new portfolio for them — e.g. "build me a portfolio", "put together a dividend portfolio", "draft a portfolio of AI stocks", "create a new portfolio for $10k". Generates a REVIEWABLE paper-portfolio draft for the signed-in Bullrun user from a natural-language brief (e.g. "a diversified European dividend portfolio"). Requires OAuth with the write:drafts scope. Available to signed-in free accounts; daily usage limits and portfolio capacity still apply. This is DRAFT-ONLY and never changes any live position: the draft is saved to the user's account and appears in the Bullrun Portfolio tab under "Pending AI drafts", where the user reviews it and explicitly accepts it to create a new portfolio (or discards it). To suggest additions to an EXISTING portfolio instead, use create_position_draft. Tickers are chosen only from Bullrun's priced stock/ETF universe; pass instrumentUniverse for stocks only, ETFs only, or a mix. If the brief is vague, first ask ONE quick round of up to three multiple-choice questions (investing style, region focus, and size), each with a default the user can accept with "just pick for me", then build; skip any dimension the user already specified and do not interrogate across multiple turns.
| Argument | Type | Description |
|---|---|---|
| prompt | string | What kind of portfolio to draft, e.g. "a defensive dividend portfolio of large EU stocks". Optional: if you omit it, the server collects a quick style/region/size brief from the user directly (a native form on clients that support elicitation; otherwise it asks you to gather those first). |
| maxPositions | integer | Maximum number of holdings (3-20, default 10). |
| startingCash | number | Starting cash in USD (default 10000). |
| instrumentUniverse |
Use when YOU (or the user) have ALREADY decided the exact holdings and want them saved as-is — e.g. after researching and settling on a specific basket with target weights. Persists a REVIEWABLE paper-portfolio draft built from the tickers you supply, sized by weight (percent) or by explicit USD amount. Unlike create_portfolio_draft this does NOT use the LLM and NEVER re-selects tickers: your basket lands exactly as given. Like the other draft tools it is available to signed-in free accounts within daily usage limits and portfolio capacity, and needs OAuth with the write:drafts scope. DRAFT-ONLY: the draft is saved to the user's Bullrun account and appears in the Portfolio tab under "Pending AI drafts", where the user reviews it and explicitly accepts it (creating a NEW portfolio) or discards it — it never changes any live position. Tickers must exist in Bullrun's priced stock/ETF universe; any that cannot be priced are returned in `unresolved` and skipped (use search_etfs / get_etf_snapshot / screen_stocks / get_stock_metrics to confirm exact tickers first). For a vague brief where the model should pick, use create_portfolio_draft instead.
| Argument | Type | Description |
|---|---|---|
| name | string | Portfolio name. Default "Custom Portfolio Draft". |
| cashPct | number | Explicit cash percentage to hold back. Overrides the weight-remainder rule. |
| positions* | array | The exact holdings to persist (1-30). Tickers are used verbatim, never re-selected. |
| startingCash | number | Total portfolio cash in USD. Default 10000 in weight mode; the sum of amounts in amount mode. |
Use when the user asks what to BUY or ADD to an EXISTING portfolio — e.g. "what should I buy next", "suggest a stock or ETF for my portfolio", "what should I add", "recommend a position", "any ideas to round out my holdings". Generates REVIEWABLE suggested additions for one existing Bullrun portfolio. Requires OAuth with the write:drafts scope. Available to signed-in free accounts; daily usage limits and portfolio capacity still apply. This is DRAFT-ONLY: the suggested position(s) are saved to the user's account and appear in the Bullrun Portfolio tab under Pending AI drafts, where the user reviews and accepts them into the target portfolio or discards them. It never changes live holdings by itself. To draft a whole new portfolio from scratch use create_portfolio_draft; to test whether a specific named ticker fits, use get_portfolio_analytics with candidateTicker. Pass instrumentUniverse for stocks only, ETFs only, or a mix. If it is unclear, first confirm which portfolio (use list_portfolios when the user has more than one) and how many ideas (a single best idea or a few) in ONE quick step; otherwise just build.
| Argument | Type | Description |
|---|---|---|
| portfolioId* | integer | The Bullrun portfolio id to propose additions for. Use list_portfolios first if unsure. |
| maxPositions | integer | How many suggested additions to save, 1-5. Use 1 for a single-position idea; default 3. |
| instrumentUniverse | string | Candidate universe: stocks only, ETFs only, or a mix. Default mix. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"portfolioId"
],
"properties": {
"portfolioId": {
"type": "integer",
"description": "The Bullrun portfolio id to propose additions for. Use list_portfolios first if unsure.",
"exclusiveMinimum": 0
},
"maxPositions": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "How many suggested additions to save, 1-5. Use 1 for a single-position idea; default 3."
},
"instrumentUniverse": {
"enum": [
"stocks",
"etfs",
"mix"
],
"type": "string",
"description": "Candidate universe: stocks only, ETFs only, or a mix. Default mix."
}
},
"additionalProperties": false
}Discover stock comparison candidates for one exact Bullrun ticker using stored industry or sector classification. Discloses the chosen classification, country preference, deterministic selection order, scan cap and issuer/listing exclusions. Excludes the subject, secondary listings and identifiable duplicate issuers/share classes. Returns compact stored multiples/growth plus ready-to-use compare_stocks arguments. Classification peers are not verified competitors or a financial-similarity ranking; no generated peers or paid graph discovery. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum peers. compare_stocks supports the subject plus at most four selected peers. |
| ticker* | string | Bullrun equity ticker, e.g. AAPL, BMW or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| matchBy | string | auto uses exact stored industry when present, otherwise sector. It does not silently widen an empty industry result to the entire sector. |
| sameCountryOnly | boolean | Restrict to the subject's exact stored country. Otherwise same-country candidates are shown first, followed by other countries. |
Discover what the connected Bullrun account can do BEFORE attempting an action, so you can plan instead of learning by hitting a 403. Reports whether you are authenticated and as WHICH identity (email + userId), the account's Pro/trial status and why (subscription / trial / admin), the granted OAuth scopes, portfolio usage vs the free/max limits, and a per-tool entitlement map: create_portfolio_from_positions, create_portfolio_draft and create_position_draft (all available to signed-in free accounts, subject to usage limits), and whether another portfolio can be created now. Call this first when a draft/write tool might be gated, or to confirm which account a request will act on. Read-only.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}A cheap stored-data manifest for one exact company: available datasets, latest reporting periods, actual ingestion/computation timestamps where stored, and cached relationship graph status. Call before deeper research when coverage or freshness is uncertain. This reads indexed metadata, not every research endpoint, and never starts enrichment. Availability is not completeness or accuracy. A null stored timestamp means freshness is unknown; a reporting period is not an ingestion date. Read-only.
| Argument | Type | Description |
|---|---|---|
| ticker* | string | Bullrun company ticker, e.g. AAPL, SAP or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"ticker": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "Bullrun company ticker, e.g. AAPL, SAP or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
}
},
"additionalProperties": false
}Get cached company news for one exact Bullrun ticker, newest publication first, with publisher, source URL, publication date and stored-fetch freshness when recorded. Optional since cutoff and limit up to 50; only the newest 50 stored articles are searched. Useful for company headlines and article sources; use get_corporate_calendar for scheduled earnings/dividends and get_earnings_call_transcript for call text. Reading news also registers demand and requests a best-effort background cache refresh; this response does not wait for or confirm a refresh. Cached/empty/stale results do not establish that no new events exist. Does not change portfolios or place trades.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum returned articles, newest publication first. Up to 50 cached source articles are read before cutoff filtering. |
| since | string | Inclusive publication-time cutoff. YYYY-MM-DD means midnight UTC; timestamps need an explicit Z or UTC offset. Applied to the newest 50 stored articles, not a full historical news archive. |
| ticker* | string | Bullrun company ticker, e.g. AAPL, SAP, ABBN or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Maximum returned articles, newest publication first. Up to 50 cached source articles are read before cutoff filtering."
},
"since": {
"type": "string",
"description": "Inclusive publication-time cutoff. YYYY-MM-DD means midnight UTC; timestamps need an explicit Z or UTC offset. Applied to the newest 50 stored articles, not a full historical news archive."
},
"ticker": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "Bullrun company ticker, e.g. AAPL, SAP, ABBN or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
}
},
"additionalProperties": false
}Bullrun's company relationship graph for one stock: named competitors, suppliers, customers and partners, each with its Bullrun ticker when the counterparty is listed, verification status (VERIFIED against a primary filing/source vs search-SUGGESTED), confidence, sole-source flag, quantified dependence where disclosed (e.g. "Cirrus Logic gets 91% of revenue from Apple") and the evidence behind it. Use for supply-chain and second-order risk questions ("who supplies X", "who depends on X", "who competes with X", "which listed companies are exposed if X stumbles"), then call get_company_risk or get_stock_metrics on the counterparties' tickers. Returns only the cached graph and never starts a paid discovery run; a company with no graph yet reports status "none". A missing edge is not proof of no relationship. Read-only.
| Argument | Type | Description |
|---|---|---|
| roles | array | Which relationships to return, from this company's point of view. Default: all four. |
| ticker* | string | Bullrun ticker, e.g. "AAPL", "SAP", "ASML". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| evidence | string | none = counts only; sources = source title/URL/type per edge; excerpts = also the quoted evidence text. |
Bullrun's company risk read for one stock: a 0-100 composite risk score and six mechanism dials (market expectation, operating pressure, cash conversion, leverage & coverage, competitive position, concentration) with band (Contained/Normal/Elevated/Stretched/Acute), direction vs the prior reading, the driving input and a plain-English explanation; plus filing-derived risk factors (severity, mechanism, source filing), identified supplier concentration (share of cost base covered, HHI, sole-source count, top supplier share) and recent material events. Use for "how risky is X", "what are the main risks for X", "is X's supply chain concentrated", or before adding a stock to a portfolio. Pair with get_company_relationships for the named competitors/suppliers/customers behind the concentration dial. Bands describe measured strain, never a buy/sell view. Read-only.
| Argument | Type | Description |
|---|---|---|
| detail | string | summary = scores, bands, drivers and explanations; full = also every per-input term behind each category score. |
| ticker* | string | Bullrun ticker, e.g. "AAPL", "ASML", "NESN", "6324.T" or "0700.HK". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| include | array | Modules to return. dials = composite + six mechanism dials (market expectation, operating pressure, cash conversion, leverage, competitive position, concentration); risk_factors = filing-derived risk factors (10-K/annual report) with severity and mechanism; supplier_exposure = identified supplier spend concentration; events = recent restructuring/legal/supply/recall events; headline = latest news headline beside the dials. Default: dials, risk_factors, supplier_exposure. |
Stored historical company risk category readings and their observed input changes. Shows dates, computation times, formula versions, score changes, changing input coverage and measurement bases. Use for 'how has X's risk changed?' and 'which inputs changed?'. These are retained category scores, not a complete daily series or proof of causation. Missing history is unknown, never a zero risk score. Read-only; does not run risk computation or paid discovery.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Latest stored run dates to return, oldest first; each date carries its change from the previous stored date. Retention and gaps vary. Full detail supports at most six dates. |
| detail | string | Summary keeps scores, explanations and up to three changed inputs per category; full includes stored input terms and all returned term changes. |
| ticker* | string | Bullrun company ticker, e.g. AAPL, SAP or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 3,
"maximum": 30,
"minimum": 1,
"description": "Latest stored run dates to return, oldest first; each date carries its change from the previous stored date. Retention and gaps vary. Full detail supports at most six dates."
},
"detail": {
"enum": [
"summary",
"full"
],
"type": "string",
"default": "summary",
"description": "Summary keeps scores, explanations and up to three changed inputs per category; full includes stored input terms and all returned term changes."
},
"ticker": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "Bullrun company ticker, e.g. AAPL, SAP or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
}
},
"additionalProperties": false
}Read stored upcoming earnings and ex-dividend dates, plus recent equity listings. Supports ticker/company search and explicit effective windows, market-cap filters, native listing quote currencies, available source metadata and partial coverage. Recent first-trade dates are not confirmed IPOs or an upcoming IPO schedule. Calendar dates and estimates can change; missing events mean unknown coverage, never proof that no event exists. Read-only; at most three calendar requests, plus a ticker lookup when q carries a Yahoo exchange suffix.
| Argument | Type | Description |
|---|---|---|
| q | string | Optional case-insensitive ticker or company-name contains search, also matched with spaces removed. This is not an exact ticker filter. A Yahoo-style symbol whose listing Bullrun stores in another form (BMW.DE as BMW, 7203.T as 7203) is searched under the stored ticker. A nonblank search widens earnings/ex-dividend to 120 days and listings to 60 months. % and _ act as search wildcards. |
| days | integer | Forward days for earnings and ex-dividend, inclusive of the API server's current date. A nonblank q makes the backend use 120 days regardless of this value. |
| limit | integer | Maximum rows per selected calendar, not an overall result count. A full page may omit other matching events. |
| include | array | Selected stored calendars: upcoming earnings, upcoming ex-dividend dates, and recent listings (not an upcoming IPO schedule). |
| minCapUsd | number |
One country's macro dashboard from Bullrun's Global Markets warehouse: a 0-100 macro stress score (higher = more stress) built from six pillars - labour (unemployment, its change, youth unemployment), housing (real house prices, price-to-income and price-to-rent vs history), credit (BIS credit-to-GDP gap, household debt service, household credit), fiscal (government debt, fiscal balance), external (current account) and cycle (GDP growth, inflation) - with every input's latest value, period, source (OECD, IMF, BIS, World Bank, Eurostat), its stress contribution and a historyCode for get_macro_history. Use for "how is the German economy doing", "is there a housing bubble in Canada", "macro risks in Italy", or to judge the backdrop for a country's stocks. A thinly covered country returns state "insufficient", never a falsely calm score. Read-only.
| Argument | Type | Description |
|---|---|---|
| country* | string | Country name, e.g. "Germany", "United States" (aliases like US, UK, Korea, Eurozone are understood). Also "Euro Area". |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"country"
],
"properties": {
"country": {
"type": "string",
"minLength": 1,
"description": "Country name, e.g. \"Germany\", \"United States\" (aliases like US, UK, Korea, Eurozone are understood). Also \"Euro Area\"."
}
},
"additionalProperties": false
}Read cached earnings-call paragraphs for one exact Bullrun ticker, optionally filtered by fiscal period or search text. A best-effort free background import collects at most the two latest retained calls from DefeatBeta for supported US listings, with a 24-hour stored-data cooldown; the first read may be empty. Coverage and source publication lag vary. Speaker names and paragraph order are retained; roles and prepared/Q&A section labels may be unavailable. Does not change portfolios or user data.
| Argument | Type | Description |
|---|---|---|
| search | string | Optional case-insensitive text/speaker search across transcript chunks. |
| ticker* | string | Bullrun ticker, e.g. "CRWD", "SPGI", "V". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| maxChunks | integer | Maximum speaker-tagged transcript chunks to return. |
| fiscalYear | integer | Optional fiscal year filter. |
| fiscalQuarter | integer | Optional fiscal quarter filter. |
| maxCharsPerChunk |
Calculate sector, country, currency, and broad asset exposure from the latest stored ETF holdings. Sector and country come from the fund provider's own holdings file where it states them (normalized to Bullrun's sector and country names), otherwise from the Bullrun instrument the holding resolves to by ISIN or by symbol with a matching company name. Currency uses the reported holding currency, else an explicitly disclosed estimate from the company's home-market listing or usual country currency. This is a holding quote/listing-currency proxy, not revenue FX exposure, economic currency risk or hedge-adjusted fund exposure. Positions without a classification or currency basis are Unclassified / Not reported. Sector and currency cover all stored rows; country covers securities and excludes cash and derivatives. Coverage states complete bucket weights and any buckets omitted by limitPerType. Broad asset class comes from the normalized fund profile. Factor and thematic look-through are unavailable until dedicated source data exists. Coverage states how much fund weight was classified and how, so partial top-holdings data is never presented as full exposure. Read-only.
| Argument | Type | Description |
|---|---|---|
| types | array | |
| ticker* | string | Exact Bullrun ETF listing ticker. |
| limitPerType | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"types": {
"type": "array",
"items": {
"enum": [
"sector",
"country",
"currency",
"asset",
"factor",
"thematic"
],
"type": "string"
},
"default": [
"sector",
"country",
"currency",
"asset"
],
"maxItems": 6,
"minItems": 1
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker."
},
"limitPerType": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
}
},
"additionalProperties": false
}List the exact values accepted by the categorical filters on search_etfs and screen_etfs — asset classes, categories, index keys, product/wrapper types, regions, domiciles, currencies, exchanges, and (on request) issuers and focus strings. Those filters match exactly, so a guessed string returns zero rows and looks like "no such ETF exists"; call this first whenever a filter value is not already known to be valid. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum values per facet, 1-1000. Each facet reports its untruncated total. |
| facets | array | Which facets to return. Defaults to everything except the long tails fundFamilies (~890 issuers) and industries (~650 focus strings) — request those explicitly, ideally with search. |
| search | string | Case-insensitive substring filter applied to every requested facet, e.g. "ishares" against fundFamilies or "world" against categories. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 1000,
"minimum": 1,
"description": "Maximum values per facet, 1-1000. Each facet reports its untruncated total."
},
"facets": {
"type": "array",
"items": {
"enum": [
"assetClasses",
"categories",
"indexKeys",
"productTypes",
"regions",
"domiciles",
"currencies",
"exchanges",
"sectors",
"fundFamilies",
"industries"
],
"type": "string"
},
"minItems": 1,
"description": "Which facets to return. Defaults to everything except the long tails fundFamilies (~890 issuers) and industries (~650 focus strings) — request those explicitly, ideally with search."
},
"search": {
"type": "string",
"description": "Case-insensitive substring filter applied to every requested facet, e.g. \"ishares\" against fundFamilies or \"world\" against categories."
}
},
"additionalProperties": false
}Resolve one FUND rather than one listing. Given an ISIN (or any venue ticker of the fund) it returns the fund's identity, costs, index, distribution policy, wrapper type and every venue it is listed on with exchange and trading currency. Use this when the user quotes an ISIN, asks "which ticker do I buy on my exchange?", or when several tickers may be the same underlying fund. Ratios are percentage points. Read-only.
| Argument | Type | Description |
|---|---|---|
| isin | string | Fund ISIN, e.g. IE00B4L5Y983. The identifier European factsheets and brokers quote. |
| ticker | string | Any venue listing ticker of the fund, e.g. EUNL.DE or IWDA.L. Resolved to its fund ISIN first. Provide this or isin. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"isin": {
"type": "string",
"description": "Fund ISIN, e.g. IE00B4L5Y983. The identifier European factsheets and brokers quote."
},
"ticker": {
"type": "string",
"description": "Any venue listing ticker of the fund, e.g. EUNL.DE or IWDA.L. Resolved to its fund ISIN first. Provide this or isin."
}
},
"additionalProperties": false
}Return the latest stored ETF holdings snapshot with opaque cursor pagination. The response reports the provider's stated holdings count, stored row count, covered weight, and whether the stored rows appear complete. Treat isComplete=false or null as partial look-through data. Historical as-of selection will be added when the upstream API exposes it. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum holdings to return on this page, 1-100. |
| cursor | string | Opaque nextCursor returned by a previous get_etf_holdings call for the same ticker. |
| ticker* | string | Exact Bullrun ETF listing ticker, including its exchange suffix when present. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum holdings to return on this page, 1-100."
},
"cursor": {
"type": "string",
"description": "Opaque nextCursor returned by a previous get_etf_holdings call for the same ticker."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker, including its exchange suffix when present."
}
},
"additionalProperties": false
}Answer "what is the cheapest way to track <index>?". Returns every fund tracking one index ordered cheapest fee first, deduplicated to one row per FUND rather than per venue listing (a five-venue UCITS fund is one choice, not five) with its listingCount and venues. Defaults to UCITS-buyable domiciles. Omit indexKey to list the available index families. Fees are percentage points and the response states how many funds publish no fee at all, so a "cheapest" claim is never made over silently omitted funds. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum funds (or index families) to return, 1-100. |
| scope | string | ucits (default) restricts to domiciles a European retail investor can actually buy. all adds US-domiciled trackers, which look cheaper but are not purchasable by EU retail. |
| currency | string | Keep only funds with a listing trading in this currency (e.g. CHF, EUR, USD, GBP) and name that line. |
| exchange | string | Keep only funds listed on this venue and name each one's ticker there, e.g. SW (SIX Swiss Exchange), XETRA, LSE, AS, MI. A Swiss investor wanting the SIX line passes SW. |
| indexKey | string | Normalized index key, e.g. SP500, MSCI_WORLD, NASDAQ100, MSCI_EM, EURO_STOXX_50, TOPIX, FTSE100. Omit to list every index family that has at least one fund. |
| distributionPolicy |
Calculate drawdown, annualized volatility, downside volatility, historical VaR, Sharpe, Sortino and Calmar ratios from stored daily close prices. With benchmarkTicker, also calculates beta, correlation, tracking error, active return and information ratio on aligned dates. Results are price-return risk, not distribution-adjusted total-return risk. Read-only.
| Argument | Type | Description |
|---|---|---|
| days | integer | Calendar-day lookback for daily close-price risk calculations. |
| ticker* | string | Exact Bullrun ETF listing ticker. |
| benchmarkTicker | string | Optional exact priced benchmark/proxy ticker for beta, correlation, tracking error, active return, and information ratio. |
| riskFreeRatePct | number | Annual risk-free rate in percentage points for Sharpe, Sortino, and Calmar ratios. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"days": {
"type": "integer",
"default": 370,
"maximum": 1825,
"minimum": 30,
"description": "Calendar-day lookback for daily close-price risk calculations."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker."
},
"benchmarkTicker": {
"type": "string",
"minLength": 1,
"description": "Optional exact priced benchmark/proxy ticker for beta, correlation, tracking error, active return, and information ratio."
},
"riskFreeRatePct": {
"type": "number",
"default": 0,
"maximum": 30,
"minimum": -10,
"description": "Annual risk-free rate in percentage points for Sharpe, Sortino, and Calmar ratios."
}
},
"additionalProperties": false
}Fetch a modular snapshot for one exact ETF listing. The include array controls which of identity, classification, market, fund_data (NAV/AUM), costs, income, and benchmark are fetched and returned. Unrequested modules are omitted; requested-but-unavailable modules are named explicitly. Ratios use percentage points. Read-only.
| Argument | Type | Description |
|---|---|---|
| ticker* | string | Exact Bullrun ETF listing ticker, including its exchange suffix when present, e.g. SPY, VWRL.L, or EUNL.DE. |
| include | array | Only these snapshot modules are fetched and returned. Default: identity, classification, market, costs. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker, including its exchange suffix when present, e.g. SPY, VWRL.L, or EUNL.DE."
},
"include": {
"type": "array",
"items": {
"enum": [
"identity",
"classification",
"market",
"fund_data",
"costs",
"income",
"benchmark"
],
"type": "string"
},
"default": [
"identity",
"classification",
"market",
"costs"
],
"maxItems": 7,
"minItems": 1,
"description": "Only these snapshot modules are fetched and returned. Default: identity, classification, market, costs."
}
},
"additionalProperties": false
}Fetch ETF price or price-return history at daily, weekly, or monthly intervals. NAV, true total-return, benchmark, and premium/discount series are returned only when their required source data or an explicit benchmark ticker exists; unavailable requested series are named explicitly and never approximated with price returns. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum recent daily source bars to load before date filtering and interval aggregation. |
| series | array | Requested series. Unsupported stored series are reported in unavailableSeries rather than synthesized. |
| ticker* | string | Exact Bullrun ETF listing ticker. |
| endDate | string | |
| interval | string | |
| startDate | string | |
| benchmarkTicker | string | Exact priced ticker to use when benchmark is requested. A benchmark name alone cannot resolve a price series safely. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 260,
"maximum": 1300,
"minimum": 1,
"description": "Maximum recent daily source bars to load before date filtering and interval aggregation."
},
"series": {
"type": "array",
"items": {
"enum": [
"price",
"price_return",
"nav",
"total_return",
"benchmark",
"premium_discount"
],
"type": "string"
},
"default": [
"price"
],
"maxItems": 6,
"minItems": 1,
"description": "Requested series. Unsupported stored series are reported in unavailableSeries rather than synthesized."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker."
},
"endDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"interval": {
"enum": [
"daily",
"weekly",
"monthly"
],
"type": "string",
"default": "daily"
},
"startDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"benchmarkTicker": {
"type": "string",
"minLength": 1,
"description": "Exact priced ticker to use when benchmark is requested. A benchmark name alone cannot resolve a price series safely."
}
},
"additionalProperties": false
}Fetch 1-15 years of historical financial statements for one exact Bullrun ticker. Returns annual and/or quarterly rows grouped into income statement, balance sheet, cash flow, per-share metrics, margins, source currency, and annual growth/CAGR consistency checks. Use this when evaluating multi-year revenue/net-income growth, margin trajectories, leverage, cash flow quality, or whether a stock passed a rule such as 10% revenue and net-income growth every year.
| Argument | Type | Description |
|---|---|---|
| years | integer | How many fiscal years of history to return, counting backward from the latest fiscal year available. |
| ticker* | string | The Bullrun ticker. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| periodType | string | Return annual rows, quarterly rows, or both. Annual rows use fiscalQuarter=0. |
| includeEmptyRows | boolean | Include sparse rows that have no major income statement, balance sheet, cash-flow, or EPS values. |
Read cached Yahoo analyst consensus revenue/EPS estimates and available EPS revision percentages for one exact Bullrun ticker. A free background refresh checks supported symbols on demand, storing at most one snapshot per day; the first read may be empty. Fiscal periods and source currency are preserved. The configured feed does not provide EBITDA estimates, management guidance or revenue revisions. Forward P/E/PEG context uses the latest annual consensus snapshot only when quote and EPS currency units match. Does not change portfolios or user data.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum estimate rows to return. |
| ticker* | string | Bullrun ticker, e.g. "AAPL", "CRWD", "SPGI". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| periodType | string | Return annual estimates, quarterly estimates, or both. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 80,
"maximum": 200,
"minimum": 1,
"description": "Maximum estimate rows to return."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Bullrun ticker, e.g. \"AAPL\", \"CRWD\", \"SPGI\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"periodType": {
"enum": [
"annual",
"quarterly",
"both"
],
"type": "string",
"default": "both",
"description": "Return annual estimates, quarterly estimates, or both."
}
},
"additionalProperties": false
}Bullrun's Global Markets dashboard in one call: world equity indices (S&P 500, Nasdaq-100, MSCI World, DAX, FTSE 100, Nikkei, Hang Seng, Nifty...), central-bank policy rates and next rate decisions (Fed, ECB, BoE, BoJ, SNB, BoC), 16 sovereign 10-year yields, 20 FX pairs, oil/gas/gold/copper, headline macro tiles (global GDP growth, inflation, debt/GDP, VIX, DXY, 2s10s curve, US jobless claims), the upcoming economic calendar, market news and the US housing balance. Each row carries a historyCode for get_macro_history. Use for "how are markets doing today", "what's the macro backdrop", "where are rates/yields", "what's on the calendar this week" or a morning briefing. Daily closes, with live intraday index levels while markets are open. Read-only.
| Argument | Type | Description |
|---|---|---|
| sections | array | Sections to return. headline = global GDP/inflation/debt, oil, gold, DXY, US 10Y, 2s10s curve, VIX, EUR/USD, Bitcoin, policy-rate average, OECD unemployment, US jobless claims; indices = 19 world equity indices (live intraday level when a market is open); rates = six major central-bank policy rates + upcoming rate decisions; yields = 16 sovereign 10Y yields; currencies = 20 FX pairs; commodities = Brent, WTI, natural gas, gold, copper; calendar = upcoming high-impact economic releases; news = market headlines; us_housing = US housing-market balance (months' supply, inventory, price cuts). Default: everything except news and us_housing. |
| newsLimit | integer | Headlines to return when the news section is requested. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"sections": {
"type": "array",
"items": {
"enum": [
"headline",
"indices",
"rates",
"yields",
"currencies",
"commodities",
"calendar",
"news",
"us_housing"
],
"type": "string"
},
"minItems": 1,
"description": "Sections to return. headline = global GDP/inflation/debt, oil, gold, DXY, US 10Y, 2s10s curve, VIX, EUR/USD, Bitcoin, policy-rate average, OECD unemployment, US jobless claims; indices = 19 world equity indices (live intraday level when a market is open); rates = six major central-bank policy rates + upcoming rate decisions; yields = 16 sovereign 10Y yields; currencies = 20 FX pairs; commodities = Brent, WTI, natural gas, gold, copper; calendar = upcoming high-impact economic releases; news = market headlines; us_housing = US housing-market balance (months' supply, inventory, price cuts). Default: everything except news and us_housing."
},
"newsLimit": {
"type": "integer",
"default": 8,
"maximum": 50,
"minimum": 1,
"description": "Headlines to return when the news section is requested."
}
},
"additionalProperties": false
}Historical time series behind the Global Markets dashboard, often decades long: equity indices, central-bank policy rates, 10-year government bond yields, FX rates, oil/gas/gold/copper, VIX, DXY, the US 2s10s curve, and per-country macro indicators (GDP growth, inflation, unemployment, house prices, credit gap, debt, confidence, macro stress). Address a series by historyCode (from get_global_markets_overview, get_country_macro or get_macro_indicators), by instrument name ("Fed", "Brent", "Germany 10Y", "S&P 500"), or by indicator + country. Returns summary statistics (latest, change over 1M/3M/1Y/5Y, range, where the latest sits in the window) plus resampled points. Use for "how have rates moved since 2022", "plot Brent over 10 years", "is German unemployment rising". Read-only.
| Argument | Type | Description |
|---|---|---|
| to | string | End date YYYY-MM-DD (inclusive). |
| code | string | Exact series code from another tool's historyCode field (e.g. "CNBC_US10Y", "BIS_CBPOL_US", "UNEMPLOYMENT:Germany", "YAHOO_GSPC"). |
| from | string | Start date YYYY-MM-DD (inclusive). |
| country | string | Country for indicator, e.g. "Japan". |
| interval | string | Resample to end-of-period values. auto = the finest interval that fits maxPoints. |
| indicator | string | Or a per-country macro indicator, together with country (same keys as get_macro_indicators). |
Cross-country macro comparison from Bullrun's Global Markets warehouse: rank up to ~200 countries on one indicator (GDP growth annual or quarterly, CPI inflation, government debt/GDP, unemployment, youth unemployment, real house-price growth, house price-to-income and price-to-rent vs history, BIS credit-to-GDP gap, household debt service, household credit/GDP, business and consumer confidence, or Bullrun's macro stress score), or compare a named set of countries. Every row has value, period, source and a historyCode for get_macro_history. Use for "fastest growing economies", "highest inflation in Europe", "most indebted G7 government", "where is housing most overvalued", "compare unemployment in Spain, Italy and Greece". Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| order | string | desc = highest value first, asc = lowest first. |
| countries | array | Only these countries (e.g. ["Germany","France","Italy"]); aliases like US/UK understood. Omit for every covered country. |
| indicator* | string | Which cross-country indicator: gdp_growth (annual), gdp_growth_quarterly, inflation, government_debt, unemployment, youth_unemployment, real_house_prices, house_price_to_income, house_price_to_rent, credit_gap, household_debt_service, household_credit, business_confidence, consumer_confidence, macro_stress (Bullrun composite). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"indicator"
],
"properties": {
"limit": {
"type": "integer",
"default": 25,
"maximum": 250,
"minimum": 1
},
"order": {
"enum": [
"desc",
"asc"
],
"type": "string",
"default": "desc",
"description": "desc = highest value first, asc = lowest first."
},
"countries": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 60,
"description": "Only these countries (e.g. [\"Germany\",\"France\",\"Italy\"]); aliases like US/UK understood. Omit for every covered country."
},
"indicator": {
"enum": [
"gdp_growth",
"gdp_growth_quarterly",
"inflation",
"government_debt",
"unemployment",
"youth_unemployment",
"real_house_prices",
"house_price_to_income",
"house_price_to_rent",
"credit_gap",
"household_debt_service",
"household_credit",
"business_confidence",
"consumer_confidence",
"macro_stress"
],
"type": "string",
"description": "Which cross-country indicator: gdp_growth (annual), gdp_growth_quarterly, inflation, government_debt, unemployment, youth_unemployment, real_house_prices, house_price_to_income, house_price_to_rent, credit_gap, household_debt_service, household_credit, business_confidence, consumer_confidence, macro_stress (Bullrun composite)."
}
},
"additionalProperties": false
}Read curated, source-linked operating KPI observations for one exact Bullrun ticker. Coverage is sparse and no automatic KPI feed is configured: do not assume ARR, retention, customer counts or payments metrics are available. Check get_company_data_coverage first. Returns stored fiscal periods, units and source links; company-economics observations are a separate dataset. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum KPI rows to return. |
| ticker* | string | Bullrun ticker, e.g. "CRWD", "SNOW", "V". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| category | string | Optional category filter such as SaaS, payments, marketplace, banking, or other domain labels. |
| metricKey | string | Optional metric key present in stored coverage. No particular business KPI is guaranteed to be available. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 120,
"maximum": 300,
"minimum": 1,
"description": "Maximum KPI rows to return."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Bullrun ticker, e.g. \"CRWD\", \"SNOW\", \"V\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"category": {
"type": "string",
"description": "Optional category filter such as SaaS, payments, marketplace, banking, or other domain labels."
},
"metricKey": {
"type": "string",
"description": "Optional metric key present in stored coverage. No particular business KPI is guaranteed to be available."
}
},
"additionalProperties": false
}Use when the user asks about THEIR portfolio's risk, diversification, or concentration, or whether to add a stock or ETF — e.g. "is my portfolio diversified", "how risky is my portfolio", "am I too concentrated", "what's my exposure to X", "should I add NVDA", "would AAPL improve my diversification". Fetches portfolio-level relationship analytics for one signed-in user's portfolio: correlation and annualized covariance matrices across holdings, contribution-to-risk, concentration by weight and risk, currency/sector/country exposures, value/growth/momentum/quality/size proxy factor scores, scenario/stress tests (rates +100bp, oil -20%, USD +10%), and optional candidateTicker fit analysis showing correlation to the current portfolio plus pro-forma volatility (set candidateTicker when the user asks whether to add a specific stock or ETF). Set includeLookThrough=true with candidateTicker to add duplicate direct/ETF-contained underlying securities in separate lookThroughFit, lookThroughCoverage and lookThroughWarnings fields; this is opt-in and uses a priced-position denominator independent of the risk-history subset. Partial ETF snapshots make duplicate exposure a lower bound. Pass a portfolioId from list_portfolios. The risk math only covers holdings with enough price history, dropping unpriced/unmatched ones (ETFs, funds, untracked tickers) and renormalizing all percentages over what remains; the response leads with a `coverage` banner (first text block) stating how many holdings were excluded, so never read these figures as the whole portfolio. For a plain holdings/value snapshot and the full matched/unmatched breakdown use get_portfolio_context instead. Requires OAuth (read:portfolios) and returns the caller's own data only. privacyMode defaults to "full"; "weights_only" hides absolute USD amounts while keeping weights, percentages, correlations and scores.
| Argument | Type | Description |
|---|---|---|
| days | integer | Calendar-day lookback for daily USD return analytics. Default 370. |
Use when the user asks to look at, review, or analyze THEIR portfolio / holdings / positions — e.g. "analyze my portfolio", "how is my portfolio doing", "what's in my portfolio", "review my holdings", "how am I invested", "what should I improve". Fetches a deep snapshot of ONE of the signed-in user's portfolios: the summary (value, day change, total return), every holding (with position weight %, sector and return) and Bullrun's computed insights (benchmark comparison, concentration, diversification, dividend income). Pass a portfolioId from list_portfolios (call that first if the user hasn't named a portfolio). The response ALWAYS returns the complete holdings list with each position flagged matched/unmatched, plus a `coverage` summary: holdings that Bullrun can't link to its universe (ETFs, funds, untracked tickers) carry no weight, sector, insight or ML score, so weights/insights/ML below describe ONLY the matched subset. Read the coverage banner (the first text block) and never present matched-only figures as the whole portfolio. For risk/diversification math, correlations, factor exposure, or whether to add a specific stock, use get_portfolio_analytics instead. Requires OAuth (read:portfolios) and returns the caller's own data only. privacyMode defaults to "full" (absolute $ included); "weights_only" returns only relative figures. Read-only.
| Argument | Type | Description |
|---|---|---|
| days | integer | Insights look-back window in days (default 30). |
| portfolioId* | integer | The portfolio id, as returned by list_portfolios. |
| privacyMode | string | "full" (default) includes absolute $; "weights_only" returns only relative figures. |
Compute annual quality, moat, earnings-quality, and capital-allocation metrics for one exact Bullrun ticker from existing financial statements: ROIC, ROE/ROA, ROIC-vs-supplied-WACC, accruals, cash conversion, capex intensity, dividend payout/growth, diluted share-count changes, and a buyback proxy. Read-only.
| Argument | Type | Description |
|---|---|---|
| years | integer | How many fiscal years of annual history to evaluate. |
| ticker* | string | The Bullrun ticker. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| estimatedWaccPct | number | Optional user-supplied WACC assumption, in percent. When omitted, ROIC-vs-WACC spread is returned as null. |
| taxRateFallbackPct | number | Fallback tax rate used for NOPAT only when reported tax/pretax data is missing or unusable. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"years": {
"type": "integer",
"default": 10,
"maximum": 15,
"minimum": 2,
"description": "How many fiscal years of annual history to evaluate."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "The Bullrun ticker. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"estimatedWaccPct": {
"type": "number",
"maximum": 50,
"minimum": 0,
"description": "Optional user-supplied WACC assumption, in percent. When omitted, ROIC-vs-WACC spread is returned as null."
},
"taxRateFallbackPct": {
"type": "number",
"default": 21,
"maximum": 50,
"minimum": 0,
"description": "Fallback tax rate used for NOPAT only when reported tax/pretax data is missing or unusable."
}
},
"additionalProperties": false
}Fetch segment, geography, product, customer, or other revenue breakdown rows for one exact Bullrun ticker. Use this to separate cyclical businesses from recurring segments or inspect geographic exposure instead of relying on blended revenue. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum breakdown rows to return. |
| ticker* | string | The Bullrun ticker, e.g. "SPGI", "MSFT", "V". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| dimension | string | Breakdown dimension to return, or all dimensions. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 160,
"maximum": 300,
"minimum": 1,
"description": "Maximum breakdown rows to return."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "The Bullrun ticker, e.g. \"SPGI\", \"MSFT\", \"V\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"dimension": {
"enum": [
"segment",
"geography",
"product",
"customer",
"other",
"all"
],
"type": "string",
"default": "all",
"description": "Breakdown dimension to return, or all dimensions."
}
},
"additionalProperties": false
}Companies whose Bullrun composite risk score crossed into a different band (e.g. Elevated -> Stretched, or Acute -> Stretched) within the last N days, with prior and current score, the move in points, and the input driving the reading. Use for "what got riskier this week", "any risk deteriorations I should know about", or to monitor a watchlist (pass the tickers to get_company_risk afterwards). Band changes, not small score drift, so every row changed a word on the page. Read-only.
| Argument | Type | Description |
|---|---|---|
| days | integer | Look-back window in days for band changes. |
| limit | integer | |
| direction | string | Keep only companies whose composite got worse, got better, or both. |
| minMarketCapUsd | number | Only companies with at least this market capitalisation in USD, e.g. 1e9 for $1B+. Without it the list is dominated by micro-caps, whose scores move most. |
| stableBasisOnly | boolean | true (default) = only real movements. false also includes band changes caused purely by a category starting or stopping scoring (coverage changes, flagged basisChanged). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"days": {
"type": "integer",
"default": 7,
"maximum": 30,
"minimum": 1,
"description": "Look-back window in days for band changes."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"direction": {
"enum": [
"all",
"worsening",
"improving"
],
"type": "string",
"default": "all",
"description": "Keep only companies whose composite got worse, got better, or both."
},
"minMarketCapUsd": {
"type": "number",
"minimum": 0,
"description": "Only companies with at least this market capitalisation in USD, e.g. 1e9 for $1B+. Without it the list is dominated by micro-caps, whose scores move most."
},
"stableBasisOnly": {
"type": "boolean",
"default": true,
"description": "true (default) = only real movements. false also includes band changes caused purely by a category starting or stopping scoring (coverage changes, flagged basisChanged)."
}
},
"additionalProperties": false
}Fetch a consolidated metrics snapshot for a single stock by ticker: identity (company, exchange, currency, sector, industry, country, ISIN), latest daily price (OHLCV), latest valuation (market cap, P/E, dividend yield, annual dividend per share), the most recent reported financials (revenue, gross/operating income, EBITDA, net income, diluted EPS, free & operating cash flow, total debt, cash, total assets, equity) and a short company description. Prices are in the listing's trading currency; financials in their own sourceCurrency. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. Read-only.
| Argument | Type | Description |
|---|---|---|
| ticker* | string | The stock ticker as Bullrun lists it, e.g. "AAPL", "BMW", "NESN", "6324.T", "0700.HK" or "005930". A bare numeric code is resolved when exactly one listing matches. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"ticker": {
"type": "string",
"minLength": 1,
"description": "The stock ticker as Bullrun lists it, e.g. \"AAPL\", \"BMW\", \"NESN\", \"6324.T\", \"0700.HK\" or \"005930\". A bare numeric code is resolved when exactly one listing matches."
}
},
"additionalProperties": false
}Read bounded stored stock OHLCV history, ascending by trade date, as daily, weekly or monthly bars, with close-based price returns/drawdown and optional deterministic SMA, EMA, Wilder RSI and MACD. Useful for price trends, volatility context and technical analysis; use get_stock_metrics for a latest company snapshot. Up to 2600 recent daily source rows; dates filter that bounded window. Provider split/dividend adjustment is unknown: returns are not verified total returns. Missing OHLCV/indicator warm-up remains null; no synthetic sessions, intraday data or live quote claims. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum most-recent DAILY source bars to load before date filtering and aggregation (hard cap 2600). Increase for indicator warm-up or longer history. |
| ticker* | string | Bullrun stock ticker, e.g. AAPL, SAP, ABBN, 6324.T or 7203. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
| endDate | string | Inclusive last trade date; the API still loads the most recent source bars before this filter. |
| interval | string | Aggregate stored daily bars. Weekly buckets start Monday; monthly buckets use the calendar month. No intraday or live quotes. |
Bullrun's proprietary machine-learning valuation and forecast scores for 1-10 stocks, recomputed nightly. Valuation: a LightGBM model predicts the P/E (or price/sales for loss-makers) that companies with similar fundamentals typically command a year out; the gap = typical / current multiple - 1 (positive = trades below its typical multiple), with the implied model-typical P/E, percentile and rank in the scored universe. Forecast: a relative 1-year return-rank signal with percentile. Both on quarterly and on annual financials (annual covers most non-US companies). Use for "is X cheap or expensive", "what's X's fair P/E", "compare valuations of X, Y, Z", or a valuation sanity check before buying. Descriptive context, not a price target or recommendation. Read-only.
| Argument | Type | Description |
|---|---|---|
| tickers* | array | 1-10 Bullrun tickers, e.g. ["AAPL","MSFT"] or ["ASML","SAP","NESN"]. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tickers"
],
"properties": {
"tickers": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"minItems": 1,
"description": "1-10 Bullrun tickers, e.g. [\"AAPL\",\"MSFT\"] or [\"ASML\",\"SAP\",\"NESN\"]. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
}
},
"additionalProperties": false
}Use when the user refers to THEIR portfolio(s) or holdings — e.g. "my portfolios", "what portfolios do I have", "how are my investments doing", "show my holdings", "my account". Lists the signed-in Bullrun user's virtual portfolios with computed summaries: name, base currency, total value (USD), day change, cost basis and total return, plus position counts. Start here when a portfolio question doesn't name a specific portfolio, then pass a portfolioId to get_portfolio_context or get_portfolio_analytics. Requires connecting this server to a Bullrun account (OAuth, read:portfolios scope) — it returns that user's own data only. privacyMode defaults to "full" (includes absolute $ amounts); pass "weights_only" to hide absolute money and return only relative figures (returns %, counts). Read-only.
| Argument | Type | Description |
|---|---|---|
| privacyMode | string | "full" (default) includes absolute $; "weights_only" hides cash/value/cost-basis and keeps only %. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"privacyMode": {
"enum": [
"full",
"weights_only"
],
"type": "string",
"description": "\"full\" (default) includes absolute $; \"weights_only\" hides cash/value/cost-basis and keeps only %."
}
},
"additionalProperties": false
}Read the signed-in user's saved Research Shortlist of stock and ETF listing tickers, with dated stored prices. Requires OAuth read:shortlist. Use after the user asks for their saved research queue. Read-only; does not evaluate a screen, schedule monitoring or send notifications.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Add 1-20 exact Bullrun stock or ETF listing tickers to the signed-in user's Research Shortlist when the user asks to save them. Requires OAuth write:shortlist; reconnect if this scope was not granted. Resolve ambiguous names with search_stocks/search_etfs first. Existing entries are retained; repeated saves are idempotent. Each ticker is saved independently and failures are reported alongside successful saves, so retry only failed tickers. Does not create a portfolio, schedule monitoring or send notifications.
| Argument | Type | Description |
|---|---|---|
| tickers* | array | Exact listing tickers chosen by the user, e.g. AAPL or EUNL.DE. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tickers"
],
"properties": {
"tickers": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9^][A-Za-z0-9.^=_&/-]*$",
"maxLength": 80,
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "Exact listing tickers chosen by the user, e.g. AAPL or EUNL.DE."
}
},
"additionalProperties": false
}Screen the WHOLE ETF universe by numeric rules and fund attributes in one pass — expense ratio, AUM, yield, trailing returns, volatility, liquidity, top-10 concentration, fund age and holdings count — combined with issuer, index, domicile, UCITS status, distribution policy, currency hedging and constituent look-through (holdingSearch finds funds by what they hold). Prefer this over search_etfs for any "cheapest / largest / best performing / most liquid" question: search_etfs only filters a bounded candidate scan, while this evaluates the full universe and reports evaluatedCount and matchCount. Percentages are percentage points. This full-universe screen is an expensive read, and request limits depend on your connection and plan. Build one precise screen to conserve your allowance. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum ETFs to return, 1-100. |
| order | string | Sort direction. Nulls always sort last regardless of direction. |
| rules | array | Numeric rules. A fund with no value for a ruled metric never matches that rule. |
| issuer | string | Substring match on the fund family/issuer, e.g. "iShares", "Amundi", "Vanguard". |
| region | string | Exact investment-region string. |
| search | string | Free-text match on ticker, fund name or ISIN. Omit to screen the whole universe. |
Rank Bullrun's scored stock universe (~9,000 companies) by company risk: the composite risk score or any one mechanism dial (market expectation, operating pressure, cash conversion, leverage, competitive position, concentration), filtered by band, sector, country and dial coverage. Returns ticker, score, band and its meaning, direction and move since the prior reading, and the driving input per row, plus the universe band distribution and how many companies changed band at the last recompute. Use for "which large caps have stretched leverage", "most concentrated supply chains in semiconductors", "calmest German industrials", or "how risky is tech vs utilities" (includeSlices). Drill into a row with get_company_risk. A ranking of readings, not of companies to avoid. Read-only.
| Argument | Type | Description |
|---|---|---|
| bands | array | Keep only these bands, e.g. ["STRETCHED","ACUTE"] for the most strained readings or ["CONTAINED"] for the calmest. |
| limit | integer | |
| offset | integer | |
| sector | string | Exact sector, case-insensitive (e.g. "Technology", "Industrials"). Set includeSlices=true to list the sectors the board covers. |
| sortBy | string | market_cap = largest companies first (default; a pure score sort surfaces micro-caps); score_desc = most strained first; score_asc = calmest first; worsened / improved = biggest move since the prior reading; coverage = most dials lit; name. |
Screen the global Bullrun stock universe with the app rule engine using custom fundamental rules or named presets: profitable value, dividend income, growth and cash flow, cash generators, dividend growth. action=list_presets discloses exact thresholds, units, annual lookback and sorting without any backend request. action=run (default) executes one preset or custom rules; running uses the API's metered screening budget. Custom screens support sector/industry/country, listing controls, annual/quarterly lookback, AND/OR rule groups and money units. Presets are mechanical starting points, not recommendations or famous-investor strategies. Read-only.
| Argument | Type | Description |
|---|---|---|
| mode | string | Deprecated alias for lookbackMode; kept for compatibility. |
| limit | integer | Maximum stocks to return: custom default 25 (1-100), preset default 20 (1-50). |
| order | string | Sort direction. Custom default desc; presets use their disclosed order. Nulls always sort last regardless of direction. |
| rules | array | Fundamental rules. Same groupId means AND; different groupIds mean OR. |
| action | string | list_presets discloses named screens without any backend request; run executes a preset or custom rules and uses the metered screening budget. |
| preset | string | Optional named screen. Presets use disclosed fixed rules/sorting, annual lookback (2-10 years), primary active listings and a default limit of 20 (maximum 50). Omit for custom rules; do not combine with rules or minMarketCap. |
Rank the whole scored stock universe (market cap >= $100M) by Bullrun's proprietary ML models: the stocks trading furthest below (or above) the P/E or price/sales multiple their fundamentals typically command, or the strongest/weakest relative 1-year forecast signals. Filter by sector, country, exchange and financial-history coverage. Each row has the valuation gap or forecast edge, the model-typical vs current P/E, percentile, rank and data quality. Use for "cheapest stocks vs fundamentals in Europe", "most expensive tech names by the model", "best forecast scores in Japan". The valuation gap is descriptive context, not a return prediction; follow up with get_stock_metrics, get_company_risk and get_quality_moat_metrics before drawing conclusions. Read-only.
| Argument | Type | Description |
|---|---|---|
| end | string | top = highest percentile first (valuation: furthest BELOW typical multiple, i.e. cheapest vs fundamentals; forecast: strongest signal). bottom = lowest first (richest vs fundamentals / weakest signal). |
| limit | integer | |
| model | string | valuation = P/E gap on quarterly financials (profitable companies); valuation_ps = price/sales gap (covers loss-makers); valuation_annual_1y = P/E gap on annual financials (broader non-US coverage); forecast / forecast_annual_1y = relative 1-year return-rank signal. |
| sector | string | Exact sector, case-insensitive, e.g. "Technology", "Healthcare", "Financial Services". |
| country | string |
Look up ETFs by name, ticker or ISIN, with classification, listing, index, distribution-policy, AUM, expense-ratio and yield filters. Best for finding a known fund. For ranking questions ("cheapest", "largest", "best performing", "most liquid") prefer screen_etfs, which evaluates the whole universe: here minAum and minYieldTtmPct are applied only to a bounded profile-enriched candidate scan, so do not describe the result as exhaustive when candidateCapReached is true. Use get_etf_snapshot for one listing, get_etf_fund to resolve an ISIN across venues, and get_etf_holdings for constituents. Read-only.
| Argument | Type | Description |
|---|---|---|
| focus | string | Exact ETF focus/exposure filter, e.g. Japan, TOPIX, or Equity - Australia. |
| limit | integer | Maximum matching ETFs to return, 1-100. |
| minAum | number | Minimum assets under management in the profile's reported currency units. |
| region | string | Exact portfolio or investment-region filter. |
| search | string | Free-text ETF search by ticker, fund name, or ISIN (e.g. IE00B4L5Y983). Omit for a broad screen. |
| sortBy | string | Sort field. Relevance preserves Bullrun search ordering. |
| category | string |
Resolve a company name, native ticker, ISIN or exchange-qualified symbol to Bullrun listings before calling exact-ticker research tools. Supports exchange/MIC, country, currency and instrument-type filters. Recognized Yahoo suffixes are checked against compatible stored venues; dots in native share-class tickers are preserved. Returns explicit ambiguous candidates and never picks a listing when alternatives remain. No enrichment or market-data refresh. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum output candidates. A backend scan is capped at 500 candidates per search. |
| query* | string | Company/name phrase, exact native ticker (AAPL, BMW, BRK.B), ISIN, EXCHANGE:TICKER, or Yahoo symbol (BMW.DE, NESN.SW). |
| country | string | Exact stored country name, e.g. Germany or Switzerland. |
| currency | string | Listing quote currency, e.g. USD, CHF or GBX. GBX and GBP are different quote units. |
| exchange | string | Stored exchange code or supported MIC, e.g. XETRA/XETR, NASDAQ/XNAS, SW/XSWX. A conflicting prefix is rejected. |
| quoteType | string | Default stocks, including unclassified equities. ETF/ALL allow other instrument lookup; this does not make stock-only research tools valid for funds. |
Simulate expense-ratio, assumed bid/ask spread, commissions, and recurring contributions over a holding period. Compares the same gross-return path with and without costs and reports direct charges plus ending-value drag. Taxes, FX, market impact and brokerage-specific fees are excluded unless represented by the inputs. Read-only.
| Argument | Type | Description |
|---|---|---|
| years | number | |
| ticker* | string | Exact Bullrun ETF listing ticker. |
| spreadPct | number | Assumed full bid/ask spread in percentage points; each purchase pays half the spread. |
| expenseRatioPct | number | Optional expense-ratio override in percentage points. Otherwise uses the stored ETF profile value. |
| initialInvestment | number | |
| commissionPerTrade | number | |
| contributionAmount | number | |
| grossAnnualReturnPct | number | Assumed annual return before ETF and trading costs, in percentage points. Default 0 isolates direct costs. |
| string |
| Candidate universe: stocks only, ETFs only, or a mix. Default mix unless the prompt says otherwise. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"prompt": {
"type": "string",
"maxLength": 600,
"description": "What kind of portfolio to draft, e.g. \"a defensive dividend portfolio of large EU stocks\". Optional: if you omit it, the server collects a quick style/region/size brief from the user directly (a native form on clients that support elicitation; otherwise it asks you to gather those first)."
},
"maxPositions": {
"type": "integer",
"maximum": 20,
"minimum": 3,
"description": "Maximum number of holdings (3-20, default 10)."
},
"startingCash": {
"type": "number",
"maximum": 100000000,
"minimum": 100,
"description": "Starting cash in USD (default 10000)."
},
"instrumentUniverse": {
"enum": [
"stocks",
"etfs",
"mix"
],
"type": "string",
"description": "Candidate universe: stocks only, ETFs only, or a mix. Default mix unless the prompt says otherwise."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"positions"
],
"properties": {
"name": {
"type": "string",
"maxLength": 72,
"description": "Portfolio name. Default \"Custom Portfolio Draft\"."
},
"cashPct": {
"type": "number",
"maximum": 95,
"minimum": 0,
"description": "Explicit cash percentage to hold back. Overrides the weight-remainder rule."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"required": [
"ticker"
],
"properties": {
"ticker": {
"type": "string",
"description": "Exact Bullrun ticker, used verbatim (never re-picked), e.g. VWCE.DE, SMH, ROG.SW."
},
"weight": {
"type": "number",
"description": "Target weight as a PERCENT (e.g. 46 for 46%). If the weights across positions sum to <=100 the remainder is held as cash; any other sum is normalised to fully invested. Use weight OR amountUsd across the basket, not both.",
"exclusiveMinimum": 0
},
"amountUsd": {
"type": "number",
"description": "Explicit USD amount to allocate to this holding. If ANY position uses amountUsd, sizing is by amount for all.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1,
"description": "The exact holdings to persist (1-30). Tickers are used verbatim, never re-selected."
},
"startingCash": {
"type": "number",
"maximum": 100000000,
"minimum": 100,
"description": "Total portfolio cash in USD. Default 10000 in weight mode; the sum of amounts in amount mode."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 4,
"maximum": 10,
"minimum": 1,
"description": "Maximum peers. compare_stocks supports the subject plus at most four selected peers."
},
"ticker": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Bullrun equity ticker, e.g. AAPL, BMW or 6324.T. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"matchBy": {
"enum": [
"auto",
"industry",
"sector"
],
"type": "string",
"default": "auto",
"description": "auto uses exact stored industry when present, otherwise sector. It does not silently widen an empty industry result to the entire sector."
},
"sameCountryOnly": {
"type": "boolean",
"default": false,
"description": "Restrict to the subject's exact stored country. Otherwise same-country candidates are shown first, followed by other countries."
}
},
"additionalProperties": false
}| limitPerRole |
| integer |
| Max counterparties per role, verified and highest-confidence first. |
| verifiedOnly | boolean | true = only edges confirmed against a primary source (filing, company release). false also returns search-suggested edges, each labelled with its status and confidence. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"roles": {
"type": "array",
"items": {
"enum": [
"competitors",
"suppliers",
"customers",
"partners"
],
"type": "string"
},
"minItems": 1,
"description": "Which relationships to return, from this company's point of view. Default: all four."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Bullrun ticker, e.g. \"AAPL\", \"SAP\", \"ASML\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"evidence": {
"enum": [
"none",
"sources",
"excerpts"
],
"type": "string",
"default": "sources",
"description": "none = counts only; sources = source title/URL/type per edge; excerpts = also the quoted evidence text."
},
"limitPerRole": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Max counterparties per role, verified and highest-confidence first."
},
"verifiedOnly": {
"type": "boolean",
"default": false,
"description": "true = only edges confirmed against a primary source (filing, company release). false also returns search-suggested edges, each labelled with its status and confidence."
}
},
"additionalProperties": false
}| maxEvents | integer | Max recent company events to return, most severe first. |
| maxRiskFactors | integer | Max filing risk factors to return, most severe first. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"detail": {
"enum": [
"summary",
"full"
],
"type": "string",
"default": "summary",
"description": "summary = scores, bands, drivers and explanations; full = also every per-input term behind each category score."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Bullrun ticker, e.g. \"AAPL\", \"ASML\", \"NESN\", \"6324.T\" or \"0700.HK\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"include": {
"type": "array",
"items": {
"enum": [
"dials",
"risk_factors",
"supplier_exposure",
"events",
"headline"
],
"type": "string"
},
"minItems": 1,
"description": "Modules to return. dials = composite + six mechanism dials (market expectation, operating pressure, cash conversion, leverage, competitive position, concentration); risk_factors = filing-derived risk factors (10-K/annual report) with severity and mechanism; supplier_exposure = identified supplier spend concentration; events = recent restructuring/legal/supply/recall events; headline = latest news headline beside the dials. Default: dials, risk_factors, supplier_exposure."
},
"maxEvents": {
"type": "integer",
"default": 10,
"maximum": 40,
"minimum": 1,
"description": "Max recent company events to return, most severe first."
},
"maxRiskFactors": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max filing risk factors to return, most severe first."
}
},
"additionalProperties": false
}| Optional minimum market capitalization in USD. Omit to retain API defaults: 50 million for earnings/ex-dividend and zero for listings. Listings with unknown market cap are retained even with a positive floor. |
| listingMonths | integer | Trailing months for recent listings. A nonblank q makes the backend search 60 months regardless of this value. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"description": "Optional case-insensitive ticker or company-name contains search, also matched with spaces removed. This is not an exact ticker filter. A Yahoo-style symbol whose listing Bullrun stores in another form (BMW.DE as BMW, 7203.T as 7203) is searched under the stored ticker. A nonblank search widens earnings/ex-dividend to 120 days and listings to 60 months. % and _ act as search wildcards."
},
"days": {
"type": "integer",
"default": 14,
"maximum": 120,
"minimum": 1,
"description": "Forward days for earnings and ex-dividend, inclusive of the API server's current date. A nonblank q makes the backend use 120 days regardless of this value."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum rows per selected calendar, not an overall result count. A full page may omit other matching events."
},
"include": {
"type": "array",
"items": {
"enum": [
"earnings",
"ex_dividend",
"listings"
],
"type": "string"
},
"default": [
"earnings",
"ex_dividend",
"listings"
],
"maxItems": 3,
"minItems": 1,
"description": "Selected stored calendars: upcoming earnings, upcoming ex-dividend dates, and recent listings (not an upcoming IPO schedule)."
},
"minCapUsd": {
"type": "number",
"maximum": 1000000000000000,
"minimum": 0,
"description": "Optional minimum market capitalization in USD. Omit to retain API defaults: 50 million for earnings/ex-dividend and zero for listings. Listings with unknown market cap are retained even with a positive floor."
},
"listingMonths": {
"type": "integer",
"default": 12,
"maximum": 60,
"minimum": 1,
"description": "Trailing months for recent listings. A nonblank q makes the backend search 60 months regardless of this value."
}
},
"additionalProperties": false
}| integer |
| Maximum characters per transcript chunk in the MCP response. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"search": {
"type": "string",
"description": "Optional case-insensitive text/speaker search across transcript chunks."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Bullrun ticker, e.g. \"CRWD\", \"SPGI\", \"V\". Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"maxChunks": {
"type": "integer",
"default": 40,
"maximum": 200,
"minimum": 1,
"description": "Maximum speaker-tagged transcript chunks to return."
},
"fiscalYear": {
"type": "integer",
"maximum": 2200,
"minimum": 1900,
"description": "Optional fiscal year filter."
},
"fiscalQuarter": {
"type": "integer",
"maximum": 4,
"minimum": 1,
"description": "Optional fiscal quarter filter."
},
"maxCharsPerChunk": {
"type": "integer",
"default": 1600,
"maximum": 4000,
"minimum": 200,
"description": "Maximum characters per transcript chunk in the MCP response."
}
},
"additionalProperties": false
}| string |
| Optionally keep only accumulating or only distributing share classes. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum funds (or index families) to return, 1-100."
},
"scope": {
"enum": [
"ucits",
"all"
],
"type": "string",
"default": "ucits",
"description": "ucits (default) restricts to domiciles a European retail investor can actually buy. all adds US-domiciled trackers, which look cheaper but are not purchasable by EU retail."
},
"currency": {
"type": "string",
"description": "Keep only funds with a listing trading in this currency (e.g. CHF, EUR, USD, GBP) and name that line."
},
"exchange": {
"type": "string",
"description": "Keep only funds listed on this venue and name each one's ticker there, e.g. SW (SIX Swiss Exchange), XETRA, LSE, AS, MI. A Swiss investor wanting the SIX line passes SW."
},
"indexKey": {
"type": "string",
"description": "Normalized index key, e.g. SP500, MSCI_WORLD, NASDAQ100, MSCI_EM, EURO_STOXX_50, TOPIX, FTSE100. Omit to list every index family that has at least one fund."
},
"distributionPolicy": {
"enum": [
"ACCUMULATING",
"DISTRIBUTING"
],
"type": "string",
"description": "Optionally keep only accumulating or only distributing share classes."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"years": {
"type": "integer",
"default": 10,
"maximum": 15,
"minimum": 1,
"description": "How many fiscal years of history to return, counting backward from the latest fiscal year available."
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "The Bullrun ticker. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"periodType": {
"enum": [
"annual",
"quarterly",
"both"
],
"type": "string",
"default": "both",
"description": "Return annual rows, quarterly rows, or both. Annual rows use fiscalQuarter=0."
},
"includeEmptyRows": {
"type": "boolean",
"default": false,
"description": "Include sparse rows that have no major income statement, balance sheet, cash-flow, or EPS values."
}
},
"additionalProperties": false
}| maxPoints | integer | Upper bound on returned points (auto interval only; an explicit interval is truncated to the most recent maxPoints). |
| instrument | string | Or a market name: an index ("S&P 500", "DAX", "Nikkei 225"), commodity ("Brent", "Gold"), FX pair ("EUR/USD"), central bank ("Fed", "ECB", "BoE"), 10Y yield ("Germany 10Y", "US 10Y"), or headline series ("VIX", "DXY", "2s10s", "global inflation"). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "End date YYYY-MM-DD (inclusive)."
},
"code": {
"type": "string",
"minLength": 1,
"description": "Exact series code from another tool's historyCode field (e.g. \"CNBC_US10Y\", \"BIS_CBPOL_US\", \"UNEMPLOYMENT:Germany\", \"YAHOO_GSPC\")."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date YYYY-MM-DD (inclusive)."
},
"country": {
"type": "string",
"description": "Country for indicator, e.g. \"Japan\"."
},
"interval": {
"enum": [
"auto",
"daily",
"weekly",
"monthly",
"quarterly",
"annual"
],
"type": "string",
"default": "auto",
"description": "Resample to end-of-period values. auto = the finest interval that fits maxPoints."
},
"indicator": {
"enum": [
"gdp_growth",
"gdp_growth_quarterly",
"inflation",
"government_debt",
"unemployment",
"youth_unemployment",
"real_house_prices",
"house_price_to_income",
"house_price_to_rent",
"credit_gap",
"household_debt_service",
"household_credit",
"business_confidence",
"consumer_confidence",
"macro_stress"
],
"type": "string",
"description": "Or a per-country macro indicator, together with country (same keys as get_macro_indicators)."
},
"maxPoints": {
"type": "integer",
"default": 260,
"maximum": 1000,
"minimum": 10,
"description": "Upper bound on returned points (auto interval only; an explicit interval is truncated to the most recent maxPoints)."
},
"instrument": {
"type": "string",
"minLength": 1,
"description": "Or a market name: an index (\"S&P 500\", \"DAX\", \"Nikkei 225\"), commodity (\"Brent\", \"Gold\"), FX pair (\"EUR/USD\"), central bank (\"Fed\", \"ECB\", \"BoE\"), 10Y yield (\"Germany 10Y\", \"US 10Y\"), or headline series (\"VIX\", \"DXY\", \"2s10s\", \"global inflation\")."
}
},
"additionalProperties": false
}| portfolioId* |
| integer |
| The portfolio id, as returned by list_portfolios. |
| privacyMode | string | "full" (default) includes absolute USD amounts; "weights_only" returns only relative figures. |
| candidateTicker | string | Optional exact Bullrun stock or ETF listing ticker to test as a candidate diversifier, e.g. AAPL, BMW, ABBN, NESN or SPY. Use the stored listing ticker; do not infer exchange suffixes. |
| candidateWeightPct | number | Optional hypothetical candidate allocation for pro-forma volatility. Default 5 (%). |
| includeLookThrough | boolean | Also compare an exact stock or ETF candidate against direct holdings and stored ETF constituents. Requires candidateTicker. Default false: no underlying holdings requests. Look-through has separate priced-position coverage from price-history risk analytics. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"portfolioId"
],
"properties": {
"days": {
"type": "integer",
"maximum": 1825,
"minimum": 30,
"description": "Calendar-day lookback for daily USD return analytics. Default 370."
},
"portfolioId": {
"type": "integer",
"description": "The portfolio id, as returned by list_portfolios.",
"exclusiveMinimum": 0
},
"privacyMode": {
"enum": [
"full",
"weights_only"
],
"type": "string",
"description": "\"full\" (default) includes absolute USD amounts; \"weights_only\" returns only relative figures."
},
"candidateTicker": {
"type": "string",
"minLength": 1,
"description": "Optional exact Bullrun stock or ETF listing ticker to test as a candidate diversifier, e.g. AAPL, BMW, ABBN, NESN or SPY. Use the stored listing ticker; do not infer exchange suffixes."
},
"candidateWeightPct": {
"type": "number",
"maximum": 50,
"minimum": 0,
"description": "Optional hypothetical candidate allocation for pro-forma volatility. Default 5 (%)."
},
"includeLookThrough": {
"type": "boolean",
"default": false,
"description": "Also compare an exact stock or ETF candidate against direct holdings and stored ETF constituents. Requires candidateTicker. Default false: no underlying holdings requests. Look-through has separate priced-position coverage from price-history risk analytics."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"portfolioId"
],
"properties": {
"days": {
"type": "integer",
"maximum": 3700,
"minimum": 7,
"description": "Insights look-back window in days (default 30)."
},
"portfolioId": {
"type": "integer",
"description": "The portfolio id, as returned by list_portfolios.",
"exclusiveMinimum": 0
},
"privacyMode": {
"enum": [
"full",
"weights_only"
],
"type": "string",
"description": "\"full\" (default) includes absolute $; \"weights_only\" returns only relative figures."
}
},
"additionalProperties": false
}| rsiPeriod | integer | Number of close-to-close changes for Wilder RSI. MACD uses fixed EMA periods 12/26 and signal 9. |
| startDate | string | Inclusive trade-date cutoff, applied after loading the latest source bars. Cannot page into history older than the source limit. |
| indicators | array | Optional indicators computed on the selected interval's closes after date filtering. Insufficient warm-up yields null, never a fabricated value. |
| movingAveragePeriod | integer | Observation count for SMA and EMA, in the selected interval. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"limit": {
"type": "integer",
"default": 260,
"maximum": 2600,
"minimum": 1,
"description": "Maximum most-recent DAILY source bars to load before date filtering and aggregation (hard cap 2600). Increase for indicator warm-up or longer history."
},
"ticker": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "Bullrun stock ticker, e.g. AAPL, SAP, ABBN, 6324.T or 7203. Bullrun tickers: US and most European listings use the plain local symbol (AAPL, BMW, NESN, ABBN); most Asian and Indian listings keep their exchange suffix (Tokyo 6324.T, Hong Kong 0700.HK, Shanghai 600519.SS, Shenzhen 000001.SZ, Taiwan 2330.TW, Korea 000100.KS, Singapore D05.SI, India RELIANCE.NS), but some Japanese and Korean large caps are plain codes (Toyota 7203, Samsung 005930). Either form is resolved automatically when exactly one listing matches; use search_stocks to find a ticker by company name or ISIN."
},
"endDate": {
"type": "string",
"description": "Inclusive last trade date; the API still loads the most recent source bars before this filter."
},
"interval": {
"enum": [
"daily",
"weekly",
"monthly"
],
"type": "string",
"default": "daily",
"description": "Aggregate stored daily bars. Weekly buckets start Monday; monthly buckets use the calendar month. No intraday or live quotes."
},
"rsiPeriod": {
"type": "integer",
"default": 14,
"maximum": 100,
"minimum": 2,
"description": "Number of close-to-close changes for Wilder RSI. MACD uses fixed EMA periods 12/26 and signal 9."
},
"startDate": {
"type": "string",
"description": "Inclusive trade-date cutoff, applied after loading the latest source bars. Cannot page into history older than the source limit."
},
"indicators": {
"type": "array",
"items": {
"enum": [
"sma",
"ema",
"rsi",
"macd"
],
"type": "string"
},
"default": [],
"maxItems": 4,
"description": "Optional indicators computed on the selected interval's closes after date filtering. Insufficient warm-up yields null, never a fabricated value."
},
"movingAveragePeriod": {
"type": "integer",
"default": 20,
"maximum": 250,
"minimum": 2,
"description": "Observation count for SMA and EMA, in the selected interval."
}
},
"additionalProperties": false
}| sortBy | string | Sort field applied to the returned rows. |
| category | string | Exact category string. Call get_etf_filter_options for the valid values; a wrong guess silently returns zero rows. |
| currency | string | Exact trading currency, e.g. EUR, USD, GBX. |
| domicile | string | Exact fund domicile, e.g. "Ireland", "Luxembourg", "United States". |
| exchange | string | Exact listing exchange, e.g. XETRA, LSE, "NYSE ARCA". |
| indexKey | string | Exact tracked-index key, e.g. SP500, MSCI_WORLD, NASDAQ100. Use get_etf_index_group to compare every fund on one index instead. |
| strategy | string | Exact strategy classification string. |
| assetClass | string | Exact asset-class group: EQUITY, FIXED_INCOME, COMMODITY, REAL_ESTATE, MULTI_ASSET, CASH, CURRENCY, DIGITAL_ASSETS, ALTERNATIVES or OTHER. |
| holdingMode | string | INCLUDES keeps funds holding the constituent. EXCLUDES keeps only funds with a holdings snapshot that confirms absence — funds with no snapshot are dropped, never assumed clean. |
| productType | string | Exact wrapper type, e.g. UCITS_FUND. |
| ucitsStatus | string | UCITS restricts to wrappers a European retail investor can actually buy. |
| holdingSearch | string | Look-through filter: find funds by a CONSTITUENT ticker or company name, e.g. "NVDA" or "NVIDIA". Only funds with a stored holdings snapshot can match. |
| currencyHedged | string | HEDGED selects funds labelled currency-hedged. NOT_LABELLED_HEDGED selects funds not so labelled — absence of a label is not proof a fund is unhedged. |
| benchmarkSearch | string | Substring match on the stated benchmark name. |
| includeSecondary | boolean | Return every venue listing as its own row. Default false: one row per FUND (by fund ISIN), showing its most liquid listing with the others under otherListings. Use exchange/currency to choose the venue, e.g. exchange "SW" for the SIX line. |
| marketDevelopment | string | Exact market-development classification, e.g. developed vs emerging. |
| distributionPolicy | string | Accumulating (reinvests income) or distributing (pays it out) — the usual first cut for a European investor. |
| holdingMinWeightPct | number | Minimum constituent weight in percentage points for holdingSearch to count as a match. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum ETFs to return, 1-100."
},
"order": {
"enum": [
"desc",
"asc"
],
"type": "string",
"default": "desc",
"description": "Sort direction. Nulls always sort last regardless of direction."
},
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"metric"
],
"properties": {
"unit": {
"enum": [
"",
"K",
"M",
"B",
"T"
],
"type": "string",
"default": "",
"description": "Optional money unit for money metrics: '', K, M, B or T."
},
"value": {
"type": [
"string",
"number"
],
"description": "Threshold. For money metrics combine with unit for K/M/B/T scaling."
},
"metric": {
"enum": [
"expenseRatioPct",
"totalAssets",
"yieldTtmPct",
"holdingsCount",
"fundAgeYears",
"inceptionYear",
"nav",
"return1mPct",
"return3mPct",
"return6mPct",
"return1yPct",
"returnYtdPct",
"volatility1yPct",
"avgVolume90d",
"avgTurnover90d",
"top10ConcentrationPct"
],
"type": "string",
"description": "Numeric metric to filter on."
},
"groupId": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Rules with the same groupId are ANDed; different groups are ORed."
},
"operator": {
"enum": [
">=",
"<=",
">",
"<",
"=",
".."
],
"type": "string",
"default": ">=",
"description": "Comparison operator. Use '..' for an inclusive between range with valueMax."
},
"valueMax": {
"type": [
"string",
"number"
],
"description": "Upper bound for '..' range rules. Ignored for other operators."
}
},
"additionalProperties": false
},
"default": [],
"description": "Numeric rules. A fund with no value for a ruled metric never matches that rule."
},
"issuer": {
"type": "string",
"description": "Substring match on the fund family/issuer, e.g. \"iShares\", \"Amundi\", \"Vanguard\"."
},
"region": {
"type": "string",
"description": "Exact investment-region string."
},
"search": {
"type": "string",
"description": "Free-text match on ticker, fund name or ISIN. Omit to screen the whole universe."
},
"sortBy": {
"enum": [
"expenseRatioPct",
"totalAssets",
"yieldTtmPct",
"return1mPct",
"return3mPct",
"return6mPct",
"return1yPct",
"returnYtdPct",
"volatility1yPct",
"avgVolume90d",
"avgTurnover90d",
"top10ConcentrationPct",
"holdingsCount",
"nav",
"ticker",
"name"
],
"type": "string",
"default": "totalAssets",
"description": "Sort field applied to the returned rows."
},
"category": {
"type": "string",
"description": "Exact category string. Call get_etf_filter_options for the valid values; a wrong guess silently returns zero rows."
},
"currency": {
"type": "string",
"description": "Exact trading currency, e.g. EUR, USD, GBX."
},
"domicile": {
"type": "string",
"description": "Exact fund domicile, e.g. \"Ireland\", \"Luxembourg\", \"United States\"."
},
"exchange": {
"type": "string",
"description": "Exact listing exchange, e.g. XETRA, LSE, \"NYSE ARCA\"."
},
"indexKey": {
"type": "string",
"description": "Exact tracked-index key, e.g. SP500, MSCI_WORLD, NASDAQ100. Use get_etf_index_group to compare every fund on one index instead."
},
"strategy": {
"type": "string",
"description": "Exact strategy classification string."
},
"assetClass": {
"type": "string",
"description": "Exact asset-class group: EQUITY, FIXED_INCOME, COMMODITY, REAL_ESTATE, MULTI_ASSET, CASH, CURRENCY, DIGITAL_ASSETS, ALTERNATIVES or OTHER."
},
"holdingMode": {
"enum": [
"INCLUDES",
"EXCLUDES"
],
"type": "string",
"default": "INCLUDES",
"description": "INCLUDES keeps funds holding the constituent. EXCLUDES keeps only funds with a holdings snapshot that confirms absence — funds with no snapshot are dropped, never assumed clean."
},
"productType": {
"type": "string",
"description": "Exact wrapper type, e.g. UCITS_FUND."
},
"ucitsStatus": {
"enum": [
"UCITS",
"NON_UCITS"
],
"type": "string",
"description": "UCITS restricts to wrappers a European retail investor can actually buy."
},
"holdingSearch": {
"type": "string",
"description": "Look-through filter: find funds by a CONSTITUENT ticker or company name, e.g. \"NVDA\" or \"NVIDIA\". Only funds with a stored holdings snapshot can match."
},
"currencyHedged": {
"enum": [
"HEDGED",
"NOT_LABELLED_HEDGED"
],
"type": "string",
"description": "HEDGED selects funds labelled currency-hedged. NOT_LABELLED_HEDGED selects funds not so labelled — absence of a label is not proof a fund is unhedged."
},
"benchmarkSearch": {
"type": "string",
"description": "Substring match on the stated benchmark name."
},
"includeSecondary": {
"type": "boolean",
"default": false,
"description": "Return every venue listing as its own row. Default false: one row per FUND (by fund ISIN), showing its most liquid listing with the others under otherListings. Use exchange/currency to choose the venue, e.g. exchange \"SW\" for the SIX line."
},
"marketDevelopment": {
"type": "string",
"description": "Exact market-development classification, e.g. developed vs emerging."
},
"distributionPolicy": {
"enum": [
"ACCUMULATING",
"DISTRIBUTING"
],
"type": "string",
"description": "Accumulating (reinvests income) or distributing (pays it out) — the usual first cut for a European investor."
},
"holdingMinWeightPct": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Minimum constituent weight in percentage points for holdingSearch to count as a match."
}
},
"additionalProperties": false
}| country |
| string |
| Exact country, case-insensitive (e.g. "United States", "Germany"). |
| mechanism | string | Rank by the composite (OVERALL) or by one mechanism dial: MARKET (drawdown, volatility, liquidity), OPERATING (margin/cost pressure), CASH_CONVERSION (cash vs earnings, capex), LEVERAGE (debt, interest cover, liquidity; CET1 for banks), COMPETITIVE (R&D, margins vs peers, technology transition), CONCENTRATION (supplier, customer, geographic). |
| minDialsLit | integer | Coverage floor: only companies with at least this many of the six dials measured. 4+ avoids thinly-measured composites. |
| includeSlices | boolean | Also return mean composite risk by sector and by country across the scored universe. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"bands": {
"type": "array",
"items": {
"enum": [
"CONTAINED",
"NORMAL",
"ELEVATED",
"STRETCHED",
"ACUTE"
],
"type": "string"
},
"description": "Keep only these bands, e.g. [\"STRETCHED\",\"ACUTE\"] for the most strained readings or [\"CONTAINED\"] for the calmest."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 20000,
"minimum": 0
},
"sector": {
"type": "string",
"description": "Exact sector, case-insensitive (e.g. \"Technology\", \"Industrials\"). Set includeSlices=true to list the sectors the board covers."
},
"sortBy": {
"enum": [
"market_cap",
"score_desc",
"score_asc",
"worsened",
"improved",
"coverage",
"name"
],
"type": "string",
"default": "market_cap",
"description": "market_cap = largest companies first (default; a pure score sort surfaces micro-caps); score_desc = most strained first; score_asc = calmest first; worsened / improved = biggest move since the prior reading; coverage = most dials lit; name."
},
"country": {
"type": "string",
"description": "Exact country, case-insensitive (e.g. \"United States\", \"Germany\")."
},
"mechanism": {
"enum": [
"OVERALL",
"MARKET",
"OPERATING",
"CASH_CONVERSION",
"LEVERAGE",
"COMPETITIVE",
"CONCENTRATION"
],
"type": "string",
"default": "OVERALL",
"description": "Rank by the composite (OVERALL) or by one mechanism dial: MARKET (drawdown, volatility, liquidity), OPERATING (margin/cost pressure), CASH_CONVERSION (cash vs earnings, capex), LEVERAGE (debt, interest cover, liquidity; CET1 for banks), COMPETITIVE (R&D, margins vs peers, technology transition), CONCENTRATION (supplier, customer, geographic)."
},
"minDialsLit": {
"type": "integer",
"default": 0,
"maximum": 6,
"minimum": 0,
"description": "Coverage floor: only companies with at least this many of the six dials measured. 4+ avoids thinly-measured composites."
},
"includeSlices": {
"type": "boolean",
"default": false,
"description": "Also return mean composite risk by sector and by country across the scored universe."
}
},
"additionalProperties": false
}| sector | string | Exact sector name to filter by, e.g. "Technology", "Healthcare". Omit for all sectors. |
| sortBy | string | Metric to sort by. Custom default marketCap; presets use their disclosed sorting. revenueGrowth is accepted as an alias for revenueGrowthPct. |
| country | string | Exact country name to filter by, e.g. "United States", "Germany". Omit for all countries. |
| periods | integer | Deprecated alias for lookback; kept for compatibility. |
| industry | string | Exact industry name to filter by, e.g. "Software - Infrastructure". Omit for all industries. |
| lookback | integer | How many reporting periods to evaluate (default 3). Growth rules need at least 2 comparable periods; presets require 2-10 annual observations. |
| countries | array | Exact country names to include. Use this for multi-country screens; it overrides country when provided. |
| lookbackMode | string | Whether rule evaluation uses annual or quarterly reporting periods. Default annual; presets require annual. |
| minMarketCap | number | Compatibility shortcut: adds marketCap >= this absolute value to every rule group. |
| includeInactive | boolean | Include delisted/inactive tickers with no recent price bar. Default false. |
| includeSecondary | boolean | Include secondary cross-listings of the same security. Default false (primary listings only). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"mode": {
"enum": [
"annual",
"quarterly"
],
"type": "string",
"description": "Deprecated alias for lookbackMode; kept for compatibility."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum stocks to return: custom default 25 (1-100), preset default 20 (1-50)."
},
"order": {
"enum": [
"desc",
"asc"
],
"type": "string",
"description": "Sort direction. Custom default desc; presets use their disclosed order. Nulls always sort last regardless of direction."
},
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"metric"
],
"properties": {
"unit": {
"enum": [
"",
"K",
"M",
"B",
"T"
],
"type": "string",
"default": "",
"description": "Optional money unit for money metrics: '', K, M, B or T."
},
"value": {
"type": [
"string",
"number"
],
"description": "Threshold value. For money metrics, combine with unit for K/M/B/T scaling."
},
"metric": {
"enum": [
"revenueGrowthPct",
"netIncomeGrowthPct",
"grossProfitGrowthPct",
"operatingIncomeGrowthPct",
"ebitdaGrowthPct",
"freeCashflowGrowthPct",
"epsGrowthPct",
"operatingCashflowGrowthPct",
"dividendGrowthPct",
"latestRevenue",
"latestNetIncome",
"latestGrossProfit",
"latestOperatingIncome",
"latestEbitda",
"latestDilutedEps",
"latestDividendsPerShare",
"latestFreeCashflow",
"latestOperatingCashflow",
"latestCash",
"latestTotalAssets",
"latestTotalDebt",
"latestStockholdersEquity",
"marketCap",
"peRatio",
"dividendYield"
],
"type": "string",
"description": "Metric to filter on."
},
"groupId": {
"type": "integer",
"default": 1,
"minimum": 1,
"description": "Rules with the same groupId are ANDed; different groups are ORed."
},
"operator": {
"enum": [
">=",
"<=",
">",
"<",
"=",
".."
],
"type": "string",
"default": ">=",
"description": "Comparison operator. Use '..' for an inclusive between range."
},
"valueMax": {
"type": [
"string",
"number"
],
"description": "Upper bound for '..' range rules. Ignored for other operators."
}
},
"additionalProperties": false
},
"description": "Fundamental rules. Same groupId means AND; different groupIds mean OR."
},
"action": {
"enum": [
"list_presets",
"run"
],
"type": "string",
"default": "run",
"description": "list_presets discloses named screens without any backend request; run executes a preset or custom rules and uses the metered screening budget."
},
"preset": {
"enum": [
"profitable_value",
"dividend_income",
"growth_and_cashflow",
"cash_generators",
"dividend_growth"
],
"type": "string",
"description": "Optional named screen. Presets use disclosed fixed rules/sorting, annual lookback (2-10 years), primary active listings and a default limit of 20 (maximum 50). Omit for custom rules; do not combine with rules or minMarketCap."
},
"sector": {
"type": "string",
"description": "Exact sector name to filter by, e.g. \"Technology\", \"Healthcare\". Omit for all sectors."
},
"sortBy": {
"enum": [
"revenueGrowthPct",
"netIncomeGrowthPct",
"grossProfitGrowthPct",
"operatingIncomeGrowthPct",
"ebitdaGrowthPct",
"freeCashflowGrowthPct",
"epsGrowthPct",
"operatingCashflowGrowthPct",
"dividendGrowthPct",
"latestRevenue",
"latestNetIncome",
"latestGrossProfit",
"latestOperatingIncome",
"latestEbitda",
"latestDilutedEps",
"latestDividendsPerShare",
"latestFreeCashflow",
"latestOperatingCashflow",
"latestCash",
"latestTotalAssets",
"latestTotalDebt",
"latestStockholdersEquity",
"marketCap",
"peRatio",
"dividendYield",
"revenueGrowth"
],
"type": "string",
"description": "Metric to sort by. Custom default marketCap; presets use their disclosed sorting. revenueGrowth is accepted as an alias for revenueGrowthPct."
},
"country": {
"type": "string",
"description": "Exact country name to filter by, e.g. \"United States\", \"Germany\". Omit for all countries."
},
"periods": {
"type": "integer",
"maximum": 40,
"minimum": 1,
"description": "Deprecated alias for lookback; kept for compatibility."
},
"industry": {
"type": "string",
"description": "Exact industry name to filter by, e.g. \"Software - Infrastructure\". Omit for all industries."
},
"lookback": {
"type": "integer",
"maximum": 40,
"minimum": 1,
"description": "How many reporting periods to evaluate (default 3). Growth rules need at least 2 comparable periods; presets require 2-10 annual observations."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact country names to include. Use this for multi-country screens; it overrides country when provided."
},
"lookbackMode": {
"enum": [
"annual",
"quarterly"
],
"type": "string",
"description": "Whether rule evaluation uses annual or quarterly reporting periods. Default annual; presets require annual."
},
"minMarketCap": {
"type": "number",
"minimum": 0,
"description": "Compatibility shortcut: adds marketCap >= this absolute value to every rule group."
},
"includeInactive": {
"type": "boolean",
"default": false,
"description": "Include delisted/inactive tickers with no recent price bar. Default false."
},
"includeSecondary": {
"type": "boolean",
"default": false,
"description": "Include secondary cross-listings of the same security. Default false (primary listings only)."
}
},
"additionalProperties": false
}| Exact country, case-insensitive, e.g. "United States", "Germany", "Japan". |
| coverage | string | full = only stocks whose model window (8 quarters / 4 years) is fully populated; limited = the rest. |
| exchange | string | Exact exchange code, case-insensitive, e.g. "NASDAQ", "XETRA", "LSE". |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"end": {
"enum": [
"top",
"bottom"
],
"type": "string",
"default": "top",
"description": "top = highest percentile first (valuation: furthest BELOW typical multiple, i.e. cheapest vs fundamentals; forecast: strongest signal). bottom = lowest first (richest vs fundamentals / weakest signal)."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"model": {
"enum": [
"valuation",
"valuation_ps",
"valuation_annual_1y",
"forecast",
"forecast_annual_1y"
],
"type": "string",
"default": "valuation",
"description": "valuation = P/E gap on quarterly financials (profitable companies); valuation_ps = price/sales gap (covers loss-makers); valuation_annual_1y = P/E gap on annual financials (broader non-US coverage); forecast / forecast_annual_1y = relative 1-year return-rank signal."
},
"sector": {
"type": "string",
"description": "Exact sector, case-insensitive, e.g. \"Technology\", \"Healthcare\", \"Financial Services\"."
},
"country": {
"type": "string",
"description": "Exact country, case-insensitive, e.g. \"United States\", \"Germany\", \"Japan\"."
},
"coverage": {
"enum": [
"all",
"full",
"limited"
],
"type": "string",
"default": "all",
"description": "full = only stocks whose model window (8 quarters / 4 years) is fully populated; limited = the rest."
},
"exchange": {
"type": "string",
"description": "Exact exchange code, case-insensitive, e.g. \"NASDAQ\", \"XETRA\", \"LSE\"."
}
},
"additionalProperties": false
}| Exact broad ETF category/asset-class filter, e.g. Equity, Fixed Income, Commodity, Crypto, or Real Estate. Call get_etf_filter_options for valid values. |
| currency | string | Exact trading-currency filter. |
| domicile | string | Exact fund domicile filter. |
| exchange | string | Exact listing exchange filter. |
| indexKey | string | Exact tracked-index key, e.g. SP500 or MSCI_WORLD. Use get_etf_index_group to rank every fund on one index by cost. |
| scanLimit | integer | Maximum coarse-search candidates to enrich before applying quantitative filters/sorts, 25-500. |
| sortDirection | string |
| minYieldTtmPct | number | Minimum trailing yield in percentage points, e.g. 2 means 2%. |
| includeInactive | boolean |
| includeSecondary | boolean |
| distributionPolicy | string | Accumulating (reinvests income) or distributing (pays it out). |
| maxExpenseRatioPct | number | Maximum annual expense ratio in percentage points, e.g. 0.25 means 0.25%. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"focus": {
"type": "string",
"description": "Exact ETF focus/exposure filter, e.g. Japan, TOPIX, or Equity - Australia."
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Maximum matching ETFs to return, 1-100."
},
"minAum": {
"type": "number",
"minimum": 0,
"description": "Minimum assets under management in the profile's reported currency units."
},
"region": {
"type": "string",
"description": "Exact portfolio or investment-region filter."
},
"search": {
"type": "string",
"description": "Free-text ETF search by ticker, fund name, or ISIN (e.g. IE00B4L5Y983). Omit for a broad screen."
},
"sortBy": {
"enum": [
"relevance",
"ticker",
"name",
"aum",
"expense_ratio",
"yield"
],
"type": "string",
"default": "relevance",
"description": "Sort field. Relevance preserves Bullrun search ordering."
},
"category": {
"type": "string",
"description": "Exact broad ETF category/asset-class filter, e.g. Equity, Fixed Income, Commodity, Crypto, or Real Estate. Call get_etf_filter_options for valid values."
},
"currency": {
"type": "string",
"description": "Exact trading-currency filter."
},
"domicile": {
"type": "string",
"description": "Exact fund domicile filter."
},
"exchange": {
"type": "string",
"description": "Exact listing exchange filter."
},
"indexKey": {
"type": "string",
"description": "Exact tracked-index key, e.g. SP500 or MSCI_WORLD. Use get_etf_index_group to rank every fund on one index by cost."
},
"scanLimit": {
"type": "integer",
"default": 100,
"maximum": 500,
"minimum": 25,
"description": "Maximum coarse-search candidates to enrich before applying quantitative filters/sorts, 25-500."
},
"sortDirection": {
"enum": [
"asc",
"desc"
],
"type": "string",
"default": "desc"
},
"minYieldTtmPct": {
"type": "number",
"minimum": 0,
"description": "Minimum trailing yield in percentage points, e.g. 2 means 2%."
},
"includeInactive": {
"type": "boolean",
"default": false
},
"includeSecondary": {
"type": "boolean",
"default": false
},
"distributionPolicy": {
"enum": [
"ACCUMULATING",
"DISTRIBUTING"
],
"type": "string",
"description": "Accumulating (reinvests income) or distributing (pays it out)."
},
"maxExpenseRatioPct": {
"type": "number",
"minimum": 0,
"description": "Maximum annual expense ratio in percentage points, e.g. 0.25 means 0.25%."
}
},
"additionalProperties": false
}| includeInactive |
| boolean |
| Include inactive/retired listings. Returned lifecycle/successor fields must be checked. |
| includeSecondary | boolean | Include alternative venue listings. ISIN/name matches across venues require an explicit listing choice. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum output candidates. A backend scan is capped at 500 candidates per search."
},
"query": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Company/name phrase, exact native ticker (AAPL, BMW, BRK.B), ISIN, EXCHANGE:TICKER, or Yahoo symbol (BMW.DE, NESN.SW)."
},
"country": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Exact stored country name, e.g. Germany or Switzerland."
},
"currency": {
"type": "string",
"maxLength": 12,
"minLength": 1,
"description": "Listing quote currency, e.g. USD, CHF or GBX. GBX and GBP are different quote units."
},
"exchange": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Stored exchange code or supported MIC, e.g. XETRA/XETR, NASDAQ/XNAS, SW/XSWX. A conflicting prefix is rejected."
},
"quoteType": {
"enum": [
"EQUITY",
"ETF",
"ALL"
],
"type": "string",
"default": "EQUITY",
"description": "Default stocks, including unclassified equities. ETF/ALL allow other instrument lookup; this does not make stock-only research tools valid for funds."
},
"includeInactive": {
"type": "boolean",
"default": false,
"description": "Include inactive/retired listings. Returned lifecycle/successor fields must be checked."
},
"includeSecondary": {
"type": "boolean",
"default": true,
"description": "Include alternative venue listings. ISIN/name matches across venues require an explicit listing choice."
}
},
"additionalProperties": false
}| contributionFrequency | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ticker"
],
"properties": {
"years": {
"type": "number",
"default": 10,
"maximum": 50,
"minimum": 0.25
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Exact Bullrun ETF listing ticker."
},
"spreadPct": {
"type": "number",
"default": 0,
"maximum": 20,
"minimum": 0,
"description": "Assumed full bid/ask spread in percentage points; each purchase pays half the spread."
},
"expenseRatioPct": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Optional expense-ratio override in percentage points. Otherwise uses the stored ETF profile value."
},
"initialInvestment": {
"type": "number",
"default": 10000,
"minimum": 0
},
"commissionPerTrade": {
"type": "number",
"default": 0,
"minimum": 0
},
"contributionAmount": {
"type": "number",
"default": 0,
"minimum": 0
},
"grossAnnualReturnPct": {
"type": "number",
"default": 0,
"maximum": 100,
"minimum": -99,
"description": "Assumed annual return before ETF and trading costs, in percentage points. Default 0 isolates direct costs."
},
"contributionFrequency": {
"enum": [
"none",
"monthly",
"quarterly",
"annual"
],
"type": "string",
"default": "monthly"
}
},
"additionalProperties": false
}