?>
ESC to close

Fund Reporting Periods API

Maintained by Piyush Arora

Last updated:

List every portfolio reporting period a fund has on file, newest first, each with the number of positions it held and the total market value of the portfolio at that date. This is the discovery call for the holdings endpoints: every value it returns is a valid period argument, and the counts let you spot a period worth looking at before transferring any of it. Reporting dates are as-filed, not calendar quarter-ends — IVV's most recent periods include 2026-08-21 and 2026-07-07. The API is free to use.

Use this endpoint to:

Populate A Period Picker Detect New Filings Size A Portfolio Before Fetching It
GET https://data.businessquant.com/funds/periods?ticker={ticker}&api_key={api_key}

Related endpoints: Pass any reportperiod from this list to the Fund Holdings API to pull that portfolio in full, or to the Portfolio Exposure API for a bucketed roll-up of it. To get every period at once as a matrix instead of one at a time, use the Holdings Over Time API. For fees and objective, see the Fund Overview API.

1. Request Parameters

One identifier, nothing else. The response is small enough — a few dozen rows at most — that there is nothing to filter or paginate.

ParameterDescription
api_key
Required
Your unique API key for authentication.
ticker
Conditional Identifier
The fund or ETF ticker. A ticker identifies a share class, not a fund — VOO and VFIAX are two classes of the same portfolio, so the fees you get back are the ones that class charges. Either ticker or seriesid is required.
Example: ticker=VOO
seriesid
Conditional Identifier
The SEC Series ID of the fund. Resolves to the fund's lowest-cost share class. Use this when you want the fund rather than a particular class, or for funds that have no ticker of their own.
Example: seriesid=S000002839

Why this endpoint exists. A period picker has to be drawn before the reader has chosen anything. Fetching a 500-position portfolio just to learn which quarters exist wastes both a round trip and the transfer; this call answers the same question in a few hundred bytes.

Example cURL Request
curl -X GET "https://data.businessquant.com/funds/periods?ticker=IVV&api_key=YOUR_API_KEY"
Sample Response (IVV)
{
    "metadata": {
        "ticker": "IVV",
        "seriesid": "S000004310",
        "classid": "C000012040",
        "cik": 1100663,
        "fund_name": "iShares Core S&P 500 ETF",
        "class_name": "iShares Core S&P 500 ETF",
        "gross_expense_ratio_pct": 0.03,
        "net_expense_ratio_pct": 0.03,
        "net_assets_usd": 720543356320.99,
        "net_assets_asof": "2026-03-31",
        "period_count": 8,
        "period_latest": "2026-08-21",
        "period_earliest": "2024-12-31"
    },
    "data": [
        {
            "reportperiod": "2026-08-21",
            "holdings_count": 508,
            "total_market_value": 884421210499.77
        },
        {
            "reportperiod": "2026-07-07",
            "holdings_count": 509,
            "total_market_value": 887767346144.75
        },
        {
            "reportperiod": "2026-03-31",
            "holdings_count": 507,
            "total_market_value": 721079727330.96
        },
        {
            "reportperiod": "2025-12-31",
            "holdings_count": 507,
            "total_market_value": 761901540623.45
        },
        {
            "reportperiod": "2025-09-30",
            "holdings_count": 507,
            "total_market_value": 703600482611.75
        },
        {
            "reportperiod": "2025-06-30",
            "holdings_count": 508,
            "total_market_value": 625581446505.93
        },
        {
            "reportperiod": "2025-03-31",
            "holdings_count": 508,
            "total_market_value": 582417536396.68
        },
        {
            "reportperiod": "2024-12-31",
            "holdings_count": 506,
            "total_market_value": 589113968237.25
        }
    ]
}

2. Response Fields

The usual metadata / data envelope. The identity block in metadata is identical across every endpoint in this group, so a client can render a fund header from any of them.

metadata

FieldTypeDescription
ticker, seriesid, classid, cikstringFund and share-class identity, as returned by every /funds endpoint.
fund_name, class_namestringRegistered fund name and the resolved share class name.
gross_expense_ratio_pct, net_expense_ratio_pctfloatExpense ratios for the resolved share class.
net_assets_usd, net_assets_asoffloat, dateFund net assets and the date they were reported.
period_countintegerNumber of reporting periods on file.
period_latestdateMost recent reporting period. This is what /funds/holdings returns when period is omitted.
period_earliestdateOldest reporting period on file for this fund.

data — one row per reporting period

