?>
ESC to close

Fund Flows API

Maintained by Piyush Arora

Last updated:

Track the money entering and leaving any US mutual fund or ETF, one row per month, with net flow and end-of-month net assets sourced from SEC monthly filings rather than estimated from price and shares outstanding. Flows are what separates a fund whose assets grew because the market rose from one whose assets grew because investors bought — VOO's sample window shows $184.6B of gross inflow against $213.2B of outflow for a net of −$28.5B, over a period when its net assets rose. The API is free to use.

Use this endpoint to:

Separate Flow From Market Return Chart Monthly Creations And Redemptions Rank Asset Gatherers
GET https://data.businessquant.com/funds/flows?ticker={ticker}&from_date={from_date}&till_date={till_date}&api_key={api_key}

Related endpoints: Pair with the Fund Overview API for the expense ratio and net assets those flows are moving, and with the Reporting Periods API, whose total_market_value per period gives the portfolio-size series to compare against. To see what the money was actually invested in, use the Fund Holdings API.

1. Request Parameters

One identifier is required. Omit both dates to get the full history on file, which is the usual call — a fund's whole flow series is at most a few hundred rows.

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
from_date
Optional
Start of the window, YYYY-MM-DD. Months are matched on their end date, so any date on or before a month end includes that month.
Example: from_date=2025-01-01
till_date
Optional
End of the window, YYYY-MM-DD. Can be used with or without from_date; it must not be earlier than from_date.
Example: till_date=2025-12-31

Flows are filed, not estimated. Most published flow figures are derived: shares outstanding multiplied by NAV, differenced month over month. That approach folds market movement into the estimate and misses in-kind creations entirely. The figures here come from the fund's own monthly reporting, which is why net_flow_usd and the change in net_assets_usd can move in opposite directions — that gap is the market return, and it is the whole point.

Example cURL Request
curl -X GET "https://data.businessquant.com/funds/flows?ticker=VOO&api_key=YOUR_API_KEY"
Sample Response (VOO)
{
    "metadata": {
        "ticker": "VOO",
        "seriesid": "S000002839",
        "classid": "C000092055",
        "cik": 1004655,
        "fund_name": "Vanguard 500 Index Fund",
        "class_name": "ETF Shares",
        "gross_expense_ratio_pct": 0.03,
        "net_expense_ratio_pct": 0.03,
        "net_assets_usd": 1421263311402.89,
        "net_assets_asof": "2026-03-31",
        "months": 18,
        "period_earliest": "2024-10-31",
        "period_latest": "2026-03-31",
        "total_inflow_usd": 184644924439.78,
        "total_outflow_usd": -213186545274.92,
        "net_flow_usd": -28541620835.14
    },
    "data": [
        {
            "month_end": "2024-10-31",
            "net_flow_usd": 13421654861.76,
            "net_assets_usd": 1349778092481.67,
            "value_out_of_band": false
        },
        {
            "month_end": "2024-11-30",
            "net_flow_usd": 20448056085.66,
            "net_assets_usd": 1349778092481.67,
            "value_out_of_band": false
        },
        {
            "month_end": "2024-12-31",
            "net_flow_usd": 13159359279.62,
            "net_assets_usd": 1349778092481.67,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-01-31",
            "net_flow_usd": 22884984092.39,
            "net_assets_usd": 1321875857336.87,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-02-28",
            "net_flow_usd": 7296584797.13,
            "net_assets_usd": 1321875857336.87,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-03-31",
            "net_flow_usd": 5425658789.89,
            "net_assets_usd": 1321875857336.87,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-04-30",
            "net_flow_usd": 20738466522.85,
            "net_assets_usd": 1487892884605.12,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-05-31",
            "net_flow_usd": 9054546381.16,
            "net_assets_usd": 1487892884605.12,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-06-30",
            "net_flow_usd": -8007267269.39,
            "net_assets_usd": 1487892884605.12,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-07-31",
            "net_flow_usd": -187246736939.71,
            "net_assets_usd": 1409245661643.09,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-08-31",
            "net_flow_usd": 11672369282.71,
            "net_assets_usd": 1409245661643.09,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-09-30",
            "net_flow_usd": -6844697520.06,
            "net_assets_usd": 1409245661643.09,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-10-31",
            "net_flow_usd": 13947366961.93,
            "net_assets_usd": 1474944667479.21,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-11-30",
            "net_flow_usd": 17636697225.74,
            "net_assets_usd": 1474944667479.21,
            "value_out_of_band": false
        },
        {
            "month_end": "2025-12-31",
            "net_flow_usd": 1180238533.52,
            "net_assets_usd": 1474944667479.21,
            "value_out_of_band": false
        },
        {
            "month_end": "2026-01-31",
            "net_flow_usd": 13306023831.47,
            "net_assets_usd": 1421263311402.89,
            "value_out_of_band": false
        },
        {
            "month_end": "2026-02-28",
            "net_flow_usd": 14472917793.95,
            "net_assets_usd": 1421263311402.89,
            "value_out_of_band": false
        },
        {
            "month_end": "2026-03-31",
            "net_flow_usd": -11087843545.76,
            "net_assets_usd": 1421263311402.89,
            "value_out_of_band": false
        }
    ]
}

2. Response Fields

Rows run oldest first, which is the order a time series chart wants. The aggregate totals in metadata are computed across the rows actually returned, so they respect your date filter.

metadata

