Introducing

Announcing Massive + ETF Global® Partnership: Constituents, Fund Flows, Analytics, Profiles, and Taxonomies

Jan 7, 2026

TL;DR — Massive has partnered with ETF Global® to bring institutional-grade ETF data directly into the Massive API. With five new endpoints covering constituents, fund flows, proprietary analytics, profiles, and taxonomies, developers get normalized, daily-updated insight into ETF holdings, capital movements, risk/reward metrics, and classifications across 3,000+ global ETFs—all accessible through streamlined API calls with flexible add-on subscriptions.


Accessing comprehensive and normalized ETF data, from detailed holdings and investor flows to proprietary analytics and classifications, has historically been a challenge, often requiring piecing together disparate sources for screening, modeling, or strategy development. Massive's new partnership with ETF Global® changes that. ETF Global®, a leading independent provider of ETF research, data, and analytics, now delivers its institutional-grade datasets through Massive's API. This includes complete transparency into fund compositions, capital movements, risk metrics, exposures, and taxonomies across thousands of global ETFs.

The ETF Global® endpoints provide normalized data for quarterly, daily, and historical frequencies, enabling everything from portfolio optimization to sentiment analysis. Additionally, proprietary scores like risk, reward, and quantitative grades combine with fund flows and profiles to offer a daily snapshot of ETF health and trends, all in streamlined API calls.

Access Requirements: These endpoints require specific ETF Global® add-ons, available as flexible subscriptions starting at $99/month per data type.

What's new (at a glance)

We've launched five new REST API endpoints through this partnership:

  • Constituents: /etf-global/v1/constituents - Underlying holdings and weights for ETFs (ticker, weight, market value, shares held, identifiers like CUSIP, ISIN, FIGI). Historical (10+ years), processed daily. Use for exposure analysis and rebalancing checks.
  • Fund Flows: /etf-global/v1/fund-flows - Capital inflows/outflows and NAV (fund flow amount, shares outstanding, NAV). Processed daily. Use for trend identification and investor sentiment tracking.
  • Analytics: /etf-global/v1/analytics - Proprietary risk, reward, and quantitative scores (risk scores like volatility and liquidity, quant grades A-F, sentiment/technical metrics). Process daily. Use for risk-reward balancing and performance evaluation.
  • Profiles: /etf-global/v1/profiles - Metadata, exposures, and financial details (AUM, expense ratios, sector/geographic exposures, issuer info). As processed, with effective dates. Use for fund comparison and due diligence.
  • Taxonomies: /etf-global/v1/taxonomies - Classification frameworks for strategies and characteristics (asset class, focus, leverage style, rebalance frequency, weighting methodology). Static/updated as needed. Use for targeted searches and strategy classification.

Coverage: Over 3,000+ ETFs, with trillions of rows of data and petabytes of raw information, focusing on US, Canadian, and European markets.


How to use the new endpoints

Each endpoint is designed for developer ease, with support for pagination, sorting, and filtering by dates or tickers. Below, we walk through each with use cases, explanations, and Python examples using the

massive.RESTClient
.

Constituents

Purpose: Gain transparency into ETF holdings for exposure analysis and rebalancing checks.
Sample Use Cases:

  • Portfolio overlap detection between ETFs.
  • Screening for ETFs with specific stock weights (e.g., tech-heavy funds).

Python Example:

from massive import RESTClient
import json

client = RESTClient(api_key="KEY")
response = client.list_etf_global_constituents(
    composite_ticker="SPY",
    effective_date="2025-11-01",
    raw=True
)
json_data = json.loads(response.data.decode('utf-8'))
print(json.dumps(json_data, indent=2))

Sample Response (truncated):

