MFPRO Scheme Master: Every India Mutual Fund Scheme in One Small File, Free
Published: August 1, 2026
One row for every mutual fund scheme in AMFI's public records from April 2006 onward, all 38,000 of them, with the fund's name, AMC, category, plan, option, first and last NAV dates, its latest average AUM and its latest NAV. About 9 MB as plain CSV, 1 MB compressed, no key and no sign-up. Take it as a one-click download from the app, or fetch it from code, whichever suits you. It opens in Excel. Paired with the full NAV history download, it gives you the same universe that runs the MFPRO app itself.
What this is
MFPRO's NAV API has always been able to give you a fund's full price history once you know its scheme code. The gap was everything around the scheme, what it is called today, who runs it, which category it sits in, whether it is still alive, how big it is. That information was reachable through search, one query at a time.
The scheme master is all of it in one file, and you have the whole scheme universe on your machine to slice however you want.
How do I get it?
Two ways, and they hand you exactly the same file. Pick whichever suits how you work.
1. Click and download it
No code needed at all. Go to the MFPRO app, Data and API tab, and under Download Scheme Master pick your format: CSV at about 9 MB, zipped CSV at 1.1 MB, or Parquet at 1.6 MB. One click, and it saves like any other file. The plain CSV opens straight in Excel, so if all you want is to sort and filter 38,000 schemes in a spreadsheet, you are done at that point. The full NAV history sits on the same page under Download Full Database, in CSV, TSV, Parquet or SQLite.
2. Call it from code
Same files, fetched over HTTP, no key and no sign-up:
https://api.tigzig.com/mf/v1/download?format=latest
That is the plain CSV. Add latest.csv.gz, latest.csv.zip or latest.parquet for the other three. pd.read_csv and pd.read_parquet both work directly off the URL with no download step, which makes it a one-line refresh inside a script or a notebook.
Everything below this point applies whichever route you took. The columns, the quirks and the tips are about the data itself rather than about how you fetched it.
What you get in it
22 columns per scheme, and they group into five ideas:
Who it is.
scheme_code(AMFI's number, the key you use everywhere else in this API),isinandisin2, whereisin2is the IDCW reinvestment ISIN for the schemes that have one, the same scheme and the same NAV series, so a lookup works with either. Thenscheme_nameas filed today,amc, andtxic_code, our own readable short code.What it is.
scheme_type(open, close, interval), the full rawcategorytext as AMFI files it,category_sub(the SEBI sub-category, Small Cap Fund and so on),category_group(AMFI's own group header) andcategory_group_clean, which is the tidy four-value version, Equity, Debt, Hybrid, Other.How it is sold.
scheme_plan(Direct, Regular, Other) andscheme_option(Growth, IDCW, Bonus, Other).Its lifespan.
first_dateandlast_date, the first and last dates it published a NAV, plusis_activeandis_stale.Its size and price.
aaum_cr, the latest quarterly average AUM in crore, withaaum_quarterandaaum_quarter_endtelling you which quarter, andnav_dateplusnavfor the latest published NAV.
About 8,600 of the schemes are live. The other 29,000 or so have matured or merged, and they are in the file on purpose, carrying their final NAV frozen at the day they stopped publishing. That is what lets you run a long-run study on this data survivorship-bias free, with the funds that died still in the sample.
How you would actually use it
Can I do all of this in Excel, without writing any code?
For most of it, yes. Download the CSV, double-click, and you have 38,000 rows and 22 columns you can filter and sort like any other sheet. Filter is_active to TRUE, category_group_clean to Equity Scheme, scheme_plan to Direct, sort by aaum_cr descending, and you have the biggest active Direct equity schemes in the country in about thirty seconds, with their scheme codes in the first column ready to paste wherever you need them. Questions like "which AMCs run Small Cap funds" or "how many Direct Growth schemes exist" are a filter and a row count. The one thing worth doing in a formula rather than a filter is track-record length, since that is nav_date minus first_date.
I want a subset before I do any real analysis. How?
This is what the file is best at. Say you want every active equity scheme from three fund houses, above a size threshold, with at least ten years of published history, Direct plan, Growth option. That is one filter step:
import pandas as pd
df = pd.read_csv("https://api.tigzig.com/mf/v1/download?format=latest")
df["first_date"] = pd.to_datetime(df.first_date)
df["nav_date"] = pd.to_datetime(df.nav_date)
df["years"] = (df.nav_date - df.first_date).dt.days / 365.25
picks = df[(df.is_active) &
(df.category_group_clean == "Equity Scheme") &
(df.amc.str.contains("HDFC|ICICI|SBI", case=False, na=False)) &
(df.aaum_cr > 500) &
(df.years >= 10) &
(df.scheme_plan == "Direct") &
(df.scheme_option == "Growth")]
codes = picks.scheme_code.tolist()
That returns 39 schemes carrying about Rs 2.9 lakh crore between them, HDFC Flexi Cap, HDFC Mid Cap, ICICI Prudential Large Cap, SBI Contra and the rest. Now you have your scheme codes, and you go get the NAVs.
One note on "ten years of history"
The file carries first_date, the first date a scheme published a NAV in AMFI's records, which is not quite the same thing as the fund's launch date. For a fund launched after April 2006 the two are close enough to use as a proxy for track-record length, which is how the filter above uses it. For a fund that predates that, the NAV record starts in April 2006 where AMFI's published archive starts, so read the column as "how much history you can actually analyse" rather than "how old the fund is". For a backtest, the first of those is the number you want anyway.
I have my scheme codes. What next?
Three routes, depending on how many you picked.
A handful. Call
/navone scheme at a time, or addlatest=trueif you only want today's number rather than the whole series.A basket. Up to 50 codes in a single call with
?schemes=code1,code2,..., which is what you want for a portfolio.A few hundred, or the lot. Stop calling the API and take the full history file instead,
?format=parquet, about 170 MB, 37 million rows, every scheme, every day back to April 2006.
Can I skip the API completely?
Yes. Both files are static downloads. Take them once, load them into DuckDB, SQLite, pandas, Excel, whatever you use, and query offline as much as you like. The files are rebuilt three times a day, so re-download when you want fresh numbers.
Scheme Master + Full NAV History = the whole universe
The two downloads are built to be used together, and this is the combination worth setting up once.
The scheme master is the index. 38,000 rows, about 9 MB, one row per scheme, everything you need to decide which funds you care about. The full NAV history is every price ever published, 37 million rows back to April 2006, about 170 MB as parquet.
import pandas as pd
master = pd.read_csv("https://api.tigzig.com/mf/v1/download?format=latest")
navs = pd.read_parquet("https://api.tigzig.com/mf/v1/download?format=parquet")
df = navs.merge(master, on="scheme_code")
Join them on scheme_code and you have, sitting locally, the same universe the MFPRO app itself runs on. No rate limit, no pagination, no network in the loop, and no scraping AMFI. Rolling returns, drawdowns, category comparisons, AMC-level rollups, survivorship-free backtests that include the funds that died, all of it becomes a query against your own machine.
The reason to take both rather than only the big one is that the scheme master is what makes the big file usable. Filtering 38,000 rows to pick your scheme codes takes no time, whereas searching 37 million NAV rows for the same funds by name, with no category or AMC column to filter on, is slow and easy to get wrong.
Quirks worth knowing before you trust a number
Every one of these produces a plausible-looking wrong answer rather than an error, which is why they are worth reading once.
The NAV column is not "today's NAV" for every row
It is each scheme's most recent NAV. For the 29,000 matured schemes, that is their final NAV from whenever they wound up, sometimes ten or fifteen years ago. Take an average NAV across the file and you have mixed 2026 prices with 2011 prices. Filter is_active, and read nav_date to see how fresh each row is.
One scheme code is one plan-and-option variant, not a fund
This one catches everybody once. Aditya Birla Sun Life Value Fund is four rows in this file, two Growth and two IDCW, spread across Direct, Regular and an older pre-2013 code that classifies as plan Other, each row with its own scheme code and its own slice of the AUM. Quote any single row as "the fund's size" and you understate it badly, in that case by about nine tenths. To size a fund, group by AMC and base name and sum. To count funds rather than variants, do the same before counting.
Blanks are common, and they usually mean something
A blank is rarely missing data here. category_sub is blank for a large share of the file, roughly 25,000 rows, because AMFI never assigned a modern SEBI sub-category to old-style schemes from before 2018, the ones filed simply as Income or Growth. That is by design, and their raw label is still sitting in the category column. Similarly aaum_cr is blank for almost all matured schemes, since AMFI stops publishing an AUM once a fund is gone, and isin is blank for about 9,000 mostly old schemes that never had one recorded. If a filter on category_sub returns far less than you expected, blanks are usually why, so filter on category_group_clean instead when you need to include the old schemes.
Sort quarters on the ISO column, never the label
aaum_quarter is a text label like "June-2026", and text sorts alphabetically, which puts December before June before March. aaum_quarter_end is the same quarter as a proper date, 2026-06-30, and sorts correctly. Sort and filter on the date, display the label. Also worth knowing that schemes legitimately sit on different quarters at any one time, because AMFI publishes each new quarter fund house by fund house over several weeks.
AAUM is an average, not a balance
aaum_cr is the SEBI-defined average of daily net assets across the quarter, so it will not match the "current AUM" on a factsheet, and a fund launched mid-quarter reads low against a full-quarter peer because it is averaged over all the quarter's days regardless.
A small number of matured schemes carry a final NAV of zero
About 2,300 rows, all of them matured, show a last NAV of exactly 0.00, roughly 8 percent of the matured universe. That zero is AMFI's own closing entry for the scheme, so read it as the end of the series rather than as a price. The daily sync filters zero values out of the live feeds, and the historical backfill kept archive values as AMFI filed them, which is why these closing rows are still here. A straight "latest NAV" pull across matured funds will pick up those zeroes, so screen them out before computing anything from that column.
Recent changes elsewhere in the MFPRO API
The scheme master is one of several things that moved this month. Short version of the rest, with links if any of it is useful to you.
Search now filters on 12 fields of its own
If you would rather query than download, /search now filters on AMC, category, group, type, plan, option, active, stale, launch and last-NAV date windows, ISIN and TXIC code, with commas as OR, filters ANDing together, and an exclude that works as NOT. The write-up covers how they combine, what a wrong call returns, and the real limits. Search now filters across 12 fields on a scheme
Three things the logs asked for, now built
latest=true is a real parameter now rather than something callers kept guessing at, identifier intake got a lot more forgiving, and responses carry freshness metadata so a poller can be cheap. Three things your calls asked for, now built
Getting an error? Start here
A practical guide to what actually goes wrong when people call these APIs, built from real server logs rather than theory. Trailing full stops copied into URLs, encoded ampersands, wrong parameter names borrowed from another API, browsers used where a POST was needed, and the difference between a failed call and an empty result. It covers MFPRO, TREMOR, VIGIL and the Yahoo Finance tools together, since the same handful of mistakes repeat across all of them. Demystifying TigZig API errors
What other people are doing with these APIs
The server logs rewritten as a plain-English conversation: who calls, what they ask for, the patterns worth copying and the ones worth avoiding. Useful mostly as a shortcut to good practice. Your agents and scripts have been talking to me
The bulk downloads got faster, and a real bug got fixed
Roughly one in five bulk downloads had been truncating, files that started fine and arrived incomplete with nothing shown to the user. Two Cloudflare Worker bugs, found and fixed, and the downloads are now up to four times quicker. 1 in 5 bulk downloads were truncating
SEBI has rewritten fund categories and names
Relevant to anything you build on the category columns: SEBI's February 2026 circular renamed several categories, split Sectoral from Thematic, added Life Cycle Funds and requires fund names to match their category by 26 August. Old and new category names coexist in the data during the transition. What SEBI changed and watching it happen in the daily files
Every field, explained properly
The full data dictionary covers every column with its caveats, alongside the scheme universe field guide and a page on how the data is assembled. Data dictionary, scheme universe field guide, how the data is built
Everything here is open, no key and no sign-up. The MF NAV API guide has the full endpoint reference, the MFPRO app has a Scheme Explorer if you would rather pivot the universe in a browser than in code, and there is a Report button in the app header if something here does not match what you find.
AI agents: the machine-readable version of everything above is at https://api.tigzig.com/mf/v1/, with per-column semantics under schema.latest_snapshot.column_notes and the OpenAPI spec at https://api.tigzig.com/mf/v1/openapi.json.