FieldTypeDescription
ticker, seriesid, classid, cikstringFund and share-class identity.
fund_name, class_namestringRegistered fund name and resolved share class.
net_assets_usd, net_assets_asoffloat, dateLatest reported fund net assets and the date.
monthsintegerNumber of monthly rows returned.
period_earliest, period_latestdateFirst and last month end in the returned window.
total_inflow_usdfloatSum of all positive monthly flows in the window.
total_outflow_usdfloatSum of all negative monthly flows in the window. Always negative or zero.
net_flow_usdfloatInflow plus outflow — net money movement across the whole window.

data — one row per month

FieldTypeDescription
month_enddateLast calendar day of the reporting month.
net_flow_usdfloatNet money in (positive) or out (negative) during the month, in USD.
net_assets_usdfloatFund net assets at that month end, in USD.
value_out_of_bandbooleantrue when the filed figure fell outside the expected range during ingestion — treat those months as suspect rather than dropping them silently.

value_out_of_band is a real boolean. The upstream source stores this flag as text, which means a naive pass-through yields the string "False" — truthy in JavaScript, and enough to make a chart suppress every bar as bad data. It is coerced to a genuine JSON boolean here, so if (row.value_out_of_band) behaves the way you expect.

3. Response Viewer

A real response for ticker=VOO. The centred bar is drawn in this page from net_flow_usd and is not part of the payload.

API Response — Monthly Fund Flows

Vanguard 500 Index Fund  ·  ticker=VOO

Fund Vanguard 500 Index Fund
Months 18
Total Inflow $184.64B
Total Outflow -$213.19B
Net Flow -$28.54B
Month End Net Flow Direction Net Assets Flagged
2024-10-31 +$13.42B
$1.35T
2024-11-30 +$20.45B
$1.35T
2024-12-31 +$13.16B
$1.35T
2025-01-31 +$22.88B
$1.32T
2025-02-28 +$7.30B
$1.32T
2025-03-31 +$5.43B
$1.32T
2025-04-30 +$20.74B
$1.49T
2025-05-31 +$9.05B
$1.49T
2025-06-30 -$8.01B
$1.49T
2025-07-31 -$187.25B
$1.41T
2025-08-31 +$11.67B
$1.41T
2025-09-30 -$6.84B
$1.41T
2025-10-31 +$13.95B
$1.47T
2025-11-30 +$17.64B
$1.47T
2025-12-31 +$1.18B
$1.47T
2026-01-31 +$13.31B
$1.42T
2026-02-28 +$14.47B
$1.42T
2026-03-31 -$11.09B
$1.42T

4. More Request Examples

The date filters are independent — either, both, or neither.

Full flow history on file
https://data.businessquant.com/funds/flows?ticker=VOO&api_key=YOUR_API_KEY
One calendar year
https://data.businessquant.com/funds/flows?ticker=VOO&from_date=2025-01-01&till_date=2025-12-31&api_key=YOUR_API_KEY
Everything since a date
https://data.businessquant.com/funds/flows?ticker=ARKK&from_date=2025-06-01&api_key=YOUR_API_KEY
By Series ID
https://data.businessquant.com/funds/flows?seriesid=S000002839&api_key=YOUR_API_KEY

5. Use Cases

Flow data answers questions that price and assets alone cannot.

Organic Growth vs Market Return

Assets under management rise for two reasons and only one of them reflects on the manager. Subtract cumulative net_flow_usd from the change in net_assets_usd to isolate market return from asset gathering.

Redemption Pressure Monitoring

Sustained negative flow forces a manager to sell into whatever market exists. Combine a run of outflow months with the Fund Holdings API to see which positions were likely liquidated to meet it.

Sentiment Signals By Theme

Aggregate flows across a set of thematic ETFs to build a sector-rotation indicator from where retail and institutional money is actually going, rather than from commentary about it.

Fund Launch And Ramp Analysis

The first months of a fund's flow series show how quickly it gathered assets. period_earliest marks the start of reporting, which for a young fund is close to its launch.

Capacity And Liquidity Risk

A small-cap fund taking in large monthly inflows may be approaching the capacity of its strategy. Flow against portfolio position sizes from the Fund Holdings API is how that is measured.

Fee Revenue Modelling

Monthly net assets multiplied by the expense ratio from the Fund Overview API gives a monthly revenue estimate for the manager, and the flow series shows how that base is trending.

Frequently Asked Questions

The questions developers ask most often about this endpoint.

How are these flows calculated?

They are not calculated — they come from the fund's own monthly reporting to the SEC. The common alternative is to derive flows by differencing shares outstanding times NAV, which folds market movement into the estimate and misses in-kind creation and redemption entirely. That is why a month here can show negative net flow while net assets rise: the market made up the difference.

Why does net_flow_usd not equal the change in net_assets_usd?

Because net assets change for two independent reasons: money moving in or out, and the market value of the portfolio moving. The difference between the two series is the fund's market return over the month, which is usually the more interesting of the two figures to extract.

What does value_out_of_band mean and should I drop those rows?

It flags a month where the filed figure fell outside the expected range during ingestion. It is surfaced rather than silently suppressed so you can decide — usually the right treatment is to plot the month but mark it, rather than to drop it and leave an unexplained gap in the series. It is a genuine JSON boolean, not the string "False".

Are flows reported per share class or for the whole fund?

For the fund, at the series level. All share classes of one fund share a single flow series, so VOO and VFIAX return the same rows — the identity block in metadata differs because it describes the class you asked for, but seriesid is the same and so is the data.

How much history is available?

It varies by fund and depends on when monthly reporting began for that series. metadata.period_earliest and period_latest report the actual window returned, and months the row count — check those rather than assuming a fixed depth.

Is the Fund Flows API free to use?

Yes, the API is free to use. Sign up for an API key and start pulling monthly fund flow histories immediately — no credit card required.