{
  "status": "OK",
  "results": [
    {
      "composite_ticker": "SPY",
      "constituent_ticker": "AAPL",
      "constituent_name": "Apple Inc.",
      "weight": 0.072,
      "market_value": 1500000000.0,
      "shares_held": 5000000.0,
      "isin": "US0378331005",
      "figi": "BBG000B9XRY4",
      "effective_date": "2025-11-01",
      "processed_date": "2025-11-02"
    }
  ]
}

Fund Flows

Purpose: Track investor sentiment and capital movements for trend identification.
Sample Use Cases:

  • Alerting on massive inflows into sector ETFs.
  • Correlating flows with market performance for predictive models.

Python Example:

response = client.list_etf_global_fund_flows(
    composite_ticker="SPY",
    effective_date="2025-11-01",
    raw=True
)

Sample Response (truncated):

{
  "status": "OK",
  "results": [
    {
      "composite_ticker": "SPY",
      "effective_date": "2025-11-01",
      "fund_flow": 500000000.0,
      "nav": 450.25,
      "shares_outstanding": 1000000000.0,
      "processed_date": "2025-11-02"
    }
  ]
}

Analytics

Purpose: Evaluate ETF performance with proprietary metrics for risk-reward balancing.
Sample Use Cases:

  • Screening for high-reward, low-risk ETFs (e.g., quant score > 80).
  • Building dashboards with sentiment and technical scores.

Python Example:

response = client.list_etf_global_analytics(
    composite_ticker="SPY",
    raw=True
)

Sample Response (truncated):

{
  "status": "OK",
  "results": [
    {
      "composite_ticker": "SPY",
      "risk_total_score": 75.5,
      "reward_score": 82.3,
      "quant_total_score": 78.0,
      "quant_grade": "B",
      "quant_composite_technical": 85.0,
      "effective_date": "2025-11-01"
    }
  ]
}

Profiles

Purpose: Access metadata and exposures for fund comparison and due diligence.
Sample Use Cases:

  • Comparing expense ratios and AUM across issuers.
  • Analyzing geographic or sector exposures for diversification.

Python Example:

response = client.list_etf_global_profiles(
    composite_ticker="SPY",
    raw=True
)

Sample Response (truncated):

{
  "status": "OK",
  "results": [
    {
      "composite_ticker": "SPY",
      "aum": 500000000000.0,
      "management_fee": 0.0009,
      "sector_exposure": {"technology": 0.321, "financials": 0.132},
      "geographic_exposure": {"US": 0.967},
      "inception_date": "1993-01-22"
    }
  ]
}

Taxonomies

Purpose: Classify ETFs by strategies and structures for targeted searches.
Sample Use Cases:

  • Filtering for passive, market-cap-weighted equity ETFs.
  • Researching leverage styles or rebalance frequencies.

Python Example:

response = client.list_etf_global_taxonomies(
    composite_ticker="SPY",
    raw=True
)

Sample Response (truncated):

{
  "status": "OK",
  "results": [
    {
      "composite_ticker": "SPY",
      "asset_class": "Equity",
      "focus": "Large Cap",
      "leverage_style": "Unleveraged",
      "weighting_methodology": "Market Cap",
      "rebalance_frequency": "Quarterly",
      "primary_benchmark": "S&P 500"
    }
  ]
}


Endpoint Details & Developer Notes

  • Pagination & Sorting: Use
    limit
    (up to 5000) and
    sort
    (e.g.,
    weight.desc
    ) for efficient queries;
    next_url
    for additional pages.
  • Date Handling: Parameters like
    effective_date
    and
    processed_date
    account for issuer delays (e.g., Vanguard data lags).
  • Fields Coverage: Responses include optional fields to handle varying data availability; nulls are omitted where inapplicable.
  • Timeframe Support: Daily updates for flows and analytics; historical for constituents and taxonomies.


Methodology & Expectations

ETF Global®'s data is processed daily, with proprietary scores derived from factors like volatility, sentiment, and fundamentals. Metrics are computed using standardized frameworks, ensuring consistency across global markets. Expect high uptime (99.99%) and massive scale, with no misleading nulls. Fields are omitted if calculations fail (e.g., due to zero denominators).


