Guide 09 · updated 2026-10-15

Massive (Polygon) API missing minute aggregate bars: check limit and trade conditions

Missing Massive minute bars can reflect a base-aggregate limit or no eligible trades. Finish pagination, then inspect trades and conditions for the exact minute.

By 차도녀 gpt may · Reviewed:

Symptoms

A long /v2/aggs/ticker/.../range/1/minute/... response may stop early or show individual missing minutes. A Python client issue about MMM and HON asks whether several absent minutes reflect eligibility filtering or an ingestion gap. That report does not establish a provider defect or explain those particular minutes.

Cause

Two separate checks are needed. First, the Custom Bars reference says limit counts base aggregates used to calculate results, not the number of final bars. On the documentation checked here it defaults to 5,000 and permits at most 50,000; the aggregate update article explains why a request can end before the requested range. Second, the missing aggregates explanation says a minute with no eligible trade has no bar. Raising limit does not create an ineligible or no-trade bar.

Safe resolution

Split long time ranges into bounded requests, choose a documented limit for the base aggregate volume, and exhaust next_url if present (or use the Python SDK list_aggs iterator). Inspect the timestamp range and queryCount before classifying any missing minute. This dependency-injected example gathers all pages without embedding an API key; fetch_page must be supplied by an authenticated caller:

from urllib.parse import urlparse

def collect_bars(first_url, fetch_page):
    bars, seen = [], set()
    next_url = first_url
    while next_url:
        if urlparse(next_url).hostname != "api.massive.com":
            raise ValueError("Unexpected pagination host")
        if next_url in seen:
            raise ValueError("Pagination loop")
        seen.add(next_url)
        page = fetch_page(next_url)
        if page.get("status") != "OK":
            raise ValueError(f"Aggregate request failed: {page.get('status')}")
        bars.extend(page.get("results", []))
        next_url = page.get("next_url")
    return bars

After the last page, query /v3/trades/{ticker} for the exact absent minute, if entitled. No trades implies a quiet window; trades with no bar require checking each trade’s conditions against the conditions reference endpoint. If access is denied, retain an unknown cause. For charts, mark any forward-filled display point as synthetic and keep it separate from source OHLCV.

Verification

Source review on 2026-10-15 confirms the documented limit and no-eligible-trade rules; no Massive API request or trade-eligibility check was performed. With a synthetic two-page fixture, verify the collector follows next_url, keeps every returned timestamp, and rejects a repeated or foreign continuation URL. Then compare the full requested interval with returned t timestamps and check absent minutes against trades and conditions. A no-trade or ineligible-trade explanation requires those actual endpoint responses; without entitlement, leave the minute unresolved.

Limitations

The MMM/HON report remains an open question here; adjacent active bars do not prove an eligible trade in the absent minute. limit and pagination diagnose range truncation, while conditions diagnose individual omitted intervals. Historical corrections and plan entitlement can affect what a real account sees. No live request, trade-condition lookup, or provider bug confirmation was made.

Sources and verification scope

Source review on 2026-10-15 confirms the documented limit and no-eligible-trade rules; no Massive API request or trade-eligibility check was performed.

Related providers