ETF & Mutual Fund Comparison API
Compare two to six ETFs or mutual funds across every metric on file — fees, returns, flows, concentration, sector and country exposure, look-through valuation, tracking, and risk ratios — in a single call. The endpoint does the part a caller cannot do for itself: it works out which of the 138 comparable metrics actually differ at the precision a reader would see, names which way is better where that is a fact rather than an opinion, and tells you outright when two tickers are the same portfolio in different wrappers. The API is free to use.
Use this endpoint to:
https://data.businessquant.com/funds/compare?tickers={tickers}&api_key={api_key}
Related endpoints: Find candidates to compare with the ETF & Mutual Fund Screener API. For one fund in depth, see the Fund Overview, Fund Holdings, Portfolio Exposure, Fund Flows and Fund Risk Factors APIs. To compare positions rather than metrics, pull both portfolios from Fund Holdings. New here? Start at the API Overview.
1. Request Parameters
Two parameters, one of them optional. A comparison is a small, bounded request by design.
| Parameter | Description |
|---|---|
| api_key |
Required
Your unique API key for authentication.
|
| tickers |
Required Identifier
Two to six comma-separated fund or ETF tickers. Duplicates are collapsed before the count is checked, so VOO,VOO is one ticker and returns a 400. Order is preserved: the columns come back in the order you asked for them.
Example:
tickers=VOO,SPY,IVV |
| include_metrics |
Optional
true also embeds the flat metric catalogue in metadata.metrics. You rarely need it here — metadata.groups already carries the label, unit, datatype and description of every metric in the comparison.
|
curl -X GET "https://data.businessquant.com/funds/compare?tickers=VOO,SPY,IVV&api_key=YOUR_API_KEY"
{
"metadata": {
"endpoint": "/funds/compare",
"grain": "share class ticker",
"requested": [
"VOO",
"SPY",
"IVV"
],
"resolved": [
"VOO",
"SPY",
"IVV"
],
"missing": [],
"count": 3,
"max_compare": 6,
"same_portfolio": false,
"series_id": null,
"metrics_total": 144,
"differing_count": 92,
"groups": [
{
"statement": "Profile",
"order": 1,
"metrics": [
{
"field": "category",
"label": "Category",
"unit": "text",
"datatype": "text",
"description": "Coarse bucket derived from what the fund HOLDS, not from its name, measured on classified exposure only. Other when under half the portfolio is classified.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fund_tags",
"label": "Tags",
"unit": "list",
"datatype": "list",
"description": "Fund types as filed in N-CEN: Index Fund, Fund of Funds, Target Date, Money Market, Inverse, Underlying Fund, Interval Fund, Exchange-Traded Managed. A fund can carry several.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "geography_focus",
"label": "Geography",
"unit": "text",
"datatype": "text",
"description": "US (80%+ US assets), International (20% or less) or Global. Derived from holdings.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "registrantFullName",
"label": "Family",
"unit": "text",
"datatype": "text",
"description": "Registrant / trust name. The issuer filter: Vanguard, iShares, SPDR.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "structure_tags",
"label": "Structure",
"unit": "list",
"datatype": "list",
"description": "Structural facts from N-CEN: Non-Diversified (may concentrate), Lends Securities, Foreign Subsidiary.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Fees",
"order": 2,
"metrics": [
{
"field": "acquired_fund_fees_pct",
"label": "AFFE",
"unit": "percent",
"datatype": "%",
"description": "Fees charged by the underlying funds a fund holds. Material for funds of funds and usually excluded from the waiver.",
"differs": false,
"direction": "lower",
"leaders": [],
"laggards": []
},
{
"field": "gross_expense_ratio_pct",
"label": "Gross Expense",
"unit": "percent",
"datatype": "%",
"description": "Total annual operating expenses before any waiver. Above the net ratio when a waiver is in force, which may expire.",
"differs": true,
"direction": "lower",
"leaders": [
"VOO",
"IVV"
],
"laggards": [
"SPY"
]
},
{
"field": "min_initial_investment_usd",
"label": "Min. Investment",
"unit": "usd",
"datatype": "int",
"description": "Smallest initial purchase the prospectus accepts. Absent for most ETFs, which have none.",
"differs": false,
"direction": "lower",
"leaders": [],
"laggards": []
},
{
"field": "net_expense_ratio_pct",
"label": "Net Expense",
"unit": "percent",
"datatype": "%",
"description": "What the investor actually pays after fee waivers. THE expense ratio. 0.03 means three basis points, not 3%.",
"differs": true,
"direction": "lower",
"leaders": [
"VOO",
"IVV"
],
"laggards": [
"SPY"
]
}
]
},
{
"statement": "Size",
"order": 3,
"metrics": [
{
"field": "net_assets_usd",
"label": "AUM",
"unit": "usd",
"datatype": "int",
"description": "Fund-level assets under management from the latest N-PORT. Fund grain, so every share class of a fund shows the same figure.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Returns",
"order": 4,
"metrics": [
{
"field": "cal_return_2021_pct",
"label": "2021",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2021 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2022_pct",
"label": "2022",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2022 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2023_pct",
"label": "2023",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2023 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": true,
"direction": "higher",
"leaders": [
"IVV"
],
"laggards": [
"VOO"
]
},
{
"field": "cal_return_2024_pct",
"label": "2024",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2024 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2025_pct",
"label": "2025",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2025 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": true,
"direction": "higher",
"leaders": [
"IVV"
],
"laggards": [
"VOO"
]
},
{
"field": "pro_return_10y_pct",
"label": "10Y Ann. (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return over ten years, before taxes, as printed in the prospectus.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "pro_return_5y_pct",
"label": "5Y Ann. (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return over five years, before taxes, as printed in the prospectus. Stale by up to a year — see Returns As Of.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "pro_return_incep_pct",
"label": "Since Inception (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return since inception, before taxes, as printed in the prospectus.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
}
// … 12 more items in the full API response
]
},
{
"statement": "Market Cap",
"order": 5,
"metrics": [
{
"field": "large_cap_pct",
"label": "Large Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $10B to $200B.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "market_cap_coverage_pct",
"label": "Cap Coverage",
"unit": "percent",
"datatype": "%",
"description": "Share of equity exposure that resolved to a market cap. US-only source, so international funds run low: VOO 96%, VWO 3%. BELOW 70 THE CAP AND VALUATION COLUMNS ARE BLANKED — do not render them.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "mega_cap_pct",
"label": "Mega Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies above $200B.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "micro_cap_pct",
"label": "Micro Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies below $300M.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "mid_cap_pct",
"label": "Mid Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $2B to $10B.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "size_style",
"label": "Size Style",
"unit": "text",
"datatype": "text",
"description": "Large Cap, Mid Cap, Small Cap or Multi Cap, from the cap ladder. Null below 70% coverage.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "small_cap_pct",
"label": "Small Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $300M to $2B.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "wavg_market_cap_usd",
"label": "Avg Mkt Cap",
"unit": "usd",
"datatype": "int",
"description": "Value-weighted average market capitalisation of the equity holdings. Null below 70% coverage.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Valuation",
"order": 6,
"metrics": [
{
"field": "lookthrough_dividend_yield_pct",
"label": "Look-Through Yield",
"unit": "percent",
"datatype": "%",
"description": "Value-weighted dividend yield of the equity holdings. Arithmetic, because yields are additive. NOT the fund's own distribution yield, which we cannot yet serve.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_ev_ebitda",
"label": "EV/EBITDA",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted enterprise value to EBITDA of the equity holdings.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_pe",
"label": "P/E",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted price/earnings of the equity holdings — the index-provider standard. Loss-makers are excluded rather than dragging the ratio negative. VUG 29.9 vs VTV 20.9 is the growth/value spread.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_ps",
"label": "P/S",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted price/sales of the equity holdings.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Asset Mix",
"order": 7,
"metrics": [
{
"field": "derivative_pct",
"label": "Derivatives",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in derivatives. Large for inverse and leveraged funds.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "equity_pct",
"label": "Equity",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in equities.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fixed_income_pct",
"label": "Fixed Income",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in bonds and other debt.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fund_cash_pct",
"label": "Fund & Cash",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in other funds and cash equivalents.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "other_asset_pct",
"label": "Other Assets",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure the classifier had no opinion on. Not an asset class — a coverage gap, and excluded from the Category denominator for that reason.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Sector",
"order": 8,
"metrics": [
{
"field": "sector_basic_materials_pct",
"label": "Basic Materials",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Basic Materials. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_communication_services_pct",
"label": "Communication Services",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Communication Services. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_consumer_discretionary_pct",
"label": "Consumer Discretionary",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Consumer Discretionary. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_consumer_staples_pct",
"label": "Consumer Staples",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Consumer Staples. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_energy_pct",
"label": "Energy",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Energy. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_financial_services_pct",
"label": "Financial Services",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Financial Services. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_healthcare_pct",
"label": "Healthcare",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Healthcare. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_industrials_pct",
"label": "Industrials",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Industrials. Percent of absolute market value, renormalised to 100.",
"differs": true,
"direction": null,
"leaders": [],
"laggards": []
}
// … 6 more items in the full API response
]
}
// … 9 more items in the full API response
],
"identity_fields": [
"ticker",
"fund_name",
"className",
"vehicle",
"series_id"
],
"data_asof": {
"portfolio": "2026-09-08",
"aum": "2026-08-31",
"flows": "2026-08-31",
"price": "2026-09-10",
"total_return": "2026-07-31",
"prospectus": "2026-09-08"
}
},
"data": [
{
"ticker": "VOO",
"fund_name": "Vanguard 500 Index Fund",
"className": "ETF Shares",
"vehicle": "ETF",
"series_id": "S000002839",
"benchmark_ticker": "I:SP500",
"cik": 1004655,
"class_id": "C000092055",
"data_available": [
"Holdings",
"Flows",
"AUM",
"Returns",
"Profile",
"Prices",
"Ratios"
],
"flows_asof": "2026-06-30",
"lastreportperiod": "2026-07-31",
"net_assets_asof": "2026-06-30",
"price_asof": "2026-09-10",
"pro_returns_asof": "2026-04-28",
"prospectus_date": "2026-04-28",
"total_return_asof": "2026-06-30",
"category": "Equity",
"fund_tags": [
"Index Fund"
],
"geography_focus": "US",
"registrantFullName": "VANGUARD INDEX FUNDS",
"structure_tags": [
"Lends Securities"
],
"acquired_fund_fees_pct": null,
"gross_expense_ratio_pct": 0.03,
"min_initial_investment_usd": 3000,
"net_expense_ratio_pct": 0.03,
"net_assets_usd": 1671231561960.14,
"cal_return_2021_pct": 28.66,
"cal_return_2022_pct": -18.15,
"cal_return_2023_pct": 26.25,
"cal_return_2024_pct": 24.98,
"cal_return_2025_pct": 17.84,
"pro_return_10y_pct": null,
"pro_return_5y_pct": null,
"pro_return_incep_pct": null,
"pro_worst_quarter_pct": -19.63,
"return_1m_pct": -1.96,
"return_1y_pct": 16.18,
"return_3m_pct": 4.45,
"return_3y_ann_pct": 19.13,
"return_5y_ann_pct": 11.21,
"return_6m_pct": 11.88,
"return_ytd_pct": 11.09,
"total_return_12m_pct": 22.2842,
"total_return_1m_pct": -0.9548,
"total_return_3m_pct": 15.1925,
"total_return_6m_pct": 10.1898,
"large_cap_pct": 34.51,
"market_cap_coverage_pct": 96.25,
"mega_cap_pct": 65.22,
"micro_cap_pct": 0.02,
"mid_cap_pct": 0.25,
"size_style": "Large Cap",
"small_cap_pct": 0,
"wavg_market_cap_usd": 1625941878367,
"lookthrough_dividend_yield_pct": 7.81,
"lookthrough_ev_ebitda": 15.88,
"lookthrough_pe": 24.57,
"lookthrough_ps": 3.52,
"derivative_pct": 0.031,
"equity_pct": 99.9221,
"fixed_income_pct": 0,
"fund_cash_pct": 0.0469,
"other_asset_pct": 0,
"sector_basic_materials_pct": 1.9044,
"sector_communication_services_pct": 1.3414,
"sector_consumer_discretionary_pct": 8.805,
"sector_consumer_staples_pct": 4.5825,
"sector_energy_pct": 3.3203,
"sector_financial_services_pct": 11.6992,
"sector_healthcare_pct": 9.0044,
"sector_industrials_pct": 8.4713,
"sector_other_pct": 1.851,
"sector_real_estate_pct": 1.6332,
"sector_technology_pct": 45.928,
"sector_utilities_pct": 1.4593,
"top_sector": "Technology",
"top_sector_pct": 46.7942,
"average_coupon_pct": null,
"corporate_pct": 99.9687,
"dated_holdings_count": 0,
"duration_band": null,
"effective_duration_years": null,
"effective_maturity_years": null,
"municipal_pct": 0,
"non_us_sovereign_pct": 0,
"us_agency_gse_pct": 0,
"us_treasury_pct": 0,
"weighted_average_maturity_years": null,
"country_us_pct": 97.9133,
"top_country": "United States",
"holdings_count": 506,
"short_pct": 0,
"effective_holdings": 47.53,
"top10_weight_pct": 37.6376,
"top1_weight_pct": 7.5525,
"topholding_cusip": "67066G104",
"topholding_name": "NVIDIA Corp.",
"topholding_ticker": "NVDA",
"flow_positive_months_pct": 83.33,
"net_flow_12m_pct": -5.8139,
"net_flow_12m_usd": -97164387947.86,
"net_flow_1m_pct": -0.5078,
"net_flow_3m_pct": 2.1421,
"fund_age_years": 10.21,
"portfolio_turnover_pct": 2,
"credit_spread_hy_10y_usd": null,
"credit_spread_ig_10y_usd": null,
"dv01_10y_bp_per_10k": null,
"liabilities_pct_net_assets": 0.1437,
"tracking_difference_pct": -0.1689,
"tracking_error_pct": 0.0127,
"std_dev_6m_pct": 13.89,
"std_dev_ytd_pct": 13.37,
"std_dev_1y_pct": 12.83,
"std_dev_2y_pct": 15.96,
"std_dev_3y_pct": 14.96,
"std_dev_5y_pct": 16.96,
"max_drawdown_6m_pct": -6.71,
"max_drawdown_ytd_pct": -9.19,
"max_drawdown_1y_pct": -9.19,
"max_drawdown_2y_pct": -18.97,
"max_drawdown_3y_pct": -18.97,
"max_drawdown_5y_pct": -25.41,
"sharpe_6m": 1.405,
"sharpe_ytd": 0.937,
"sharpe_1y": 0.947,
"sharpe_2y": 0.845,
"sharpe_3y": 0.966,
"sharpe_5y": 0.491,
"sortino_6m": 2.139,
"sortino_ytd": 1.38,
"sortino_1y": 1.36,
"sortino_2y": 1.239,
"sortino_3y": 1.407,
"sortino_5y": 0.7,
"alpha_6m_pct": -0.12,
"alpha_ytd_pct": 0.28,
"alpha_1y_pct": 0.03,
"alpha_2y_pct": 0.12,
"alpha_3y_pct": 0.08,
"alpha_5y_pct": 0.02,
"beta_6m": 1.001,
"beta_ytd": 0.998,
"beta_1y": 0.994,
"beta_2y": 0.99,
"beta_3y": 0.992,
"beta_5y": 0.993,
"topholding_kind": "stock"
},
{
"ticker": "SPY",
"fund_name": "SPDR S&P 500 ETF TRUST",
"className": null,
"vehicle": "UIT",
"series_id": "UIT0000884394",
"benchmark_ticker": "I:SP500",
"cik": 884394,
"class_id": null,
"data_available": [
"Holdings",
"Flows",
"AUM",
"Profile",
"Prices",
"Ratios"
],
"flows_asof": "2026-06-30",
"lastreportperiod": "2026-09-04",
"net_assets_asof": "2026-06-30",
"price_asof": "2026-09-10",
"pro_returns_asof": null,
"prospectus_date": null,
"total_return_asof": null,
"category": "Other",
"fund_tags": [],
"geography_focus": "US",
"registrantFullName": "SPDR S&P 500 ETF TRUST",
"structure_tags": [],
"acquired_fund_fees_pct": null,
"gross_expense_ratio_pct": 0.0945,
"min_initial_investment_usd": null,
"net_expense_ratio_pct": 0.0945,
"net_assets_usd": 781188872106.76,
"cal_return_2021_pct": null,
"cal_return_2022_pct": null,
"cal_return_2023_pct": null,
"cal_return_2024_pct": null,
"cal_return_2025_pct": null,
"pro_return_10y_pct": null,
"pro_return_5y_pct": null,
"pro_return_incep_pct": null,
"pro_worst_quarter_pct": null,
"return_1m_pct": -1.96,
"return_1y_pct": 16.2,
"return_3m_pct": 4.47,
"return_3y_ann_pct": 19.11,
"return_5y_ann_pct": 11.22,
"return_6m_pct": 11.92,
"return_ytd_pct": 11.14,
"total_return_12m_pct": null,
"total_return_1m_pct": null,
"total_return_3m_pct": null,
"total_return_6m_pct": null,
"large_cap_pct": 39.61,
"market_cap_coverage_pct": 98.95,
"mega_cap_pct": 60.2,
"micro_cap_pct": 0,
"mid_cap_pct": 0.2,
"size_style": "Large Cap",
"small_cap_pct": 0,
"wavg_market_cap_usd": 1510135068552,
"lookthrough_dividend_yield_pct": 7.972,
"lookthrough_ev_ebitda": 22.1,
"lookthrough_pe": 27.75,
"lookthrough_ps": 3.81,
"derivative_pct": 0.0864,
"equity_pct": 46.0628,
"fixed_income_pct": 0.849,
"fund_cash_pct": 0.1679,
"other_asset_pct": 52.8339,
"sector_basic_materials_pct": 1.9589,
"sector_communication_services_pct": 1.4417,
"sector_consumer_discretionary_pct": 8.445,
"sector_consumer_staples_pct": 4.4005,
"sector_energy_pct": 3.4591,
"sector_financial_services_pct": 11.6512,
"sector_healthcare_pct": 9.2463,
"sector_industrials_pct": 8.1515,
"sector_other_pct": 1.4062,
"sector_real_estate_pct": 1.5549,
"sector_technology_pct": 46.896,
"sector_utilities_pct": 1.3886,
"top_sector": "Technology",
"top_sector_pct": 47.5649,
"average_coupon_pct": null,
"corporate_pct": 99.9278,
"dated_holdings_count": 0,
"duration_band": null,
"effective_duration_years": null,
"effective_maturity_years": null,
"municipal_pct": 0,
"non_us_sovereign_pct": 0,
"us_agency_gse_pct": 0,
"us_treasury_pct": 0,
"weighted_average_maturity_years": null,
"country_us_pct": 97.9722,
"top_country": "United States",
"holdings_count": 505,
"short_pct": 0,
"effective_holdings": 44.69,
"top10_weight_pct": 38.3024,
"top1_weight_pct": 8.4525,
"topholding_cusip": "67066G104",
"topholding_name": "NVIDIA CORP",
"topholding_ticker": "NVDA",
"flow_positive_months_pct": 52.38,
"net_flow_12m_pct": 1.601,
"net_flow_12m_usd": 12507067553.45,
"net_flow_1m_pct": 0.8611,
"net_flow_3m_pct": 3.9942,
"fund_age_years": null,
"portfolio_turnover_pct": null,
"credit_spread_hy_10y_usd": null,
"credit_spread_ig_10y_usd": null,
"dv01_10y_bp_per_10k": null,
"liabilities_pct_net_assets": 0.2754,
"tracking_difference_pct": null,
"tracking_error_pct": null,
"std_dev_6m_pct": 13.89,
"std_dev_ytd_pct": 13.36,
"std_dev_1y_pct": 12.84,
"std_dev_2y_pct": 16.51,
"std_dev_3y_pct": 15.34,
"std_dev_5y_pct": 17.25,
"max_drawdown_6m_pct": -6.68,
"max_drawdown_ytd_pct": -9.13,
"max_drawdown_1y_pct": -9.13,
"max_drawdown_2y_pct": -19,
"max_drawdown_3y_pct": -19,
"max_drawdown_5y_pct": -25.36,
"sharpe_6m": 1.41,
"sharpe_ytd": 0.942,
"sharpe_1y": 0.948,
"sharpe_2y": 0.821,
"sharpe_3y": 0.945,
"sharpe_5y": 0.486,
"sortino_6m": 2.153,
"sortino_ytd": 1.391,
"sortino_1y": 1.361,
"sortino_2y": 1.218,
"sortino_3y": 1.388,
"sortino_5y": 0.697,
"alpha_6m_pct": -0.06,
"alpha_ytd_pct": 0.35,
"alpha_1y_pct": 0.05,
"alpha_2y_pct": -0.26,
"alpha_3y_pct": -0.23,
"alpha_5y_pct": -0.06,
"beta_6m": 1.001,
"beta_ytd": 0.997,
"beta_1y": 0.995,
"beta_2y": 1.023,
"beta_3y": 1.016,
"beta_5y": 1.009,
"topholding_kind": "stock"
},
{
"ticker": "IVV",
"fund_name": "iShares Core S&P 500 ETF",
"className": "iShares Core S&P 500 ETF",
"vehicle": "ETF",
"series_id": "S000004310",
"benchmark_ticker": "I:SP500",
"cik": 1100663,
"class_id": "C000012040",
"data_available": [
"Holdings",
"Flows",
"AUM",
"Returns",
"Profile",
"Prices",
"Ratios"
],
"flows_asof": "2026-06-30",
"lastreportperiod": "2026-09-04",
"net_assets_asof": "2026-06-30",
"price_asof": "2026-09-10",
"pro_returns_asof": "2026-07-27",
"prospectus_date": "2026-07-31",
"total_return_asof": "2026-06-30",
"category": "Equity",
"fund_tags": [
"Index Fund"
],
"geography_focus": "US",
"registrantFullName": "iShares Trust",
"structure_tags": [
"Lends Securities"
],
"acquired_fund_fees_pct": null,
"gross_expense_ratio_pct": 0.03,
"min_initial_investment_usd": null,
"net_expense_ratio_pct": 0.03,
"net_assets_usd": 888128937468.17,
"cal_return_2021_pct": 28.66,
"cal_return_2022_pct": -18.13,
"cal_return_2023_pct": 26.27,
"cal_return_2024_pct": 24.98,
"cal_return_2025_pct": 17.85,
"pro_return_10y_pct": 14.78,
"pro_return_5y_pct": 14.39,
"pro_return_incep_pct": null,
"pro_worst_quarter_pct": -19.6,
"return_1m_pct": -1.96,
"return_1y_pct": 16.18,
"return_3m_pct": 4.48,
"return_3y_ann_pct": 19.09,
"return_5y_ann_pct": 11.22,
"return_6m_pct": 11.97,
"return_ytd_pct": 11.18,
"total_return_12m_pct": 22.2905,
"total_return_1m_pct": -0.9562,
"total_return_3m_pct": 15.1949,
"total_return_6m_pct": 10.1943,
"large_cap_pct": 34.07,
"market_cap_coverage_pct": 96.44,
"mega_cap_pct": 65.73,
"micro_cap_pct": 0.02,
"mid_cap_pct": 0.18,
"size_style": "Large Cap",
"small_cap_pct": 0,
"wavg_market_cap_usd": 1652388130843,
"lookthrough_dividend_yield_pct": 7.654,
"lookthrough_ev_ebitda": 15.95,
"lookthrough_pe": 24.74,
"lookthrough_ps": 3.57,
"derivative_pct": 0,
"equity_pct": 99.7213,
"fixed_income_pct": 0,
"fund_cash_pct": 0.2787,
"other_asset_pct": 0,
"sector_basic_materials_pct": 1.9417,
"sector_communication_services_pct": 1.4109,
"sector_consumer_discretionary_pct": 8.3719,
"sector_consumer_staples_pct": 4.363,
"sector_energy_pct": 3.4297,
"sector_financial_services_pct": 11.5549,
"sector_healthcare_pct": 9.1691,
"sector_industrials_pct": 8.0813,
"sector_other_pct": 1.9426,
"sector_real_estate_pct": 1.5411,
"sector_technology_pct": 46.8175,
"sector_utilities_pct": 1.3765,
"top_sector": "Technology",
"top_sector_pct": 47.745,
"average_coupon_pct": null,
"corporate_pct": 99.7213,
"dated_holdings_count": 0,
"duration_band": null,
"effective_duration_years": null,
"effective_maturity_years": null,
"municipal_pct": 0,
"non_us_sovereign_pct": 0,
"us_agency_gse_pct": 0,
"us_treasury_pct": 0,
"weighted_average_maturity_years": null,
"country_us_pct": 97.8985,
"top_country": "United States",
"holdings_count": 509,
"short_pct": 0.0011,
"effective_holdings": 45.42,
"top10_weight_pct": 37.9732,
"top1_weight_pct": 8.3798,
"topholding_cusip": "67066G104",
"topholding_name": "NVIDIA",
"topholding_ticker": "NVDA",
"flow_positive_months_pct": 72.62,
"net_flow_12m_pct": 14.0797,
"net_flow_12m_usd": 125045813402,
"net_flow_1m_pct": 4.9087,
"net_flow_3m_pct": 6.8256,
"fund_age_years": 26.32,
"portfolio_turnover_pct": 3,
"credit_spread_hy_10y_usd": null,
"credit_spread_ig_10y_usd": null,
"dv01_10y_bp_per_10k": null,
"liabilities_pct_net_assets": 0.1698,
"tracking_difference_pct": -0.02,
"tracking_error_pct": 0.03,
"std_dev_6m_pct": 13.85,
"std_dev_ytd_pct": 13.34,
"std_dev_1y_pct": 12.85,
"std_dev_2y_pct": 16.1,
"std_dev_3y_pct": 15.06,
"std_dev_5y_pct": 17.08,
"max_drawdown_6m_pct": -6.64,
"max_drawdown_ytd_pct": -9.13,
"max_drawdown_1y_pct": -9.13,
"max_drawdown_2y_pct": -19.01,
"max_drawdown_3y_pct": -19.01,
"max_drawdown_5y_pct": -25.4,
"sharpe_6m": 1.421,
"sharpe_ytd": 0.948,
"sharpe_1y": 0.946,
"sharpe_2y": 0.838,
"sharpe_3y": 0.958,
"sharpe_5y": 0.489,
"sortino_6m": 2.174,
"sortino_ytd": 1.402,
"sortino_1y": 1.361,
"sortino_2y": 1.23,
"sortino_3y": 1.396,
"sortino_5y": 0.698,
"alpha_6m_pct": 0.14,
"alpha_ytd_pct": 0.45,
"alpha_1y_pct": 0.04,
"alpha_2y_pct": 0.01,
"alpha_3y_pct": -0.03,
"alpha_5y_pct": -0.01,
"beta_6m": 0.996,
"beta_ytd": 0.993,
"beta_1y": 0.994,
"beta_2y": 0.998,
"beta_3y": 0.998,
"beta_5y": 1,
"topholding_kind": "stock"
}
]
}
Six is the ceiling, and it is a readability limit rather than a technical one. A comparison is a table a person reads across; past six columns it stops being one. If you need to rank a larger set on a single metric, that is a screen — use the ETF & Mutual Fund Screener API instead.
2. Response Fields
data is one row per resolved ticker, carrying the whole record — a comparison is the whole record, and six rows is a small response. metadata.groups is where the analysis lives.
metadata
| Field | Type | Description |
|---|---|---|
| requested, resolved, missing | array | What you asked for, what was found, and what was not. A ticker outside the fund universe lands in missing rather than failing the whole call — unless fewer than two resolve, which is a 404. |
| count, max_compare | integer | Funds actually compared, and the ceiling (6). |
| same_portfolio | boolean | true when every resolved ticker shares one series_id — they are share classes of a single fund. See the note below; this is the headline answer for a large class of comparisons. |
| series_id | string | The shared Series ID when same_portfolio is true, otherwise null. |
| metrics_total, differing_count | integer | How many metrics were compared, and how many actually differ. The ratio is the fastest read on whether a comparison is meaningful at all. |
| groups | array | The metrics arranged by statement — Profile, Fees, Size, Returns, Market Cap, Valuation, Asset Mix, Sector, Bond Character, Geography, Portfolio, Concentration, Flows, Cost of Ownership, Risk, Risk Ratios and Identity. Identity sorts last: its rows are the provenance of the record, not a property of the fund. Bond Character (effective duration, effective maturity, rate-sensitivity band) is populated only for funds with debt holdings and empty for a pure equity comparison. |
| data_asof | object | Six as-of dates — portfolio, aum, flows, price, total_return, prospectus — one per column group. |
metadata.groups[].metrics[] — the comparison itself
| Field | Type | Description |
|---|---|---|
| field, label, unit, datatype | string | The key on each data row, the label to print, and enough type information to format the value. |
| description | string | What the metric means, for a tooltip. |
| differs | boolean | Whether the values actually differ — decided at the precision a reader would see, not at float precision. Two AUMs that both print $1.99T are not different. All-null is an absence, not a difference, and never counts. |
| direction | string|null | "lower", "higher", or null. Set only where better is a fact — a lower fee, a lower tracking error, a higher return. Null for AUM, turnover and holdings count, where it is an opinion. |
| leaders, laggards | array | Which tickers sit at the good and bad ends. Both are empty when everything ties or everything leads — every fund leading is nobody leading. |
No winner is declared. direction is set only for the metrics where "better" is not a matter of taste. A fund with more assets is not a better fund; a higher turnover is not a worse one; and tracking_difference_pct is deliberately left undirected because it is best near zero, which is neither the maximum nor the minimum. The endpoint reports and ranks; it does not recommend.
3. Response Viewer
A real response for tickers=VOO,SPY,IVV — three S&P 500 trackers, 92 of 144 metrics differing. Green is the leader on that metric, red the laggard; both come from the payload, not from this page.
https://data.businessquant.com/funds/compare
API Response — Fund Comparison
VOO vs SPY vs IVV · three separate portfolios
| Metric | VOO | SPY | IVV |
|---|---|---|---|
| Share Class | ETF Shares | — | iShares Core S&P 500 ETF |
| Net Expense (lower is better) | 0.03% | 0.09% | 0.03% |
| Gross Expense (lower is better) | 0.03% | 0.09% | 0.03% |
| 1Y Return (higher is better) | 16.18% | 16.20% | 16.18% |
| AUM (no direction) | $1.67T | $781.19B | $888.13B |
| Holdings (no direction) | 506 | 505 | 509 |
| Top Holding | NVIDIA Corp. | NVIDIA CORP | NVIDIA |
| Series ID | S000002839 | UIT0000884394 | S000004310 |
4. The Share-Class Case
The single most-asked comparison in this category is between two tickers that turn out to be one fund. This is the case the endpoint is built to answer honestly.
VTSAX vs VTI returns same_portfolio: true. They share Series ID S000002848: one portfolio, two wrappers. Only 42 of 144 metrics differ, and every holdings, sector and concentration row is identical by construction — not because the data is thin.
That is the answer to the question, and it is more useful than eighty identical rows implying it. What actually separates them is the wrapper: the expense ratio, the minimum investment, and how you buy it.
What Differs — VTSAX vs VTI
Every metric where differs is true
| Metric | Group | Direction | Leaders |
|---|---|---|---|
| Category | Profile | — | tie |
| Tags | Profile | — | tie |
| Geography | Profile | — | tie |
| Family | Profile | — | tie |
| Structure | Profile | — | tie |
| AFFE | Fees | lower | tie |
| Gross Expense | Fees | lower | VTI |
| Min. Investment | Fees | lower | tie |
| Net Expense | Fees | lower | VTI |
| AUM | Size | — | tie |
| 2021 | Returns | higher | tie |
| 2022 | Returns | higher | tie |
| 2023 | Returns | higher | tie |
| 2024 | Returns | higher | VTI |
| 2025 | Returns | higher | tie |
| 10Y Ann. (Prospectus) | Returns | higher | tie |
| 5Y Ann. (Prospectus) | Returns | higher | tie |
| Since Inception (Prospectus) | Returns | higher | tie |
| Worst Quarter (Prospectus) | Returns | higher | tie |
| 1M | Returns | higher | VTSAX |
| 1Y | Returns | higher | VTSAX |
| 3M | Returns | higher | VTI |
| 3Y Ann. | Returns | higher | VTSAX |
| 5Y Ann. | Returns | higher | VTI |
| 6M | Returns | higher | VTSAX |
| YTD | Returns | higher | VTSAX |
| Total 12M | Returns | higher | VTI |
| Total 1M | Returns | higher | tie |
| Total 3M | Returns | higher | tie |
| Total 6M | Returns | higher | tie |
| Large Cap | Market Cap | — | tie |
| Cap Coverage | Market Cap | — | tie |
| Mega Cap | Market Cap | — | tie |
| Micro Cap | Market Cap | — | tie |
| Mid Cap | Market Cap | — | tie |
| Size Style | Market Cap | — | tie |
| Small Cap | Market Cap | — | tie |
| Avg Mkt Cap | Market Cap | — | tie |
| Look-Through Yield | Valuation | — | tie |
| EV/EBITDA | Valuation | — | tie |
| P/E | Valuation | — | tie |
| P/S | Valuation | — | tie |
| Derivatives | Asset Mix | — | tie |
| Equity | Asset Mix | — | tie |
| Fixed Income | Asset Mix | — | tie |
| Fund & Cash | Asset Mix | — | tie |
| Other Assets | Asset Mix | — | tie |
| Basic Materials | Sector | — | tie |
| Communication Services | Sector | — | tie |
| Consumer Discretionary | Sector | — | tie |
| Consumer Staples | Sector | — | tie |
| Energy | Sector | — | tie |
| Financial Services | Sector | — | tie |
| Healthcare | Sector | — | tie |
| Industrials | Sector | — | tie |
| Other / Unclass. | Sector | — | tie |
| Real Estate | Sector | — | tie |
| Technology | Sector | — | tie |
| Utilities | Sector | — | tie |
| Top Sector | Sector | — | tie |
| Top Sector % | Sector | — | tie |
| Avg Coupon | Bond Character | — | tie |
| Corporate | Bond Character | — | tie |
| Dated Holdings | Bond Character | — | tie |
| Rate Sensitivity | Bond Character | — | tie |
| Effective Duration | Bond Character | — | tie |
| Effective Maturity | Bond Character | — | tie |
| Municipal | Bond Character | — | tie |
| Non-US Sovereign | Bond Character | — | tie |
| Agency & GSE | Bond Character | — | tie |
| Treasury | Bond Character | — | tie |
| Avg Legal Maturity | Bond Character | — | tie |
| US Weight | Geography | — | tie |
| Top Country | Geography | — | tie |
| Holdings | Portfolio | — | tie |
| Short | Portfolio | — | tie |
| Effective Holdings | Concentration | — | tie |
| Top 10 | Concentration | — | tie |
| Largest Position | Concentration | — | tie |
| topholding_cusip | Concentration | — | tie |
| Top Holding | Concentration | — | tie |
| topholding_ticker | Concentration | — | tie |
| Positive Months | Flows | higher | tie |
| Flow 12M % | Flows | higher | tie |
| Flow 12M | Flows | higher | tie |
| Flow 1M % | Flows | higher | tie |
| Flow 3M % | Flows | higher | tie |
| Fund Age | Cost of Ownership | — | tie |
| Turnover | Cost of Ownership | lower | tie |
| Spread HY | Risk | — | tie |
| Spread IG | Risk | — | tie |
| DV01 10Y | Risk | — | tie |
| Liabilities % | Risk | — | tie |
| Tracking Diff. | Risk | — | tie |
| Tracking Error | Risk | lower | tie |
| Std Dev 6M | Risk Ratios | — | tie |
| Std Dev YTD | Risk Ratios | — | tie |
| Std Dev 1Y | Risk Ratios | — | tie |
| Std Dev 2Y | Risk Ratios | — | tie |
| Std Dev 3Y | Risk Ratios | — | tie |
| Std Dev 5Y | Risk Ratios | — | tie |
| Max Drawdown 6M | Risk Ratios | higher | VTI |
| Max Drawdown YTD | Risk Ratios | higher | tie |
| Max Drawdown 1Y | Risk Ratios | higher | tie |
| Max Drawdown 2Y | Risk Ratios | higher | tie |
| Max Drawdown 3Y | Risk Ratios | higher | tie |
| Max Drawdown 5Y | Risk Ratios | higher | tie |
| Sharpe 6M | Risk Ratios | higher | VTSAX |
| Sharpe YTD | Risk Ratios | higher | VTSAX |
| Sharpe 1Y | Risk Ratios | higher | VTSAX |
| Sharpe 2Y | Risk Ratios | higher | VTSAX |
| Sharpe 3Y | Risk Ratios | higher | VTSAX |
| Sharpe 5Y | Risk Ratios | higher | tie |
| Sortino 6M | Risk Ratios | higher | VTSAX |
| Sortino YTD | Risk Ratios | higher | VTSAX |
| Sortino 1Y | Risk Ratios | higher | VTSAX |
| Sortino 2Y | Risk Ratios | higher | VTSAX |
| Sortino 3Y | Risk Ratios | higher | VTSAX |
| Sortino 5Y | Risk Ratios | higher | VTI |
| Alpha 6M | Risk Ratios | higher | VTI |
| Alpha YTD | Risk Ratios | higher | VTI |
| Alpha 1Y | Risk Ratios | higher | VTI |
| Alpha 2Y | Risk Ratios | higher | VTSAX |
| Alpha 3Y | Risk Ratios | higher | VTSAX |
| Alpha 5Y | Risk Ratios | higher | VTSAX |
| Beta 6M | Risk Ratios | — | tie |
| Beta YTD | Risk Ratios | — | tie |
| Beta 1Y | Risk Ratios | — | tie |
| Beta 2Y | Risk Ratios | — | tie |
| Beta 3Y | Risk Ratios | — | tie |
| Beta 5Y | Risk Ratios | — | tie |
| Benchmark | Identity | — | tie |
| CIK | Identity | — | tie |
| Share Class | Identity | — | tie |
| Class ID | Identity | — | tie |
| Data | Identity | — | tie |
| Flows Date | Identity | — | tie |
| Portfolio Date | Identity | — | tie |
| AUM Date | Identity | — | tie |
| Price Date | Identity | — | tie |
| Returns Date | Identity | — | tie |
| Prospectus Date | Identity | — | tie |
| Series ID | Identity | — | tie |
| Total Ret. Date | Identity | — | tie |
{
"metadata": {
"endpoint": "/funds/compare",
"grain": "share class ticker",
"requested": [
"VTSAX",
"VTI"
],
"resolved": [
"VTSAX",
"VTI"
],
"missing": [],
"count": 2,
"max_compare": 6,
"same_portfolio": true,
"series_id": "S000002848",
"metrics_total": 144,
"differing_count": 42,
"groups": [
{
"statement": "Profile",
"order": 1,
"metrics": [
{
"field": "category",
"label": "Category",
"unit": "text",
"datatype": "text",
"description": "Coarse bucket derived from what the fund HOLDS, not from its name, measured on classified exposure only. Other when under half the portfolio is classified.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fund_tags",
"label": "Tags",
"unit": "list",
"datatype": "list",
"description": "Fund types as filed in N-CEN: Index Fund, Fund of Funds, Target Date, Money Market, Inverse, Underlying Fund, Interval Fund, Exchange-Traded Managed. A fund can carry several.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "geography_focus",
"label": "Geography",
"unit": "text",
"datatype": "text",
"description": "US (80%+ US assets), International (20% or less) or Global. Derived from holdings.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "registrantFullName",
"label": "Family",
"unit": "text",
"datatype": "text",
"description": "Registrant / trust name. The issuer filter: Vanguard, iShares, SPDR.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "structure_tags",
"label": "Structure",
"unit": "list",
"datatype": "list",
"description": "Structural facts from N-CEN: Non-Diversified (may concentrate), Lends Securities, Foreign Subsidiary.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Fees",
"order": 2,
"metrics": [
{
"field": "acquired_fund_fees_pct",
"label": "AFFE",
"unit": "percent",
"datatype": "%",
"description": "Fees charged by the underlying funds a fund holds. Material for funds of funds and usually excluded from the waiver.",
"differs": false,
"direction": "lower",
"leaders": [],
"laggards": []
},
{
"field": "gross_expense_ratio_pct",
"label": "Gross Expense",
"unit": "percent",
"datatype": "%",
"description": "Total annual operating expenses before any waiver. Above the net ratio when a waiver is in force, which may expire.",
"differs": true,
"direction": "lower",
"leaders": [
"VTI"
],
"laggards": [
"VTSAX"
]
},
{
"field": "min_initial_investment_usd",
"label": "Min. Investment",
"unit": "usd",
"datatype": "int",
"description": "Smallest initial purchase the prospectus accepts. Absent for most ETFs, which have none.",
"differs": false,
"direction": "lower",
"leaders": [],
"laggards": []
},
{
"field": "net_expense_ratio_pct",
"label": "Net Expense",
"unit": "percent",
"datatype": "%",
"description": "What the investor actually pays after fee waivers. THE expense ratio. 0.03 means three basis points, not 3%.",
"differs": true,
"direction": "lower",
"leaders": [
"VTI"
],
"laggards": [
"VTSAX"
]
}
]
},
{
"statement": "Size",
"order": 3,
"metrics": [
{
"field": "net_assets_usd",
"label": "AUM",
"unit": "usd",
"datatype": "int",
"description": "Fund-level assets under management from the latest N-PORT. Fund grain, so every share class of a fund shows the same figure.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Returns",
"order": 4,
"metrics": [
{
"field": "cal_return_2021_pct",
"label": "2021",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2021 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2022_pct",
"label": "2022",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2022 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2023_pct",
"label": "2023",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2023 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "cal_return_2024_pct",
"label": "2024",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2024 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": true,
"direction": "higher",
"leaders": [
"VTI"
],
"laggards": [
"VTSAX"
]
},
{
"field": "cal_return_2025_pct",
"label": "2025",
"unit": "percent",
"datatype": "%",
"description": "Calendar-year 2025 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "pro_return_10y_pct",
"label": "10Y Ann. (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return over ten years, before taxes, as printed in the prospectus.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "pro_return_5y_pct",
"label": "5Y Ann. (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return over five years, before taxes, as printed in the prospectus. Stale by up to a year — see Returns As Of.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
},
{
"field": "pro_return_incep_pct",
"label": "Since Inception (Prospectus)",
"unit": "percent",
"datatype": "%",
"description": "Average annual total return since inception, before taxes, as printed in the prospectus.",
"differs": false,
"direction": "higher",
"leaders": [],
"laggards": []
}
// … 12 more items in the full API response
]
},
{
"statement": "Market Cap",
"order": 5,
"metrics": [
{
"field": "large_cap_pct",
"label": "Large Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $10B to $200B.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "market_cap_coverage_pct",
"label": "Cap Coverage",
"unit": "percent",
"datatype": "%",
"description": "Share of equity exposure that resolved to a market cap. US-only source, so international funds run low: VOO 96%, VWO 3%. BELOW 70 THE CAP AND VALUATION COLUMNS ARE BLANKED — do not render them.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "mega_cap_pct",
"label": "Mega Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies above $200B.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "micro_cap_pct",
"label": "Micro Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies below $300M.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "mid_cap_pct",
"label": "Mid Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $2B to $10B.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "size_style",
"label": "Size Style",
"unit": "text",
"datatype": "text",
"description": "Large Cap, Mid Cap, Small Cap or Multi Cap, from the cap ladder. Null below 70% coverage.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "small_cap_pct",
"label": "Small Cap",
"unit": "percent",
"datatype": "%",
"description": "Share of covered equity in companies of $300M to $2B.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "wavg_market_cap_usd",
"label": "Avg Mkt Cap",
"unit": "usd",
"datatype": "int",
"description": "Value-weighted average market capitalisation of the equity holdings. Null below 70% coverage.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Valuation",
"order": 6,
"metrics": [
{
"field": "lookthrough_dividend_yield_pct",
"label": "Look-Through Yield",
"unit": "percent",
"datatype": "%",
"description": "Value-weighted dividend yield of the equity holdings. Arithmetic, because yields are additive. NOT the fund's own distribution yield, which we cannot yet serve.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_ev_ebitda",
"label": "EV/EBITDA",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted enterprise value to EBITDA of the equity holdings.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_pe",
"label": "P/E",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted price/earnings of the equity holdings — the index-provider standard. Loss-makers are excluded rather than dragging the ratio negative. VUG 29.9 vs VTV 20.9 is the growth/value spread.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "lookthrough_ps",
"label": "P/S",
"unit": "number",
"datatype": "int",
"description": "Harmonic weighted price/sales of the equity holdings.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Asset Mix",
"order": 7,
"metrics": [
{
"field": "derivative_pct",
"label": "Derivatives",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in derivatives. Large for inverse and leveraged funds.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "equity_pct",
"label": "Equity",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in equities.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fixed_income_pct",
"label": "Fixed Income",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in bonds and other debt.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "fund_cash_pct",
"label": "Fund & Cash",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in other funds and cash equivalents.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "other_asset_pct",
"label": "Other Assets",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure the classifier had no opinion on. Not an asset class — a coverage gap, and excluded from the Category denominator for that reason.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
]
},
{
"statement": "Sector",
"order": 8,
"metrics": [
{
"field": "sector_basic_materials_pct",
"label": "Basic Materials",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Basic Materials. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_communication_services_pct",
"label": "Communication Services",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Communication Services. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_consumer_discretionary_pct",
"label": "Consumer Discretionary",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Consumer Discretionary. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_consumer_staples_pct",
"label": "Consumer Staples",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Consumer Staples. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_energy_pct",
"label": "Energy",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Energy. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_financial_services_pct",
"label": "Financial Services",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Financial Services. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_healthcare_pct",
"label": "Healthcare",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Healthcare. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
},
{
"field": "sector_industrials_pct",
"label": "Industrials",
"unit": "percent",
"datatype": "%",
"description": "Share of gross exposure in Industrials. Percent of absolute market value, renormalised to 100.",
"differs": false,
"direction": null,
"leaders": [],
"laggards": []
}
// … 6 more items in the full API response
]
}
// … 9 more items in the full API response
],
"identity_fields": [
"ticker",
"fund_name",
"className",
"vehicle",
"series_id"
],
"data_asof": {
"portfolio": "2026-09-08",
"aum": "2026-08-31",
"flows": "2026-08-31",
"price": "2026-09-10",
"total_return": "2026-07-31",
"prospectus": "2026-09-08"
}
},
"data": [
{
"ticker": "VTSAX",
"fund_name": "Vanguard Total Stock Market Index Fund",
"className": "Admiral Shares",
"vehicle": "Mutual Fund",
"series_id": "S000002848",
"benchmark_ticker": "I:SP500",
"cik": 36405,
"class_id": "C000007806",
"data_available": [
"Holdings",
"Flows",
"AUM",
"Returns",
"Profile",
"Prices",
"Ratios"
],
"flows_asof": "2026-06-30",
"lastreportperiod": "2026-07-31",
"net_assets_asof": "2026-06-30",
"price_asof": "2026-09-09",
"pro_returns_asof": "2026-04-28",
"prospectus_date": "2026-04-28",
"total_return_asof": "2026-06-30",
"category": "Equity",
"fund_tags": [
"Index Fund"
],
"geography_focus": "US",
"registrantFullName": "VANGUARD INDEX FUNDS",
"structure_tags": [
"Lends Securities"
],
"acquired_fund_fees_pct": null,
"gross_expense_ratio_pct": 0.04,
"min_initial_investment_usd": 1,
"net_expense_ratio_pct": 0.04,
"net_assets_usd": 2297839156547.89,
"cal_return_2021_pct": 25.71,
"cal_return_2022_pct": -19.53,
"cal_return_2023_pct": 26.01,
"cal_return_2024_pct": 23.74,
"cal_return_2025_pct": 17.12,
"pro_return_10y_pct": 14.24,
"pro_return_5y_pct": 13.06,
"pro_return_incep_pct": null,
"pro_worst_quarter_pct": -20.87,
"return_1m_pct": -1.6,
"return_1y_pct": 16.98,
"return_3m_pct": 3.21,
"return_3y_ann_pct": 19.26,
"return_5y_ann_pct": 10.13,
"return_6m_pct": 12.31,
"return_ytd_pct": 12,
"total_return_12m_pct": 23.1467,
"total_return_1m_pct": -0.329,
"total_return_3m_pct": 15.6587,
"total_return_6m_pct": 11.0684,
"large_cap_pct": 35.85,
"market_cap_coverage_pct": 96.36,
"mega_cap_pct": 57.7,
"micro_cap_pct": 0.13,
"mid_cap_pct": 5.37,
"size_style": "Large Cap",
"small_cap_pct": 0.96,
"wavg_market_cap_usd": 1433247423179,
"lookthrough_dividend_yield_pct": 6.707,
"lookthrough_ev_ebitda": 14.93,
"lookthrough_pe": 24.02,
"lookthrough_ps": 3.11,
"derivative_pct": 0.0893,
"equity_pct": 99.5656,
"fixed_income_pct": 0,
"fund_cash_pct": 0.3451,
"other_asset_pct": 0,
"sector_basic_materials_pct": 2.0662,
"sector_communication_services_pct": 1.3472,
"sector_consumer_discretionary_pct": 8.6377,
"sector_consumer_staples_pct": 4.3502,
"sector_energy_pct": 3.4785,
"sector_financial_services_pct": 12.1175,
"sector_healthcare_pct": 9.6603,
"sector_industrials_pct": 10.0863,
"sector_other_pct": 2.1234,
"sector_real_estate_pct": 2.0545,
"sector_technology_pct": 42.5845,
"sector_utilities_pct": 1.4938,
"top_sector": "Technology",
"top_sector_pct": 43.5084,
"average_coupon_pct": null,
"corporate_pct": 99.9023,
"dated_holdings_count": 0,
"duration_band": null,
"effective_duration_years": null,
"effective_maturity_years": null,
"municipal_pct": 0,
"non_us_sovereign_pct": 0,
"us_agency_gse_pct": 0.0028,
"us_treasury_pct": 0,
"weighted_average_maturity_years": null,
"country_us_pct": 97.6902,
"top_country": "United States",
"holdings_count": 3487,
"short_pct": 0,
"effective_holdings": 61.47,
"top10_weight_pct": 33.2129,
"top1_weight_pct": 6.3949,
"topholding_cusip": "67066G104",
"topholding_name": "NVIDIA Corp.",
"topholding_ticker": "NVDA",
"flow_positive_months_pct": 65.48,
"net_flow_12m_pct": -0.9063,
"net_flow_12m_usd": -20826365151.3199,
"net_flow_1m_pct": 0.1603,
"net_flow_3m_pct": 0.019,
"fund_age_years": 10.21,
"portfolio_turnover_pct": 3,
"credit_spread_hy_10y_usd": null,
"credit_spread_ig_10y_usd": null,
"dv01_10y_bp_per_10k": null,
"liabilities_pct_net_assets": 0.0939,
"tracking_difference_pct": -0.1473,
"tracking_error_pct": 0.0433,
"std_dev_6m_pct": 14.08,
"std_dev_ytd_pct": 13.66,
"std_dev_1y_pct": 13.14,
"std_dev_2y_pct": 16.4,
"std_dev_3y_pct": 15.41,
"std_dev_5y_pct": 17.52,
"max_drawdown_6m_pct": -6.78,
"max_drawdown_ytd_pct": -9.2,
"max_drawdown_1y_pct": -9.2,
"max_drawdown_2y_pct": -19.64,
"max_drawdown_3y_pct": -19.64,
"max_drawdown_5y_pct": -26.2,
"sharpe_6m": 1.442,
"sharpe_ytd": 1.013,
"sharpe_1y": 0.98,
"sharpe_2y": 0.856,
"sharpe_3y": 0.937,
"sharpe_5y": 0.425,
"sortino_6m": 2.204,
"sortino_ytd": 1.501,
"sortino_1y": 1.412,
"sortino_2y": 1.257,
"sortino_3y": 1.364,
"sortino_5y": 0.605,
"alpha_6m_pct": -0.45,
"alpha_ytd_pct": 0.36,
"alpha_1y_pct": -0.46,
"alpha_2y_pct": -0.19,
"alpha_3y_pct": -0.54,
"alpha_5y_pct": -1.07,
"beta_6m": 1.019,
"beta_ytd": 1.02,
"beta_1y": 1.02,
"beta_2y": 1.014,
"beta_3y": 1.018,
"beta_5y": 1.023,
"topholding_kind": "stock"
},
{
"ticker": "VTI",
"fund_name": "Vanguard Total Stock Market Index Fund",
"className": "ETF Shares",
"vehicle": "ETF",
"series_id": "S000002848",
"benchmark_ticker": "I:SP500",
"cik": 36405,
"class_id": "C000007808",
"data_available": [
"Holdings",
"Flows",
"AUM",
"Returns",
"Profile",
"Prices",
"Ratios"
],
"flows_asof": "2026-06-30",
"lastreportperiod": "2026-07-31",
"net_assets_asof": "2026-06-30",
"price_asof": "2026-09-10",
"pro_returns_asof": "2026-04-28",
"prospectus_date": "2026-04-28",
"total_return_asof": "2026-06-30",
"category": "Equity",
"fund_tags": [
"Index Fund"
],
"geography_focus": "US",
"registrantFullName": "VANGUARD INDEX FUNDS",
"structure_tags": [
"Lends Securities"
],
"acquired_fund_fees_pct": null,
"gross_expense_ratio_pct": 0.03,
"min_initial_investment_usd": 1,
"net_expense_ratio_pct": 0.03,
"net_assets_usd": 2297839156547.89,
"cal_return_2021_pct": 25.72,
"cal_return_2022_pct": -19.5,
"cal_return_2023_pct": 26.03,
"cal_return_2024_pct": 23.75,
"cal_return_2025_pct": 17.14,
"pro_return_10y_pct": null,
"pro_return_5y_pct": null,
"pro_return_incep_pct": null,
"pro_worst_quarter_pct": -20.89,
"return_1m_pct": -2.2,
"return_1y_pct": 15.98,
"return_3m_pct": 4.24,
"return_3y_ann_pct": 18.76,
"return_5y_ann_pct": 10.16,
"return_6m_pct": 11.91,
"return_ytd_pct": 11.32,
"total_return_12m_pct": 23.158,
"total_return_1m_pct": -0.3318,
"total_return_3m_pct": 15.6584,
"total_return_6m_pct": 11.0713,
"large_cap_pct": 35.85,
"market_cap_coverage_pct": 96.36,
"mega_cap_pct": 57.7,
"micro_cap_pct": 0.13,
"mid_cap_pct": 5.37,
"size_style": "Large Cap",
"small_cap_pct": 0.96,
"wavg_market_cap_usd": 1433247423179,
"lookthrough_dividend_yield_pct": 6.707,
"lookthrough_ev_ebitda": 14.93,
"lookthrough_pe": 24.02,
"lookthrough_ps": 3.11,
"derivative_pct": 0.0893,
"equity_pct": 99.5656,
"fixed_income_pct": 0,
"fund_cash_pct": 0.3451,
"other_asset_pct": 0,
"sector_basic_materials_pct": 2.0662,
"sector_communication_services_pct": 1.3472,
"sector_consumer_discretionary_pct": 8.6377,
"sector_consumer_staples_pct": 4.3502,
"sector_energy_pct": 3.4785,
"sector_financial_services_pct": 12.1175,
"sector_healthcare_pct": 9.6603,
"sector_industrials_pct": 10.0863,
"sector_other_pct": 2.1234,
"sector_real_estate_pct": 2.0545,
"sector_technology_pct": 42.5845,
"sector_utilities_pct": 1.4938,
"top_sector": "Technology",
"top_sector_pct": 43.5084,
"average_coupon_pct": null,
"corporate_pct": 99.9023,
"dated_holdings_count": 0,
"duration_band": null,
"effective_duration_years": null,
"effective_maturity_years": null,
"municipal_pct": 0,
"non_us_sovereign_pct": 0,
"us_agency_gse_pct": 0.0028,
"us_treasury_pct": 0,
"weighted_average_maturity_years": null,
"country_us_pct": 97.6902,
"top_country": "United States",
"holdings_count": 3487,
"short_pct": 0,
"effective_holdings": 61.47,
"top10_weight_pct": 33.2129,
"top1_weight_pct": 6.3949,
"topholding_cusip": "67066G104",
"topholding_name": "NVIDIA Corp.",
"topholding_ticker": "NVDA",
"flow_positive_months_pct": 65.48,
"net_flow_12m_pct": -0.9063,
"net_flow_12m_usd": -20826365151.3199,
"net_flow_1m_pct": 0.1603,
"net_flow_3m_pct": 0.019,
"fund_age_years": 10.21,
"portfolio_turnover_pct": 3,
"credit_spread_hy_10y_usd": null,
"credit_spread_ig_10y_usd": null,
"dv01_10y_bp_per_10k": null,
"liabilities_pct_net_assets": 0.0939,
"tracking_difference_pct": -0.1473,
"tracking_error_pct": 0.0433,
"std_dev_6m_pct": 14.07,
"std_dev_ytd_pct": 13.58,
"std_dev_1y_pct": 13.11,
"std_dev_2y_pct": 16.6,
"std_dev_3y_pct": 15.51,
"std_dev_5y_pct": 17.58,
"max_drawdown_6m_pct": -6.55,
"max_drawdown_ytd_pct": -9.2,
"max_drawdown_1y_pct": -9.2,
"max_drawdown_2y_pct": -19.59,
"max_drawdown_3y_pct": -19.59,
"max_drawdown_5y_pct": -26.2,
"sharpe_6m": 1.393,
"sharpe_ytd": 0.946,
"sharpe_1y": 0.917,
"sharpe_2y": 0.817,
"sharpe_3y": 0.916,
"sharpe_5y": 0.425,
"sortino_6m": 2.119,
"sortino_ytd": 1.396,
"sortino_1y": 1.317,
"sortino_2y": 1.207,
"sortino_3y": 1.342,
"sortino_5y": 0.607,
"alpha_6m_pct": -0.33,
"alpha_ytd_pct": 0.41,
"alpha_1y_pct": -0.36,
"alpha_2y_pct": -0.33,
"alpha_3y_pct": -0.65,
"alpha_5y_pct": -1.1,
"beta_6m": 1.015,
"beta_ytd": 1.014,
"beta_1y": 1.015,
"beta_2y": 1.028,
"beta_3y": 1.026,
"beta_5y": 1.026,
"topholding_kind": "stock"
}
]
}
5. More Request Examples
Comparisons people actually run.
GET /funds/compare?tickers=VOO,SPY,IVV&api_key=YOUR_API_KEY
GET /funds/compare?tickers=VTI,VOO&api_key=YOUR_API_KEY
GET /funds/compare?tickers=VTSAX,VTI,VITSX&api_key=YOUR_API_KEY
import requests
r = requests.get(
"https://data.businessquant.com/funds/compare",
params={"tickers": "VTSAX,VTI", "api_key": "YOUR_API_KEY"},
timeout=30,
).json()
md = r["metadata"]
rows = {row["ticker"]: row for row in r["data"]}
if md["same_portfolio"]:
print(f"These are share classes of one fund (series {md['series_id']}).")
print("Identical holdings by construction -- compare the wrapper, not the portfolio.\n")
print(f"{md['differing_count']} of {md['metrics_total']} metrics differ:\n")
for group in md["groups"]:
for metric in group["metrics"]:
if not metric["differs"]:
continue
values = " ".join(
f"{t}={rows[t].get(metric['field'])}" for t in md["resolved"]
)
arrow = ""
if metric["direction"]:
arrow = f" ({metric['direction']} is better; leads: {', '.join(metric['leaders']) or 'tie'})"
print(f" {metric['label']:<28} {values}{arrow}")
6. Use Cases
Where a comparison beats two lookups.
"X vs Y" Content Pages
One call fills a whole comparison page, and differs tells you which rows are worth printing. A table of ninety identical values buries the ten that decide the question.
Share-Class Selection
same_portfolio plus the fee rows answer "which wrapper should I buy" directly — the portfolios are identical, so the decision is cost, minimum and account type.
Advisor Fund Swaps
Justify moving a client from one fund to another with the metrics that actually changed, and with direction distinguishing a real improvement from a difference of taste.
Model Portfolio Review
Compare the candidates for one sleeve — up to six at a time — on cost, tracking error and concentration in a single request rather than six.
Only-Differences UIs
Ship a "show only differences" toggle without computing it client-side. The server decides at display precision, so the flag and the rendered table can never disagree.
Screen, Then Compare
Feed the top rows of a Fund Screener result straight in. The screener narrows a universe; this explains the shortlist.
Frequently Asked Questions
The questions developers ask most often about this endpoint.
What does same_portfolio actually tell me?
That every ticker you sent resolves to the same SEC Series ID — they are share classes of one fund, not competing funds. VTSAX and VTI are the canonical example: one portfolio, two wrappers, identical holdings by construction. When it is true, the holdings, sector and concentration rows agreeing is the expected result rather than a sign of missing data, and the comparison is really about fee, minimum and how you buy it.
How is "differs" decided?
At the precision a reader would see, not at float precision. Dollar figures are compacted to three significant figures, percentages to one or two decimals depending on magnitude, counts to whole numbers. So two AUMs that both render as $1.99T are not "different", and a metric is flagged only when the difference would actually be visible. A metric that is null for every fund is an absence, not a difference, and never counts — it is still returned so you can render or hide it as you choose.
Why is direction null on so many metrics?
Because for most of them "better" is an opinion, and the endpoint does not have one. A fund with more assets under management is not a better fund. A higher portfolio turnover is not automatically worse. direction is set only where it is a fact — lower is better for fees, minimums and tracking error; higher is better for returns and flows. tracking_difference_pct is deliberately undirected because it is best near zero, so marking either extreme would be wrong.
Why are leaders and laggards sometimes both empty?
Because every fund leading is nobody leading. If all the compared values are equal — which includes the two-fund tie, where the best and worst value are the same number — both arrays come back empty rather than marking everything green. They are also empty wherever direction is null, since there is no good end to sit at.
What happens if one of my tickers is not a fund?
It is reported in metadata.missing and the comparison proceeds with the rest. If fewer than two tickers resolve, the call returns a 404 naming the ones that were not found — there is nothing to compare. Sending fewer than two, or more than six, returns a 400. Duplicates are collapsed before that count is taken, so tickers=VOO,VOO is one ticker.
Can I compare holdings overlap between two funds?
Not directly — this endpoint compares fund-level metrics, including concentration measures like top10_weight_pct and effective_holdings, but not position-by-position overlap. For that, pull both portfolios from the Fund Holdings API and intersect them on ticker, or use the Portfolio Exposure API to compare sector and country weights without transferring every position.
Is the ETF & Mutual Fund Comparison API free to use?
Yes. A comparison is bounded — at most six named funds, all of which a Free key could already read one at a time — so it is open on every account. What it adds is the analysis, not extra access. The ETF & Mutual Fund Screener API, which ranks the whole universe, is Max and Enterprise. See pricing.