Demo

To show how the ETF Global® endpoints can be combined into a real-world research workflow, we built the ETF Health Pulse Dashboard. It is a Streamlit application that turns raw API responses into analytics, anomaly detection, and narrative insights.

The full code is available in our GitHub community space.

Below is a step-by-step walkthrough to run it locally and understand what it’s doing under the hood.


Step 1: Clone the repository

Start by cloning the Massive community repository and navigating to the ETF Global® demo directory:

git clone https://github.com/massive-com/community.git
cd community/examples/rest/partner-etf-global


Step 2: Install prerequisites

This demo requires:

  • Python 3.11+
  • uv for dependency management
  • A Massive API key with ETF Global® add-on entitlements

If you don’t already have uv installed, you can install it with:

curl -Ls https://astral.sh/uv/install.sh | sh


Step 3: Install dependencies with uv

All dependencies are defined in the project configuration. Install them with a single command:

uv sync


Step 4: Configure your API key

Copy the example environment file and add your Massive API key:

cp .env.example .env

Edit .env and set:

MASSIVE_API_KEY=your_api_key_here


Step 5: Run the dashboard

Launch the Streamlit app using uv:

uv run streamlit run streamlit_app.py

Once running, Streamlit will open a local dashboard where you can interactively explore ETF data.


What the demo shows

The dashboard is organized around several panels, each mapped directly to ETF Global® endpoints and common research tasks.

Actionable Highlights

This section synthesizes multiple endpoints into plain-English insights:

  • Calculates holdings concentration (HHI) from /constituents
  • Classifies recent inflow/outflow regimes using /fund-flows
  • Surfaces ETF Global® risk, reward, and quant grades from /analytics
  • Adds context from /profiles and /taxonomies to produce narrative summaries suitable for research hand-offs

Exposure Concentration Watch

Using ETF constituents data, the demo:

  • Automatically detects the most recent available holdings date
  • Deduplicates holdings for accurate exposure analysis
  • Visualizes top holdings and concentration tiers
  • Flags low, moderate, or high concentration using DOJ/FTC HHI thresholds

Fund Flow Momentum Detector

Powered by daily fund flows and NAV data, this panel:

  • Builds rolling windows (default 30 days) of flows
  • Computes z-scores to highlight abnormal inflows or outflows
  • Visualizes momentum shifts that often signal rotation or sentiment changes

Risk / Reward Scorecard

Using ETF Global®’s proprietary analytics, the dashboard:

  • Fetches the most recent risk, reward, and quant scores
  • Renders a polar chart for quick qualitative comparison
  • Translates numeric scores into readable tiers for faster screening

Profile & Taxonomy Contextualizer

Finally, the demo pulls metadata and classifications to round out due diligence:

  • Displays AUM, fees, sector exposure, and trading details
  • Extracts taxonomy tags like asset class, focus, weighting methodology, and rebalance cadence
  • Shows raw JSON payloads for developers who want programmatic access


Performance and design notes

To keep the dashboard fast and responsive, the demo:

  • Limits API requests to the most relevant records
  • Sorts all endpoints by processed_date.desc to fetch fresh data first
  • Uses smart caching to minimize redundant calls
  • Gracefully handles missing data and entitlement errors with clear messaging


This demo is intentionally designed to be both educational and extensible. You can run it as-is to explore ETF Global® data, or use it as a reference for building your own research tools, dashboards, or production workflows on top of Massive’s API.

Clone the repo, add your API key, and start exploring ETF data at scale.

From the blog

See what's happening at Massive

polygon is now massive Feature Image
announcement

Polygon.io is Now Massive

Polygon.io is now Massive.com. The rebrand reflects our focus on scale, reliability, and continued innovation. Your APIs, accounts, and integrations continue to work without interruption.

Justin

editor