FieldTypeDescription
reportperioddateThe reporting date, YYYY-MM-DD. Pass this verbatim as period on the holdings endpoint.
holdings_countintegerNumber of positions the fund reported at that date.
total_market_valuefloatSum of the absolute market value of every position, in USD. Absolute because a short position carries a negative market value and would otherwise net against the longs.

Reporting dates are as-filed. They are frequently, but not reliably, quarter-ends. Funds file on their own fiscal calendars and some report mid-month, so never construct a period string yourself — read it from this endpoint. A period a fund does not have returns a 404 from the holdings endpoint rather than the nearest match.

3. Response Viewer

A real response for ticker=IVV. The rightmost column is not part of the payload — it is computed in this page from consecutive total_market_value values, to show what the data supports.

API Response — Reporting Periods

iShares Core S&P 500 ETF  ·  ticker=IVV

Fund iShares Core S&P 500 ETF
Ticker IVV
Periods 8
Latest 2026-08-21
Earliest 2024-12-31
# Report Period Positions Total Market Value Change vs Prior
1 2026-08-21 508 $884.42B -0.4%
2 2026-07-07 509 $887.77B +23.1%
3 2026-03-31 507 $721.08B -5.4%
4 2025-12-31 507 $761.90B +8.3%
5 2025-09-30 507 $703.60B +12.5%
6 2025-06-30 508 $625.58B +7.4%
7 2025-03-31 508 $582.42B -1.1%
8 2024-12-31 506 $589.11B

4. More Request Examples

The call takes one identifier, so the variations are all in what you do with the answer.

Periods for an index ETF
https://data.businessquant.com/funds/periods?ticker=IVV&api_key=YOUR_API_KEY
Periods by Series ID
https://data.businessquant.com/funds/periods?seriesid=S000002839&api_key=YOUR_API_KEY
Then pull the oldest portfolio on file
https://data.businessquant.com/funds/holdings?ticker=IVV&period=2024-12-31&limit=500&api_key=YOUR_API_KEY
Or the bucketed view of that same period
https://data.businessquant.com/funds/exposure?ticker=IVV&breakdown=sector&periods=1&api_key=YOUR_API_KEY

5. Use Cases

Small endpoint, but it sits in front of every expensive one.

Period Picker Population

Bind data straight to a dropdown. Each option already carries its position count and portfolio value, so the picker can show what the reader is about to load.

New Filing Detection

Poll period_latest and compare it to what you stored. A change means a fresh N-PORT has landed and the holdings for that fund are worth re-pulling; nothing else needs to be fetched to find out.

Backfill Planning

Iterate data to enumerate exactly which periods exist before scheduling a backfill, instead of guessing quarter-ends and taking 404s for the ones a fund never filed.

Asset Growth Curve

total_market_value per period is a portfolio-size series that needs no second call. Combine it with the Fund Flows API to separate growth that came from inflows from growth that came from the market.

Portfolio Concentration Drift

A fund whose holdings_count falls from 509 to 508 while its market value rises is concentrating. The count alone is a cheap early signal worth tracking.

Coverage Auditing

period_count and period_earliest tell you how much history a given fund actually has before you build an analysis that assumes more.

Frequently Asked Questions

The questions developers ask most often about this endpoint.

Are reporting periods always quarter-ends?

No. They are the dates the fund actually filed, which are frequently but not reliably quarter-ends. IVV's recent periods include 2026-08-21 and 2026-07-07. Always read the period from this endpoint rather than constructing one — a date a fund did not file returns 404 from the holdings endpoint, not the nearest match.

How far back does the history go?

The underlying store holds 56 distinct reporting periods spanning 2022-06-30 to 2026-08-21 across 13,929 fund series. Any individual fund has only the periods it filed within that window, which is what period_count and period_earliest report — a fund launched in 2025 will have a handful, not 56.

Why is total_market_value larger than the fund's net assets?

Because it sums the absolute value of every position, and a fund can hold leveraged or derivative exposure whose notional market value exceeds the net assets backing it. Short positions carry a negative market value and are counted at their absolute size, so they add to the total rather than netting against the longs.

What does this return for a fund that files no portfolio?

A 404 with a message saying so. Certain unit investment trusts — SPY and DIA among them — file no N-PORT portfolio of their own, so they resolve on the Fund Overview API but have no reporting periods and no holdings here.

Is the Fund Reporting Periods API free to use?

Yes, the API is free to use. Sign up for an API key and start enumerating fund reporting periods immediately — no credit card required.