# Ticker Research — Finradar API
> Version: 3.61.0 | Generated: 2026-06-20 | Content Hash: dab7c657
> Fetch this file at: https://uat.finradarapi.com/llms/ticker-research.txt
## Authentication
All endpoints require an API key. Pass it via query parameter `?apiKey=YOUR_KEY` or header `X-API-Key: YOUR_KEY`. WebSocket endpoints accept the key in the `token` auth payload or query parameter.
---
## Ticker Research
Per-ticker endpoints for company overview, institutional ownership, and historical fund trends.
### GET /api/v1/tickers/{ticker}/overview
Company overview and financial data for a ticker. Includes sector, industry, market cap, income statement (TTM), balance sheet, cash flow, margins, and per-share data. Data sourced from Yahoo Finance via yahooquery and cached 24h.
**Token cost:** 5 tokens per call
**Response fields:**
- `data.ticker` (string): Issuer ticker (canonical hyphen form, echoed back).
- `data.name` (string): Company name from Yahoo Finance (typically Title Case — `Apple Inc.`).
- `data.sector` (string (nullable)): Yahoo Finance sector classification (e.g. `Technology`, `Healthcare`, `Financial Services`). Null for unmapped tickers (recent IPOs, foreign issuers).
- `data.industry` (string (nullable)): Yahoo Finance industry classification (more specific than sector). Null for unmapped tickers.
- `data.market_cap` (number (nullable)): Market capitalization (USD). Computed as `last_close × shares_outstanding`. Use for size-based universe filters. Updates daily via Yahoo Finance refresh + 24h cache.
- `data.enterprise_value` (number (nullable)): Enterprise value (USD). `market_cap + total_debt - total_cash`. Combine with EBITDA from this surface for EV/EBITDA multiple.
- `data.float_shares` (number (nullable)): Public float (shares freely tradable). Useful for liquidity-aware position sizing — small-caps with float < 50M shares typically have wide bid-ask spreads.
- `data.shares_outstanding` (number (nullable)): Total shares outstanding (point-in-time). Differs from `/financials/metrics` weighted-average value when issuer is actively buying back / issuing.
- `data.first_trade_date` (string (nullable)): Human-readable first-trade date (e.g. `Dec 12, 1980`). Useful for filtering recent IPOs (within last 1 year). Null for very old tickers without recorded IPO date.
- `data.short_pct_float` (number (nullable)): Short interest as fraction of float (decimal — `0.0072` = 0.72%). Updated bi-monthly per NYSE/NASDAQ publication cadence; may lag 2-3 weeks. Above 0.20 flags potential-squeeze names.
- `data.short_ratio` (number (nullable)): Days-to-cover ratio: `short_interest / avg_daily_volume`. Above 5 days flags squeeze risk.
- `data.revenue` (number (nullable)): TTM revenue (USD). Sourced from Yahoo Finance — typically agrees with [/financials/metrics](/docs/company-data/company-financials-xbrl/get-financials-metrics) TTM revenue within ±2% (Yahoo derives from same SEC XBRL filings + applies its own normalization). For audit-grade XBRL-direct numbers prefer `/financials/snapshot`.
- `data.gross_profit` (number (nullable)): TTM gross profit (USD). Null for non-COGS business models (banks, insurers — interpret as 'not applicable to issuer's structure').
- `data.operating_income` (number (nullable)): TTM operating income / EBIT (USD). Negative for operating-loss companies.
- `data.net_income` (number (nullable)): TTM net income attributable to common stockholders (USD). Negative for loss-makers.
- `data.total_cash` (number (nullable)): Cash and short-term investments (USD). Point-in-time at most-recent fiscal-period end.
- `data.total_debt` (number (nullable)): Total debt (short + long term) (USD). Combine with `total_cash` for net-debt computation.
- `data.profit_margin` (number (nullable)): TTM net margin (decimal — `0.270` = 27.0%). `net_income / revenue`. Negative for loss-makers.
- `data.gross_margin` (number (nullable)): TTM gross margin (decimal). `gross_profit / revenue`.
- `data.operating_margin` (number (nullable)): TTM operating margin (decimal). `operating_income / revenue`.
- `data.ebitda_margin` (number (nullable)): TTM EBITDA margin (decimal). `ebitda / revenue`. Useful for capital-intensity / scale-quality screens.
- `data.eps_diluted_ttm` (number (nullable)): TTM diluted EPS (USD per share). NOT split-adjusted server-side — reflects as-filed EPS for the trailing 4 quarters; for split-adjusted historical view use external market-data sources.
- `data.book_value_per_share` (number (nullable)): Book value per share (USD). `total_equity / shares_outstanding`. Negative for issuers with negative book equity (MMM, MCD, SBUX, etc. with aggressive buybacks).
- `data.free_cash_flow_per_share` (number (nullable)): TTM Free Cash Flow per share (USD). `(operating_cash_flow + capex) / shares_outstanding`. Negative for FCF-burning companies.
- `data.dividend_yield` (number (nullable)): Forward dividend yield (decimal — `0.0038` = 0.38%). Computed as `last_4q_dividends_per_share / last_close`. Null for non-dividend-paying issuers (most growth tech, biotech, recent IPOs).
**Since:** v1.0.0
**Parameters:**
- `ticker` (path, required): Ticker symbol (canonical hyphen form). Server normalizes `BRK.A`/`BRK/A`/`BRKA` → `BRK-A`. Multi-class issuers (GOOGL vs GOOG) preserve the requested class. Returns 404 on tickers with no Yahoo Finance coverage; cached 24h server-side.
**Sample response:**
```json
{
"data": {
"ticker": "AAPL",
"name": "Apple Inc.",
"sector": "Technology",
"industry": "Consumer Electronics",
"market_cap": 3984500000000,
"enterprise_value": 4058044000000,
"float_shares": 14820000000,
"shares_outstanding": 14840000000,
"first_trade_date": "Dec 12, 1980",
"short_pct_float": 0.0072,
"short_ratio": 1.38,
"revenue": 401450000000,
"gross_profit": 189890000000,
"operating_income": 128190000000,
"net_income": 105320000000,
"total_cash": 28160000000,
"total_debt": 101700000000,
"profit_margin": 0.27,
"gross_margin": 0.473,
"operating_margin": 0.319,
"ebitda_margin": 0.345,
"eps_diluted_ttm": 7.1,
"book_value_per_share": 3.84,
"free_cash_flow_per_share": 7.13,
"dividend_yield": 0.0038
}
}
```
### GET /api/v1/tickers/{ticker}/holders
Top institutional holders across ALL 9,600+ 13F filers with quarter-over-quarter change. Queries form_13f_holdings directly (not just tracked funds). CUSIP successor chain expansion and amendment deduplication included. Returns status (New/Increased/Decreased/Unchanged/Closed) and change % vs previous quarter.
**Token cost:** 5 tokens per call
**Response fields:**
- `data.ticker` (string): Ticker echoed back in canonical hyphen form.
- `data.period` (string): ISO `YYYY-MM-DD` quarter-end date for the snapshot. Always 03-31 / 06-30 / 09-30 / 12-31. The 13F filing for this period was due 45 days later. Most-recent quarter may be partially populated during the 45-day filing window — see `/form-13f/filing-progress` for completeness gauge.
- `data.prev_period` (string (nullable)): ISO `YYYY-MM-DD` quarter-end of the prior quarter (used as the baseline for QoQ `chg_*` and `status` fields). Null when `period` is the earliest covered quarter.
- `data.holders[]` (array): Array of holder rows, sorted by `value DESC` (largest position first). Up to `limit` rows; total set has `total_count` rows. Empty array for tickers no fund has ever held (most pre-IPO and very-thinly-held names).
- `data.holders[].cik` (string): Filer CIK in 10-char zero-padded form (e.g. `0001067983` for Berkshire Hathaway, `0001364742` for BlackRock, `0000884144` for Vanguard, `0001037389` for Renaissance Technologies). Use as join key against `/api/v1/form-13f/fund/{cik}` for the per-fund detail view.
- `data.holders[].name` (string): Filer name as registered with SEC EDGAR (typically all-caps EDGAR convention). Use for human-readable holder labels.
- `data.holders[].shares` (number): Share count for the position as of `period`. NOT split-adjusted server-side (preserves the as-filed view) — for split-adjusted historical aggregations use [GET /api/v1/tickers/{ticker}/fund-trends](/docs/company-data/ticker-research/get-tickers-ticker-fund-trends).
- `data.holders[].value` (number): Position value (USD) at the period-end mark-to-market price. Post-Plan-51 holdings-quality value normalization (handles the pre-Q3-2022 thousands-vs-actual-dollars SEC reporting issue) — for historical filings the parser auto-detected and corrected the unit on a per-filing basis. Always presented in actual USD here.
- `data.holders[].pct_of_portfolio` (number (nullable)): Position weight in the holder's total portfolio (decimal — `0.255` = 25.5%). Useful for ranking holders by conviction (a fund with 25% portfolio weight has higher relative conviction than one with 0.5%). Null for filers without a complete portfolio for the quarter (rare).
- `data.holders[].chg_shares` (number (nullable)): QoQ share-count change vs `prev_period` (signed integer). Positive = added; negative = trimmed. Null when prior-quarter baseline is missing (new positions show null, not zero — disambiguates 'new buy' from 'held flat at zero').
- `data.holders[].chg_pct` (number (nullable)): QoQ percent change in shares (decimal — `-0.250` = -25%). Null for new positions (no prior baseline to divide by). For mass-comparison use `status` instead — handles the null-case cleanly.
- `data.holders[].status` (string): QoQ status classification: `New` (no position in `prev_period`), `Increased` (added shares), `Decreased` (trimmed shares), `Unchanged` (held flat), `Closed` (had position in `prev_period`, zero in `period`). Use for status-filtered holder tables and smart-money-momentum dashboards.
- `data.holders[].accession_number` (string (nullable)): SEC accession number for the 13F filing this row was extracted from (18-char dashed format like `0000950123-25-009876`). Useful for audit-trail UIs and EDGAR-link generation. Null for amendment-superseded rows where only the amendment's accession is preserved.
- `data.holders[].filed_at` (string): ISO `YYYY-MM-DD` date the 13F was filed with SEC EDGAR. Always within 45 days of `period`.
- `data.total_shares` (number): Aggregate institutional share count across ALL holders (not just the paginated subset). NOT split-adjusted — for split-adjusted historical totals use `/tickers/{ticker}/fund-trends`.
- `data.total_value` (number): Aggregate institutional position USD value across all holders. Post-Plan-51 normalized.
- `data.total_holders` (integer): Distinct holder CIK count for the ticker in `period`. Mega-caps (AAPL, MSFT) typically 4000-5000; small-caps 50-300; micro-caps 1-30.
- `data.total_count` (integer): Total holder rows matching the `status` filter (= `total_holders` when `status=all`). Use for pagination math.
- `data.offset` (integer): Echoed-back pagination offset.
- `data.limit` (integer): Echoed-back page-size limit.
**Since:** v1.0.0
**Parameters:**
- `ticker` (path, required): Ticker symbol (canonical hyphen form). Server normalizes case + dot/slash variants. Multi-class issuers preserve the requested class. CUSIP successor chain is automatically expanded — for Alphabet (`GOOGL` / `GOOG`) returns positions across pre/post-2014-share-class-restructuring CUSIPs.
- `limit` (query, optional, default: 100): Max funds per page (default 100, max 500). For typical UI tables 20-50; for full-list export 500 + paginated walks.
- `offset` (query, optional, default: 0): Skip first N results for pagination (default 0). Use with `limit` to page through all holders. For tickers with 4000+ holders (mega-caps), 80+ paginated calls would be needed for full enumeration; use `POST /api/v1/form-13f/holdings` for bulk-export workflows.
- `status` (query, optional, default: all): Filter by QoQ status: `all` (default), `new` (just-opened positions), `increased` (added shares), `decreased` (trimmed shares), `unchanged` (held flat), `closed` (just-exited positions). For smart-money-momentum dashboards use `new` + `increased`; for distribution dashboards use `decreased` + `closed`.
- `period` (query, optional): Specific report period (ISO `YYYY-MM-DD` quarter-end format like `2025-09-30`). Defaults to latest available period (typically the quarter ending 45-90 days ago given the SEC 45-day filing deadline + ETL lag).
- `quarters` (query, optional, default: 1): Number of quarters to return (default 1, max 20). When `>1`, response includes a `quarters[]` array with per-quarter holders and QoQ changes — useful for trend charts. When `1`, response is the flat single-period view shown in the sample.
**Sample response:**
```json
{
"data": {
"ticker": "AAPL",
"period": "2025-09-30",
"prev_period": "2025-06-30",
"holders": [
{
"cik": "0001067983",
"name": "BERKSHIRE HATHAWAY INC",
"shares": 300000000,
"value": 78240000000,
"pct_of_portfolio": 0.255,
"chg_shares": -100000000,
"chg_pct": -0.25,
"status": "Decreased",
"accession_number": "0000950123-25-009876",
"filed_at": "2025-11-13"
},
{
"cik": "0001364742",
"name": "BLACKROCK INC",
"shares": 1100000000,
"value": 286900000000,
"pct_of_portfolio": 0.061,
"chg_shares": 12000000,
"chg_pct": 0.011,
"status": "Increased",
"accession_number": "0001086364-25-014321",
"filed_at": "2025-11-12"
},
{
"cik": "0000884144",
"name": "VANGUARD GROUP INC",
"shares": 1380000000,
"value": 359980000000,
"pct_of_portfolio": 0.058,
"chg_shares": 8500000,
"chg_pct": 0.006,
"status": "Increased",
"accession_number": "0000884144-25-006543",
"filed_at": "2025-11-14"
}
],
"total_shares": 8920000000,
"total_value": 2326200000000,
"total_holders": 4775,
"total_count": 4775,
"offset": 0,
"limit": 100
}
}
```
### GET /api/v1/tickers/{ticker}/fund-trends
Historical quarterly fund ownership trends aggregated from ALL 9,600+ 13F filers (form_13f_holdings). CUSIP successor chain expansion and amendment deduplication included. Split-adjusted share counts. Returns per-quarter totals for shares, value, fund count, and computed deltas (fund flow, share change %).
**Token cost:** 10 tokens per call
**Response fields:**
- `ticker` (string): Ticker echoed back in canonical hyphen form (e.g. `BRK-A`). Useful for asserting your client passed the ticker you intended after server-side normalization.
- `trends` (array): Array of quarterly aggregate rows, sorted by `period ASC` (oldest first — chart-friendly ordering). One row per quarter where ANY 13F filer held the ticker. Empty array for tickers no fund has ever held (most pre-IPO and very-thinly-held names).
- `trends[].period` (string): ISO `YYYY-MM-DD` quarter-end date (always 03-31 / 06-30 / 09-30 / 12-31). The 13F filing for this period was due 45 days later. Most-recent quarter may be partially populated during the 45-day filing window — see `/form-13f/filing-progress` for completeness gauge.
- `trends[].fund_count` (integer): Number of distinct 13F filers holding the ticker as of `period`. Counts unique CIKs (one per fund family) — Fidelity, Vanguard, BlackRock are 1 each despite running thousands of underlying funds. Mega-cap names typically have 3000-5000 filers; small-caps 50-300; micro-caps 1-30.
- `trends[].total_shares` (number): Aggregate share count across all funds holding the ticker, SPLIT-ADJUSTED to most recent split via Sharadar's split-adjustment factor. So a pre-2020 4-for-1 AAPL split is normalized to current-shares basis, making cross-quarter trends visually clean. For as-filed (un-adjusted) shares use `POST /api/v1/form-13f/holdings`.
- `trends[].total_value_usd` (number): Aggregate position USD value across all funds, post-Plan 51 holdings-quality correction (handles the thousands-vs-actual-dollars reporting issue). NOT mark-to-most-recent-price — uses the value as filed for that quarter (which is mark-to-quarter-end-price). For the price-adjusted view across quarters, multiply `total_shares` by your reference price.
- `trends[].fund_change_pct` (number (nullable)): Quarter-over-quarter percent change in `fund_count`, using FAIR-COMPARISON logic (post-v3.9.0 fix): `fund_count_prev` only counts funds that filed in BOTH quarters, so the metric correctly captures incremental adoption rather than being polluted by funds that simply skipped a quarterly filing. Null on the first row (no prior baseline).
- `trends[].shares_change_pct` (number (nullable)): Quarter-over-quarter percent change in `total_shares`, computed on split-adjusted shares so corporate actions don't manufacture artificial spikes. Positive = aggregate fund flow IN; negative = aggregate fund flow OUT. Null on the first row (no prior baseline).
**Since:** v1.3.3
**Utility:** Quarterly time-series of institutional fund ownership for a ticker — drives the 'Fund Ownership' chart on every company-overview page. Aggregates ALL 9,600+ 13F filers (post-v3.3.0 rewrite — the legacy implementation was limited to 668 tracked funds). Includes CUSIP successor-chain expansion so M&A continuity is preserved across corporate actions (e.g. PFE/Wyeth merger, T/Time Warner spinoff, GOOGL share-class restructuring). Split-adjusted share counts so cross-quarter trends remain visually clean across 2-for-1 / 4-for-1 splits. The canonical answer to 'are funds buying or selling this name?' — pair with `/tickers/{ticker}/holders` for the current-quarter holder list at the same completeness level. Post-v3.7.1 fix uses fair-comparison QoQ (`fund_count_prev` only counts funds that filed in BOTH quarters), so AAPL Q4 2025 fund_change_pct now shows +11% instead of the misleading -98% the old logic produced.
**Parameters:**
- `ticker` (path, required): Stock ticker (case-insensitive). Server normalizes to canonical hyphen form (`BRK.A`/`BRK/A`/`BRKA` → `BRK-A`). Multi-class issuers preserve the requested class — `GOOGL` and `GOOG` return distinct trends. Returns 404 if the ticker has been delisted with no successor in our chain table; for canonical resolution see `/api/v1/cusip-successors`.
- `limit` (query, optional, default: 20): Maximum quarters to return (oldest-first ordering; FinRadar coverage starts 2013-Q1). Defaults to 20 (~5 years of history). Capped at 40 (~10 years). For full history beyond 10 years use `POST /api/v1/form-13f/holdings` with date-range chunking.
**Sample response:**
```json
{
"data": {
"ticker": "AAPL",
"security_name": "APPLE INC",
"quarters": [
{
"date": "2024-09-30",
"total_shares": 1150000000,
"total_value": 220000000000,
"fund_count": 4400,
"share_change": -20000000,
"share_change_pct": -1.7,
"fund_flow": -5000000000,
"fund_count_change": -15
}
]
}
}
```
### GET /api/v1/tickers/autocomplete
Full ticker list for client-side typeahead search. Returns all tickers with company names, ordered alphabetically. Designed for preloading into client-side autocomplete widgets.
**Token cost:** 1 token per call
**Response fields:**
- `tickers[]` (array): Array of matching ticker rows, sorted by `score DESC` (highest-conviction match first) when `q` is provided, alphabetically when `q` is empty. Empty array on no match.
- `tickers[].symbol` (string): Canonical ticker (hyphen form for multi-class — `BRK-A` not `BRK.A`/`BRK/A`/`BRKA`). Multi-class issuers preserve their share-class suffix. Foreign-listing variants carry exchange suffixes (`.MX`, `.TO`, `.L`, etc.).
- `tickers[].name` (string): Company name (Title Case). For multi-class issuers, parenthetical suffix disambiguates (`Berkshire Hathaway Inc. (Class A)` vs `Berkshire Hathaway Inc. (Class B)`). For foreign listings, the exchange is noted parenthetically.
- `tickers[].exchange` (string (nullable)): Primary listing exchange code: `NYSE`, `NASDAQ`, `AMEX`, `OTC`, `BMV` (Mexico), `TSX` (Toronto), `LSE` (London), etc. Null for issuers without a clean primary-exchange mapping (rare; mostly OTC pink-sheet names).
- `tickers[].score` (number): FinRadar ticker-scoring signal (range `[0, 100]`). Higher = more-prominent listing (high-volume primary, well-known issuer name, frequent news coverage). For multi-class issuers, the more-traded class scores higher (BRK-B > BRK-A on volume; AAPL primary > AAPL.MX foreign listing). Use for ranking ties in autocomplete dropdowns. Phase 47-era ticker_scoring service — re-computed nightly from volume + market_cap + cross-section signal density.
- `tickers[].rank` (integer): 1-indexed rank within the response set. `rank=1` is the top match. Useful for UI rendering (showing 'Top match' badge on rank=1).
- `meta.total` (integer): Total tickers returned in this response. May equal full-corpus match count if smaller than `limit`; otherwise capped at `limit`.
- `meta.query` (string (nullable)): Echoed-back `q` parameter (or null when empty).
**Since:** v1.0.0
**Utility:** Preload all tickers for instant client-side search.
**Use case:** Building a ticker search bar that provides instant autocomplete without server round-trips on each keystroke.
**Parameters:**
- `q` (query, optional): Optional query prefix for server-side filtering. When provided, returns up to 50 tickers ranked by FinRadar's ticker-scoring signal (Phase 47-related — high-volume primary listings rank ahead of low-volume secondary listings; multi-class issuers like BRK-A vs BRK-B disambiguated by liquidity score). When omitted, returns the full enumeration for client-side preload.
- `limit` (query, optional, default: 50): Max tickers returned when `q` is provided (capped at 50 server-side). Ignored when `q` is empty (full preload mode).
**Sample response:**
```json
{
"tickers": [
{
"symbol": "AAPL",
"name": "Apple Inc.",
"exchange": "NASDAQ",
"score": 100,
"rank": 1
},
{
"symbol": "AAPL.MX",
"name": "Apple Inc. (Mexico Listing)",
"exchange": "BMV",
"score": 12,
"rank": 2
},
{
"symbol": "APLE",
"name": "Apple Hospitality REIT, Inc.",
"exchange": "NYSE",
"score": 38,
"rank": 3
}
],
"meta": {
"total": 3,
"query": "appl"
}
}
```
### GET /api/v1/tickers/logos/domain/{symbol}
Get the website domain for a stock ticker. Returns a Google S2 favicon URL (128px) derived from the company website. Useful for displaying company logos without maintaining a logo database.
**Token cost:** 1 token per call
**Response fields:**
- `symbol` (string): Ticker echoed back in canonical hyphen form.
- `domain` (string (nullable)): Company website domain (e.g. `apple.com`, `microsoft.com`, `nvidia.com`). Sourced from FinRadar's curated ticker→domain mapping (~7,500 entries) — primary mapping is hand-curated for the top-3000 tickers; fallback uses Yahoo Finance company-website field. Null for issuers without a discoverable corporate website (rare; mostly small-cap shell companies or pre-IPO ADRs).
- `logo` (string (nullable)): Google S2 favicon URL at 128×128 resolution (`https://www.google.com/s2/favicons?domain={domain}&sz=128`). Free unauthenticated CDN; no rate limits for client-side `
` rendering. Null when `domain` is null. For higher-resolution / brand-asset logos use external services (Clearbit, etc.) — Google S2 caps at 128px.
- `cached` (boolean): Boolean: `true` when the response came from FinRadar's 24h server-side cache (most calls), `false` on the rare cache-miss path (refresh ~5-10ms slower).
**Since:** v1.0.0
**Utility:** Get company logo/favicon by ticker symbol.
**Use case:** Displaying company logos next to ticker symbols in a portfolio view or search results.
**Parameters:**
- `symbol` (path, required): Stock ticker (canonical hyphen form). Server normalizes case + dot/slash variants. Multi-class issuers preserve their share-class suffix (`BRK-A` and `BRK-B` both map to `berkshirehathaway.com`). Returns 404 for unknown symbols.
**Sample response:**
```json
{
"symbol": "AAPL",
"domain": "apple.com",
"logo": "https://www.google.com/s2/favicons?domain=apple.com&sz=128",
"cached": true
}
```
### GET /api/v1/tickers/logos/domains
Batch lookup of website domains and logo URLs for multiple tickers. Returns a map of symbol → {domain, logo} for all found tickers.
**Token cost:** 5 tokens per call
**Response fields:**
- `domains` (object): Map of `symbol` → `{ symbol, domain, logo }`. Empty object when no requested tickers are found. Order of keys matches the input `symbols` parameter (preserved server-side via ordered iteration). Missing tickers are NOT included in this map — see `meta.missing` for the explicit unfound list.
- `domains.{symbol}` (object): Per-ticker logo entry. Always 3 sub-fields: `symbol` (canonical hyphen form), `domain` (company website e.g. `apple.com`), `logo` (Google S2 favicon URL at 128×128). For multi-class issuers, both BRK-A and BRK-B map to the same `berkshirehathaway.com` domain.
- `domains.{symbol}.symbol` (string): Ticker in canonical hyphen form (echoed back per-row).
- `domains.{symbol}.domain` (string (nullable)): Company website domain. May be a sibling domain (`abc.xyz` for GOOGL/Alphabet) when the parent corporate site differs from the consumer-facing brand. Null only for issuers in the curated map without a discoverable domain (rare).
- `domains.{symbol}.logo` (string (nullable)): Google S2 favicon URL at 128×128 resolution. Null when `domain` is null.
- `meta` (object): Response metadata: `{ requested: integer, found: integer, missing: array }`. Useful for batch-completeness gauges and client-side fallback rendering for unmapped tickers.
- `meta.requested` (integer): Count of tickers in the input `symbols` parameter (after server-side normalization + dedup).
- `meta.found` (integer): Count of tickers that returned a domain. `found ≤ requested`; the difference is in `missing[]`.
- `meta.missing` (array): Array of canonical-form tickers that had no domain mapping (unknown tickers OR known tickers without curated domain). Use for client-side fallback rendering (e.g. show generic placeholder icon).
**Since:** v1.0.0
**Utility:** Batch company logo lookup for portfolio or list views.
**Use case:** Loading logos for all tickers in a watchlist or portfolio table in a single request instead of N individual calls.
**Parameters:**
- `symbols` (query, required): Comma-separated ticker symbols (canonical hyphen form). Server normalizes each. Max 200 per call. For larger universes (full-watchlist >200) chunk client-side. Unknown tickers are silently dropped from the response (NOT 404'd) so a single bad ticker doesn't fail the batch.
**Sample response:**
```json
{
"domains": {
"AAPL": {
"symbol": "AAPL",
"domain": "apple.com",
"logo": "https://www.google.com/s2/favicons?domain=apple.com&sz=128"
},
"MSFT": {
"symbol": "MSFT",
"domain": "microsoft.com",
"logo": "https://www.google.com/s2/favicons?domain=microsoft.com&sz=128"
},
"NVDA": {
"symbol": "NVDA",
"domain": "nvidia.com",
"logo": "https://www.google.com/s2/favicons?domain=nvidia.com&sz=128"
},
"GOOGL": {
"symbol": "GOOGL",
"domain": "abc.xyz",
"logo": "https://www.google.com/s2/favicons?domain=abc.xyz&sz=128"
}
},
"meta": {
"requested": 4,
"found": 4,
"missing": []
}
}
```