Fund Reporting Periods API
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:
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.
| Parameter | Description |
|---|---|
| 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.
curl -X GET "https://data.businessquant.com/funds/periods?ticker=IVV&api_key=YOUR_API_KEY"
{
"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
| Field | Type | Description |
|---|---|---|
| ticker, seriesid, classid, cik | string | Fund and share-class identity, as returned by every /funds endpoint. |
| fund_name, class_name | string | Registered fund name and the resolved share class name. |
| gross_expense_ratio_pct, net_expense_ratio_pct | float | Expense ratios for the resolved share class. |
| net_assets_usd, net_assets_asof | float, date | Fund net assets and the date they were reported. |
| period_count | integer | Number of reporting periods on file. |
| period_latest | date | Most recent reporting period. This is what /funds/holdings returns when period is omitted. |
| period_earliest | date | Oldest reporting period on file for this fund. |
data — one row per reporting period
| Field | Type | Description |
|---|---|---|
| reportperiod | date | The reporting date, YYYY-MM-DD. Pass this verbatim as period on the holdings endpoint. |
| holdings_count | integer | Number of positions the fund reported at that date. |
| total_market_value | float | Sum 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
| # | 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.
https://data.businessquant.com/funds/periods?ticker=IVV&api_key=YOUR_API_KEY
https://data.businessquant.com/funds/periods?seriesid=S000002839&api_key=YOUR_API_KEY
https://data.businessquant.com/funds/holdings?ticker=IVV&period=2024-12-31&limit=500&api_key=YOUR_API_KEY
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.